From 97e1b1bd30402b8feba609862fa13ecaf148b644 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 19 Jan 2024 23:38:20 +0900 Subject: [PATCH 001/323] [PFCP] Fixed incorrect TLV names (#2887) Fixed standards documentation that described incorrect TLV names. --- docs/_docs/guide/01-quickstart.md | 22 +++- .../guide/02-building-open5gs-from-sources.md | 20 ++++ .../troubleshoot/02-now-in-github-issues.md | 113 ++++++++++++++++++ lib/pfcp/message.c | 38 +++--- lib/pfcp/message.h | 19 ++- lib/pfcp/support/29244-h71-modified.docx | Bin 1343756 -> 1343906 bytes lib/pfcp/support/cache/tlv-group-list.py | 8 +- 7 files changed, 196 insertions(+), 24 deletions(-) diff --git a/docs/_docs/guide/01-quickstart.md b/docs/_docs/guide/01-quickstart.md index c5ec59db1b..0d7fcac081 100644 --- a/docs/_docs/guide/01-quickstart.md +++ b/docs/_docs/guide/01-quickstart.md @@ -335,10 +335,29 @@ $ sudo systemctl restart open5gs-sgwud #### Setup a 5G Core -You will need to modify your 5G AMF config to support your PLMN and TAC. The international test PLMN is 001/01, and the international private network PLMN is 999/99. You should stick to using either of these PLMNs unless you have been issued a PLMN by your national regulator. (This PLMN will need to be configured in your gNB). +You will need to modify the PLMN in your NRF and AMF config, and in case of AMF, further modify the TAC information. The international test PLMN is 001/01, and the international private network PLMN is 999/99. You should stick to using either of these PLMNs unless you have been issued a PLMN by your national regulator. (This PLMN will need to be configured in your gNB). If you are aiming to connect an external gNB to your core, you will also need to change the NGAP bind address of the AMF **and** the GTPU bind address of the UPF. If you are running an gNB stack locally, you will not need to make these changes. +Modify [/etc/open5gs/nrf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/nrf.yaml.in) to set the Serving PLMN ID. + +```diff +$ diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in +index cd9e45feb..58e8cbbce 100644 +--- a/configs/open5gs/nrf.yaml.in ++++ b/configs/open5gs/nrf.yaml.in +@@ -10,8 +10,8 @@ global: + nrf: + serving: # 5G roaming requires PLMN in NRF + - plmn_id: +- mcc: 999 +- mnc: 70 ++ mcc: 001 ++ mnc: 01 + sbi: + server: + - address: 127.0.0.10 +``` Modify [/etc/open5gs/amf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/amf.yaml.in) to set the NGAP IP address, PLMN ID, TAC and NSSAI. @@ -404,6 +423,7 @@ index e78b018f1..35a54419e 100644 After changing config files, please restart Open5GS daemons. ```bash +$ sudo systemctl restart open5gs-nrfd $ sudo systemctl restart open5gs-amfd $ sudo systemctl restart open5gs-upfd ``` diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index 34154ce38a..edeb73aebe 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -110,6 +110,26 @@ $ cd ../ ##### 5G Core +Modify [install/etc/open5gs/nrf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/nrf.yaml.in) to set the NGAP IP address, PLMN ID, TAC and NSSAI. + +```diff +$ diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in +index cd9e45feb..58e8cbbce 100644 +--- a/configs/open5gs/nrf.yaml.in ++++ b/configs/open5gs/nrf.yaml.in +@@ -10,8 +10,8 @@ global: + nrf: + serving: # 5G roaming requires PLMN in NRF + - plmn_id: +- mcc: 999 +- mnc: 70 ++ mcc: 001 ++ mnc: 01 + sbi: + server: + - address: 127.0.0.10 +``` + Modify [install/etc/open5gs/amf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/amf.yaml.in) to set the NGAP IP address, PLMN ID, TAC and NSSAI. ```diff diff --git a/docs/_docs/troubleshoot/02-now-in-github-issues.md b/docs/_docs/troubleshoot/02-now-in-github-issues.md index 31e0ccbad8..ab5a587221 100644 --- a/docs/_docs/troubleshoot/02-now-in-github-issues.md +++ b/docs/_docs/troubleshoot/02-now-in-github-issues.md @@ -10,6 +10,119 @@ head_inline: "" } +#### What to do if a FATAL occurs? + +You may occasionally encounter a FATAL like the one below. + +``` +FATAL: s1ap_build_initial_context_setup_request: Assertion `E_RABToBeSetupListCtxtSUReq->list.count' failed. (../src/mme/s1ap-build.c:577) +01/19 22:01:49.169: [core] FATAL: backtrace() returned 10 addresses (../lib/core/ogs-abort.c:37) +./src/mme/open5gs-mmed(+0x8ef5e) [0x55f6f8a78f5e] +./src/mme/open5gs-mmed(+0x5910b) [0x55f6f8a4310b] +./src/mme/open5gs-mmed(+0xa4ea5) [0x55f6f8a8eea5] +./src/mme/open5gs-mmed(+0x88b65) [0x55f6f8a72b65] +/home/acetcom/Documents/git/open5gs/build/src/mme/../../lib/core/libogscore.so.2(ogs_fsm_dispatch+0x119) [0x7fc2362f4c2f] +./src/mme/open5gs-mmed(+0x9e99) [0x55f6f89f3e99] +/home/acetcom/Documents/git/open5gs/build/src/mme/../../lib/core/libogscore.so.2(+0x1199d) [0x7fc2362e599d] +/lib/x86_64-linux-gnu/libc.so.6(+0x94ac3) [0x7fc235a94ac3] +/lib/x86_64-linux-gnu/libc.so.6(+0x126850) [0x7fc235b26850] +[1] 41823 IOT instruction (core dumped) ./src/mme/open5gs-mmed +``` + +When a FATAL occurs, Open5GS automatically calls backtrace(), and from the address information it outputs, we can see in which source code this happened. Note the addresses 0x8ef5e, 0x5910b, 0xa4ea5, 0x88b65 in the output below. You can find those addresses in the following places. + +``` +./src/mme/open5gs-mmed(+0x8ef5e) +./src/mme/open5gs-mmed(+0x5910b) +./src/mme/open5gs-mmed(+0xa4ea5) +./src/mme/open5gs-mmed(+0x88b65) +``` + +And you can use the GDB tool to provide additional information. If you are in a Ubuntu environment, you can install GDB as shown below. +``` +$ sudo apt install gdb +``` + +Then run gdb like below. + +``` +$ gdb ./src/mme/open5gs-mmed +GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1 +Copyright (C) 2022 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +Type "show copying" and "show warranty" for details. +This GDB was configured as "x86_64-linux-gnu". +Type "show configuration" for configuration details. +For bug reporting instructions, please see: +. +Find the GDB manual and other documentation resources online at: + . + +For help, type "help". +Type "apropos word" to search for commands related to "word"... +Reading symbols from ./src/mme/open5gs-mmed... +(gdb) +``` + +With the address 0x8ef5e, 0x5910b, 0xa4ea5, 0x88b65 that you remembered from above and the `list` command within the GDB prompt, you can find out in which source code the problem is occurring. + +``` +(gdb) list *0x8ef5e +0x8ef5e is in s1ap_build_initial_context_setup_request (../src/mme/s1ap-build.c:579). +574 emmbuf = NULL; +575 } +576 +577 ogs_assert(E_RABToBeSetupListCtxtSUReq->list.count); +578 +579 ie = CALLOC(1, sizeof(S1AP_InitialContextSetupRequestIEs_t)); +580 ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); +581 +582 ie->id = S1AP_ProtocolIE_ID_id_UESecurityCapabilities; +583 ie->criticality = S1AP_Criticality_reject; +(gdb) list *0x5910b +0x5910b is in nas_eps_send_attach_accept (../src/mme/nas-path.c:171). +166 * the MME shall delete the stored UE radio capability information +167 * or the UE radio capability ID, if any. +168 */ +169 OGS_ASN_CLEAR_DATA(&mme_ue->ueRadioCapability); +170 +171 s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf); +172 if (!s1apbuf) { +173 ogs_error("s1ap_build_initial_context_setup_request() failed"); +174 return OGS_ERROR; +175 } +(gdb) list *0xa4ea5 +0xa4ea5 is in mme_s11_handle_create_session_response (../src/mme/mme-s11-handler.c:436). +431 ogs_assert(OGS_OK == +432 sgsap_send_location_update_request(mme_ue)); +433 } else { +434 ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( +435 session->paa.session_type)); +436 r = nas_eps_send_attach_accept(mme_ue); +437 ogs_expect(r == OGS_OK); +438 ogs_assert(r != OGS_ERROR); +439 } +440 +(gdb) list *0x88b65 +0x88b65 is in mme_state_operational (../src/mme/mme-sm.c:552). +547 break; +548 case OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE: +549 if (!gtp_message.h.teid_presence) ogs_error("No TEID"); +550 mme_s11_handle_create_session_response( +551 xact, mme_ue, >p_message.create_session_response); +552 break; +553 case OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE: +554 if (!gtp_message.h.teid_presence) ogs_error("No TEID"); +555 mme_s11_handle_modify_bearer_response( +556 xact, mme_ue, >p_message.modify_bearer_response); +(gdb) +``` + +Reporting this information to a github issue or discussion will help others troubleshoot the issue. + + #### MME sends Attach reject(EMM-Cause:15) with Diameter error(Result-Code:3002) If you see the Attach reject(EMM-Cause:15] with Diameter error(Result-Code:3002), it means that HSS is not running. diff --git a/lib/pfcp/message.c b/lib/pfcp/message.c index efde7b333c..50941162d7 100644 --- a/lib/pfcp/message.c +++ b/lib/pfcp/message.c @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-08-18 22:15:59.596820 by acetcom + * Created on: 2024-01-19 23:36:01.346970 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -2369,17 +2369,6 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_predefined_rules_name = { NULL } }; -ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_information = -{ - OGS_TLV_VAR_STR, - "MBS Session N4mb Information", - OGS_PFCP_MBS_SESSION_N4MB_INFORMATION_TYPE, - 0, - 0, - sizeof(ogs_pfcp_tlv_mbs_session_n4mb_information_t), - { NULL } -}; - ogs_tlv_desc_t ogs_pfcp_tlv_desc_remove_mbs_unicast_parameters = { OGS_TLV_VAR_STR, @@ -4188,14 +4177,14 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_control_information = } }; -ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_information = +ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_information = { OGS_TLV_COMPOUND, - "MBS Session N4 Information", - OGS_PFCP_MBS_SESSION_N4_INFORMATION_TYPE, + "MBS Session N4mb Information", + OGS_PFCP_MBS_SESSION_N4MB_INFORMATION_TYPE, 0, 0, - sizeof(ogs_pfcp_tlv_mbs_session_n4_information_t), + sizeof(ogs_pfcp_tlv_mbs_session_n4mb_information_t), { &ogs_pfcp_tlv_desc_multicast_transport_information, NULL, @@ -4218,6 +4207,23 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_control_information = } }; +ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_information = +{ + OGS_TLV_COMPOUND, + "MBS Session N4 Information", + OGS_PFCP_MBS_SESSION_N4_INFORMATION_TYPE, + 0, + 0, + sizeof(ogs_pfcp_tlv_mbs_session_n4_information_t), + { + &ogs_pfcp_tlv_desc_mbs_session_identifier, + &ogs_pfcp_tlv_desc_area_session_id, + &ogs_pfcp_tlv_desc_f_teid, + &ogs_pfcp_tlv_desc_mbsn4resp_flags, + NULL, + } +}; + ogs_tlv_desc_t ogs_pfcp_tlv_desc_dscp_to_ppi_control_information = { OGS_TLV_COMPOUND, diff --git a/lib/pfcp/message.h b/lib/pfcp/message.h index e10796db49..c186cb988a 100644 --- a/lib/pfcp/message.h +++ b/lib/pfcp/message.h @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-08-18 22:15:59.578047 by acetcom + * Created on: 2024-01-19 23:36:01.327925 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -626,7 +626,6 @@ extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_event_notification_uri; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_notification_correlation_id; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_reporting_flags; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_predefined_rules_name; -extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_information; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_remove_mbs_unicast_parameters; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_identifier; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_multicast_transport_information; @@ -733,8 +732,9 @@ extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_l2tp_session_information; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_created_l2tp_session; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_pfcp_session_change_info; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_control_information; -extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_information; +extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4mb_information; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_control_information; +extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_mbs_session_n4_information; extern ogs_tlv_desc_t ogs_pfcp_tlv_desc_dscp_to_ppi_control_information; /* Message Descriptor */ @@ -978,7 +978,6 @@ typedef ogs_tlv_octet_t ogs_pfcp_tlv_event_notification_uri_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_notification_correlation_id_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_reporting_flags_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_predefined_rules_name_t; -typedef ogs_tlv_octet_t ogs_pfcp_tlv_mbs_session_n4mb_information_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_remove_mbs_unicast_parameters_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_mbs_session_identifier_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_multicast_transport_information_t; @@ -1827,10 +1826,10 @@ typedef struct ogs_pfcp_tlv_mbs_session_n4mb_control_information_s { ogs_pfcp_tlv_multicast_transport_information_t multicast_transport_information_for_n3mb_and_or_n19mb; } ogs_pfcp_tlv_mbs_session_n4mb_control_information_t; -typedef struct ogs_pfcp_tlv_mbs_session_n4_information_s { +typedef struct ogs_pfcp_tlv_mbs_session_n4mb_information_s { ogs_tlv_presence_t presence; ogs_pfcp_tlv_multicast_transport_information_t multicast_transport_information; -} ogs_pfcp_tlv_mbs_session_n4_information_t; +} ogs_pfcp_tlv_mbs_session_n4mb_information_t; typedef struct ogs_pfcp_tlv_mbs_session_n4_control_information_s { ogs_tlv_presence_t presence; @@ -1839,6 +1838,14 @@ typedef struct ogs_pfcp_tlv_mbs_session_n4_control_information_s { ogs_pfcp_tlv_multicast_transport_information_t multicast_transport_information; } ogs_pfcp_tlv_mbs_session_n4_control_information_t; +typedef struct ogs_pfcp_tlv_mbs_session_n4_information_s { + ogs_tlv_presence_t presence; + ogs_pfcp_tlv_mbs_session_identifier_t mbs_session_identifier; + ogs_pfcp_tlv_area_session_id_t area_session_id; + ogs_pfcp_tlv_f_teid_t n19mb_dl_tunnel_id; + ogs_pfcp_tlv_mbsn4resp_flags_t mbsn4resp_flags; +} ogs_pfcp_tlv_mbs_session_n4_information_t; + typedef struct ogs_pfcp_tlv_dscp_to_ppi_control_information_s { ogs_tlv_presence_t presence; ogs_pfcp_tlv_dscp_to_ppi_mapping_information_t dscp_to_ppi_mapping_information; diff --git a/lib/pfcp/support/29244-h71-modified.docx b/lib/pfcp/support/29244-h71-modified.docx index 45f844780549425ffef1441311b45896de8c6784..1b06faefd4d3ff83f14b44a1fc84899ad4f7e937 100644 GIT binary patch delta 652561 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

QBmM%kvVF8cx>^;`aB@1F4=Db-1)(UF+ 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

`ln^e7U*#U-=FFRUx5dgX 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%0A@O=8tm-Rpz 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

GnZp@WeZm293o;wN_S3q|6(X2+agTo@ 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 )hEbR2i}TACyVcZU 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

Gjl+aOY%ABHm2Bp&! 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ÅO@I{8DK>Z90u7#+i-;ClJh+y<$ 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�(u@mLAi3Zf7W&8m67~ZW2i_izb^&6J#SHdp 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%0DH~0Ii|&*)%$Q4i>@?LIXG&70>?2CpZh+ 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 z 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 z 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 NBSm+YdLx1E{|_}{xtIU| delta 652412 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 ?9e8T$g7ETsBS! zf~4hwhP{ZeW_9@OEG3>8__;so6k=q~B_l%}N*kvARS5 z8pq+Wj!2ikqb0N$%PiF8VrI@?6Z=0?i2Ov}fzdXwGM!vPyw#u`6k!WX=$!G$EzTDM zI?1UpQaujd$wWVcO|Lo=2+p9{j3ncGodNW*zmx$pqL+m!y8{hZ19rQTZv{hn1rCKw?%FLk}qlIaH(Ml#Y=8o{?ahA7hNJwo7Gp zO1v}hRYG5ooYdfYS$w->31mak`xMxp9cS)sdlm(0l}2Lgw&-_)0hT+q!vl*iX_}6y zprf&$;93PT->9<>Z-@CcFm8;*KmeG3E$738o(GJMiV+N%t;O}}fE4~+Y!o>w33#0< z?MkGgwNW(!eoi=I;BN=!Q+{^SE(8m=tFiry!;ZA)vqq$f z^pq`4IkiDy855>vKjwjbsK-BRRN&w)KlQxP=f7SYre3PoEQ7#X2ptoA+=~h9+{l=G zmy1z!`N|lE1$F{z%BVB3VF4AZBi<2M3@SBA2*@RdAkO;2>{z*<$?vjN`M+ldEr>;< zR~Xa0_{zjmjVZr-@_Rhvx8inF5eRleobeuvz9Q0L?W$AR!;eN@q}myx7_Y(D)lNj4BSHT)OUUBmrrLbzwtq{c9&t zNQ;@$O(w|h)w%i?*}67)8J-QTNClpt8a`4`+U9_5oyKH*$3q^|NLs#OnFXJJP54z;Z(%i<;>y{XNH)LlUnJp zaQoz|t>id(tocmU>omKSo_ik@*;uu-dC74!|kS$xRe2ov#)u4>{Q3 zV94&1fY17ZDdS%}N4oe>R*=*kS*54y&C(A8e+(gt{sd4_UkznGIH`7W>GbT`ujab` zz}z;r8KssU`(Je5G8wJ8*`gy_a$(@L#%M$MzHWb>U3BFwX-^m?hzBYKsD<#O@Zt6- zNuzuc{HkILNC1dR*-GX3u9T;h$*Oagn(VoKI4@l>bremc(@ybFdeo_k9fHjwd9$B? zmhs*q`??Ui`DD7KL+Ngk1YQ3tx8b7Qr=PcZw?)%nBxD|HH&w+x_bZ@2;)+(LCvE{o zg7k>v&xAd7O4?7mUIozMXw43;)R{8a^InQKpBN}=WdIoAF~#hP1ls9sLX~Z9=WP9= zgHw5n0Cplv_E>CnyzHqsLcB{_J~Ff|aU|hHlN$-CXw|_O_lqjT&$KYld0|0%qr+gI zd~(sWwXzrDQT&v)>xY|*mwRRVdf3E3vq^2x=Vr6G*hOMtD9n6?MqzRe-(VSLC1Nch zD_`CoUcinvBuUOFsCIP9crbw&&;fc>%i#%VPFSQQa{HpZVUVGz5XE``D-jjLX%%13 zz@|qH7hK*D-{;N37L3nZ+-=XXdHhd)o0B{2U7Z{@ICl(Imv2>!Vjd;#cQ?EJO zHg{a@QFgQpA~5R|3G;WWYLe`!2hR6foNA}EhW&!srkabrPsc+mFFk}=gCeNwf-y?p z?OU+rtw8b{&kG!rm#u z0X7i&GKq#!%>K$?feGS~n(ppurq+ ztlSjmmpoI>rXr&HJyLl-53XZ*y#l({%1cLO=stSXhbAnkB1KTkr4_Q z62-7z8h@}J+k0};R&fRbkF%5(V7Dp^airLZ;c3nOAa7AlMv?*iwrfYtbM7#{B>8)GKOk9(nvH1XTj057tvdW?CV1}I%_P` zrz0m;igvyRY&pNb2x`O3kdA0uk;{skq{(1O_S#K04o53>in$XYjrJJ&s_Roerl!?s z(Uz0v-%s}Jgq);+r+iT_KSIsOxaTyig`o`d@shF}$Y>m( z6s}jZh6I^yN|4UhPq2zG@EdwIB6sU9fo>UB%zeT_Gfsle0_NW|rBREs0DY51IkJ@w?2im z3){jFwX4iMZaSi9b!5bN%E=ScZI%r=O6`$r*z56ao>S_IOrA@{b`{@oO0wt|S)pbA zI4Af{gKi`zwu1l?BNx&`4=1XV! zZF>2#*iY!SQ&4&qU6n_{Lc%gp2znvH0IKFNaahfF16txdtD$Z4YM9TaJAx8dYADN5 z&uL($X#P&k8`vES01fYKH2sQZRdatL@2A9%y-E~fH#>%G%q&d`7E!qQn$M~;du(L@ z-+gWb_Ei?WDLwWVHwpSf-$yk!q0D^*x_9_dIBwLRis8_g*XBPBuY{uZ(lS^4fgGs>l!QSz#-Pvz=;vzLGo+-0wogvNt^V9lpk zxR**(%=Zri@AD(rvK)+7YsgMsFt`Vd^snHmA$`CW(wiK#a%~H~(EWuxBCG{)e(l%0 zH}sBvSc^OXj{hZhqBQhMGyud>NPeo62B_Zv@6(59kzYINNB8MK6#sslzLR5E*Ua8E zBC%3LbB~{wtXKZ9m&!ho{w))~8>;DQ#w-2L0YOoe&!X#U0@)fEWHR0|cswRcj7`%_ zOYo=5T$4r$6D%Zb{gyAfw{#FVD~<7F*z(LtfIOlIh?`F-0g246?zObLL|;IvAMNwF zy-0)3i9ZA|IiBztg(oM`NG@P|r0sEmkn<)9KjLHVXGi6<&B`bk-!&rNGfDoDcU z4!yWfMRbh6o`=%(Z4N(y!@aNYFsJ%(K|Avp~@DxBMlt!j> zba&$D;qJ!Hxhu76JOQL;Dvg?ql;?MEv-?whyxIP}9Rslg3&p`Mrl#}-E(ZbT8h#!I zkb0Z>V=rq&tjZj7qXL+`Uo;VUcDjn^4szZI+oHbk4T2ZE69V#9i*EwSYo)qq#OC%MLEdoZ4jGPnlQK&hYaW zAsH~RJM{3!XRX@?~-c=YC!w$Dc{*Y>n@&c{hfXM3QF=jw0=n>aCXCzP*e8Tcqd&ZVwy#?vQv}s z0bjJvt&~T^j*+s_UfNlOb0*aH})zzLgjx0z361$5P2fSGmWn#K2d?)Sn+cB@IR*9-HV z)sB(cYmg3XS>piA!;54r;Fxp#6qjD5x$4Wj3QhE|^u>yJgB?Y!#HGfL4%(Zk@a}!i zk~0oY`I$0;$~Q~{>tT*;y+0?H+}929ArfIvnjMCIk9}2HK4I)V(S_L@@OFf3<-o3k zxab+O6hx&DQ&U^{(CmrtW%j`F~(*)c5gk`txt&8O#XW$<~%cV}9ehD}H z1$$el(q8MC;%@D0R=_{MS#@R{t6OJ`T{l{WU#lUSXY1O!9h-0*>m~4-b^TF|_949a zEyk>IV-;lC`>{_0H(}k=pW^ z+VLgL^CjK6Expz8{SQCt3b1w1_XyJ_^P$nEiQCC4-Zc830@$GtHapwX$vG@UN%k?d zB$C6_m0nZJb|-hzmVi`(Xhm2^UJC(&2uvH>7EH71NQ*=g_{#Ws%*8GQHoT*jB)(mL zD;4BJu1T`TTg)TkFPhmJml+|>@Apsjzj=AqzgGk{9^cr}^X$IAe8T&-r(1B_IjyWS zz5)Lx9)Evd0DRBY4x}26D=i-58h7CpR#zJ~yE~Q(+Sq{3t;zomqz%O-xBoNO1h@aWVr5lAe)@C;{VdZtE)3pu2za z2{}_d5Mace14PAUeE*x0@O^c8*>8XF-Gwayh_iDahiC}tl*CCwS;AI5qw6}84ak*= ze0_t@G7VzhW?cFO9gf@ucaIS#PBpP{geCL9QH8$j72sn~Y&K~}oD!Rw#l+=1o0>uG zKy{#5H7BhRWtKlo$Eu{7tkvR#my!N4lH|9D{#{|K! z)vHx|XwuXYFJPg-_TspL{RyO5aGd>S!)SJ(V;ZvYmY6_3K+r~qN^AQy)T6Yy2&FwS zQ-A4S^KYV1Z^=#yTsG4N`8kOdvBug~#>vXyT%XXV<6>Ou`yE}XHF$Ln4F>Z9-A{sq zs8~S#!czZTh(vX{T;zeWX-XJ@^{`@ApM$xvC=M&19k2x+4zH}*4%Uj19Iz*mz^K*f zC!IO!v3+>p_arP*6>V|pIGoCaZGh{IrG=QxRhOei6ER<+`ipq$j}lY!vlL80h%_xn z_ymR2}PjI|;$x$kFthO^1P<3pDLp#Z* zu^VixGk`R%NmUfw0ENqL#qgGJ82uWSbprG6r{Q%`UbgL>6FZW@KL}5lEH-OfNb690 zFOdV;l<-0G=*aAg>cf`%r~6j6&Il94`0VGwgJynZt3Bw5nXUtdjpX?3(*GkuL*)3P zG6RhX!RBN@8&hlZPojS*D2imp$< zxl|$sT1I6sdX^s|LGQhI>3u84N=e-;Sor5p{&q15tY%PE3iACJ~!i7tK@ zd*o#TTFmn1k}KOb4_ed`3{G6E8rqG4B|YL3sbRLtj`&u_F@@W=vTi$}kV%XuqaS-ck` z32ntT5aE>QRN8y{HG8{wlp`(P1zDo-ndgbZexm5oX!t?mvW@_^s4BAnqBX?`9s@L? z41Wmr%1iE;p?yL1G4X79YBJLD}P>1C~Gz+6H4*7|b_AG*DkC8}R`p z9|gb6bvDpro8!6nND0PRal^BS#s|beQV$)w>b|R9GYug9K}HQrx{AuTKXD194rLs-x2-rc?(F-r3pHQLdt+H?_5o#o(>Q9*DaM;K21!(C5`(H zt|eghvxPA?h4<9i3l`!Xlw|Trdprbf;wfZ@nuq7ndEu(UMeP_jxrXe9g>uG>esq(C zDkCHt!Mv$>&)>6$C3uh(LFL3-wadIG>3Bq^IwCmo5(9>B{dWkeu{H?k?_9M~wj2kq zpx9JvoAI&VBFu*K~FDoKrnBT{ZpbLQbjOZv^)gzE?6Nsj%8y6bC%S2tR(jDfC8l zTTQIr2|GPmF{X3TqH1b$sNFPR@kt43HVd-#rTBdRA9UnyIYf%i9Ycoi?ftb ziZ^ZJeX_cmc7#)X_q~=bdWY49ej(3Kz*K;Y$8kB#LJ3s`@mqVP zH-PFqN*h=mQ=Boi!R?K*UJX)%|NHn@CI`+Oy1C&HYXuxA!P!93j_&D9HM}RKfRX2u z^X~dCrI5-hp<^SqineUK`4_{hDh0rnHZEf`g5ky+ zAAQZput*pNOvk2J$eir0&Jr?$SL37POlYhr?HQ3oOlco9O>!6{t$C1TqWU^!5wrSmE)k=V&`76Z8E4QO`weG9GU1NJkcxo64O4SE87GTl+?>>pGzG1}9jKrcJm~f9`V-}uL$624o~(ei)!>ya zOAZ_Ol?5|~CrR@%0^vDLIIK?a2dfx@LgM@#$pcNfOy;;}#=tAA^yMbp+<>TjOveP4 zb?ffwX0_vqL0hKpFnHNNW_S6mI@zxS-lg@)Qk8KF?NrTUNy2Zcf7p}a7%W(l2tuE3 zJb3MJ484kz!319yr4_1Bb{@PqC&ZIq*9=lEwCcYD zVoW(d=?hO8?ohv@bF}t7(i_qcAyONUe-!8H3nw#T<|mx~VFf(UzeLbtpCs$_>BJH5 zEoKY_z-wKvvNdhw29Z|e_28V(hoWG{y|*`HRIKa5w*Ii#b>gN+gv9TzQgHLp1cwF# z4o&VaU)*m~^*wKd(#QMvTgHmS)UiW3USwa<2r+G_7*S4Y96l!mEfM@m*B8d~^U@J5 zt9bkcv`wzR^fr+jo$*sY3_{l3=~4 zG(2l?kipbI?6VhFC1|beF{_yc%MXeHVOj{T6nf~Zi-_DUneEH~*lKit;>B)tp!Ouw zhTJ?gKvuCUL`geLovB%_f*FM_KOItj;U!h+y!m=HTyB~z?fe;>$&{Lfcc-B8X;^KtH&9{KO#O$YmT#9sbb@;A{wl9yx^^GHf=UgDSf(V=H-PuzDKf|i4 z>N^2QCCMY!x#!_>0bHEoWQ}6Y%M|~yeVCjtp9If^eav*cKJK1Jx=otF4DwB?{+oau zCO%6;nN}Xo#=4)6qUxq-IK-A-W|Nf7IEq`{wEEyz<`^a#ot990FVX;DpF+weTQdu` z(6k>?nf9k(b*|**bYg3mE>VS$5G1Og<(!Uv9iETdThu>K3OH)2ELR@8PL zCPpt!{f^IpqpYcUKA&{{5z#KjRFhor$^*1o8oeYaOT6$7N%{J0T`1(td6R+ZsB5h8 zN3R5lhc}mmf^M!vaYmZ&qq!n>=02n`ECN<>K-RR}oXFgFKQDvcCHfX9&TOVNr+uZp z9mV<^PwJ4Cr~zR9JEup}k(64>;>kVszweBUc17Kl;L(Exo0b%4aD&0AQhyqXgRR_@ za_F3`R8guPIHAbImo)&^MlID34Wf}}#mKX0oSP0AyCj+i;CDJ?i2iH`-~L)J98I^N zeuZjJ<+1wpRcy0lYMKmCopgNHL*g1TmZ8}Vo0?eip!fiKzRq_aY9e&5_y@2Mkj;MR z{2l#LB&Pd|TFuPOacbmkl1U#{M7;m@wR}w^Pn*i;N{clfOQm{QOkb1Ue(qP~+VRGv zilzD4%?}=S<_DO)4~~zkyLncKi81}nT20Ir=85MWx(NMATygc=;ALZ(wKd(KOa(3| z%5N+e!BPt-NYCF6TgMzp-X_%f;_62=u%ws+|NAJeju31b_4V^)=j}xL?fC4)l;&ln zy=A4xI(v!uSm>yHE!R+F#dF;j65)raRA1D+CPuJpZc= z#bBKiAO!wNPfHW^;LA=dxGynzbwA?LUljTfT$*?hZxJ!v{2^^{7Qoh z+Wx>&>z@>MfR(*B7*FjP;spEcRfk-@dJiqk2I>Bo00R?vqCw(FwZ=}u5?F;+E^Hng z5qEEzioQ=Anm~kF@kpb(9!h&jU3{&&_p%hrr{aNsg8Sa}(6@S^ZU&!12}DF%t)gIv zqgxo|R!lAu#sG!O^|Y%$DEB6DJu=&qRwT!Z={78@s$83FRnkm79pquwv42PXW|P8WHt&(Y;*6_$%RR z4+F@xA^)Y~?LW;q{4isuOzBJm@i!^g@wvW=_13^;KLq!|oF`6*=Y>t_`4ipZm-sv1 zXjd0wC7w`%cC0O3Jhxr8gOP({*V`_(aRsMw@TGkvms=ftLM5HWzf~^ddl6Asn!zZ- zN#T`bF@`ezwa1NhpDoE%A0H=NlWY)sPy%xBlAfDG%|Upt@->GYfG@91Zp@HpT(lfq zm}AXBtZXmq9!a^m5Agd52tvR*{&*Y@I?Fv=+0M|fC(1sZ70D(0(TpQ-rD($4{!*{*z(19cvWeJ+kgqJV*v(d zY`s^R>hr@+hA48`8O~5G)I>ozEBW{IpZDAC1csM){}}VPBYdh9QMp>~5Z~E+Y9G5` z5-tu_t0r_F0I#Cw4R)QP;-V_))x}Z=e_2Ywd`yPVhqK19*Vow-+rCtI#LlVIv&MPQ zEr)@!^mTu-d&!kgRyVH5`~7rx{s1hh^|}Vv`tJv82N3T|S80IUds2j@!BSQ0Wfh!c z#~?^hb!Gc^<^FCSKK9CxcM1s%G84=yRBQ^wJbFg<&NgO24QFx4!>L#a|B?au8>13x zQhOmJYCWDcf!9&4WexdO0AU;@W2_xM#0Wf4hpL>ZutVwdWb{4mYS9P?2ZWimMr#rV zAKyFpw*HP>9)?Cu_W6NRK`AfdljoKn{#4jRE;!8sZ_^*~N5JJ<8WvWAvYFppYhpJe zOi82l{W-$g!Pux|Syrx4j|t=B?KbJz(3X~T_!pR)NQGA7MMR9M zkxCmOI!@rb2Fax?&VkiftKnrKpF?| zHqH&>*OKU-vKZrl8iN7k*LJh(mrK^sGoCI`s~zg92js zFSTmaJL&600As(-l!53ui}wYkJBn=cMG)l^-dHHdeIt-%=^jx9=i1XB>z9rxqh3k( z=a&%~>j}FVSlpn)XI%|H=??hHNt|b*yR5auTq&Ak$xI?z828&P`pfpJ`&7+r+e;(W z<8lwSGwwBQ3Cr|b#_Mc_9vw`${xh@%$s1eAp1uYe!V}n zLED#xi>EM)wD zy<#ADUdtt97^KzhTq6NOPTSDHkaI`aMxyK}cTet>;dtetCQD1C@4A)oroOh-Y}G0? z$1YiM!K!#1OJwP3e^9?&Ib2USgZot{PX|huutU^7hXRiwSJ7yW?pkcA60@P^<82!K ztZ`aaJUBCr(>$y4Uvw~3p))J=xrQGi$X4dUi{gy3pBb#kMB{HO%Yz$4N{o?;x>C}s zNmET{z4$-qhy{B(6Y7NA=wH~Hn8xfx8L;*EouAgc8Z~uU%Guo}LJU0dj(@K~FzBSh zL|Vjn)B{n%Z5=hw9n6yeKX98R8bncOup3pcN|ERqNB;Kc+vp|tx1CCys!*JuBP|kp zXtTdSZ5O9c8}SIoX*=iN((0OFZ0Za9P9-({f=jApq991RG2$~zV$@UDaVKXB1jWtb zqU_l#On_K>`RtyljQBb`nvWl~k%RQV-|6$t%>sE~yy0-VH0of&tv)C*^r5RGj%jOC z;-aq>;V*TIqrX>B>lxCaeK!a8GD3K^>%PDaeL!Ae=n0i2l{T&zsP$t`wdkSl)GJ&0 zALbSRQ$ox8*=e>t|CEiaZvQj>9C=XWMr3OMiuy|ZHtn{r#YdkozNyRVM%pIdjB|k& zjR{B|@~Pk?PQOK?q)2tAYPFrx5AObL$Ao!Lf6${aq<(7r0iPW=>x1mJwtfa&;4sO* zpfTrHTLnC)6o0zu@m5JO30ltZ%&=v%r^xyWgZZjtQqk2-%aw#Y`jE$x?h(Fjbuoi| zd>th73;JxZi(WT9HNxRrIPqgLH(u>d`4-Ta|D|_BrL3-B1|6p+9D_Z+4|$U&FkV^g zA{m*;$Hc0fUwuRL4<$2zZ=M>HBiAESw6Be2SsI5i)h?8ROE|31myWP33>1gol|0#r z89nzDVQdI5ZT&Xl@v6dWzb~y)1^D1!O~Jnx7qN-4^MKvp&5PBdEB>|18$4&FEC7sG z$I60tAf%^M2z7ho?N~9;EBvRLhtwA}>G$KiX0FsuKpW9#VJv@UgdI&1xvpB$S`#Ib z3Wbx2EIkd>iKG2M{K-wA_)fA28Ld>mSc|P~TZc|hrJ<|ce>?Zj$bT%s^8lJk1OBfK zJX}SJf>y_qUh6|qZT-Ej;u&Cj87QOkWm-a}4&MEYbC+g#D*Jp!sD~<$VeHL`n(<9a zz|N<1SojcTYx**W@9*ZauPRTBh!|!~AjxGrDh~M)d%~%kCjX zd{LaGR$Y?ngu(&fv>{Yv=@zrwGN8_${f2~75Wo)tA2`mF0qzNUSdLQ?c%;y(AW4JN zuFCyh-6L6Ph2YMBC1+XeNNkltEq^#twewy+4n<94f;jN%O2Kck()apf=HMrzKyFBh zyuv^|I3;9n?Y-5)y6zDKmpdaCF2rAzw$67ou0&+m;Wl?Fdw^`dBA0m9juEJcfK%^h zM_@`o2oP|_qr3Xm06?Ync4BhssV(o&FAN7Xi#5jQo;MKVQ}ZXBS7mT3%}hJC^2<$H zRKOR4?Jq6c1pagVDY*(uu_FJ`!n>jpl~%D;P|rQV-dw)v%1(&Mk{PFDn{9+m{JZE4 zZXouzRrwiF&Io?pMt|AF4jd>inhew4O4oE5coH*9@P}U;4f+1%@%H>kf!lyf!}Hg^ z3>-%an6T!NIkYq;>&6tlfm?IVDU|a;s8jNJ{wge6r?NQg2pJJpi{{^7-fq?cOt*)E zXUw#KK2)YPBr~zq7~7q6V|NTNW*!SSu1(t&&1uwKLHvD_Zcjrw&E^ZL>R4UKEBbO# zU=0>Iw74P;b4gh&E7-o4z}|J}{2cu&|4{u+9OTG%h;!95c$Hzsnx5F9EgG3fP8o}uR{Q|2s{CDbLoP|TSgtw-N+Ku(`zKxMlkfu%kLPZ=2G z_A9SOtoM6BMQyrz!0|igvU~m;T)06WF!1I1$?wURJMJqP#-J@(;?wusS3)QbZ+xwz z`S6T^X~LN4(}NW0omD%pWXI`5Az0!kbh zf9X1Ss)yu}82Yojj$kuw}6lHHnje z=@080hMW$SNzR_FXr~SqY+RP&zV1hw-^u$gnE4WTcfB~Oa797m0tD^Z)&e^QpYeJE zspNI>3b0I`U7vQFPB>vpKk$dF#VT@U4#nf2tciIf>y{9sxeR_(KtfD$29AWnw&C*A z4sS{$opKy|O*yM7bf!fmboVKQr*SzF3=Ke}it$K9T>6Ox71va|1FBU}(1S%nSbmd= zJaN+SjPRi2_k+_UXkzf`?mymP%$U~MKTT{FFjC3%#(C^U5O}g7G~SV$ zjdr@47OxB;QR%LOfO8+z;NAb6JPna+0xO6pXI7_0IQK@p8qjfce1QQoUir%A9>HNah-^?#=6Z9$CE9;z`nG>I_DM^S9Jw`PL z^@CAqWAdSEa*RaP9ShH>I-&Jk2#<`nTcpsz3&IT2A z-~TI1tGMIOFRPXEC14TwSSw~oUUeeoYD(`2H==|-UqZ|+zVe7uvzwD=N0k=sJPnn} z{PvHUMUIXqEoUW$AwMTKib$PWt!ub8!#sHA_h_kFBydOi97eqm0#-M!%zk^2NDR)3 zAVGNl0Zv^q!h9Pmg8ECs%Plc@eFEMcIWjuj;I%O+b|J>c$flxxg6ti!-0|PfpS6zt zkS4s}@~z=vE!!D@J+dR=LUlt5MJQ)+QYI`tF-?!i={tiz_a{Rpj`_M_yDK$}=*sM_ z6@GU&{!EoD3rd|QC`vU?sJkNr0>0CDSCndz`HwH~D~B35YsXekWp_sS#LDvOHX1bR zR|#1M#0BO(^1%F!Mt`)T$Y& z)mrUsrU}?7!p@NXDmG@1lk_>*yNp1S33E2k*#WH|%s`GYR-8IweYJpRmqe(Ey1C_v z81lzF=m&75d_%tNiB&5k!n`xbkH`E&yadSEo2*#b{g-{7e!I2rH}r^3sx&cw!&H&8wy<@;!iHYMX=XaSuKONoWCZ0$M~uSk94-9 za~#HrUvHvo!%Q3sXy%yl1U0Jo`H>P54Zo<_wpKoO{d;DaljJbwx$=*c_)gH%?>;l! zRL}`VsYV^ZXMc^)B3~OOQ3%!*F*qw#L;}W!q)ECbGpst7MZ)p^v})vh*j@*7Cs7xq zvvsJL54!mU`w`iHy>sb?V@@SMlA=sU7(m6anC=ytdeF%WEEsrJo8M0y(2-cSkb^Q> zhEof6DDCeK?3J*^forD51qGqsGA)t@oMfHT_e;Cl3OnUBcg|SDMQb#;C;Tpdpz9(- zePD-_>Z8fqap=*!8jc)WkzE*U(h{QCf@1-C8&5R%4mYaZQpI!0r6KOx{s&uK;b)qz zlP1RwzcOIm+L#$;0$T5m9`;0LO4^@vjik3L61E>PfiWIg4BpdmS?a&pYy8`ms39yO zlBGSgt2v&Fb2no^ zH)2dx0FBSW-|tOQU#9eRag*E(*;|Q9L}s>WI|%Z5MZ4EO^k1S?ilZ!3S=wLm^!4ZL zcmuSm_y0CN;IDt%{@d6V!DpAf0>lXZ2SK;;R+r3tO!9p3*<5|U3OODLs5{viQ ztV35bo%RC(JS)?KpCQ+esv%1nBN;C5CtjGrJz>ljgAEMv;-^tWw^01 zgimP;hMU`A_17V!R*C>YT05nRG9hCCOZ$x=8hPb&u|vPO?msHK8*%Pm5PfwhYHxnn zK-zoHVuB0H*LVX0*U-#Dj9lFKb&xTMUW+)2901pc@eisLV;v&yR1P# z!jP*N(EsK}r<|AiM#Sn~dQs$7Q590+U(utbzjqg_?)1wq;`K?;EX#oYrH#>B>N)R zDsBPptHN2R)|ZI^Sx_k#V_WdJS>6V{W8;$qHCUEcQd(L$HvrEX;%PBFwK3xhv0J^n ziF6@0g^(K_`h*)Ied%n$f@P(4Schc@sqw->rj!rw*sm%}gop`|eZ$6tQg(7Q z^AK`H{gING#s%cU2~qJt`_U(PZfg_g@G`kPaDrKno^@Tz&=8jiA9$ojw&m@F$Xi!tl7-msu_g}J}V>sY+m_6 zjMrH!L-^AuR-x~N#U+10cbHD8+2qKxs(nUY;k@#SXrs*_dWDsM+%X3KYcj{91Yen= zqt?3ROEL44y{ricI5&q>`=kQ1@+H!-8s1{6AN2d#MnJ#3`dcuj?6x7q-E54Qv83?QL;Byp~VeBJy9lS{Y%5O1r!cCg~ERB|trA2U(ejv<5R@VH7hnwh*flxkLX0 z7LK=Q#Y3`l=LzGBCs*Q;WHZCaubYe!v*5Er|C)Uve38jTsxjar$N-6!>Y8eAex1I3 zq+9QPBflEnu}iGiv)nJJfe()w={QJMg5PK+Rw0$M5aa)luUy~)27UYIsO>C3(mVOL zV$~j^Wc0Dpu;>_p$~j1H1X+(!9zNHh&|!bT5DTKkkOuS9}jMTzC0PG63-+=9UUhESA#-YNo)`E6~T z!pSk&W_2q3w_MpmQ=jsdesrV-?6sb(6BF6B#X9Ini!pX&C4_z&0nOV2&xrj;xAV|s z_yu#Fx8HEd)vp-Gl~lP0)|k7D48NaO=={<}ZG=Vk!IR{JsAIT3mcPtM1!D>qrH4}9 zWuL0t;;n4S<+K$hK%z&lOXSUkwNVKs5@g&fhp+2Y45i@2DU?Z-esk4fRStj1ceyrb z5SBt!75&JMfkM)qrw?7%d?-1wtQDa|B4SUO7+t_-&)1aU6kRWLVE6*7nN#0gc>0b@ z1gVRX;=pmi*OSV@32c^)ss;iq8u9+F%}??Y8E@n*7FWW~1<>v(eIrfGAZh&(yNiz% zhT7}I9QTa|Js6q<4*H)`hez5#SMO~^P}*ihbORlH6_S1`mQezf zQ~eDJ{=QM=Lp=&fj+E9#N_7e=I5;&>UR_~_5Mq<`BKOc1!h$o~@sWdX(~F8uRH^R3 zjAj0g42Ok|ElLz(oK0OA)B~T|G&pF@>3o;5>?o7P+1j@JGD|wSXJ7B{*dY!kCMpQ61fH6Z{}(m+Z_8I+7X8H8yj>1etAdO&_+vFsQd2@;JVM{I zAS(UJ@P_zeoMRp!2UQkn@-HS;~!+9XtQ z_PZnhVo8LOTxbSc4wE>E>Y30Uc&{?h)u$EK?YCozzamZ^ax8G4e^g^^^T`eFOZi;D zC5Wr>3Y`Ot)-kAqkAh^$=%a!cidg9+i+1M!b7Eqp3*tB885n7t;NLdY+M@o(3wOM$ zNKg-zto>tFguS^0MM?Ik9d~f`3KRR?Hd7(w7ul{Kaq7MZ^i~kRxRSvp@)BUM*+`y#iS`+F* z1751d%Vp1BFX?z)=DnbE-~R4L``PX0=gbdES}?VN_ji^+5mi2;&y&--Zr9PSu#5>O zsONt-BGE_sJPyMf>}+@@SX9`DRK3b%t-?--Ke zaKc-v`(}OK2t-Db#YrO#44;EIY%M1O1J9p{UE5@CBAJ-81wNeKgcV(pL1r#lr#u0h zcl*9B-wYfQFMlrV*s>FL$87d@?QlO|*kw(-e|SyJ69?ZO7GM9!6yZrvC!Kh8DN*kX z`FJSvAp$bRsxrm-J{!KTHr?FA;vE5pX##Ck5-TDT=zno+hwNb$!sEwX@uQ`o}*d zxKePTz7{lBuOrK~inOLd@KEUSGXQ>bez^%n;#R-vY~+2zWhDwLSoU(~uIf%{ok!ir zSa|6^^u7Jp%{#<{iwj)Gy^)B+TkAqy4qd_XP(_2JWT;5VvT0^?e#P#nB|=!6w*~0@ zNY&J@E3!!h@$^S*AqwaPRQr(>bP1~Ub6|Ki(gFf;7cLb#4ZCZFwZt8KaThYWs{bPC zk6qN7K=bRF|1O7K48_VwFGqT-jpKP_eXWfXvE7Tp>D&m7dYjOA07-q+#%*T#bp2+U zf2oZF4!gP8nOd^8%FqD8R$JLqz>!47KCMMD1a1&v(Pb=j!1PZ|IHAq&P-dUc&GtcZ z??A1?{i?aFBZ|yd2Byo=z@m54ql^wz*cn)D)7qsUO7s5YU`&6k<#pn4LuzoL%Vg zV|HOgChY%UT|HBdk&XUHj*BI>yyBVd`T<|m#-ylhKPz7>t-!O^_0Bg|cr1-=5k!jH z7UjW24z_Y^_FQ#O$HWSX)+M5Z=JCbWO_*<5*C~O2#Z3ILUz+SW8`PS+D zt81bs8LrwE#%xyHuF+4-=q8}Fl=`KiVe7%TY&*Aj8T#Vsah0ym6THEY;X1{;aoA10fLy9(T z=CK=IVHq<&lHhSNt4$)$V;T6--Je9l!59C47h8Vm8*Z2B8EFCN;-VFk1Znply=#j46jzP zI1DZd%t4pKev($Oyj`6tMVdzLs9$t<96h|Wc4q)ZT9TCvU<3V9v}>;j7{7x_h*nh+ z%E{8hCV)MSh=c^D(buvxnbl#e6Xu*q|Jm#dj3`S@bcO6K{EUX}n$7DIf(FhYIJiW# zRSwFa%LL7Jdi1})Ts^)0Yr-HxnUxmR3?Yd5baLGvbMC%CW-Sbm3DYOdCiWSs*Ls~W z@^yQ#dmOT4!|ftW7ZPMZD59D=v-<@^_C@;2{p=Uewb8qO#!g~t$gOn&hHgaH(#F(Z z_AgQU@hw~&N~#IFESO48`wSS3>(4@-?fC1Tx36bQk2vJWsK~ge58@k7wpoWrKOK7( z92Z9b##RkN^dVrke=y$!d=fjewB9i&c*jbXqJ5~H020qu26CvYBW8M|_34UrPiHq0 zUqBf{dS&G&ACwu7p#qEUrLqFkxsEQUNB%dxhKJY02}5b#8Y+}Giue>RIPkB8t+o^_ zVF!Y$gxfQPO}LMJpBuw}!F`Rla=Ad!I$YB0J~rIg3iQcC*-Yek=jkqUelEoA$uY<* zMyGsh56Pj(F-n*EIqAzC{Su*?zi$YkeHqHuAby{mF;RZjPR4Dm&1}>lchya*U^fZ5 zdP3<=ZtVDj7?!+{k3019=%kl`UeWT+>o*Q!_FxamU;rU+MYCtLf7vG2mYT^VMyFgX z59Is^TnJA8?h{YQM@fXbf+37iOeSA3EDhmJCYySfZmU=y+7;a${v%&AIUb6>$S&iD zqA%|fP{XuAa!GTwcvl>uF;zop+tN#^c!KMn@J9tLuAd3$hwZ#5z)Z*d?Mi$EuADDd zB&QlR1I36~e8nxHgMua9$FawP=QqrA`3N3x@)<1Lh21!E|1pfz7DStjc(U)?UxjSvWdO^? zcC}z!8Iv99Fh?~A!2Vf;6b0sL`+`^HmvygFYW8piDot(WeKWg%nu;0oIV%P8#Tv?_ za`Bwx-sZ&_siz%BZw6zgw4+L=Wg)Sd*oJntDSHPv+-(`uTZyh|S3R>5^2VuSeZ1cP z3iRoFeyTv@VzmhhxBU6%wV_*T;-o7lS{L%BwEn%{QPYk84EPXKUX5JYD;F2s$|CZL5w;a&Z5~c(SbEMCNC_Sn zGJd`e^DkkH3_!9pthbGi1dXxvE195ym98{thq9tltA)-@{31D1t-%T6TL2$OA3Cl1 z@8;zG3$1Sk0?@a>J)AuQpbF=My~J|JF_d_8 z%043mDs6h3eaIO1NDG_byscQ?%v%nPayYDvIN1~Y5yVX>3?6JXRb;<)aBZS}OWKsV zZh_gmx)Aklx0pAyRNk(CU)`vf`2JA*tG7F*_jv?vh#d2N%DtSRq zLO<6N;CsU>?bl1^6}B!=N9w{|uOb#dkkk|Jz%JD#1^!OEWqoec0dma8>_DmHt>3Wi z9XWLn&ye6EH&SbnbdCPFUJ2y2OOHs1VtJ}Vk9>7)AytqckkcBN@31<_zxn^$S-2<3kE8D5^0)z=+pcE7&a6DjMIH&FO<^l!ufg&xk^@xtj5tfKh{OJOckyz|7P1#UckSW!CO)O#8bh@?WmTaM2;V> z44ZF%wXBxEAbJ;@I!_V(0Xu$vnFim@A&*Y`3m=1lqu(^uCThY5l`Ag)&yl=H)qiIk zIKZ&4U($Qv|2dO)?LDD_V_2mWB#`ywjt`^?oMAC}*x;2f#SoC7V^Y~#d@lPj_EYKu zY(jb%GF*7l{u{F7wifcav-ab)Sg4hR5M=A$^s2D%5$l4v8lD$PtdgbgZqpoUcDrvj zI23}Pfb_Rh0ptYiU;mt1g~(Jp^e=1yM-rg|K;(F2-+xZe(|wPId%wCnwNnI3`Sv%~ zX<{TUrp{kJA_S575b^;z{A+ycRhj&r0nVVy87UZ^;dSm`|LU5i1g}PCqGr={SB{!= z4HT+M4|=75=)$)?;$O}WPh+=Pn*Vdz-)!9zSpU*AX@{3zJA);NqY#S%g6t^!cA#=- zX?fZ@8qAsp86O3fHTDa^?rdqx?cud0?+1vJ-l+6gI?Qjc_#cG6dIYWZ^bJOZyUOSs+>FV%Rr5}06ICBHD&AVF^= zxBkfbp16#MQIx2dZ?C~|$sFBiOJI#%F246;?QQp{+@sms+pYB}nMC^V1~~B8erUIw zzIOYs@x7YckE8b5X}Xu-vmPPAx8ksHW1)*ze{uk4vaI90Drt4f4!CPxUZr8Wmal57 zo*29iPDaH&wnjbUG1Kl?gG7GiRU@R>+&b!>Kj^vwoHD4Mj+VMaWqKeLnc-c=Kit)~ zJFvCU?f-N7{#6)h&2`P~0hk&AE;ia^{+njj{l(>wMu%y*dd2ta_^8w1V@?V98;8H^ zWjcJXiw%=ium=|in{=;`&VF(KOQSlgh+0#J-lf!sal$!5LQ{6c;4DwQLOK&VW zEU3hjH-qFCnBWa4iU*6wXF5nW?TVl6u|>Ew9`*|y%Ve|4HO;x$G>Nwx{s2##F}_h9 z_KO&s{8}QxlzMoE^@@jgshJw}n_tB|Z69a?WkT|$-~4Z)=C#P5njL+8A<)e+d#L2??6cB}YiD!}TEKr_ZOLqJvWcC)ev7 z5f8`R&i}-jLO68X6!KFu@RTL9HRW-)+qI^kzsMp_a}5R-d#Z6c2eU?n#GX*J`y*wA z@onF``Lo++uduh38ypF)sLYaUZWcvjs^N)gS~CoLvo@ zBX+e6brhkCi-o3U)yWy+KwI-3cFOXYIBw1quD&#zXBNsX_78|%`bDb%A#u9Y)jx7# z#1wO&1%Oxs?GHyuJ(X<_{dnH0*rBUMCFtW$_F!NSDnm8*broNZxxn>H%{rFgcQ+A; zuW+c>)2Q064cOOHVVz{RVF% zkC{Rf_skIc8Mi0B7T^r9kU*BtceU{KPs=sQR8(PRG(RcZV)GM6;-qSNEWv0G_%CE< zi$U+B?#P|JjY5(f@p-4Bi62;;=MWgzK}vBq{vQ z)hl9C%g7LZG6Zz^;Do)8ssrje^y2|y_M<_$pt)1??j(4d0Z2PMh@95BfSWg&};F8(4y4 zz(fRW4dF?E;GK15Usv#|D>T#rlpnoMd9t`7oN+>j1TMvTFd0k+b%PLl4IbPxKPEMc)oO982G_ zOIrukvxJ8A{5^9KAIanGSPugLh+uJAyqQKyUZt-t#5q#SYK^ep|G0;<@GEsNOPQTZ z^3j^mDsOQJ>MS2S)F0jXy{mjcQ8j3*vMb}`B*d{76c+9Ij%}@EkO_N{CU3Z~LlOEo zc;5l{z1yW~9&Lz^Y&@=fKVbK(oYPQqM8u!_G7ryhrD-QKI{Irw)Z<_t#*ZM>CSt15 zWpYDDH^c|)mvL@Ev@@XncDHnq-oa@X2iYN32%O3*GB$Nw{|GoWQZ}}$-faPDVaj6o zOV?!gE5oi4E;tS?N+ak9%CVnuL3oVutbxGq=;pODy@=SdsXgS^+X-Lz+>s=%06UzC zG&Q?mBb)swPoNn?(Dyov#$-Oj95UeF z8Djw`ABpSZE5LK?E`7TOx(Fsdmk{|{~FsND;0ZyeJzUn%tu zzI!s@M5s95D^a zwp-C7YclgPLwF;U;;!$-PT1x>S)@;c6ZlmOY{l)XoV~6f&bJQqhvc6T{0oM#v(+w@ zw_hW(B7qZe*H()?k0uO+UjuJ^c~M4-MyNMKZ&~%rZEtp)Cq2sQhhu=dYg8%py3ch6 z6rzixd|F4ll`~VSpnDu|K_~u4gUpEzoD!GI{^K?8{~sys1Vc3;ydKe@__%X6D>N+p z4&g+UVxOf((4;K%&#kOviD?hwV$W|YaY7k)YqXP!uwX|CmU)%m3f11B&Gyu~puPqU z;sU58(+p^0#!5oSYjkizK`nFTtJ=N!3Vt!^qVoCeD7UyTR19L(XRCIpC9Y&qINXSs zZF$^ry&x^01~}cL|6kd%+p@+0PG$r&FX#PXe%>AGuW1*Ym6uxrZi2m7JVVf3);O2r zS&q#9{KpI${UtrS;i^u;{`^2|Pld-;$dkhA7Kv#prIb)|8;Ul_6P3q$BhM63B9tfQ z#lH4KjM81c-Xdu|2si$%W{&A1oxE?^z7Y|4g|q1$gO8Hk)W!?!_bnPz(SJ0r82Psi zz|wIoEHC@Ye1O(gf2KmS~{AC zaqcx8aaRKZ?PrT;;Po{h^-h-gU_GFtz-7B=u@?a$1_nVW8++fq4qlaZ^WphZkD zUT`|W)yZVkHwD4gwN{&0Zld44`$h}tPF6`5r3@UO&+vBW zPF`)C3Jxi)(jC9(ss(rD6|FLl>CP)xUIQDrm^=>hXyHJ~h*Kfh!uy~-Krf*XH$HR5 zLAZ>#I^PKSQzhBQB-2}tu<$`XgMAP(>8@Y4paQ(pEp)k{b-8xVCX!kL!s9;&IP78< z-sQPN577Ep8Fk8L6emZCIgsMbJ~Q3zd0ob$_8UURK<0$&S39kN<3OzQ`f1lVhnWeS zNPg}5a0Wfr_&|8Gh>A367>Q9H;Ft^H%VMtZ(Y(O00?@8pe7>p0TS5<$3+~UIpJ+IREG@5R(@oQu{*V9x0}*kEw9SN?P=SDj8|s$uq#| zQUzwGPQVwycKjR^qgm!KU|LvFC>3ndqX4zYSJNBc(uYe>E?9$*$QJaf^(FcHB2mKY z6`%3oE$FUs$6TJ?JyraJebCbO3#3aU7M-MXD$iDc*vZLHhABZ*?H4+F?jFm^A!2B| zl$Bjq^9{+m&JM7XwMQ>RZpm8JwOSH&1Jm!36^2PZgkb{F5M9tuHf>D>#;6kpdA2@p z$6i?5TDAs^U`A&Di>q%64y22^jWw}t+jcVX#I`Z9lL)Z;eV$qhg4pO z{nxksxkU!7eqIvjz4Xrgn9g-M3z6ls_mf89+QE26bs}Rs3^{Tago4p2c4AE}(P%Aj z^g>-2p(heMn^!?8@(Q><4mxv2?=~kNmNoQWK;qPkzA$2>`*} z)QxL7P8!qC<2|^j66ICa8&@i44@e8)(aI2medq+n_uu{PN>BD3$Rb*3fVFI9`dVW8 zdJ_U-hW^dcrvN!gzrTmy7HrR{%O5XvL*~!YD#GfqTq#K0NGnS%J1#$)4&%GN{MB;O zfVZe8!0S3|RW2KQwPNE5`G?0+{_3#ofIyo~pA+>FK6HoB2o8l-cv02Z{%m|-v@}Ns zD5s;ef7>?O!!Ra{r6Rd`;N|K6=YOAaiMId%x|SkW-%MUJFQ#Yns!we9LU$@$f8u0Y z&AjY!xH$!z&3nSxuFeCr?~dP1kv6VTbO@|=s8_5Nl@RP_h*VxY{8kzS0dt0O5y>a^ zFO3Kl)5)Yu4&5w*WU91^kcWM@R`3z>6|}R{y*d?=L<~EfvH&GS44a=k338`PZL@>w31y@&4UaZ3OG>W97f zHGW{-ic6PN6L93G*-<&KVxrM0CyWY9SLo+K6dTb-^6B;!BIqCg`yP8tii_vw`Nxi~ zjTE_YcEclouXb5NQ)YLg?+lxyJeLXx#=kh4>4B}74fC!F=|LaxSA`9k&ySm#g)ifWyG+HfuOUDOXZG5w`)yN< zZF=0-G?}036Q3vOQE%8?u1;F&n4F67WENu2g?Fo(USRNs2#u(@x3wM-G9ERy-7! zYxtF+E`9L)TxQ?U>`$A2Tj3Ea_{@K>x`NU&A`Rf@5Y7h|y_=*|>3Ao3pp3cX6qf>E zPa4UMSBsuMA*~YXve!q)xuLyqPYe|f@Gq>g0tKR-YfBsvpV+7Sa!7`GR#mXJ4D};Q z77v1At+H-d1azCEPo2qyq(J`R?x2sSN|1t*0$)?xpScs-MF0H&9n1{svs8uL)LOD} z&3ZZe5P~&v@+P|7_)6>ic>A8TGtHEH^2S~=FzhVc#0)uqhn(WKC;n;i#7zTGC;y!5 zJ^O$Mgvn{A44NBi*r^wR1?jTf<$Tneq&&mVrl)il5{^QzP(fZ+q59@*F zGr69zsJPw9-w+V?qy%Hf(uIi(4|%64NNeW+kz+Ad906xyMwKlKKQ*Zzdk! z7NVa?HQTZ0DQ>7v;_qAZzyPN?o|^4%2qe?-&pPoufvypN%o@1Pd{I>Hw#~Xb}4m=~sUX=qZvn9{Bqm zoiUJXY4E`zU(3b~zo8c1c0*WoGKt{+PxuGjef@y_%qmMlAbO!RaPktBlVDj0A3|~N zNN$Dw5IN(@1SP4SMq+Knn4QRIS+jp-q7Y8@ny^R=Xk=j)r%xeZ7+d!cOh}E~JIQZv zt*OaITI?yi!dgP0#vFLJEA9vY+bH3d{yx^%yST;Fy2S6{8u}`VJMxXo!mbt4{9LPd>rO-G@Z3 zl@bd(4{`b9ddl13b&Ukz;ZI}YinUV}M!gF{-=5MAy($&1zUoR-WL4VExXme zs{q*aJ6APh&UK-;;75HE7#!6hVeF!Y5T7ML$SowBd8w}RUTLv{=9(!9N^gl(msf?b zh{}lOe_J+|q*wVAX!R9>?UkETHFP@+scP|Kmn>+E0^N+$N4X7r4^++>zA&0BV3QfL zRmtiH!PG)<3bL*G>iWKXzfZ{iWnc;Um$oqachALfU1~ZfeF?KHwcHxWV6>+l2gob% zIK6Q@^RyPJ>fKdCjKtK@lY9K^QW49lSCC%_Z}j6e9?(|utJt$?l#?$MGQgj zAEicX7`H=W*fNg3Pr%fiaD@e;JI_P&m+gV-h1>qCIQx|l+gla!z#usFQh~I$jJpU% zoSv|&;AtRwUHj&--~!fYbNLyE^Sum^;eB00&ITJ$aSvwy9^b(PU>B;C%fK$Je}MDr zA)N*%%F=O-;+e%lfG8uYI~7N1n|<*%5ZG4h^qf8(q5ZPsQ)muKPXYt>>m}^a z#AQzE67i425A0ysMS==(s95$W!?sqkEqP1t;e2r6w!#Sep&KOymFsS^RpyH5-m)x0 zQE6^Bl{)|0;M((M4rfjm-xfDm{eO^gr_hroM>_JEQSPAYhe{i$`?2DG_lY*@YH|8W z?>F@&;Ub*OQ{a}fmvGMwYTkfw6?|q~Aj8bS)#>-=rPm^a%UdfIi zMzwb{YnEh+l)>XeVr%(*>hoPh`ydiZLSL~7N7hN33nxJHaTVrg$5_UMxj#`nQlT2P zQaX7;(Z8PUeguS}9w)xY2{fQLPVcD2E#+-i@LTc$n zyYpZypD1P?p-8yX2utZ3*b2W8O$6;u8_M4oPX~NCvoSF^d`Ut;%!(IdjVk7ZXl!@$ zk{ZUyI!Xa`9@{0azjt!)>R9Yz3MF%g&Pz@9VdgCV{8Zkw<@o6`{v2F|)WJCsTCDy7 zhl)1SSLa)J&voA8wC#m0<4cAL{cYe_TFy*cRUb>B#`k%5*j0%QvrMm((I<$$_z~9E zEM@LseNHP-;i23K5ddjXe<45OZxdUTaCW)W+ja@mjD?+C__lm-q_1R2?l5GeAJ9}?ZX2tUrjFinliTzZ`Rc&9@aaTz^`dAHnaU4LoezU z*6}u~i&qxHkXEWy$KIcuJkK5s(6jO9UB6on9cWq((Ndg%tf3 zgI_?`f``gA`~SoL7uqLXy)>0>1kL02U}mEvb?Z3^>Pj=W_K;0R6`Zxmhi6r9V`rKt z@Hc@r3nx2T{(5-3pVQ5`b{?W*#>8AP{RholZYYO_)S(ej4BqkS%#vmy_Okf)*Yp!6 z_i*G>UwR;a^f_(sMdOYFa|VdNYDovwx>YH&S^sG!OBNtzp>*<+eQS1#T#6Z6p9^XFwn{Ay6tr=%FB=3C#_; zwfuBU{Kp&|L%CFJ#MoD3KaKUwvFgg{G= z>{Fv)drTG}{V2D0*1o|$7)q~mRgm{KH&kKMwOdz7FF>fmM|*WEqsnqTD$Y41 zus2IdROlS3N~1V|G=1qyP1a-sQHNoNGqi(t0i0s~;{D!L1I(o3z6x}!Y*E&I-|y-W ziw33Y5x3+sLe8hJHndVnA)L7VbGd@WqU&+NTYe<1k(?0MAIL(W4V{1|lWVhyIiOuB zD+=Dz-F&+Rkj>aXBfNNg8F2lFs&KlNjYVr2C?Ph!gPpa-xi&j(v<``HbUK!FYpt>- zS8v1pE$^#l)Eg4o>wty7Xu>3pFb$VAQP|sfxhBrNt>q5$!VG8v zeXxWr`KU@IQ*xqG&im!@ae`tIrfe$ZL)=5__l&dJBP_+t8ECl_PaCzF=(m#pzd2P&M(xl)I94v6x$$#J+*fUe^MJ5L56coZovA>Qj zt#wSGC5`KZ9~C8eLJl!!drH3^dYqqUp>?n}P1jn!`FWfb)6vGWakvDA)F5MfBd6t< zJNW_@0wADoc7x!h9yD@Am=#$&pG=hn7c|G+9Vqy-0qyJp+q9$-35E!(kew6EsmuPw z;?#sq#>F{W)vUEMKZ`#v|{ocuge-KcA z`6PHIi#qSmhz)Fzw*KYBp7ACbM~Zqp;sDR)G*zC$W|p$+xM@&_VZ-9v zyU^?(XePSYpb(6zwS|x^w=u4mLrjrLH|nTm(OIP;wrrYDjE1DFv*^V3x(E$^w%G)9 zAE1>YgW2AhJsE3Eq{1zHrX%v@9Ly?W$vLAz2WA!j$X;(xCwLtjf_oJ&o#FGNg~P8# zo@NIlaF{&z+7PO6m1LHTY%-6LpS}rw@#IeWzPLP!e2N@Yd}QHnE7pY7{kd@@QsokO zi(V)}5)u*BpWw$is&9ieGMAM`T+0REoe);Be<#DDe8%&yC4>r%$2`9v4jKB@@`l zPljt+zn0i%g$<&&VU22B%%=y9%xL}GlOJ`uzF=85P!b&2^#PK&M0O!G4Y}MXZ8cf! z+V}an)Ib8@?T1iMruJ+R*0VeRj#)Pq%X}0zD&__|Au>%YLv?_x+O{Y+ zEE}{_#voh_zC)(&ggQ}wbF@hX@8QZf|>%0 z)^**}mVK!-D>uG7oWy1A)5RlW>)i#91nTG)4~a#)|&)0O3GmFm!?s|Bprl*AG7(*LJdThP3DDQcZ%iz$Q4C9pD~LrgMdsr|0K## zfx{~z{Qao9$}pRJLZv{C16L%9SWv?Kag)lkDENgiahZrV_!vQEC297;MemY(suegW z%Dp0;yeGd-TF~&v+`{AC!C${jaWQ?7uIsaX2`bz$S1gO6v+GjmUl& zt@Vn3Qu_;uKmSf7Cc5{AyK@j7n?>(7>hu}unShO5LA6w~_?xzvbh$>ul6N##EOSuC zU8rxSt!&DryMF)BT9k*|m$d*EZoTJ00XKD>dLpnu4eEF}P-CZhWD)xZ1dOkyc4{s$ zBu2F?KiamvL4V4QB?CQt7tR3_SM?~TGf&(oEv1AMa@l=}tEa*6 zHl^;Qc0@>CADy;nWML%y>bXVVDsqK`^PgpOw}3+N32H=GH#<7nw`l1=4RTFIgC!`AFy_Gr3Sl_&~BSl=Sq%h~k59 zPoH(2NW5QAmMAS=qAUm4Fm|!2b<=-2!H7Sh3=h*b!t{g+(~5H&NYWE$8E8sv8@l4c zD1ET&*5m1IC|PR^Ygi&!(?^_l27){kF8BV&eCb*_sP{XszETcE%epGv1P`>0zcnA# zqrqsfnd{qL?I+9ydM`fzbkDAV9DVlS3KH=J38kmtAlft48uA&?9H%|PdS06fH5ucI zVZ*;DXP&ywm%gQx&+F-eDss`kw)~i0Yn%wTP4z|Vtf4QXUNOKIQK@P^UvNF#EB^_F zaacm98kcctW?I+9UOpi9Y0KKK<|tS9Ky|ji<1CHn{p*LTFRe+@Z7x@WwJ>EQQFg9O zbQEIcczM3iuTUec+ou`^FM<{N1+{$ih7lFuq`SMxcL!JRiR!;%2&}sOa z)UnL}(zzItX`-v$9p=Y{!rJ12IOVz$d;v_7T@Ai|z4apit%tFV#e{TQ4uYV94?zJv zP$iBHOxNEt@RrB;=6bMo$A8PgH-bG(G=0oi%HzsX87?rdmB=KIh!_O2pSV&xH06DU z(6dvAiA0zDC=D_7$ho(QF_J5YD@3-+&*NIwaiEr(XcoR54ELW?GaTeXF+M|5+6bu7 zS!|+6azH*HVvqQvZuql6+exKA*(LP{r>U(L#+(nhrCgJqQt1{ACn;4e)Oc>L|MnvCpIc`nY6(d7- zRgypgIP{`Yu(O;ZThTc$QstbGHARfzM$m#lGg8AuKD?b@pH!Tlo{qabj_g+HU6(1& zp0jXx+<%EkVMg>tlu&SBI}eP-^v%mH;(Q>VV0hEkdDm@R-Lv@3+9Il9Oa;n|=23ys z6Wo$2!%Xaq+r=o`OHoq@>d*O_&JwGWM$a7sV6fXt#~?Gu|~gy=42T}7}+H7mo_^?jLW4sQZPPopCFzNN%z>&uqT0D19ELEWsK zIafmJ6V4rR{>;f5Qot_kCn1uJACGg2RxO_C=s{#x``%~lyVty-T@Iuheo(~^ubDVN zvTAKyZ9El|$(`?fx}!K~PC(OB4B%8T|2GKJZ|IIr=6&3X9cgE9TUm;l9;5YZOvdGv zuzsdLA!OKUNeM+tXe=fq-P)J}OSF@;la;o&Da0+p8>{n5mC7p6Jog{OOs4jQoY5b% z%KSCN%`O>4XeZTe{ED=WvuH}F`b<_hoEA=F(Z;J+9M9AlZcr@XV1kR9Ho=aBgG@L| zv=d%$JmeqNqWbk1#2+d`nJ+u;Tw?hF?|5pS?X)P^%DM_)-A>3P=Vq%7a|COiPaaE1 zS1@@Q%|XF@S}(%eDk}JHa!Yj%8Sy<_A(3`t?^w**60Jre)yp8yDI^_bSbDwI=2e$t zem5uhE+nYjdh8kCo)%JFc+Q9gA6F&s;S%o86AnxV66wdHmdbUnZ6&o)5q;l)NM6A| z-<6{c*DKgY)n^iqX#r>vZEZx<;?rnn%t652Y=!G zU8DOv+J9YFS;G%EOc?U()gzqa2Hv{(kbMUq*AIbnTsD9yq0UERva%c$J?DisP!1vq znJ=01076FGnV*i*-TlSl!z5U^3$tVx=06+tDT&~abKx?kq_(CQ-x^U`nHnT^&*g*K zG>R2rFa&OO4+=x92CJ`pkluisErZOl@^HtMj9qQ*!(9v51LTqgY=4WP3#)rXBnEbI z_0}OlkW=8GFEUP)=^ZLMrS^9_xN2}yyH0eFKTGO)TM9*#S*>{qJr3K)aE2ag$X~A- zV!6Dr7@?N1``@MV+oE5#xlPv?ab$bfrLNNtnQ@=S?hT? zl*zW3m+Bnj5^vg^r+IAubgrn8_`T~Q?V3?WnL^Ed9ci@+sEYmPvyTVf*@&^@r$m0D zxrQ;%6V)fYl?#}z;{GOAH#qy{im2;aGV)>Mx3LY-EY+c74u0|0xh4CliRYTo#=*^&T#31N$}l%8kjN?Y+8?_UE8`GaT6p8n&tPcF}63|U0rOr zFbWL?D&~Q?6Z}Lx=r9ZDg@5HHjc^@5rq8%IVeH83%D0LRG3&Jt=2x7;5E(q$ z){>~LxZ>1@ThtG@!`sOX@A-UW~504SkH#bQVGxYyC7Mm;g-eA3%sEjz>Z#9ypp3v_ z`6z+Dc#~UibA_Vm-Ra_siCPDD@fZH!iMiYMl@$25) zl{iUlYjGA#zN&UsDr70Xc->Mk3nMP3oxdw?vq3781zr1Fi~lELNU7jlarLx-`?J2M zl3Bs6sGUcrM?e*a2Jiu)wa% zWL`^gNGZ>`(*XMS&VnY1SKNXqTMeIp{4aQharMAzu= z2dDVwxZp4j!OQK#ld?5k#;hNn#_drc7&3mv)WXilc|ruB5r>&eukZKvdADkTlM6@= zVe*NREal^mMW-#eqhriyNZhHHV}sV)y17}`()xgKx_@hTj-k~rfiEA zB1o61tQrV2`=6}$_l*rS`X2WFL!3BO_AFt!i~Hy&D&v35wD+Ll2SW3Oq^S{ztr`$+ zE}?VV@0=saqtJ`z5>c0lPVa>()WzCNDg7?z{OPyM7)uP%_&ON#$?tx3NPoUuQ({>( z<+=dme9xL2xqF+&F29#(eLS#Q!9P1fY3I`$>eIVVu%5_56_F7kFkzB$`}3`sI(4+L z7MokMsP|*=%?GCwOEI!gtrVVaGSb z=FvGhlI)?w7!%8L=a2|LJ_SHc#5L0{1grq;y)j%zH(eRN#I_3|AC!$lW@(F|o^G@m(`N_H zPU&RKFh`54aNgCvd#==;w#?1)qdTpQxlyPz*xJJRS>a?=g&ZpTz7@B_|K>CvW0s^a zPO}sp^J1tC3uYD#hG=5Q$=f~sqoQ>6BCxO$tysL)6*1QCZ`Y*SlZ%#1&I-XR8vKh! z(MQiNwnlQde;=Q|?0e8T-ki6cp-BPvjLEB+`;22fg2w-eR3fS^9R_y&IZt_kZ(SjB zjLW3fskRl9IMx7f_IB^xGmY;vvZe2@ESC>8X2@5MP#0aFHK!W9DKqRns$GFeiUN)G zhBS%rgmdKTL*gmdMcKm2f|&7w=|H^uIUcA;ntpICx6W7z2qrMjL{q zDvGrxK^d8-oiDVNf@-(bVpLMbl~17JJVI$NKg1OCd=Y}y(#CAm;&!2OlH0)# zE@N|wPd0#xy~&`>QOI&lSA>bTVOfy9+R#cV~j(WkE0l| zX1O5iW{)S~&9C6ZErJagmgcA)#82fR_Y~1|c-3^nCZSWQ#}@bUw_sCqLgXZM0o_@i z|Dx=+WzC%fnJUtLc^$<&_Tm3;VhBqkTfNrGNjYi|lfiU|A1>VHst}GfBV58dnT;gm zG-8ZOL4nL1$$46GFBUb5L?{o-m`aVp`fJ zG#0(9*(b_p@{vv`G4zy}hgn~(I7Y5G4aRPh(jd|}7mp5*+=6pl!0jzo6ZWg>^24Bc z;0H6?Os1Vo2ZIHGJVs50euC_8HIjz2FXJyQp@Lnlsy}%a@AIsD;7D}6kkjh*S+4m! zmE_NFZryg^zakVd)w)|$EOQG*ywjB2X6NjD8TrLF>1J460qJ0|K{Q8stkY#b6~K_9 zT6PuSLi!_sQcn0+uuGD3n6A-jCmV7~1^W*QF=$fsPd}ind}6m;i>)^P0hya6OdNLG zu&j3UNB@LbBWI$hGD~u}WYbf5!({ioeuja0k=}w&^UpirlxgAio-yJ1MJ=V2K<~e! zH?C#<{~&d0DQnhZp_^j*5h8`1_^1*g*)xo_RB15^>TXUsTJD=U3RPG->q9nY$0hLG zLoO$Uul0fY*NH!lpy(lKA6P7(lXq7Y4a4(JDBjmTBX}&?*q{UEh`=N+cb-B``C+SB4CzhS17!E9eQ#O?BmIfht4ug^gvm z5IZ0{Z;sQ?wTb?^+~02yU)Nts1+Xhs*Upl(Y3n+kw6^1k{nkRx+txhJaT8aZl?uOe z>6#O`8drv#YY5nAeQUPYX}1df>Nrk*16gd8GdG9(S_|)uQ1(c+cnU(>rY>i6TUa-f zmVp!M3fJ|%?KL~tDCgK88^l!uJBM}4{{b?l2!U?MEpuj6)o9DA^ql{p4YN1wEWjRc zu8v&=bqGA^w@KJAO7{G77Mw0ws|`W4VQa6PI%Q2QSZyCZWyN~6(=%~N_o~%d!PZ+g za?uK%yCpE!=gqblmYt2~bd71`-gnlFg44r_Y6%Cjguu{J##uyM5kK`<{+jisk^}KU zEwgaq{JH;>vh`0>d{C7^zKS~@Y#8eBG9j~5heWT^LnOalSkSJk-Mlpr8tH0iy2zk7 zD69+J`X%9k*ie`OvP7cH@9V{pPV8U0v~=IL>%fH68W~VrfXgQN z_Kimh*v&ba7U(0~?3CVdook%WF!On|YfT3E5{MV>2jjlH$}GO*wRhZdy;g-DPdWT| z&Hz_g)-{f+ZWCH3vDL1Aj%%XU?yqy7aZaSQf?Y9h%lTc?@AkK{+cwU~Y)LyluDWtA z@D(e<#y@YMmGp#{l^Uo#T%N1~l-*3D$45%z4Lnyy_zi2EPiPJ`v zZfwB{sdMd-TcGPxPbS)d>r?{y<6%F?t|XK$Eu zP7hU1g=00J6bhNjP@uJE%sol1K{PZa*HML~u#Q>Ar?-cfQyn&GE&Ch5;e5ry6kFUT zXl@WW=bhv&y5{3v4zZ%y!|E9rcN_V7im5qxO)A8gXyP<)bo86xI1N4{_J?Wcq`77b z7lBBq7{VjUpXN09LJea`MED|=tDigS&Q8AG7}4nJ$<>fMgv@6H{l?8cIzR2A-rN;} z$g7MwL1RaI`xnv3fzo@@>%UQ5CuoQW5cXx zw7;}TSA*|H#zD#V{f!qGN!*&%eBLCc#n0A+*rnc$!VfPsmLvvh*^v#T#^L@kvuhgVfOB zA{H#ZND*!11y!4XTuB+l4Eu6METQh6!kI$Qe`QKZ^$~iHe+T$TU}W-f@ZpBTlR8Bh zl?~^Rp_jc=xNc?wFUsN%8+=vz<6*bzC05D!MRCB?EmD>Hh?5u3j4#Q4K;q&-j0F8w zO!}~qIr97#3a^h<=ury7H~Q?@C)%WyY}R;{=-ULXnPw7z<;{O&5-KtzZ^=?wYIQ-V znX^nuvZF-r&WsXO8H#&Cu}#TV>^lh^2$f>(&yL(ofm}Etxqr+)n{tJ4*&j9oGsl>S zTMQytfq0}1xc^#*{k1fnz)r_QE7>ERs3^M{leyxdq!~_#i`{Fv6bH9q*K4D3&10Cr zuB=H8$qc4a#pJ)4D6DrO%Dj>Pj{8t!77e&`>V+zKP2bLi*`CM7_ zC=3;4c)!1}&uX8KN}5JRno3eX%VYKxB}-vgt8SNZ4_@C8Olz0L^9dpT66hI*JI5xL zQpym15;7@8hr46Kxgrmz+&@Fq9nn9Uo)gdaX8t6?hv2c%1rGC_6`0S5$xH{bH$7GT zHpa3Q@h-?)vo~RVdjG@Ul)p;yH1&_MqjDFecd%4L1RXj|)}8m5XtU{gDm-#J%uW@L zhKWuJ$1oDC+6(Hax6(7Y^I_bna*fu)DmMBPX_dBZj9c827V@`hAj5K(0fmte+}#XZ zLpn=Tm;&a91>mI9I*W5_GMJDBmNFOtvgb77fUOvppIHy}pKxSDI_I~q zUqeddm2G!;_HK>8k3)rqbmxqQAOW11t z=T5bjhSNm%GtPf$NLA0lpBEvf-Ryltw}9w6){~AGrxf1emUVOf8&(MCl?7=VjnJMp zc2UodTL6%*1=o0(#3ZYNE!Ve~T^KH}z3$#}yr;aBFTblTZqcE?!%D%YrShrWL;|Tn z=BUKD6E2^w7V(!H38ED>mO9s3bZK|T^E+CkT$YkH9krsRFc@S3R zg%-7u9n~t?f?8Hlpt~}f zFGIy@%>1QKS}U*6ML%l{E?)6$p-o{rU<}1bN6Kt=po)=)Yx(*wWQbl|kiJY3l8@xbY z6xO~ks%XJB=uVv^qVmA(#WU=eNZb&eJWfRCIW>EEau#G@dlh>Lej$19{zvj(m^yXk zOEY}|4>Ppd;DY|W#q6H1EN=KhzfYyuDkVUVtj~J z-EqD(gnHJAUx=J5)FrRXYdlu{$$oHjuHRMJqNIV-+M<=jh46%dctIP64zAm&(HLi8b4a=3psBJ&+(+(NziCT z!Q=*S(|JIxz<<4-X~8%p^^dh`-R&=12;3OOp67i+o~$A=*PWD@ddoR5OxYW9bNJ*u zJ!4B4ZLm7(g|P$lAo*r*1Zzag?kFIlAU#Vb0vuqhlgvMEWNA&@-1U?j-|Gl6jnu1| zv<{CQ#>#|y2h}=vgn=Ve4_cQSbiD7divD;}K^*N>w)PR@iEPUd$|x1ro$+G}nRmRo zYEPX!?$^ah0oC`1Tuyc&l#ReuRpel5&vOa>k5x(QAk4+CW<&FQ*4i(4loB9>IN7+!5=`Q+bbAWt2})q+a=R ziBo@a(c^{_PZZ&7$n^cm$(L@r>`*j~(wL3hzM3h>?7EXCjKt{oz82nI0g%q>f@W^*5H(FW}$Qpr^j37H*|{V(K`F1zRLEX1aTJ z8SrB9IeI%=(_BZy@m@v=oZ&Tg@V5h8&T$*4V%r~|q;?099Dd{;AH03(n3}wHOg(FK z7n8T#z|Rozy-r;Z^QOUzX_MvW`h%hjwLW$``eZ|H{ff3 zG95v^K*9@qTbbavv}YpG+#a0o<)_ESE>pki%s;7oDtab(tAJVbeS?IVpCL}S#^{R6 ztBRskb$ymCqdP9>As+V*mj%pqsMc!)1ds~6DZPKG;cv|mI>?^UQ%W$s{(I70SMlVn zR~yseX~Yh!9+pixwC4r%YfXM(mJ#}EA9PwCld5VK2lql$5 zTB{{{6FJLPcJaem9z(wc|GmLtPofINq@|ynI<}O z!w9(W$yY`|Vtz6DW}ahW%M&{|RXKSjI7S;<5r2(EZw`pxP?9Ar9u_kh#F$#wmhV>~ z2V~BphzgkRsSE)-g_YFQys(qUhr8*mzIIuV!CHzFI5P=zq9+GV@@)`l#!Z|{Cl$h! zq9KEqHx+C~Mj9l#zk)Sz_LvcCJW}uuO6bg^%o(lAVU?u79zLr>HuFjwtWGLK!A#(9 z60977TrV2k%uxkCd~Sm?lP#;e<52yEm=6pdFgweBIY%ILPSup6rz^bQ%|{cx_yGT* z?SOd|_5`3lNp>)(KgFMMY|mv(^6~z3=8*~Nr{AiY9!>e&Dad#_(GY*7A4k1z%el9S zHp&ZY@SS33xf;V}d4=u~hrzu2dRTcm zsd%R9!O%BqWpeJTLhG=05Rhkk>8cjHyu5nN*WOR>FU~WU;o&_>b#c0k=8cg4m^VBD zJX*BkoMS_0f?*`aNm-S-lt~M?>6J+zNhz?0Jcp~*CYk_2FR%O0ck~YYxGuk`U5YA; zXw9HV+~#VQIv6ZEUP)Y*X|@7i*av*@j>nRz(2Q1Q|>_u zTQ6CMONZ_rY03#h)J6Jea)pM6I|m#s zy2ERt9rFt+uJxtqh071*XAO&L4KZ@XP#e$AfUZ-iu*OpTs&lfu`BX)~g>^cANky2S zk|)JmnmX~he#6#x{^XcPsrdtKt=J>B$9D z_0bwUDZ}iE#H-Tzs?&ZvU~%SZakr)k*wk(J^0pv7xg5?>iPuk*G31a@DBj^I9-0cX zE+(GxGUsjGfP)Dd`#l}Mk+>m=_ zzN>xT3N_v>7YO)1yBfZC*uMuIHZRqC4H@GcOSX(JAi0#k zIkin{vqq)1$?g{$&8DukL+7NIPSn(*u?=O5t>5?Q9l2?~zl_i97O#_Sqvu6q(7YuG z4@bh(nu8SBKTVs`d@`|LZ2Zyc)+zvYKH}Obg}W~BE&xEl4TMWj%1y^>XhBRBS8st%!Gz z3m3$t9@cDVcvRs)w#uVrkhv|=^>Ve=4gC;Gz|)iEyKNUPeQ%QDwf62r$PerBH=Kv<>%{c9#UaYd1Ueoos@vd~wG1=w^rvGy;3wm#I;%3T1ki zT>aO`#Da5_WmJSvLoZABCl@rhMD$9-lx$sNXF-W6=F*NroIC)|le-n2sur$vY}W`{ zMK|o)eybUW&G&cs2j1azxMcc}p?GXGc&Ym_cVV@ehj)+*(>5>)3PqjjBuOuBD|zs*4+K4{Xo-Bi#L;p%<> z!Gg#X%aF5)dJ^r-p|Yy& ztB_Ql9{O`lV6L5)Cw{anBl-`TEC0!FN&=>{^SBBewf$S|x+|9k-V%8Y7+H77Y%;|k z?m-#LF^UW8D8IG&!1Np?^XRT%T!skzf$CPWSqyiG_I>$w#yky`L`=~FlJR`2V%)>~ zN^B#xY_Iy{ak2%;jdKxhckUi;8YU%?p!faKF!7Ecv7d?kXvs48v>7KVs{*&8)N|AO zigSfG--|`Z!GRU`^jvfD3jLAU*zz+2d|8HU|CT zopO#y2IT{VIypu=jigwIA%L1y(kovt&@J$Z8J?T^x&RM_Qk_xuYT-&r2tay?eIN!V znQ6}Gh=`Uh&Vnd@hL)4e$F5ok=gE|Cocu-?t`Re(MHZc4LDyltl7SfjqE4a=*ZvP* z?;IRi^tJ!Sw#|v1iEVqriEW!5+qNgRZ6_0BV%v6d`~BYc{nfp7-?~*@^*QUTeY*eX z)7ASt&suv&4?Ugi@h+iv4?}#!(*oCNx4D!W?by@M=Q@vB@(KTBrTybOW~PVqFoMX@ zu85+Iob~9O8~YdDCZw4XLwR3>F?Hup9r%=@-WJZ!5n=_I5_(_`IwA;@gIND)guUMYVBlfedSL)+1qJ{a zB0w5VDfExZK0WGF!6-*7QXtTX48*(R7Y41ZwXr)qeFIU#vT@%oEB5 zbIp?2QGjT;LhMw;g6J%v`d0#Yz#P;hL2Axm`qT(P+bRZI6W!&*yI~F32tlJuiux_| zSnqO!VN~kU#C-yT$)ytP62UrQCF9BX$;DsLV@br{^?Rs<6om{>88z7lV3Xbu+sgOE63k+Cf5O=BmjeM-a_3r zxX9%a2r$v3AOH=Eg@4VZ97}2z=A589t9N!MAesoD`p0eu<5#pcdwbS7MIhx;EwsCd;MF~BD=cWM+2>9(~LfxETz!d7|iF;MRhR@nG?Qt)8`ElpKJ+0!h;qd z0`Ac`{RKN>#sf|8k6!u-nZ0hcpAHPa1`D2!bTt4|7muy0iZ*VM%xBUJobz*dFF;fA z36MCGMy$}WNURZFAA0OaS4eXW3Z&T}csrCrVw16=zj1q0SdNM)V% zFyPm0EILLqWs(WXN6@3I0mHO24BvUTQow@J^U0r(#Nw_{!mVP{HVC6ES`1>1W!5fp z!%S`4;Tl_W4xgsS_bm*`Wj|8Pfn`BqrU`;O2UVIX(Ss{SX2sHzcF_H~B5$RVcImAn zIrvlVxx6mduJM$jHQ2Ba@=3X976(l(CpAd1$&A5)1XtP)WK>PAI)z~mP+%Hfw<*xt zV0S3od%$pa3?UU7J0^HCAQexO%Q1k9p5WE}&U?=;?WAO}Zvgn42a97g25_NKQ|QlQ zp7>hr!KD$KgHon3n}b3Cst`$@3y%bp2>VZ6y&rEwuSi(CZc|bR+3EgCv5pTN!TEjmA=wa?XiNN-!HSvOb9)|0^~qA8KHsOJ>({ zVX7~sYe{2WmIEMuH`#Mnfz!^4au-e;5=zxa9Fc?xxH7NlF4_>R z1hB<+RTjC}I<@5u^2Dd235E~y%+io;qa$xd8N+KID0fDclG!Iv*-~$#3wnaBccRJ- z-S<$eHK*Bw-Q=`mVyIfjo(z%<>e%y(|dSCDN81}OKPWI zBHBD)M<4za$8d4Pp3341vN&QIy%`0{eGmadSk~8Ek3AVVG^akvBrS}ET=wudBd-*4 z0Tnal9;(O}>Od4q$$Gz=qIiOo(hZ}w5#qZrggz{@RI{%EWfp5y9GJ3!2!Gn_{{Zmc z{10H6Vs2|-am7HHSWs`!(1GCgI(2H>49Wl85yGN^(c@hegUmwN69$5VvF576k?IV~a#YIT7r=k{9>LEI$p|RlwLg zU0~_lq`33A;R0%>0-)106<1^RcDN!5~V12?5Tb=uht9Ag;lO z;RS!z%>8KjR;&U9is(|pHPR9`b}V$TKkG#eM<+bGG>xis&qi)==M#`Tn9wgdaNi#1QKJPiX9+`BV#57-5FcJE~SduGrMlu#ign83r<-+vvTCQ`yLsv7iQef~u$)L)^_JhXV-(rZ)hgxt&RtlxKF zb!6;X52v6E=h+&m_;*@N zo5<_S#UBEz9Z}zjBRDLqagZ)g_JM&yjuAD@ol7yyWGYI%^JB2B5a)W|Ar<2cZP1ut zI&rTaIL+gdjjYbJZJQVgl+yO?Ex(^+hH4G4*WTv{Vgy%f^3+k>Ig)~~ixvAn0Q^tL z#Ri;Tg!jXGBu4mCWx#kOj!O?t7o>%s3%?zHPyW;M!Nw_l>AmZznWr5&i$BugPJ})E zi||)HiQ&tb7<79KV(ux`Yr_K#ONLCP5!^4foVze)y$8QLb&T&=x!#lI`Tjj2uJKw% zfa9e92xS_B4b>J6X;%(#T%V4$|DPCtkt_J;>W@4AfXg6`2#Zk%7;`v|ac2};o@8D! z?%gjBION(A5??l65yoll2;Z zn{|GVQ;rdbl;${V802K_jnT8W40tp!g_;ho*8i?{I!6B2Yw#x~1KYbkk=wUjR{Fbd06~ z$!J1<#v2#m?t{jdAxuAe#!=%%4Nkdp;~ea#7ae+S6|xsnJ{nPUs1k;I1xAxLLIfh0 zqLvzUOH-@zr(Lr7&%xRPjU^S3iUK~Nr61!Qss*>{2sl)=X3e4K%FSyr$0a~*A}i^0 z>>;DG0W|zo=yK~TTjg`B8(>SF4DLTR+Uet8=JyXhthX~y9_yFu^SLsF=(UmA8}h^G zm#!w$j+ZJiM>{e0H^>*y)2~_c7C6FACl}H;qmNM>qoSnptJDzUp4`<{MCJQAxg_}l zYOb6yrTN4BR}KiFA6B*DddFEGTSv!y5I03cF6kVL630cK277Vz z#Gt?=UpfT>Xh^CBg@&R|0*q`MBhNjqhVUn?gKJoS@mW>Oq?W9VoG@s*)g0_bTsEkr z{W6yq#YK_UjkAk1duQOD31B0Dw0%^s6$p4`kd-UAoi$xhozBY5ZEV$B(#td`FvQ@# zT%}sfP|Nf{=Kv*noMF14unKoun?A+pT@}@o3mDY*5q;rs(ZB^7EQFgM;*B_pH_O%(WAj7bM)@LT;>dZlE-ZOwE?Eg z1XcxSUoJPd*&`mZfKsIV7@?b+C~~?#wO^}0(%tf_dC<*=8U5q{G(xhuxGSH=@k$#O zOkRvQSp4FGxcft6^w2TGslz6!_XL%I$)~BlkaNua*YC}gtc(4vQuZen4vLI3Q$uLs z5Fs?1tlSZC-JB-_@Mp?tN^&$E>>>AwcsJ4`B&Kem!ahi@W1bR{Kj|GT z+0M;Ecl-oI0IkmUJuvaP1mxknOh!q`l55nJup;t>5^a&)rUYKynO$tfeNC%0qij&P zUn~IiupPeIiAA##g6e=M1_xSKNQFN&AbneyApgJv^{+E`?%+T!bV2?3L0X<_V7D1} zkfGJAwwgne{m$>#T)FXDmDPn2|8az<=4VDnSQ`7Q0_K^l)6JPi18`%bkr45gXZB_&t?hanMAGpI4v|L`a>zS*lf7v<70ouH?}JB70XP z0(LA107v#8o`PrsMC}|+WuA0^Df8#ow(lvdx;Z@$WhPr$Ye@qnp5S_&81=W4-iGdP z*CnZT5>1GYZFP0puh_l-z7wI1!y!05NcXVQD}-5-tqd3>Ck!6siQ}h<1w86(&EU`w z#}ue~_L11HW-sZWGD`?kN!`=X$QCamw>umuz--==L1t*uo5;x@=b#zSbiSkN3_SEc zD+N~i!=FNSl`v~?;pP5Fs=f$hB|ek6ll<(0S2~t*wO>_j`w8JLy{NCEo9E!95SJ_5 zTiIRpa~Zu5T=7ruG9~kOrC;ZH=ZZMgp<7?dolBbP03hM#X&{ zDoK=6RC>C?n#E8xwPUCKXm0=3%|xrYEc2ka7P2oam6+K_mN^dfIO^mp;HvVoCNEC< zKVa#if8)MBzv?i3trh)~V)J`(SaK2U0#u#!9*{2lL+4TnB@%z&+>Gd9bMJ^p<2qv| z{JanAR+9IgNUap3P!a^RSsHP5LuT26Yw#ndLm~*+{|G7_9!1TKIpbjw{1eP2GJrr4 z&M{ZPpdi@#M{F5vRZ|nsV;WQ7xPeu!7b{%DeRoMYQ>^zgU-Upc2+w8*|8K2dD8R)q zC2gL$s@5o^8ppH0BC(TT5W>t&P6Jt;N=Gl4WQV8zsqDy6LBf0LB5o(5(+OlL{ni5U z-)wueJq}L%0-PO0Gjc2dv1E-2_OkTfnPb*UEJHh<(VC-3hZ`qaB0Mgo^5jzZ{| z9IOAj>Sm$}e<6kMu-*9N3`m=}D1pLx)VT60-%>ghL5%u_70kZtm5e2$moViK7k(mZmU zNlk3U5Pp(LL0D(5ST%6e)sDBZHD2sAtwZ`RIs9O>bHvwTJ%gV8yaMssd@joe$oM6( zh?7fn_KT;4Ow=E9GB4RH%mGwuZ-U$$ktzy!(thik4}W(1@osKQZPP&B9$M#!`foRm zU+H1jTI5WKD%{&n-B4)G<7e#VP&(Vh++>M!FNxoRH(MQotu7p;m;t4GJk71H?AcDr zYdmfQfc}eQ-QJexaENHLN-~lh>#M&FNAKM~=$c2wID-JO$<_G;xhoNcEc_@@r}xy%R2 zh!JJhxxl}RF%Er{=K&^PUXHq%PnPV-A*^2l-%iesUsg*uvFyTR)$hl^iiuFyx4G^* zXicB(kH10!p;zlAh=zkQJrDQ~a{kQeM~$OK0-Wk4@CEJfdM)Fl`Za*}84k|{+q=o7 z;k1<|^S!oUqgwlCE<5mXwb`y9Z4Ha4=La&=XK3A5{_a7G5J1a6v|0Fdru+uoDxzzO z`a8dNydG?SHbd=Tu2p`b=OtUBJMVc5Nq;7X&+)b|Wdo<#(5s^}dEnICVpfI=Ie2wXyP$E^8oAbAV``^5**wDEd1o zr{Do$T#q$5T^{|Oc-JFnyutHQ_aXC8d+Jiw9S#Rsfs6zjf_nn;`}wv;&@y4`tMRq`O#W=Sij=6C5-?+Lf3A zqRBudmVMwIvfDZkZ#U^u7kx3jPiF};y%Nv?=B%b+P;&-1rKTIuUg5o1hizu7zpt9a zh&Lb(W1Dr;#$S|uA-{@+XS47*81y-fzf{WDT&);j|BjTfKKttpw8uN8Nm}Yi<(;v9 z!uNFZq~;T3vi|nQPp2cl`5e}?F--D(G(&4vVpoNfcf(^!-(K%r?e_JVM}|Xt0u#U? zdG1u@4Eb5*Qlxz?tU#EsC>^y65eRQvoIA!+%I#%`UKRo#stKDK!3umzS$sZ`_EM_@ z?X^Nc2a77FIgYzThvK{;6f&8Fm(l#eaTny7Ld$+9_~p%#@x3G${G~mZJ_Z;57z2OZ zgRT%0DXe%rvqr5Pby|k=ZK&z(?*@SQR>&nbl+s`gGi+ZT1=IAn#dXKsu@_dDHu`Flr`*(ihWFe|6p4vB{qB<(RHxWlYzV(>F zM{r`4V()F#_iFwdRXwGaEA)-jpNrA^vJ!HjXC6%``rnhCC@A6Vps$TFEGx!IYEx;& zRnHeVD?o0m>drjXdKwDe%_k=;8bxjz|+gOxl*xwGOCvN`*G$x&iwoB z*pUhnz4rc{k)8?gn_mBJ?`zktL8;S&mG%wtHvHcPpSQ>}mw5iZ7=K_BPAI!II(gW* zA9RQ`wqpQTm|(>&1Ad^pDrobWlx_M~(98^N50~dpdRU>yU=KZZ(BIP(Cb7L?N^h*K@rAd1sS+dMl5%sfji`aWM{5e$m`x zg36tt4Q6#G`*zCFP+3!`MBnF?elALSdt-rdChOgE#dAGJU73)W(5>sxdK)db?)>84vvMRrZgn)HqQk?4;R6pfOg&_7eBCXAz=Jjdj)B!xW%m$jp8 zQ6)hEonWcLQKl`U!n)7ORNP0ZZ9qq&tcPo5RGHCkD|X@vc8xC|;zf)|yKf=vaM{T7 z&JnQ-*;mP@)MA0L5P|~SC?drnrbQ-W(6I7>YQ28$?sq{``Y#iYmEd_Jz5HukbeSm6 zeW1HT&2WSd{Kreix<3NH&SYllirwmbLbCu!*8I~!vTchAO!EIK81`-xylU@cj2YoIDGgSpX4i1l1bD>Z3exC!B>97GC z8DJ-8r!FQu=K&fH0etQmNb7455B}dsjngQ#T{9$!2UDK&m#$tu^KlFJ_nR%K&w|Gc z%=RP<5+P>Y#ySa;jd`_;fk#CFHIix?NJ(2japy;wKEqz87#mzvKc^!E*^Y4PYsL|x zkLpA|+ExPNLW=`C#hpPM&<4?oW(BO%5qLHo2`=&_P9tWEH9#XmWjTx6alCWDmK+C} znp3yZjiblu4qFqi8Rm%XR^4EA1syTk#$aNbDjelgUgWl!GIAghjWRgD@*5TrdaxPo z??^YzDcHdYMEtV2&;9N8i|UML{CUW8Mr`HuhfKlW*SJ-F(rer{?Yp7jwnac3@{l-x z#CEj?nd!{FcXHZ z;qqu<)C{uKsz6U>_bw(E2^^A?`#%do&8`P)L2?Q4o{_G$43&n?(80$Io)n zT^pTzdp^{2X|J^+@A19)J!|cmieL!1Wr~VRr#s5OSqlM~1gpnGWo_M_QmAIJhA?kv z>BXzm>xg1*B;X2OZa|~8bOIgQy`-2;@|r}5K{!mjq0<`xJ<1{&801jry=RFu4th>F zvOus$Kp-JqERQGCaIHvQ(w7otM8J^M$^HEgPyJ65yIKq4lsA&mzRvmWRIGdT7RL2$ z`CZLY)*eaSNMifC=tm*%OIyu@?0?_WSlEPb6*JgqMA3)BqGhRv zYMS|UKLA0d{?Gys8~{mIR+lGa#b@5qYxLW<(V1c5*H*B>_!t|$6PbRM%~si=mHK7z z&f)ucCQOlJo6?B}-C>!2qj5HqlFR+=p#xUdmViz6V5C|eiA)3*=HC6K8$#nf($1!8 zzEE$N-$xC80Feh+1?xo@_2~Cuj5Zg(DBJT!RKWV|B^HNs%Jw2px`$^G!vlY9`cUXx zF(X^c^n{K8KW}GS``qwf>SeZqxVjoW`3Gi3x-(q!ULE}|-?DCZ9HyiA!iMfa59K%v z!%ISmYTej}v8xEl=)>n?_whfTv1y43btQ*H&cxd4Le=)0|QhmkP*w<`@KEVxOsWBd!t|xN5SK!@= zPpTHL921un$eT6f#sS7Zm!ihkGcz{qf!!)9@5ALwsX3X!WlFN$C4=NyM}PnE*pnOy z!wmXmqn~QdUjaJ$ONYY5Ls#FnG4np;OR}--&M$8DPcF?)zhs`x1+ zk-gX&tS2xA&?|&hS#qB1DwfM#r*{+l{iG#d8yx*O^ujc^E&w+a<;u7q@;lqdHC9MU z8WewHUl&~ZxkpW-S;bi=w%m!20G2XAGeF-2Bf{U>O#Y{EPKbJ?ef)!>t~Yf}eZY`x zPp<+wo#WjDYaYj-VmWu&z>36`=Tc-~$$0)6Ldiadx7X*Q6v58J$t!HP)G8*R+bBqn zY71>7!sMU4FkqKP;%sOlKq320GWKe?3=r#ClCp{Z#~+O@$6LC~ON5?7$^%0=Ol7#9 zLb(E2Z)p4qc3>Pw8nY-|x`{LXr+c0EfCFoA^&xjSwqm$bycm4E_heLrH!5T)tg&U* zmR?=XZ}wQWa96mYJpO=}Mk*A*6U5$3uF%ISdbptQ72vEE)^S`cT$WO#iv#tD0{G(g z+SNQZb%r{(;SO_EOT~8zH9mDLzeO`ULr$V0L+4Sf_N5mIyFy!O{Bvs-C}Y;?Mjkro z12tF+x%ZpUWYR+e3%a(O2J_$?6YJT${mNk8=cI|*jZ$8#Z6?!*XLQ5l7-^b?ygc+6 zr^WIYU_V`+%9Pw_jMy+j;j-f&)ftsdFxKk|iOstm_LzCrO7TAChboG8jyG3TN~6vB z{&uR@No5hl;xuhj07s-1L?D!N+XknW)8Gry={&d?*2w#`%UELi@933H6YrW@{l6Dq z)o>`DHtoNg85a`FjyNUb)`$KSrZ5r_--8yn0>;V_Y~l!!iIrly(}$J7CO4Of_s3i7 zh3iv5z+oNI30&#o&Ay1124<*!vW8Z{xp*|8>hZc5IA8w@c3c4F5GNEvrJ~4lR+SbXzeQV7Qxx!7yx51}^GS0%7v<1c)BL90 zIe0T}cgYWo)fmq$Ir}h@QV~xYfw43&%eR zAVs_*{h?HEDOO21y03yS2OGUf1fyO7prAd9GF2e0xsM+mwm>ok?DAW*?6J{<;3wFv z+vgkuYr9UJZ~qEsdr2#uLBuw~Y%R#{rF<6dZ^S^+aOqNX9y8;?paem0TBJ2?_|41j zDgSsav14l>l@RSvHd>>&j==6_s4bTvUu(rxu@CYPB^!c5BjuRIGy>QCF980VM&Q{$ zHak;$s=oE@dxKURoL!weWIw^?D2iAqezV?{osY45zmMKj$xnGNy8xGxZA{w6Z_lVT z%geKxfvN&0BQq@Vc!xlCvdAL%kEkkU1fFm>I zWsk(}q=nlT%4u#e4$w;Z!8UxZhxW@0nq!|Kt$@0LJHWsB&fm0iL$R)2eXnUd z9+s@|tjf1hL~_<^Gdb)R$97#=>KA>NBdC@K-g_La|Cr`@!!u)z<{PlXD9<7!+?niL zCZC7i;fJJ8AUQaBP>tN0uv^;?>qAcJcQD4UcVj4dvZ$Gqx~hLakb2z;B<)jt2~`d5 zh01{i6Srj^4g&TR4|8Jg-b?gAMiYV6h(uua!S1!U(*!^-fz*L%qLb1ChQD9*1eQod zag69G*mD=Bb*njvy&H)tc%BKUJ1l4!GH&Oj%-wS`>YNIzhAXx?u=^5A&1S$4mLeRm z8C;!{MGhN2yYr1#pp&WfDg^3Ng@FVw^1kK77Mu6t0L(0I*uVnp_%XH4KT3bPCWIrq z%0b6YdY{FDhzYaL7#EUcpP465u+8@$PX(idts1e}f5yB0wI>k^MmV0B#>slwn=)@& z3-oM0nd)%`8_flY9TRmuA6Q}fvQUV27TC1;rJ+l(OJZ+;ks;;8bZN*MI(^|u~ zZWS@F0!S}9mcv|IX*(g7hf}oJG3AHOk@$0u)0?ZbAmpkETyE-A?TOT=?rqQd!$T>* zEB)&|?vSMp-84qr%JlsL)ltzk?M*qPf@MGFoEUwcaQ~%p)j~BIKumb{S1!@?V9)U%=yFMvZ>OU$oGZ_ z3l(Ban!@HSM&?wZ=M*RVOF-pwAu9!x8aJ@cj3%zFTXmH6*W_jx#d!)mkHQ_=Yb04C zE+F>cZ^KgG0Z*0o7= zlqR$?dp_xgX|9mF@xYouVYa9|!dVEUL48N|q0&!JN7o>$!sk;cWz7I03+S(g?T#N( zOE$4}1z7UF0vYDypDsntH;vk>ztp2y2LWStM!}RORiQ}8VTGCR@3=lFP+N-=;Kb~n zG}Ee|OPskW7ChuENb_D;Pcr7i_#RyBxi%O?N)ijQ`;b>gUG#_pnmDnj@G}c`Y!4K@ zrPzp=5xWg+GJ!5XW`w)uguimRbYwb&7fEV}Z{poIT($R3>>$IBjGL=I=~RJ#@qo(x zQ8n<+HE(EB&NLG}$+F7-*EQ54kmw0U5u z`!Mf1@OmoE_pzBWSeaGKjC5{{0hpet$gf88qe%Q08lq-vWxMFu;GBD%D-!X0;U5F^ zHL&=|QGF{6IFsM2;;R4(r+Zb|Vtt*ILt5O)$?mqBT-Ku6Div2{jZnRMdAYj(jF-iw zR>j&1+2QjmX2I)X$;VN$FV(8pPcPhg=$Sl^A)0z|89GQTSLg_n^4EsY4 z)OrLG4kz^(IUXr@&8o0T0ph^qxS27yDRDcgrZH&Z7^YqWNtur9MMsp_d=9RT%OA}CPY_VExqTpO=r}^cVCR5Z*mBPR&?YKi!sYSN zI!n9hqNE+#xf_S~r-WFjCK+Y9dzv5y$ZMpY!SH25vzZKmGvT{C+=$#*nG-ANR`w$? zb8*nnK1bGt8k-R|MzD{QP;}08Bx@^;@d?waJvaD_YnH#)&(9c%@=e8{kq_mVb6Ajq zuLNtSvr+^dHh?$!Q@RmFzU{<+u1zxbw@)vu;+{d{i^^gm^~q^tQ|DS>Fe` zT)~&x`NOrwV>S`hJ9K9CshEbSN1B&Md8b#v`kFe*IzSBPj;L@)$eL@SUjIISc+fPQ zyB1;pSLl)gUwkp5?5T1WC4?BvH-$+83Kf z9I0lWjhlev>4^je4#B{A%MXm`#r}gTjaPo*e^`iw^<-CzSd)0bs&|I4o<-x==Z&Lp zfS{f};E~_~kIK9EkI$+T+Ox8}-oO&^8POTW2%y>O;I2?2scf4Z8_l2BP_`8*t9@UR z&#M6MHN`Vt^I`ulYrfRPVPP~kw;=_{5t}GyGu++P!J*v&AAJrCWCVmD&;rKO9!UK= z(ttFNkPl^GyG{S8^%uC+p@-xz*P7BZ04AaBbhTBs;GFf*LB+vG1QI!w1_iXWH1v)H z((;@PlKOSh)o*a?{O8kX>}WAvuzte5nmTuRhcJka#ayAZHS`k|Z!lde#eCUIpg#rr zC(T_x9Xo(AB@-HN@|`DVAiFj#)|n-1?A2@B2Bk3q7*3(T@;lCRpYqdC<&bMP3ip(j z@QO6dsZ8@oa+E#@|L3eyLy(HXf5pYx|HY>wKG@qUm{)$(4YoheKXfyk=DFv+g@3QE zcmv&yu!N!uC%!y+s3^a|i*z9tf+0Gf&%%hBmY)KOkyf1o3Jt(~*_sb>El=a5D1mJJ zwZQC8VGE~G^#@@@@_HdgT(9oQl7kk-0N?p3cJuA2Nq~k*z4(*ribA1E>P>9pI9oH} zDX;9D>o8uuBD)z_)IjkM<0lqPDFJJwrfPh)bGQOC4MV)sG$~(y;3ZJ9Q{Y#9x$|yo z7(|zgzA4Rik^<1#vp^;}O_1{F0;_3&&`hP?`-?F9IW0qZQZ3;nfG_MiTjzgLIWItL zHoF`h+^5vspmSXc_H07ypjeVEu+&L;Vi6EVjp-4t^1oqz`hEYv<_B#*H?!yu(#X7r zMoTx1Xb?mz6+;H0bV2~3S|A~(he|k)ogWSgWV2hg1p-##-(LAXP`~V{uFTm6*GT?1 z({-_($Mso$UMFo-yj< zFrAv7bA%Zpm^o-6S2 zzr6co&+IXFR=27CLWtobFD)imKnnTWmsMT4LZQP#xC|J1Et0-eBoeM-C`qi1@)i2y z^tkv$C+|ST(a*yGhZ&RqI#Du###f0 z%d=tu6<8P{;u4Fu3X@E1{VjS9he2MXS@D1fuYUh(w6;gaoA!=(LOr*AOp=&t;$O8VY6%Y(oeyY%BTCaT<6AC=UP)*nv`L z1O~4_TenmEzhYdr(K!!)-w6awvN}c;qC%k*uDsEIV7dFQJ^MILUCv0QP>vge`T%Xg zHtxaPM?6HOEdg=q;oXX7NxlgttawVoVsh)EG6obbr9(@c>Ug!NRz1~~D93@me$F3& zdz0{zHP`rwN5$x0FlOUc+m&{{z=WB?@KKB-C@-Pd?v@gkX(=))owH`>^LXx>wj`xV zUVS7PPwV%b?|9`Q$jt?8pP9byv{&DILalT(Xz9$maBtphe!sI+tj7cYsEUjmB+Bi?AVd)_3HvGI`JxleViYJ^8J-OTvSh`9qC|N>Yn!4VJmY<4yM)krJ<$B)$F6y?whXOJQ5V^)ySG$~3B_qy`u@HcKeszP z2nbXnhNj!CrD}__*FO9`S2cJ>R*>=r(e1-4pu)2fhVz-%x)VGvA18t5mV=TS@Tu-3 zDnNY@wN4wXdL&*#WZGjea*Y~iT-}d*U@`K=Jl(s z%naA1Vuo zoLdv%YL-}$?|LxRG%sc`EN!(kfF+4s63k1C82#Gr5*md@oGvi1J1`3?OhkHUkv^*~ zX$JrEY33E94pjoGiu(iz8BlSMCdX8_00iH}_ymm;Oj*-0Z?kDjdv^yp_Y=XDNQ51e zSS}lthGc?tZT_^eP9^b*Y@59CVxXom?=DGi(2V%2RZ9a!r(Wc|Y#m86dAmqWo&Jw8 z-pPms?#;Q3?3;3$UZP)*MY%6ynEHfi8(lOE9TlBw!fEKc%7MGs zvLqYwhBRwbHQ~w{m$m4k|-md5&wB1X!BOqK2AX)k4e1)!3 z3jE|#n)=+#UwJs}RCc#8&#)&3j(c3su;pmVrjEc7&Uetj3tx~-p2a%7P1I)E6;I?) zM@MKFPP$}M%d0G~=cuT;$J-jQHe~|wP)`(90=|A={{P_cxYk=99(1I&F$WYG9FQ?v ziGvn%2L_44b3wEfn7==8$FJz0s}!Y{YlYx0*XZ-kn`iE(@grA?ZbEn^_$}n7v0w03W{xm_P8Odn z`ZW`gY!Pf+mNvet_Eiu zT#_a3*Db{qCr2Pc4Q5<6OfdMzH#)NQZq+8RI$p?GjoRHP9g`fP!){w`yZASRVtX?g z?a5sm)RuK?zHDAgs<%~_8M-Y<7reE__Et7PFR8kF-wU);EUdf)N!yU@$aV4A^1Q6% zVPq2jUg8_`YY?=D7|U^V;KaPeV52ElDDUdA85$MdNVZw|V}8@fF7rG^I5wE=Ehf%N zkUm_^uhFZ=ok(|nA(n+QNkYhOa%}G^xf2HzM)Zqss?H08vgb4ZbP*8^!*@!KM=J0%Ker8;Dtx>X4K$+9E$ zXoSJ>&agSybGy6QvIkvb&tf!bCJ=f6g?6#fP7h?@&{9SELEzB;$_){!0Q)~^3fs!E zUjwrRfY(f6A83wWM>yHL>Y?p^6pw?d?G|d9$s=|ehTqg#8^DbJ;}1%N_8>s)VhXsY z!Q{$Q`ETg0oa&FcZFr$G)A5^ ztdAc)&In{s%H(M171zW#yBv4>p)eJ>7|hf;G6E^ODrzFwOgrMTSrs!s&)T@)tz0#d zzZRAi02i$aue@}r3eD`H!`*LcY{Fh?$c959Bb9-X(7VW(L8k~R*Jw)xVqbx`w!!k$7hxv5l7&JCspUlqMd z7s{u%D81l@L+QAyB^|7wzBWsb63(bu72EZqj;`_*KeAKApObcAtZFWRlKfqz{I|*pVM+iz&NT!T1O|y4gA!it09Hoz z!BA~YJG+8D&$M|aY*<1Xq7tJQ`}3Jg@b@eWO!rrG7JW=oSXn|xr~wm_$yhI*tc*wK zT%X%PTX)C8TAmc^g9+ucEj#n&4oABWXOml}GsHD9AAR*7XsS(tS=hN_D3mRB5zFJM zp|B?iFl>?_Ltc57gbEg#Fa8BBfVN7&;j!*IPoe``*>>lMftgCN=n8@=wn&0kEtbKM ztFA?nSlZ~`D5PKIFw=y@L@q9$>{dbCSz}}YSBBax;%cUj-EqQ-vt*umvjx;*hBL^f z5nIL&GVS1Ey-n&Q71pZ?8f-$Jj4$x{+OYS7asyeT=|8k8H=p6h`DhV009j>bVTLN& zw7QLkI`$N{Gr{6qX7i?EgI@S<2dx}jTisd1{V?*$$^c?89(N8cxgswSNkI>Ya(P;_ z{1j_;aRchj<9INLK7JjEPuAS$oHD_gI%16J{?R>RJ28!!F7SPOTV*M5GCnaKoT6XbfkLp^}0H4L&_|w)KekHGN9~Ur5Ab{s<|!^%{|)+ zkxT0v^_nDQ@^zO6pQ;dQ@n&%Hd6A?wyj(;9MUh6G#dHdGk4BeP1koYTW5PU&cxW|; z<}ZB-fV=(YAKBq1dMfvl#Zq9+VK@}9T@|!4`d5F32Ms^djBs)UpC-@4KuwUsKMz!N1ArO0uDJafvDETqw8d6Hi_kOZd6wy@DJNW7xzJX zTtKC=qtr^Z8j9m`{CR2qocj$80s@>b`o1e1NTq&N79Yi-omYxF4PpQ_q(qJTm2dQ#Sg9BIfF0DEp){sUIH)ftwu1_I@ zAEc^A<9zna7#t`J(O;+j((@hmhroaTcaVSZoUCOl{7(vu_D;)IOKS4DNpzx5^8ESg zmJc-m8 z8fj^1;sv6tF|||#OXKj5FSrp1ucz91$Ss5&1B6Ff{>+g6i*&}g0516>#np>rEGmV9 z9ZnbALNbQK`1se{(mrn-#Uz^q#oRPLt%{V9pKvSIoO z+dHZ$Yqo^{9Jo}!ps(5wgEU#Khf6juo_(5d-SFd_epVxHd+n=T)$ZSm!mP?os8IVB z@z%flacsvX>aBc331G4V0Ct>R>WVz;9XtyMYf^U4OL$@M344~-EIBh+-1NS~_U=NL zawJy&zPCCRFz{0gN67epkOnyR7@k@Q5aM>44sSg55eO|6t^h&kqBI0ldF_EFbv) zY+)WQLVw!NrP-zVTHZtrU!MkhYlJ4oc_)h~ND*!}UWGNHk{2I~bJw8aXHQ7PyXprg zs=5qAKl_X1V5Z`1mSa==R9Q%kkZ$>7Y_BKS%PE=(LrrZ6cuuwiv(wcB4oogo7NHCb%k-8Ij-o8cP{XG3(}{B4Cuj7EVj)E$sr@Fugy ze5M>`Znmy!7{&$FaX)&cH^yzUe$c(zyd@yC{E#dqEdU+iAMx?L#1V;yVxL^3XzCPP z)nvT$Ot||D*jio%;gZvBp1&0~p!TDWG|Y=j7tJiBy*mx(uA%E4EiE`~tHH5nxJNbC z(MaC>j07ouK0vX)m5QxC4~LwV!5+C0A{NtWXDz;W-IdiSJGhWjNc6E zzY@a_%J1_$B(w4su3F^#H`se>IqS=$JFjO5C)tSujJPUA>%Wrf6Vj3b)$GI)o;H6r z&?f#bvd%HOlc3%9v2AN&Pi)(^Z6_1|W81cEdy-6S+qRvP_uRAYTKAq$ySqMi_p0i8 zc0IpM_sWajPBwe=;9ppV(dw7C_&2o*{nj65Jj0YD490hg)r? z8zF-8>o_UClB=(w0(GnmC}aVBI2X~4jX&FrE8#WaHpha(NCmC_zibJhssa)k43yY`3m(< zJt-z@qWs2?nV-e;+n{cd>A_e4lOv`ToF;QHYjs(+&mR3!#vR^^tDg--7+);n^x|Mk z97h|9I%*nl$(vy6eKoKUpsbgkZU#0vZF>x4<0`c%Dhzc2kz9dx#@>?+DRZhp@_ga) zVEOVP88~mymYe)Z<=>eD975C>M2iO!LOhc$qYhX^+5v`k<@1E|2m~FVKsErlbws~= znal6VtoUHT`>IVXsnj0UAt>%>NQ2^d+icYPcP2z!&t@)0=!W79Ab5?;G;{KZrp(ga z;Rd>__c8Tv5QDD$z?E+|n?DTkHi8wA=Is_-+-&6C0Q2y`_FB0}yBw-KsH$4pRBMfLzb!qlh0o7cz?1mo`QVw{0DqZg zI%?a5&lKGwk#SNkvo&u;v^tCF7DMgMt;?I*?WFR z<5b8=hYnBh;kEZX)T|G9l* zeV4LYrGqEoogDvEkfe1+#khA#_=34Cy6FVDt1T<StgN-eH-0SY7^0-y3p9ZosmEPm;_sXfT}?Bx8;c0tML9{RGvwvz?Rxiak4X{w zGqdBtc}ZO(aPjY+TZ;m2F4jZe^I9O^S*5hqsdYYDTwVA^i`oIWaGT6ljpWoW6YOhV zF5h1@wAo+@-zyg9DQ%iM&k6om8+}SnVlH#O)XulF_Xh2%FmBKj)JvfE0lD;77*FVt|vd&8LyVSaRT3-}_SHvxGbc;3(c?{`X5s7IM zXi*jBUICwy7(etE%7a(baBIPZ1tBUR>-<(s{5{a>P#1w2(T-jzdWGwl??cb(7V3jS zaa~fkP1iBQmyXjpbI04WE=%8}k)%wnEc{2KijFF=JbxX~9VB7HOz%?L0^9w?{ZXQ^ z;Acgnr|D^8TIx=;kOcK%9^VJRfd2mlS@h3Vse&}FSyF3Q0vP?q> z_xgyh{S`YXp~2)gu0QTg;=1|JPJpjpuCCW4Kl$Kge!p+y@7M^2HJCI)_GeAcL>qNq zI{U#f*-~7OD(o59M)d6pP(Vb^lsd2Cwtn`tuO%?17}I*oT&07U)oNAq##=S%Hd}QP z%YCeS%W|vZ*56e|HN(yM`h8k%bhl)Ko@xX%3yFN4*7opy#6@J;7Pi~Vu)xz^rmkAO zdWON{98-2#+PAxQ^VN?ZI!p?5WSds}G;idQjrK4UjPvxES>yEQ&=1zs0_1%|-)1Ue z$dvCfwdHhZK^gpc*`gf2%2_~;F4gi#w;uK{q`7kq^l-*@>zNL!RTdb@x&%?f&kyW> zi?@>bafZPTOp|K7fHt}!!+FNmp_!COA<;p;KGE?eDrs0Ed!0Ozc!eh2C5XQcDbk4O|B{1cA?{_ca(V+1 zF%U5m7EkBoO0!G-68A+O-_19`;^MeEjoZh1m4VMcUx}4T73~ThRtqTZlA}Q>Pci+2j+AbpuV>?j#wX!s_pUTRuy??V4p% zwN^U00##BB_ML+^^?T=B*|rW$4Z^&=SyDSjRaakkqn^j{QWSX4`{;Ya{mkGU0+)+Q zwf+sMUuw$rx4$#9Poy)Jp@y+7pPuihQ&_AUCO0xp+XPRP%XJ6oKy$D*O50asJ*O^4 z<{APgPOQB*_ejf=R%J^7yN9f2Ys1TTK3|8w8>Pw1l!7LZDI%k#t0F5{wX~9xT|I3w z)Y$kp&s{guZkMdOsD4nHUcVkE7pyZKJIvTd^xJAg&8F-1MVhF}D`Z$_M#iTYEGZlO zu;yzR2RM4P$B`1hEZ^Vja1J7dUZJ!XE&f1sRmhM;s6Uxueyze^>@z-VPRv z&*;6p5W5_ze_gNhvP(yk2)iZ=_$3qhJdY#XD>m`Vzu?fs=!s+NJ<~kcRquN|t%t4N zZA@X#9-lO2OAW}@r#GEy^W!YFacy->=+_X=@l@5cVG@SN3ff}qtVPDZ6nTVdoekiM z^y^E{eY-Qdv+q7txpDacu2VU>kcSnx%@x}ja9>R)&&)oi86XiL1Y;DQ^k{_{REeL$ z>pRomnkM(x^ox1q20VCVi7)A2YJ(mG4ZmA6d^puwE1MzPiyf^E)fj4OHd29Gfw8b* zy$fw4%p*rRurB-+g?z*ug0Otjan-sCQ<++UDUmsC*FD?{`F7T3!1J67uCnG*t$&6A z4CwCG1aWk%gpnzqgrENweM(mVcoH^Urx*tirf`N4EQH%LofH!BN5UQ+&tOz@2U%J2 z@x$%>^>>S<68jsuAH0DE1*!zvVIUVEwmRy$9W?F%GmSiFL$2s}a9z)o=RKGbN zIBPl5sd_0C%p0~NrK(|`X8#@-GdSD7?a>* z+dcCx2eUe1&bh6R=PwJ=k8DuLYGc~RCa`?XG5D823E&Uq+s8gfy7d~f_@s0`divR)L*2Ln3OslG z^u5l9AYt(fETghnjOXepZ)h8fv5jfy0sun?XaDVv8^}|puq7W2L)G95_-;ozG$zIaX_79+UcV@EEjkDP1rusK}`w<7-d@z zbSbz#!bbc{MAA=2wC4T!`h5N(@Ufh_*1=w58oS8^9 zzIea69iwNUmuXcx0aGzadG&f^f#Bn0`?Wd1k((hG3udBiS(JG}{Ck_JKjzmxe&P{h z2o2cQeZe47g8U2of~hczg${G(n!cHQ8(_OM3|9AdIcC-iBWEl=cV+A)yG5-5|P!(Jx?75Dr?pBeczf=&p-P=6pfNOfeyqyZG2=IkPR6JULYwc4NM{p=zxWT zPb=OSaq-3#&N)IvcoceulJ%pig_#?n-f4xCXKa{HK4Jd}L&`W#IPi~?d_O{7w41_E z5WztOqA)BNFyy~i9kS=H;IZ=0{az|b+dy;x5oX`wXo++eL7 zi(C12bql~~dOU;kCS17|p1>;3Tma0h3#+^CjX%+|cmr2YO=oU1;;2Au9l+9J9zz|H zD@QP}8o;%Y%UYDzWFRD?*{2O9zgKRMmh&{`-Ig$A@(uOrGL+OxSzv1u19&ExyQF;i zS`4+VC%~))!)yrZ>V@}DozH=PNapZd#Tnk#5qh>B^nOb$^5oMt-b2-vcYp(0wN;&} zyh6ImNh5vZw*}~11v0D}q+v%Hl+`P{Kj&EW6`OHHc23L!LyCpfe$Gd>A(K`6^ZIxC zh|WHmUL~?;x?qD7sxjqsDM7{+YP{XeaiNCrKFaG2<(JH+k53DFYh;T=G}ET4VFT-E zDTF^EKAEV?ixZA^`J1De@Bn9xgL{naq0=*PDu$-Sr7V#R{blHQvT3SB`$e#s)f_e3 z$T_pj!SYobQX|Kbdygjzw&+dLU8$8JmmE1F9)mL)sM!7;v-kBTBUu~%+`@JZ{mYl~ z#2{Xmxua*BJstBxD^~^N}cN5{fKvy z7leMCJxngMVJHj{;6xZ0%!kr15AnU&eejKgZ_!8Vd}%GQNdL5cJoK&Y)=;bX8<*f* zII!Ng2?roM#6&p)viativPo+ESSWy=ml%I_-CXHBw+)B2PE$e0Cmzk8tt_Pxc!hs$ z@h(svZy%EC9iyREEuX%>~uNTPs) ze1zhF%o?0+@b67#I`!T`oRA#@CN>&Hvg!0} z=18-hSI$g_w<82vb@0SH*tUp4#BEt{qOYuDB;9-#BGr)xUs12`q@NERA8Hz#PGvXJ zjaNJ_Ym+tsR8+FiMG6Eq+)f8PgK6nLSOH{>L$r(NwSOHU&6#JNAoLVa$!qA3$E;fG znwFTuf#CQ?c_a*OEWkT}Yy>>(oJ|V%0C9v}C9P?Z@TXG3>#3t0VnmA|r}Pw?HQ(=PWSY@>fm-%uO^CHV?%=yPH%`&zV15oD zy;PmKhMcSQHah%idruEWC~RfqVw!VIPRBs;?kXkOAZLcH_G)MLP`H%sDU-b;!4>(# zu|7EhP+R^ir6sujqEnOanXLliF-_qfz*@7aKN-fSS^Q(?O05*xmLivy1pUHFuF>;; zxFhlHxn7+)A1hYJVbecs3lw~Az`O}m!$#{|pZd`%VA{?#s78_pG&h?LIl@G$e1kZt z{%^>b>5*i(<~wUp*|jp$)xqO$gQjQc(_s+{K;ld9Wl}j|Ytwo#LTDAhF%SLb1aas0 zW+Tl>!DoQE?m8$7yjAgqe9UfX_4)o~kWq@zb}q~2UtZwT68kNTd8hxV?#^kQ|pLDaaw39J{M?+c+^1)*m`7)|5MvLu5A za22UnMt-iQq}BvU~3oOJ~R)EGF$w!Q3?tAd8 zQp7v75Gx-zXqtbw6JRNi?BIFQNaSb*_~E2z@1Hz8b6ti+dxB70)G^=z`M;S{DtyC% zpXKHYd@`ez0YXGR=O=>8!|k_t5*)+X1jV1*k+&ey$YTuV4TLfH2X9}AVOqbQL%|9a z3 zmhbX6vFCU&R3gAX3m^!_BX#Hi+z+M4f%o#&>!dltKM@HS!^$h$TZTMMd$TPLg~N4) zgb2Hy3ProX#lJd`Z;|+p8B$)n%6;Oug#+1YYw;aIK>K_1XSNFwwpUtXlf%9LVKibQ ztd7ujRxVd#)WtCVXL1@v>P08NgvAEQrEgd6(b$`ZC|^}$pRRkh>(D?( z3w51`huyNeAZOsivetE`L%Nq7q4B^tMK&Vo4Zb;7{v_Vf`nT+NqlBLqdV-1el9s+N z->bvdC%+qF^#J_G-&71%XtG`f7(ipNxyw@nIKC?*p|z#d2s0X+GUJBDYOTMeyx?D% ze{l>R7<=xQ&Y-7%g9@qOIn&}(Vj|Be>*r)sy#QueK(Jx&O7KP{L+krebR=7*%l&Ur9&*o`f}Ep07+}?t^-|DE}p=)60I!LB-X- z@hf1{3<9p_zyR%^Fn%LdAsv8*hE9ItPllePZ~0sUvqBpZtiL%P9$wuZTu^A_FN^Fi zE8Oz=kicI5;l_~g5pp7Mbu! z9QZ)!4wNn7O%rXX;i?j)mY^_-?Ep?XVnrUL8GZ;MK6wK!0vMTp!v3f3l#KX@;3fO{ zeJ(s`X)&Q7^S3kh#4a_9BBIa@M78>(8uc{dhR6!m+VqRQUCOxRA*UZb*r8ZnBkfuQ zA8DqmO6N_g>FsD^lr#Vb=OF(Ln1BT1xjXWQ-OnkOT@CuoPYoKZib|qbBu^08TpFm0 zk1y?}Wk~eyb+O|}z%e9mHn)|g`ooF@Z;N6aSocaFoLtV{@rI02RgLf_ZQ|3*eRJ}` zI*<8H?m(Ag(ThU~+~@)5zH1V>v8z_8I_Cx-bUWV$S=6&wXeU4m8DE9EfMoe-EtR#X z-$9q_Q0t%XD8;*ZuZ>eDaMD0VDxF<~TmHQyCk9a`blSFxl$PODrbi89&-%Nbw^`FN zp@4S@`!h3%$bK%XQDK~+gE{2lAAN}yzfd^ic`t(rNoT^sA1M&Koy=&^=a)7$&5EjdS*_{ zhZZp+PdKw-qFM_?Lqh;fBSy{1f%ZEX?sw~$NM5c(7|p>H1W^N845V+=6@~y}D7~zs z2DUrai~PxZl7w^mmR4GZ;gC&C+GCxg_kmNXTmnE zP`L@yYAY<(Hpl?OW^n5`y)#ZWit5r4(e;gc3N-*T1uHhS0n#y?ES;2< z=+@hRXAr?Sfg?!G$isI`=f|2Q&9oTB>NxUJ*d~BvOTlc2{i7g90Y}ztLH2q=8g0|C zLmoB!`j5-PgTF*K)p$YpA=(5XB)NYX!yd@R3qnmvZJ+=ik%}vZNT;$#8CW66WrJ=} zhGGaEIXW{ivTg+#9tWs zHzI#NDPL2Q3l4;dnRwAi=D+G4YM|pSa}g%n$wf+hki3pFkm{fN&n~QeQ{$cgb0mK} zwp@n|Ljs^Jc=S4vtmPXH_0H!?Hje&EkUJ4(l9P4>tE}F#JVoM)JA4GLHIy$FfKOr=8W>(-!6GFQMe7ke34)e{iMlj9cyJQ%gO*3xcmj7@~U31wEs_W*h@$MFlKG> zAL-8NwzNx^3SwrYEP450!mYjpZLls%AgX}75|;T&PYU~TF@5!Vxt#6+clLB=gv7=# zY(4fZsf*nth^v-82*xmKNOnLmPWGQty${uU&FuzR#!SsgU$$;!hTeCQ%MeW;mTA<_6T1sP)qyo~ zCC$VR)g4F_n5^=^IptF{SsyCdJMQ!scCdh>UoxV2)AI?#H4Q(wl$rfccS0{{bf~gv zbD6rwIOo&|_@SM-r5y8nYQLjy=o3Gj#nCJ~# z)ozs6wr99D>;p6H$)u^!`Zw6jB~MIbrE&xdng?pXTm#Zq4pNic4-f$N{);~|k~rJMQfQxJLGpbN2AvAuRCF`6kq#%}s0aYpVLxts z>LkkVE-yC^4+k6`uBVccEhiuqT^ZJUmVbty9CR1o++$sPg_Jucpo;~Qkh9!X1$Tv% z-1#GZPuI)Aq8lc2BvF|ZZYxm%Z63Z2W9{Zmy@V6|BhM;L*oy@V&=hn+tp7x+bh)Cd z8Q26Kt*RM(=~vs;vXO8v)hPgj25egjZo(Ga2r@>$hbmdrLbes1s@{Z~T7ZH>3Z38R zyrMxY)a7_T0NC3AZM|COqji z&;&_Vb>jN~`Bx>IvxU-#D7V98+k}G>kZ=4I%R?x^fqK3(Ypy@v+lha2Xz({5+1^0+ z@~U-(>mR^DT>OBuiEjZcKuG_KbMVVxDxoepoeV6!cRf1iF7@1#~(QT4|~8 z8fj~f%Ga!(-F^t5-{=D8E!6cY1j|AL$1wWlVE+>t-hveeyPLR0>#fj!VG++AP;*t! z)J5kSl-U_PtypQhApir&X?PZBhm9~zhq!IJkRrTFRjVVaa4vFgCMI8?Ev=z^E+vZA z^kjHUwya!^!b-PxVUQq>(34)Q13#A}pv$Wp(cRxpT1E!EIaWMdK1P72R;r*Yx65On zj2+FERW|8l4QZJX_ft~CdItwSSSfWVlNDQgr-^}g4d>wuFRWaa@n%ywQ}p90cG;zD z(2?I(J+`IsQeQLt+hOHT;SnqrO;%0Mv{8S>?D3Q-S>3xLm|E+_cqH1uGm{Y+obhr+`B{ zm^TsH!N#qziM<~_AzAdtX<>-He;V{ge&jIuAvNWXT;GnjQR&b$+eSTw?lM;Vn8que zByw(@U}V8QlzXI2pc|C$y!FSBYhhZ4d`U42_n-jjS?cF}m!InI0%eCRwL2Ux3bgCl z3IX_fbMpL%tCc2I?r3AEKQ&w8uVCHpci~>~-&jF4S6zOMYChE+8-!DGkIiRJ01nv2 z~Ahs2K@MFG1MC5kKFY$Dr4S|+akrRJIiGv>1-tz`upsY|ajNI`tEDeY2BH2=Gm z0WK-u*j{9ba` z|CxJ^QG2sfS7;-&xUyC|Bky*2)z0WGAkPDh7}(eYE!AofR9&>-A{GJJTNb+5(h+l7 zT#044!Qnz5ULg;m&7RR84_u;e@|Swe;<8D|`4DPfm?DNNamcL9KzJ4jVnR0~fKTVa z*4>~Vmr$s1Eb_JAJDZvN#dAgcF;~5cn{P_<(LR^lHF4_c#F6R*m5q>a9uHok2c8D} zz5}LB_@!QLBg0aX*GfIocv+LD zxDMC5Ie08Y^}t;rrq)d>vLZv<6D$!W@Z*=7eOF?D{fgXOS~>w?q5c-pOK5`u{01lm+_0eV3yj2venK(spzKv8)-R6hlG5!nZaj-F+yoSKgum_CzR(eBSY8dYjP+IFRUu73c7Pb*pG_K?4a z#z6ZxQ3BI*HF*%9Atr>ICXFim|D(A z0sScz$KAT_1}?%MFjfY^skmV><-<7Khj>E7%@1~v`w zs1MLdwd>t;A+vrKTw*xx16!h=3Ty>M66r=n<^p28 zaAjXqs`orF9xz2}`aCcVwZk#-%%R$OlL0!7bne=sX-OHJRDGVi`>8=hO`>!2yg$wF zbU`}so|ClHt9f8zCFW!gLsL{4G96P6eFUl~X^ZWek8ZuPz~7K}>*T7SkIFrUqqK|O z)jddeL7j;csCO1AS6syfB4S6BBkI+cH2`MGB){3%7u@gLq?mSeuFTU^!-bz+65opT zySG zGIm^`@bm;K^rQFc24+(k*H1Ga%B62+&FEgV80LK|P3Pl1i!s6SdBdfsoYXv6-;?XAX__nkv*LWfkW?MgPKI_g<_lEJ^6F7@)D|T z-X`xa{y&N7v{k?Y@!80)v+cP6C@9mMJ!}_PN3d!Isp$X@QIqB&IIZ?_X@_bhcs(;I znf6Cx9lkpyW{wfixL-xDeNipr2b2Z?^9sV=UasxWIj)?^ytd{UA2V0SJgu~xM>ovs zS0gT2@?zwy$A}XWybX7Pzkogw!v=WT$73>xKlN&@r?j~=jxCh8q@-U>Hgf|j0fts6 z7q$yWWs)vvsLktWJk&Oo8hmXT!sBgW`gofN`2S9MdeW6S9Y&s1oIifq)R(FN3SrVD z7xxzjFnMQ;tSw_Pw9Mu{Ak@1$IU(qVvompqlIcf9XDYGHK4NzFenI^RATO!ksruHlW69Z%wCZ-fkjI2?2y`z$^ zU6~ndnb<#Wgw()Kb8kU1*RJQePlUpebB?&$!ymETcyVLD{Nqg8w0F4t)kxwA$dOJf zON8p!2dzw##?1!#Zmc!vvig4I3F`Hy`3p(j$BHiYw&0bg$S9aUH~x%u2&S>j`PC%ck;qXbwpKs56l2>|YhaD}1eV{U z@k?mWBb{t)5Q)eGwu_C;cp&|L`n)xg_b!*N4T(1JM*D&f!G=U&6>^#HA5Fw+E5PY{ zAd1*a>tc~095&1VRCtNd{(hk4l>w8}dQO*5{#O)od9O0O@^oRIphB8xdhA4oR1{LH z+_g@4A%gKn$7z9!igxiQXFM=`K;EU@^mj{Ks>0oFbqS(2y=Sfg=mJKjats@Lq%BI1 zQa)fBlfPoC7sUP0W$(PGaij+CiuBN^ThAh8ak~X96;z@;2nJo_1;+9V=^9g`Dw}T9~_l_nxlA)JU_Y8`Ta#JX`wD`3@`<) z4RR;n0GCOx-aJd6c+ygyRxK_-HXvK&(1(hXPA|$HdV29Ok?#h6UWmoauSx7%#VTa04tDwo0oTN+bsdx*G+Gui0jpgpy)bq z`uy${<1OM-u?&3Q=l8q2i?_%3y*^*dyF;&wzJT7w-fe=9bNz3W^}0tVTz*yinw36_ zb!e#V;4Q1;P3=xK4OY2>6?p!Xa#Pg+tfFGDn1lB5;jr_==F?;oR z1m9%!X?=xp@_jka`x4dz)rqQNX$ngMFG>X8;R~7_t^X=nFT4BE%L>-&p?D!MIK(aZ z?leTnI;fUk6_9xL3$7uuD~M=lzJ|RvK-!jU3?2)c6vphx1dQYh?)-0m%7!|ycFok} z@n|6z^}6pDsRiE>7~xCd@Oku-yK2F1x7MQi`Pmk$#&0UI1V+=D2_@PzSxXvq;j(`p zwX#qHt!iq+?M$Dfw%*C|K!4f}Ma41@gg%%x$X%J{YJOK!XwwjE66>xA6V*g80xn@G zb9@{nsW19`>9`pyj3GnDc6APbxw-R}X9|MKsMTmrt8tR8(G%Lf0}?n?7N2hWMwihf z@oT(3uBUevsES_-txS_Ek`?Oz5hl~p1YWXZmhU=#C=Sk*g&jVg18rMD?+m+s=B3mS z($7EEs#F?dYJDqKG>VnW1w*rx0n*1;Sg0?*N0|tg>3v~8VV5-FD4}^EFw&cGxB}+2 zZtW>p51G_4X46tHgDF$TPhKgl3q9>$pFYuR>&0nW4hgGq&Reaz&^HMd=PnCPJ9N)x z99$a0a_CGQ#kbNN`7!w59GCIi};H*tS)z-*PTmsgu|YMm(m01 z*1ewos}1tWQxW=SgNgFD^Mk4K zZ9DC9%=6ZVMurFG=HpiBwldGZiMq2a3ax8;jw25f>i18IPjRb)#wC=0*y4vso#n7$s?B}j0+1kvI<&pLXpdk*#I7z9Y(p&?jPUe@I5e6snz78tm*}{svu{-B z=-it~wGt#uu8#-lXTsebF-qM-5LF*#LK#a`L+NQQ63WlWq%w2T z!Kv(L4^vj69mFs`>>LN>hsQtLh;id4DZ9}@p_O&WhzRO32280*1iYz_NW;9%M{9wO{k_N7?_GcXf`Rid7wid0bUHGX2x26VaWHEczD%(vh^9D!(O(d=lh^eO1R4*?u#m)p!-O*YAj?3zVIAX4c9%<)b4UDKR$ZE z)ey@}4lqapa_qL=_j5`k>)clv9e(iK^|yd|^wQg@UJ#Cu?IDR@C4#$WV4FjbnjBoI zq~1n7l12;fh1fMSdd<y2r!gwM{5TdRx!CO zAcY_=1y1ttq41kP^BdiXTrd!WruO`2Gt7=}w zn7<6hQfL^o`8!+l%gTEG+ z0&3f8qw=fakuu;}=(;#}4_sq965-+Pm+}yz==lUR+kQ}hiNro)h1cKpXMbhF)b5v|`=3OgeVa#x)itX6m z!eL_2Y@oA-izs-P9gDcDV8vGG2DW03TIjDkF8?R=N}P)==%gf4V+CwsC6Qx=9{!Kp z#_U5aX30DFr(1MYvx@I?t)7I{s38nriKFLLjdmH0I^e_*R;X$n+g{wC>>A5#0K8l6 ze%4LZgKZt|^jhIuFuvF0!+8~kfHYKZpe7HnJwb-vBPlpJuy55D}IetA$Rmz^s& zuoxjZc#Dd4ux`#X=wz zUsLg>v0)_+-Gnfo&&|4=mC&=}k~Te#de{{6`aTs)?*s#6Fq@ypNEiD-P>Lc^j{V5aYcvig}o~zHL48xiES=HkY;4Wh2l9I-! zxR`#JQS7?x97zXCoPUy5Q`I%iYGIisM~D?~J~SsU8+{4SQSbEU@z+i3eEVNjzT5KHf{DUU!u z0LRo69>#xE)oQ(L%KY=(R6WKlYCGo^z*vPuQ7RGoPoxO+R?aKX2ftg2Ch~sA5)1Hw ze>qM^D!{5*y0?c0240LZ#3nwFXQSdx+j>HZtNvr53Ux0h z)VJ$yVXY5XhMvmg>>`}kTlEex%Lo)JUooX=xcbC+-^2Ww(9r+|D4?tk+u@YjRg(e; z$K|wfi(}XtOza<9D8zm3dkLVgI#&xBbU>68X$)94U`ONU?^ArdkEUZKM-p8=rdRls zu813mmuC3p*40vqi2%r9RW|K$Lm=?KJ!!Pr`sZX^_u?4CA{7TB`i+#tyDe5Cyp|Bb=%WUm2JsO2hmK4h6q2yYmX^ z&uabM}nuCR6TFn+QkvTp&GE9J z_t?lthR75?SSgqVKzJz!;5o*xynpke zkgerIe0jkDumZOwisg(D;E5btMr82XJzc(I zU*x+4Ts9fB3ORkL4#V>`usl-ifWz7{TtsykGOE?Er)^K8bn<079|J6-F>k>JUX*2`Kz5MH#`2UQ5<`Esy_J$# z%>;|B0!9wLwOe%qU;ik5Z_vw3&|V9M)xe2qzDOs z3B*6Q%-Xb0FWhtQ5F$9ga&%kx%;#NlCON3Aum2?as&xuou5#$dr4(zC9aq%2>~po= zOM^`MK?-@kYpJt3sMzM~F@0h?IyaV5eYM_m0O{(ljNM<=B)5Ex=9bQ9=V2jty4e(w%uutZhso3#0E7-jw&>sz^XHQ;Cm`>&l2@3_Sw%Lhj8IKv_9QzgpTw#jU!vIHLeDVD}qRV}Nc zr|2Iy@<2}3vm(pSej^4v8S~1mt7D?P7#X-VcHq{hAc?()QTj)#Ur`0GZ#cBO4r|y~9 z>R67km998$fww#FkO&|z8XtIaMc)X$w`e}vc(H5WKlfFJ+9J$ZtI%F&~YDC zBzw@>nta=a1E5}e&d#z9czaTxZ6`0Y-(GR4fj(Q8ci>tEd)(B-9Bzz{s8Js)?tEae zvjzTR0>(Uy2k%S_^_JjZUS=#!kwiq#KozsW1!D1tnpDm=5R=jZB-o?^JH!cl3-2#& z$MV&K%fSk@7xmb|=sPv+oiF47x_81HR@<=ErXgG90LYad-G-mh5J7UQgXS|tBz81L z^N@OE-`OsoSR1!I@*Vy6ZVn1f|NF}4qGctRuE~11G8KKQvb)Mm)m7D_ zd>fAa5im&`E{hTF#xh%Bp*Q{G%^C0>XVcSjz@(fV76B7AnAOkH!~GQvzL+tB^@bVA zUc)+M>nJ6g#&ekd(*QY!a(se{@rAJ$LgrnLSlP3yEo@=I9<+wmwIM>kf`9;wA10)W1LP(s|V-M{q}(0nz><129NPvS&)=aQddmmqV!(5tq70k|Hli$6{?{}VpcI&c9g)`xL7TXFBJ^w8J+ zFMOHQP@Do&z04>kb^!ncjqCaEJp~;cTE)-n(CVKy^!e1l>UpoRr8EXOeJTE-^Nes30|F5Fq-MX8;;MB^V^{hrj_Qa;r#b-^rt+ zM6pPM_U#hPBBL(x_kZLCTVQO8l^A~ixsh`jrxmDM!}hM+1lJkEb0W3l5|~tiJ-opQ zsVmCmO_(Z%u<#CX#hrV9m^Zp_AWBIR6 zYy)pq@en{qz~CCPz@2w6mHY~r6hKu9!a@clcx)(PokHDybJ5KlmMUK6DZQ~aiFIQQ zo09D94e+v?f(v@(?yE=)#O?m0fL7Jyywv1Y%bdbV!LRpW++M6{JYA3}yd@iE+~G)j zZED?fwuGSiO4{?Bw%x?(A~?mkA~m2Nm#uPao%Z&mxHBT_kd>2uxhW&0)UdRC8b{}vV1@aJb@nyCIp4V^SYdvfkaJD2!hBoWxh7a)en*aTZQYE6 zWQ5tP+o08dvb@ln=(K!o&bY=g`wArXTOe~WlwZvvC$+JNcGz+%h^I+)>gtP&tE*22 zp~SY#Hf{~7F`VczoX`s~>VoW8J{uPB)8yHXU7-8rSQ~?CmsD2k7Hq%*Lw2p$^Px3o zBDu=C6Ot#B#HJ{NXp`9;GgiJQ+&wHWYB)B#6o@DoEIhXX#?A>~%tb$|VZZt@Ugw%%qgFF6<2J0mCfKOe zjLW!ts;>z)YBl3Bu6p$~VO|C`u|dX<`lVOiJwX`kCHMHgCre0C3i$*IEV<-K z2ol80kZ?YM0;>se;(P)Hmfqs`_yh_pg`(wBs1dR^?%K*j6$wJ4nydhKTlFMhs*|m8E^jTIOZfLg0m3P}&dgu*23_ZM8}N#M z(69Di*Z1-Me)9LvmgoDw00030|LlF~a^uLc?yE5T;|3K$Ed)hLyc6ySwU#l@X{kA) zWZysY10o@b#}vUskliCcji1F&b}N@!Q7C|$sGgZ{*lrP9RaRD3u3u`)R~V`rxAnZ1 z@5uHDR5JO>nPTH(4_oN#8QGhm zYLKtz@%nVXIveE6?HRUBW4TnMj5j&Rfi1SybRaawSvt0wXI9I(De&k3oB4XrGskSP zJjVoHhRWJX3~u4D74=%&gii%DoJz2*pKOd3&o0J78~8h&>_4Zlr0$tm+^-jZhtVJy z0jdezZD(8iNF$$;$|^9XBpz6dt+aYtGNT?Dd&EwbNu_(5?O)$j$nbSG&>fAkdu4sz zAo}Xt$G2Q91oeJg>xB5^#+#NHQ(|^3aF!+chHBeTC~yPlC(QJqBKO;?YZ&?Y_1YW$ zlXd>0X4fvpU0UZ<*rHwS_K9PEvn`lx=IawDZ1G?W)a?_;W?Rstbo+m?c^LkVi>OOB za@agP_1nnd!Fi#)OFopdchR{Jw2|HZU+lyPe#hqnM4V z79-ZSNJVqbq>r~hPQy-r9h5)Dli{I+K};8rggF~c{f%{OC>?Af^Mjy&EX^Hjt?ZrB z;;(0v#rx(g@496@PwKrI!jiw);3~EXsiAsq|4jG)`>vWeM=J!FCGOn&7xDW`Iv!?!4g+q7@#p$;PfN(F z0`q*cLTt?%@MjE;aSDIVU&1+dWRM$~T*c~C`9|Xc@+;hL_j14azwM}c)m5kxSAc%I zk~qs6`9FxjFI|tD(PZ?xc&+^-9*N}`y(VHuttI>lwood!DY4osfA+ihES?RIXcR>;9pSgB#rk5^{^gX^VWjIbEb6K0u!m+^htrJnOBL zMxW3G9$bCGh>#&awQIKBd7R7%Zj5G$FSxNCZJ;P*(lDb39IEu8;fs7mLez#-9Ni{!YgmU1 zg@bHuJ*wpJ?LH}a%4a+I?u-FY;Z2-%sH1G2maS=hX@^i{gM_j2-`%5ThX z7#8l^IE{w|;Q7h7WcFrE$#l|!zXYz=;&1V2jD78Y#oHMv-}=_#_4Q4EQMRn6@705~ z<>d$c&->u6;e##1<27B(#VL4?7Xm2~;yizIGdz`?L7dYAr<@08bJ#{C&;7(QntK1_~f@ilJI@QHmC$TdQoH2y`d9&}e>3`k)91+MX%dJ}H|is-q8g|%~W zh(XKR*JKEQc(_7l<>3LVyy<2W`6+>=|D52cl~uOXw&A%Vr_h6c zAXn$>+t}}+JgsDLlTC*Xu4)Hl!&o))t?A-q!A0tjejHyc5K9|>y3u~tBTn+2c* zR-&t|M!i4-Z`AUEM;0^r!+f3gxCQdV^l319zp=;)vo;>jgq8+)X5_opEjV3u1)`24 z(C0>gYRI=6uN3ckj)6N^+cPN%_;3JKD@+1zjf%Ym!LS$4p=MZQ8mT#?v!xT~t#uMc z6-gLFH{-$+y+>#Rg%L-cR zl{V&vR(zdpxo7l-&6#b|N0ni2r(|WJ)k}^aB4AEnwRT%P*4=$#NXSfoaZF^;S0<_9 z$)oY;R+y`+)V3p%jzlsG$g!sS9u^(wg#vFK-m6%YU4Gy*Z(6y?RwA8w{6EE`F}hSO zp}fvKes~#BX`mlsE3f2``eW_kyo&uh-@cnSAOcF-AA3))j$PM0@^>o;C!d^plXk+n z8fV`8j_`NfW{#MA5=3)dMaO@CQ%cx<^0Dab-PDQ|Tl_t19-yN;tc@%&|J*t+IXaV|~ss5qCV z=@$K3*8;gT?h;tn0=YCUNSJjkkW1s{LRr^}bBthNi?3CLWL~|0Urn=l=HFbwo!|8D z{7^}EGxFizwPjXQh#A*|Fl#mg4AcxTP;~Up2~g(DtHOB6xGV3-B@nzmD){wBK=Asx z_oE_sITHHa!Mj$|j8+j`QGr$vJVhgKzHB(hHu8amw2#WuSleEV2xG?S;U5Hm z0oHOv*`Ts0BsIGP%f$q*FiQa_u!iK^rDw={f3kR`%cJpsx3Roc6(xXWOH_uLpMrs8Jnh=Inep-p;|So^yvnN z9i8UO*g_dYLC}C4|0nl0l^J*07dr)WM5;pL71n|liGiQi@;0TjKiNs{M@V^milJBb z+Z5M}>H=Q;XSvgxEPC5p(YFpiqIFa zY{S}TKL-6iQC|OKI0Css>CkW*O?A`UCnMIWW5rfNgLbcyFt>zK`t+x4M?deYOgttM zF3ljnORA_!W+F;M=T2*HI0i`Q#-CVd{Yg8>6||9mYBUKY#!L*^yikcNOAJ`zzsA4e zpO)SYYK7@okyR9S)sIF%`H*RX2%>HF&Ro+X((VQ+x@wL0zu*2Ls%wB|*p&E$Hl$XIm+=rMDCm3d$i7}ex z6IN?~B&LgRW=5m)K{B1^@8%R6zFk+-$n?6`>0<7&8wEjyT8zm&_xFd9`V5-apaf0g zG1+orh%8lf5s9uHp|^>>M9JuxvEt$?&3s6-$S--VF5W$WV5v~3XSJyyz8Yo%gGltC zVovMRbYSxy^ZcNsO>l7%zh-chE~fGit&i`2xwKIg1P=BD0~#xHvYK+_7^o^mit59p z!F-zz6T1RIt@JhuSE@C^HmA`owLsBnEbUfRaW$Gbx^u=(7)x``)!;Fd9sJw;q+oIQ z$xMC9G_Jk)DDL(cJ2mTdiiN124_@G(mxlS*RpYuBPq}dD-Ww@rWFt$ z_)gJ1C3f)Pya`?B1iFIptD-=2?CBI-gIv9D}%B2$Nuh zfnd8?O)XWG*vgLRK%mn_#jviOtmue;t}5T|UyAYl3CPkx*rZyXMom`t)MQ1^{yl)o z(fQ};)zK(z1)!C8jeHAdG6=1;T$u0WIOwj8%v-7QtpeCWLmk{Qb6H`g3H@tzr8WTy^472%BN{P(7IW<; zZ=^ezrN&Gjq$(@ChJe!RT^BFt?gPSx>SJMT>UI30KS~_IcCrbDV*k64No=RO`kal<$ZhL?P|$<2!0)iJ3d4qw!*q2~RVfp;sw`Q$8h>dJ3v^9w zWSMt}#7NRB$G&U1QMiJQOn%@G*q~Hlysh5oTjtCkgCQZ6MuAtp12?7e4|Zq67rt6Sjs&qxfsjc4uI~Mx_kM1(&9xF6w&tB8W}pz8vO%*AhMtZiL#I z<0?3)-Q-H~C3=DOC(ya@EQHs@GD3p-b6aT8+guZq?pWWLrP{IBAV;Gz!b!Uk^s*67 z)Ja>BXYC~dG!+|2K$#%8BOzKn92zhLX~pIu%jR$`tvgimmu;+7!a?c-Gp|4bbZSs5qLk-g;L+~G?h*c_d$VGH(P968Dc))&{d;_N;D2HtB z4Rz&!S5I}AakU+cPORLc(n$m|E&ntN^RZZMlT{rFjvYhgOGXAPgkO1;cd}w_PxE6| z_ZDZpR_SNB_6c3o5V0P%llNHsTgKg=fWSX8ATacV_jyHwr8rT4L5V@AGaF#o`n;lY zPG0#bwTA+)=xX4xFy&&OW}vo!P@-$%}Y%o~7 zE_e*e#-Uf#mEIJ8XA0@EN~>Xy_-L(tUh3EvD*9h=&R=+_?+Ylp;?WTW#gSiPw{oSO zSk)MeeYFaTID!D?Ew_k+N+E-1P^;ywi49h{wfqsl@H2kQ^YGa6HNH@L8!TjL`N8kQ z&-fd@hR5bVhJ!RXKJu2t2CD;)o8D5@vg$xzp=w`O$aQ;v_kSlW=JwAQZf&>k%yx^H zt!se-9JhkVx)vxJb%}3X3&c|0g|@B*^p#dXUugwuA&&!ep-#RV(Q^uTBiG>>_f(h% zbEVuUjDjlX@v(P*1eW1Aug|6-ac%kmn z1tccfTILAy6z;G8^Y6Rs3$Zn#7H*8_SDdnOr6n{DxYGJ{XR{JU;#k7PbbGZ|HL*FD zc;wgM_QXj4OQ8dW;n2xyFEQE+|C1s$@&N?vE6=lZG2PkZg#kEvdXrWLNC?iRGeZ+E zVr_YUGJ-!L&m9u!>=|Inu^Bbk6gGX;*%djsF>Pn04EzCO|B)*i_8dE<*!Qne z0@wBkE$hcb3^Rep#2=Uh`q#fS&-f+POHbAk{16(Y>@v)o?r=OY`ZZTBvJ zyU1bO)F__R`j^+Wr_p#W+d;(CEax)G2D1^R`%4O=-`$L`ioMjErSo(k_*HPrqj*R9 zB#4E90Djwamh7wMCSv7OqPR>xrVuVNI&=84C(t$sRXl7K8BBn0C$(FMy8VrNV?Y)* z<&3n?NNit-iCtrq@m^mP<|@!gm?1QOePe$w-PiZ`wZHLzB#HwNdX`Fl1#Z)t-Z@p4 zqY5*5N@cl+!Kw9`7#tSO?s>EvaraN4CQQ<@_k#T*y@KpO6{8bBz9upCfI!~BWXk+^ z{@|+_Ps|h+C>k-O576=)O}p~}rxWYoMz?o!UaQ+{Gk^l5Jqc&n)(oEPR z2AN2kb#x~XN=Eg)KJ%<2FZT$x7r`TwoG+di;GsEAVjgtvmsSV@FiQmLVVUn(tZ+GB z$yZiX@>k|7yA()zSU|Vd{*}1)aCg_pv5n3|ma2uCvd1makR;Lx&0IrkA7K_XU}X-G zU)Yo7SJd(yN09eMbC=Nw0wsUb#cZIkK?laG>Pfa|ye_9_ykj!Ku@gscwL2%BP8eJI z_#_u6JZ>L_VU>^FI68hOT(EoW$I1>r_X}~&*TL{bR3n; z$14y{!)w~f(LgYEIL++L&29jzTmM>`43?=juV$wLrd>s|8rs0`zqCA?sRz zE++xHxCexJ?U&CA0v3Ni4b0sYq~^7=08hC4&bk($%UOUfuF$Zq1?X}Xpvzf+E@uI{ zoCWA2wJN{$-ad#O4_8|>@J`x7-Mf&=>n8->Haxvl^ZGY=*ZtJ zE3~N5QPZm#hM)2G$~r9*9BVe_=>)cDC$L33fi2nzY|&0&i@G+UbuA#3I|0$vDHdIk z+lb7%R!oYXanje(Tzt_HV4Be1bt$#31MH7p`-=(h zO|=eGc_6nFyqJjVTLu{!=1oVrL&*q|X#)>UIOZ6fk)2#*g}Z-z8~BM)Tkp*sDW61) z3Jt4JNF|dDJ4;+Cri$967x$OlTD|B-ivOmwK&k}xjkiGwm*Z?1Hufy=Ko5(# z_xI3+KE&Py{H0iXXX|0t4V!}55XcR?rL7S;HX(4;Jik6Y!LsO};C&Gw?x7h{=2~Jf zY3{_r-NC1QFUfz*x4bLiT-C|Z*-S0~4m+C~&7l z_njM01kU(c_9j-BZr{WBqkox31}OZl7_u1d{z9|IOtFWFe5@%|uIWY+HP}BeBDGOo zKk$8g5RV63{Vqfd%7Hzi??srEO+vq0RzUa3LDj;IH%x!#36)jx!6wrg41viU#-aVp zY11t;rWN@MFtZC0*{u#ODpRjWU!;dKL#eYfFZ@asYDp%u82TUXl3Q*%)s;=B>SmZ; z!v_q~*GCC;4oR1{w|J?)f7|b$cb%u+uPb$QRAAAELdMZi&Z0-xLC89f3ffT{i$)Faxv*(|t6h8Q+}lSH*p!`L z88=zg(^HZjmtBLAr&Uz_@xupbf6~MDCwLy2gUNyOn|(0AE~sK&6@bG9-1fEleg7iR zuCOw4YpN8$^J_Ri#cS{T*R^k>m=fhKmam3=Z`h+QIzHwjYJL}3HwF_pM9r&48G73M z+RuNRYM_%SfV^Qc9j9*~oH#>Ot+do^%!Vk1>BWM;Lg87REAsWPL&|B)X(Ym6q_#Xd zm6LBh@7*4PCc<|}WkmdGfYc&p6YLH<%MukQ6KXWYjtUN`yO*^P?^l3%{=7PgNMwj1 zti3&O@mC)Ru#My@*#*~7BR#paxn8D#JLP}qjMI2DJ6Mah;L?J9l3TSaPsZwJMNYsK zfocZ;@3^|U0;#bx;ZREZu2I*eb}Gy2er`WnyUH{`N9yW!;%dy zeqX-e|Dfhi%3hbF{j~D-X25clv9P3MGCdxPT*3>KyX=D)1 zGx0q1_UfA*t9|r#fdVn+FUwoGwoEcUpyD6wZ3DgFbGPdT?3a;PkK(xS`$$`0wRAbfwtD;8pkL~WTF*{#&9tlTJAf<576>n=%VmxJu!u-g;lU{_m10M zucPBH(fE0DE50LpW|_H`^Wy{Zo_zz-o%JtsYB#e(lg#e zs1`+h$(vCU{*XTdBj`Daycrlltb@pHQ_oe`;raM8FoM}T{x0>wYUs#q7DX99r{QP( zrSxICxrMXraSEo$PqlKZo3j$vLB?j+pd2^!jgm^$`?^1;zRf$mlqf`CHzn> zEsJm>!VmfC>5n=kUviy^T!bHf=*;s_vxLEOT}v4EA^4EnwnPGegdfTm)kCp+_?ZH5 zh44cTLr7SP@IwXg3gL%x(t+yT!w;SKxG2{%#d*kEd)F$NQ(izITtfJv+)+W;2f>G2 z{2hN;j~{->Uw;>-UI7A6cup<^kHp&uKjZ^ih{_%+Kw1btCFd8t6Qf(;o;{C;X5rBN)RdkX-0u zd6?G%U6P_em!v4rB`FGYNs0pPd7?mDg8#^c-C~0&NH-UDi}iqDI=u_K#YR>r zH$1?uuI6f83$SDqU`ZFJ&bk)ZsxES)buF+}15J6O05Xy?uKZg^7gYI*-LHO|Co||j zW)`|<)I^EX;rch%719#6-Zgl$1^xtyoOgMbH5CFxM3Ym-n@X#m#9vYnxhej2BL2Tc3797bE%;Bd1*6&kS+AoGtnGu2 zc-S$2e_Hb4ljHYmwGB!z(!?Q&N_&L%$lqd98Cn2cr%2aaGhu8SeA_V^3CDw3nq@Uu z5lA~72pK{GEv-RKC}?p1C!VI+Pg!l6jz@zxt(d#rTOYn0Qr8sDy;1!-%SIKGA`Mk) zfBkam*ECI%*#U7QJt{k2V!ep$28kJj zmv@@*!&y3=!s&tOi$bgpUgF6pdv)?N@=buj&_=V)u(l7HyUyah6dO<{N9FBtl}`!# z29~A4rX^W5Qr9*rYpCrnur9Z6)r$ToGaAo`6*gX=pQ=BI|Lv0b(8yI=O5&X!9E<-% ze~vu%Z>F8KgkC8<>0EFe5=YQmO3}Gr92^L_s;Z84iF*c`&CF;qBVL!GG{prHYb7&A z@tqC2?kon~LhX%kF{z1jrc^_%PK(8aCBqfl!|!CtSem=`x77HzvT*CD5Cx4+g1&6G ztpWRfgNZ!3wg%*z5BsHa5mt-=gujz(e{X@l>>!*>uB`$2%%c)D>dd1?UCO>+!+0JG z-W&^wKNIKIJf1ID3SgQqw&}y>i`4=?0=VZuv zO)xLb?Hs`qDyz6WTMxiF3c%w>0eJi<0FNI9;PImXJbrYxYFTD!KKZhU62&$NoK%Kg z5*ATH3)K1H9(fh(1J>3|z$|G6G?V2gT%2Sau7s>~#u{c&vke13ptk1f&yM`cW@q#% zUzGXoy6}o*=W4)*p3-J?P2hUKe*|l>WFtQ+c0Z8ddykuWZbe*)7sD^Q}S z(wskE_HKz&uu@q4wJpAJ+d8xJNErR(eW)bRTuz9`nKnXjAAG5OR$}~8*10pBmUXee zcz&k9OOKZ4B3(djrV)80@Av2PJ6(dNKL4Z0vwN@DFhZRhU+BVZqAHx(+$2Fr&56ma z1gEXweeCt#2-J5K)@{Z5f8f7_m-CIVs7`R6U0OPvt~Q`_6}>yB z1;^U^F`$mEK6!iN6Y6S6=yKf37e+T=J~38=0_;8pbt9Gl2wL@b4@hGZ2ImL%e6T`ZSqA88?SZ zha;TcWM0Z7Ddv{|?3{mX_Zs}|5!m{*N%CC^TTE5s8!t9!V5|cK^E>yWc+JSbu?TVD zEonfS^;W0Ia3n00Al6ug0|5>$PG+)bxRTf6^6qOd;9Lm!e*%7NuHUA${fV;^OmX$& zo779Lwssy}H(WqAQ;3Sj| zC;joq5bY^Of6PQFt?z9gG><)Lb|+_W`^kxTF9pZmFu#8d^$f(Nmm6yJyUYHb%;(3< z7Bge};ff*Xwq#H)lgLu=3iKdQ8kr4kFQ^KC-oH(g8fD=!cK#7YQ{;fIu+jO$u?QMJDSG|6ve?gOvRvw4oVMCZ!>8+uEtJWbh z%b9YVFD!6e=$_I4a{e*a;=FhJ-ovX*@r|i$+iFAeRIRPcCz34E^O)5}LS-4m)A(_O z`MHAi*@S_8Aq12{-sieKXNA5_;s1n9*}M2!jQqdeI$^$Z-qezF7`nOIcREb$H-&Om zkTQZ|e^lDlORUsoUr!xF*QC<09>?k6ahp;`xf9(gYtjJ8y}a26qvhKn=+gtt!EILR zxv)DXUfY9Hbr(FWewg*v|M~__ROLPZo{tBEWGenGcxmmiHJ}qy_L45fL)At}@cYGw zAeiag#(l?TH0_fOZY2iEEZj@2gR{Mcsur@1e_SNpbPTlz3sz>xP9<{`3iWSK4*Nfk zq{N)YZ{su`f>eSjOr-$j*Mk5Pq@2UT#F@ilEgc;ln6^TN;Sl ze+O+v#cy*1Dz*v@bv}NYCs-u3beorL9Nm7OhL&qK!mEYu8nutWs&21}?&@`g;SHf4 z4F%pQ7YLEvV4bjgs&&LeHzUutsq_ufH+pcCfWW_aiD%Dwba=0qrM2A>$6_aLF2A_< z^FQ)apxts2$`@`OoSc`yC42BQJ_|0Ie>_{69;*NqTke}ORC4kPQHOFigpky5F`yKfft)j>oXnDGJQ=(xpIHCr zf9zinDmDD80jG+*);;|DzUri|Ba|jZWyD=;Ca+@59 zIUYo-0wIU}dW{lR$+7j@e(x)c7!C%pprc20agNjPYtZ)n+7Dox-N#gd#uy~`8VE+E zBhFirVdH$H4HT#Vwpof8NiYDje+{t<-uK|%_W<`Pz5ucE&q?|n-5`aN$(6GjvZiwo zogNEW!>)Gg3Q3{%(XV-j3~dA4&dm4Bq#S1Lh`yA*Unak#B=38yGRJ6lrF|Y3Ztsz9@CiHJf5i15tMz^{ znIvPGT`8?=mcEOrFqV_}mG8xF*>4a-RZCGu&>2L3H-NLU-U0T3dBgj9OScCR4 z59A>M#?W=(QX)ZPG$`AWIk>9HX9xI$#!xjzLmVLBB?3|z)?kZIe=%U3H`7S#W@xnw zbh0P7AI1ji%`};T1Or+s=r)fs&$ncAIW+J<$D&)`;4{LbFr^k>bQ7$70*`g z@h-K;zaMt@HByc#EnNi@bqw5YNGl-$wV;*9V(uAVnYSo8- zL;R(bF7$FPW>{?@$i7H4zF-mm5kEYOYZD;S&et_&qqc~1S7q4RVuB=67Itpi!g)#m z?A}^?Ib+N&&r8LS_`RV6Oc?`BxtX*0RpkjZw5Vds(s1z*7`(Oj-wm#<)^vXX+u)C{ z6HZ|&m@Sk?J`%ZPD7kX_5sU7j1l<#iK2K$`p6VLUjL^HTJ;kH3_~l*Dr`Huk>&x6S zQREdeMis)uIWp83iVq(L`VwxoSU4CB zr&)5+t|wmJZ&OCTO<5W#MxB3#oD5IGCQcZCpKHMpPgzH&I9?^UuQZon$JK?+w5N(x z1O8bOn&TAOP^kBUY>P2{#Bo#M!DYcTOY_b0P@&y&C=8bOBX`S3ZdVq32kTiPuCC^; z7F%XCr^?1TY-}=3YZNvYcXEpa-iWs+aD}qL7_wF^%7d-%#sCd_@dbbG|J=hoJ!&9; zu6yyL2^3p6bl7Q-woap3K3`;I@*h_rKMCJ#TLy)xVX(p zHCtqT1dX-qHVQew>$HFAO8+{Nfr6*pxQ1zxO{iQ0Rvude#6@~5y1{@!S?XaDxK8Od zH2jZJ$>)cQmw=l7m4!koXITRd?2_clzRtM+65YEcO5QZ5ib(Drn9+@p%ny$n+FV1O~<0Jwp4Nok(vl0|jd7A(AFK2B;-w_H0IA_H!mrW7Y zrZn=UU`4?-)MBrJf5P~Fxt?FQb#t=wgYwybNI?U62T`%*LEH`J4CPc~t_{p`Q2oCNfNowgT6>S8~& z^M&|(GMAw`%<+%{*wBZv#oz@PKDKY4zfF?{z6dk~D!+-dOz2m`2E==R#I~C})9?B( zRh&++Vz48)pC@iCaVD@%B(}}`WtJ|UU!Vk-s-V0(=V)g=f4{mW5-T^hIL}P(F{tWD z`NTRHF{o;)nxiLL2D2q71XW}kPmd(wAhrtV*rG{ng7fq9!#klIE;7loVm8?2Z~PV( zQrx4td!=$5@wCC6*6n?NJ3bWub0RkYcXFJY=aM9qWEk8a=6r2lYpDBY397_UK>VcD z?GW`TXJRtX_o%Z^x0{6}AH#Y-YLRi><~`Fu8dT+EY+?ZnyUBl zGiyF*rf9>(9r#6>Ir!6>5F?mT$Ir&YfEz0wx168_?B~QW>5>naoq^Bbp zopHNR)wfUC`w~eaArVuj-<;lP`agd!$YsGZcf2dB`07(z4HpmElG=83> z_$M*y1tuzXjfP_m1{;RfU`}wVjyUv7Lz3DkClOmy$&*H=0htUSZ6~?@wk-+o-9TCS zGVHJnI-LUTm!=^`sl5(CZv8G>Ue8tCbetk2u70w}QoZTx)X8Ef}^Q_g~6CLR;Hv&?A zZ&zpQVu~>L2F{D@mSDFNQD?9z;HA?hw-Jj^4KwXkehG4<-97FEFPNz}5DeT%+S#c; zP*~Dgxz#*q6$J{V^iYQzAHsLZSPZlZ#(d{=yNF{hf9E)d-K7|)RRJLd-ZE<0jArY} zOLzSud1c9b)^R1yjrKLv?Z#qT9XmHQlx^AM<(@39Wn824Cmzqi>C9Ev-&VX~3W(RX2W5k*?B;F&H7gpSc19ay%yHG#XAM6brtSY^~VkngB6ASGY8yoykoc zt;^5kf9i?6P=(#EdakIWNr!r+&(C@Y5gNtjqhqpKlN6^s!V27*xLzu4avhgmMH91q z&^$Yc8ru1G!R0U%5aTT>&e<$AdiyXjS8yIw4vbWoViA*6ns_lMnVTZSNV444m0|h3=fQNiJ3GgMtCxq%LGOgly#+LOx8b)?uoHUlk?( ze{AJ?n#!c@_(|I?Bkj6%F`ac&88=V~pu)g%wA|^(Gkxur<;5;8x2E>NZZ7!2_{gw9>?G|;O`DKyLW7+eu{>#HxsD)72 zPx-X&Yr2%NdkC*zpWoHGmq?IM$+`p1pT7#0sxagoY z-XZfx9rjiEF(%pto)r4+;#ivrvuh@!o%AEbHz=<0+l$ySb8zywo-JK@6yblG2es}* z`G6Zn!yiR0cx@r+C6yn(99m88FF2K`{&4yEqR{}3PanopQAtOTE#3;GX z3cMvYvJyN*OeB`^c@|GruM=frCy!) zVcVqxU-u2KP;Bn%Ox$#17WPiEzQzPdw5>(H6t zD|OgyE#p0jCr>7^LLPCBCuhmzNh5AD%jje)5iG&F9;e?kt6?}uF<1qoOH^b<~@C`Dj3n-8(^)Yf56 zFTi2gTFK-E@(N|r@6}M4))(pPbb;$%m+cU$h|Y>_Y}YyH{5@r&vYs-n^(-a$?p7l? zOIG`5RhKVUabLx<*24QTnLPi$Q9Pjum1+cb{rfTIVRnA~a7LLQ)T31f>d`7U${d>v zI;Zo6ahhfF_*`BmsR-$@e_`$`x3{a$vd}C!IcO0i!VWmo>7-=ZmL0E%<6Gm##Hki8eD$ zn;@^ZcEsxqY4iF)!LO;F73Z*KXm|6Aw+X8F;w!2{!WZe%Au0_Mf5?vH;s$HUA+Km^ ztUBwV>0R z@J|LMMwQ{B%T;xp&@RgN)G+*D8?7?1jn=`jPs0#gcR9)iP{j3SU=|}+f5Ac%onw1= zmt^T!{G*Cqu{r?94)lr(b@oRH6t=7L-wdXGPZ|6xtJMjjf9H}4#Ir#%iD#oU1JB4z zCqgT93|WUIY|i1B_%t>alTtztXS|pjXe9PAPm}JX_7w?OyKwa?CCcIK?p{;8IY*{>X68=N@AM=`u)lNC{qh8vQ0iRwV4?k4g}^b#wSZ^dlmISeB)O zk#wa|rblfi6|@?i5lj+}T#ERH{mWYiEd|E^zYCX9F#;0-6qjW&0w;e=3^Li{<>B&W zS(JneJ+!#Au}ujT=trNoPyR5*h?Wpo@og-P+E{W`(XVYTtK4Re7%4I-piTk>i5VM^ ztn*g89*wc`G@Z$k0yi_Ti&>J)s1ij7a`bYRIsiY;ihJXRit_{&#+ zVAUE(Sp^tqpg*$eNZ)@~K$ePcOlX#op=gRBlGDl@rWH<}la(|~UlD)sNl7)LixU1guP>MW>LGYn~rVUwr$&XIvv}5V>{{Cw(WFm+qUhU zZ?D?>oFD6~Q#Gru`HUK~YRo^w&wbNZPYuXV8GKMK%%&SX!zi_|SG>jA)8;9Sw7a<2 z_eWkj-B+yaH(*m~Cp?b>ex7YNjx*GU+eC-esB8yc{`WFTF9EGvwkZZjOfhnjGm-ZP+{uCJiM z)cgX9c#!AloKkF9fY|{alMJgKhpepA$i6*iI0HF>SAx*?DE7aIC>9TFS~=WKc5yB< zwGcd3QmLQNuxo?^NUg_{&2FsQ=jnCf9VwgLPHNpDUeTd?)T02FtaZKk=Rk|QnYqqK zuT8x2D81l@^0Mb$wor@&(w;Y)bYg7dp|;{dzm!Xq6EDX#ZEd=3`IeHOLGfRen)>dM zcn|QK@T0B5WsX%?FqfaO0jDbe^qhMbzyaM3jmG)B$*PJ3aH(BU>3ZqD88xA1wM>mY z1{Q4IGF%heiVJ8N#^xBEGlZLYyJOq1N%vT^RX)5QVcVK*{<7%ap1q~Icn`bbNKvjI zZ;4CZ&-LNR7^KUj#=9W^*(zRqz(8(x3=WcUR^xd(Y9J2GfK@VLV5dPxW_F0-ki!K$ zs?cbB{#@u?LRFl6rY9|@>|`fus;)zcla9kBSIJ}RKLr5p+iKu_#|fN?RR}&3{LaDb z_^+)XB8L8eBJ_Yc{OS@oRlzO<`$`V`b=*K|i^>=i|pFb;jF<`CjdDRNwD z3O151+q(pINJ|oBDthU`Y@Z|45c*9Z{5Mup(`V3I0oEKul`SxCjQlgGY(g=S?e^Qls6~-ND8crF>2rvYhh?@Fyxc~x*V5qW z-%|dxSQH1Mrqsv>VU=N#$KWn%05~B0ckoGbI79%Sr1ZZetg;==?V_jYtLqR$q7d;b zKsn)Ot=E+zKV(wymp0cq!5 z=gV%@nMQQ=;cyyOZ&#V5>ijPWO|isqDD(H$sag% z3f>8Le_K&<{e|bR;1Q{!^)xg)nzQ51wuCCkL31W^;Vt#3-;nWP7^L`DIE_cqe9Bl6 zV2w`2c^udZ$FndF&1IiFVMgL0dN@Ju>`5tFB{y9z6h>dIB6i=ncPLG#_=Co+*J_P8^s7YD(xp>>iCy1n`j$TX67oI>9%JPd_Ro71DLD_f#!* zuqKQ%Jh(8W@^_-GX(+XoWdT|(7}Db9nkIIQC%Ruc#=Z-@oMl}6=#R?ohp)JG>&Fo* zm|MnomZ3W;*YuSTbO^Q3?Q~(h0#-$qifiinp|Sm-L*^X2O5S(W5?12)f+YMDUe=+b zEkf8f_Tbx0)DpJcV)McYh!5lsiC)6nwNB`@8#7E`K;~B+Q``)^Z~)Sy6(jzGs~Nru z<|G(TWg53MS5%dY2z#1gW^EVKYxlHzvPMp`$f=;c?qvgPYzb5D2&q{Fg$2H}N!f=u ze>)L+uey@=nP08CQ<2b|X~>uHlHJaDE|aCT>2~wXSbdmvRfqJE(MR6h+S-$+(5iA0 z&Qdu-yqQ6sd$fF9-vReuo3A!D3GgTdDws)~Q0e^)vY``=rK97{(e$KGdR*ohoyg&& zXOfpP<@3dinHr1LnBMJuQz@N)O%1_0UL2Xqf8j=jQ%hCY7l!>3pp4#6d*eSUe+zPr zW${WqkOxziWKB@wUl^l<9#TcKw6%+gwSwq;mD5J|3yF`;Cj(%AA81{9YujBbU$chp zWSI*XKPb{8>j$V|635Ij^V&{VwyJqfI5EW~)ZIR;+ljP8?!izC2oMH4#J z{yQcbq4x$EXBV;9|3WBGqJ^FIykJzHR%ajaDxuFP2K#ifR159Vh2~91NKZx`X{YHy zj#kJDXmE}k=`9B^PhgrWwx~Xz^JZ2?sTiPZpRICC(g4^;e1BW;gc&VV_fl8+7LS|e zY69^bgR+n`Lux@N+kRjSFEdK^_P37vUF6%F7r3aMX*6o>*%|J*Y(x2lppT8D^qW3z zOUMHo>n_Gol#gx}jyC5=J^0!2e)G(_j9KjjQ?5_Uo}U|%sKtQ6dZG;&(`jb8HFJ@7 zoW`ZUUK*fZBzQtbAa;Kf}5eX63$7Hg#`;! zZ1<778>;^}E>^kI&1y|eD1I)T(Whh%^@c1h-;~h(<}*=+-;nSwQGA4O*ng*kYN^CD zau{}Bfg1JCdvB)6DqnCsMX=BF_pkqw`Z>4VmrS^-fP}gD2d=8tJQ&Frjn}KQ$+tfU zaBeCo_neL${KzF+J8Go06f4usHh70W20PL^QkqK4j2apF{pUBcs2*)ci5G;Xa~g44 z)I?O&`E&fc*^g4Idr&or6IAneSwR;4+$wx1XV$U4QnNuLrf2)o?Q;vG0W`X2!)6yv z&ZmwKcXi5(>t=EDUXBBrOJQQy${{=qpm6fg&(j)XGJ83qM5k*7cr`A?@*e=pQnBFq zm-o1$m!Tj;5SIFECbE=1akOIScEK^)VS0Bq3S5i@K~HjKQXFU0_FO}7=W zk1)$OUgt*iDj1hb3Dw>_0(%adv#^*uD!o-N94!CpyLfb*O)V}yjNIOXlhzazU~b@} zI=zj5&}9AJei?d4c2b_eOWmYl`Z_fkmiG(&{oMIw&3s_@g4xt;KJQjwkysN-K(oG; zE?29bO>`uqOd%>ey;>5NNO}*kZhJM?cuYnH`XPHce8&9P7EiChJPMY7%jL<9gKUa$I z<rb=x>vc$m}T8X*85*kbUxBcEf-2SJA$WbwD@x zM9DkO*4s-DSCfVr?eR4!QD8Q(rPpl<>}9`i^ve>%*ZdOIm<>^$p!ys>HD~zihjb zcw$W|O!-YR9Koh8b3GN24d82W=d)&UBBl3jBI_QO{M zT6(EOtFdTm7wx&UMIU9W5E)@cH&yO?7XGq74AV{BY)0gQyGgT50!N?jD~0u}fn@<7 z8fDByRpBmt8m$<0K`)LiTX?cmxu{>P2{&V@QZMPMqnR?(=LB_%H8oG=&cuIErEox3pOP+!P zH{gg$Z`yri;%7sDM4Qrf}aUq zm&RI_L!qw~0FwVj>(CKGpPJ{i{(+N5hfC3zXx{14`_%53;aBYcw^5J9!dYU|pm1pN z<44B&$_&Hm@YjB!fH=6|1DBq8l$}mqu~z8xK6do%w^kd%ot^IyFtaFbUn)$ z&e~IAU;E1G4Rf(}ld~JDC7MoR(LGZk=Jmx2Le)QCA8;~8E##CB&s5KpK4`2u)XA9X zTojkPr~8ThP|2pD1BC^viA`lNb1w=U$2F9@R^`G=Oh1JMsV;2BrR~zXUv!8llEjA`u(XahzO?n_p)N3$nYyvN+p7N;yZI>O2?{3>s@aqRb>o1i zLVob-``(Qp1Knusl}AXnY4rL@+sauxli%AKP1Ug*&)d$Atv_SU-g0J7D&znJRNzq; zrCfdHuQ(e0?tC623$iweN-w_(3A(3)eupbV%B%>mC}6SiKrP)Bn#XdDkPOIr<*4oQ z?S;|vc{hN!Ax}gHLFCfi4Z%Ii4&!knGw`ykEGG6H*$pXfKnI*JBiFxX#`{4&2~(0a zT@B={I`1FdnDh+kd(NxfV5e=j#mA0M1}>47;Bv-W)GZ${MAEnfB*)WekY9q|wof|) zI_cF82Ov@HH0(2P2>Sr13E|e3%|_b$DC@>gi_c3W&EtjauVeazsr{iLl!bto%xgS; z7?}|}_?5MEc8pMrLd(&B8K>z4CP4yWfkWgL6kQ-^NaQxL@k%fp z4)bR@uuUlWz_Ca%^+i>0MUc;@`<)XJoEau+Q9vwjNO;U58{?-PZD08-(nMl5=O2b9 zDuSYbTwH&OUxq~|D=J8BZpH<~x2VDrUxwe!sfqEL9P@%?iom#vqybO_H!H31f;g@7 zG6VDu>pLa*NKg_@yp(4`3~fo7F8O3PIRf6@bKk*@Xhl?6uJ_ueKQsGnx6WDMK&nu& zM@@~-3&~nUID&aTWA2D0(nUivN8Zlh95-JjLYkSas=^Gx1$gn;t@Wd6&0^mQF*Ss% z@zc)bGn{1v1oIC%ndMjSKy7^ZoxB$DaYL^b8FZ!?+~4sQZO$oYV!-qOi{vZ{46ZiK zTdyfhI%Ci3FE>Zx?fw4Zq7>MgRZ{*iw1g2)S6E`spqDC6rk$pNo~5wE#Km|Of1 z+xX0^oY<*5m0Nsu*_s1h?5voB=YzV}wvhp^DH9W%QIn3aQErrBcJA;|ZZuOq?&xSb zsX?zPFMA=WX^1H)k8LKbP>}jKT#Iq0K0l8*{?HhzbY=1Xs@@h6G1uRx_65~I9^(HwPsJsCVku3*QGBf z!aH3Wl*Q&#Lv;>2B1ql?grg9yVE-KJ{33lh3j3o{5DV?;tA!FkWh_j~)n|9q1`*k} zW>Y42ZKUK@>*QBccMCVya_ju?rH%K>*&n={gX@}3>{RFvC|J+Nt~qZeo6zh#MV0PW zxU(I{0sS7PU+>kyX?l}!JN>Zc$}vdCOQ%u<=D;NL)3}%%<~`Vy6If7UWmqcquXS>h zV6)`biA6h;zm=u|asxM2^{%6J`hqQZyfNO`C94kWHBXB5f>Ep_HkiFh_Dwh&6)U`s zNAIa?c;*z9aC#;$K_oa^ld(2WlgA;O9o(P3kKsBL9m7 z``uB2+;M&aU;{nE;XTF`MCOJh31WvcQyFe2uQ96g3n~B8S!zp&5bjK3?#rdc!Y|?g zGA-4d3f6NjgxA!G4};+G2gk4S*!1~#LLx;e8u^N_t$gcd9|^_S1?l#P<{fDbTZJscrev;q5?=j775+-%j8%-?z>t797_x!oFY0QM0{ojZ6|J0ufU-ol3rN0WIW ztQEyZO;?SvLEjMaHx2VGky1S1$YE#p!H(|C_Bn`1iqW zdv8Cm(lxkT%ec|1Fgf;tBqahHI_)z~GxeJO`l}VRYUW{39kYqN$xhzn!1{It-(yj^ zhFp*P1`I-3feMGm;EPnC(Q2Fc!+c2S>Hsb!fq{^po&G`iVgL z+6=$OG-&_5y9j2Fdg;lq!k{fXv5M8eS%Oi3mrKU525ADrF`DaNwlfV>)%DS<=VhN}-_A(H|z~#n&>mFtDJ-3ZZfWmlPRkU;<;tHS|*p7A8Bx zY{1a|T%1&V$N5V+y_F^*!+5_X&sXG(RWxD8MH^3 z!lC^EJA#|VG`<_h+r71|R=vPOzd z3;9A#HtC~syb{k{p3X{91-SIKuBwv$Uv2IxGHyXmV1)KZ*Aj!A5uj+bZ)AP#7&zvS%wd2p}yH5IlTQd6hxzRo6*Sp?%@aH<)mI zSp?ygjdVWi4XN|N0xxfW)ThUyKeW~7%dl3M>yBKVk)DH9%4QVlVpy4fOzqPhj@~(8a&Q59S~ z+xF98XAYTWS0%p2v`&vowUn}IKhwtteAaumRsi9NIrn+Hhi4#5*O!8qUq)vA9Uu0* zz0XY}zNq9s7wCGuIh{XTM1Rv-%tm*Rfy^2K5Tu;f>ztQWo(;XT^G|yGj*zbdHg}K4gh@cosIb`<;v*Wj=k^6 zfNlS2O{2UyF&+)X+X=NliuBZq{rfUrGw%2&+VQ5F7hl`Oz0GR)*#f9R@^g1I9g%K$ zQPpNFSgJw+hyC&P)dow5+~lmif|3!;>l*)^`SVC)CKIc=Bn;_PcUM1 zgqp}LQ{ccsimUgSTZS|yZSihgmVDBwZU^uzl2|NyW;;Pk#7sZV@l*j-qJ1BCDE+L| zaEBeN0H=D`DJ{B8If=?x2)urDs)g(&f)+M4lj(0v=}7-3wg|BPU8)DD!oB#nxZ^YX zXx^LRArFiSf#C|HJkc_ok|YmIjMjfMTg?0KL7*a1-rFfS_8R`_Tpkz~5L)N- z#pRX*KW5wbso!wgZBX*`Y=*-ZyV;2)H?`Jh-7{0$F%0CaX&pEc0viYl0+HRUc}y14 za=m%Wxd0#APEiMUZd-P8wAmpRIVET}Zr~>I@4Aj5VckBjIkplS;h5}XyivdU@4xi< zU5$Jm@%I@#eK5@d5Njks*^X>00G9RdT^x})SkRA^RpQlmwy8Ng!ruDh&F_rN1~d(FM*snLiA9t2J0a`uEC4+4W@ zcMcA!S-2fkAXIH(qe_rupRp4PgJMcYcn5mq@+VOoabt#IMumD^%1Yv900x=y9b7JIF^&N&nB&hy_!gkqE2iEFphRn>|0qV`bTq z;_>F1RMoVwiBk^qkDGPU6!H zQ!SpeOX!n?`a^0wS!a2UJ7E|lxwJ0ef%LP&$ZDempdNC2IBdl# zU0qXS>@qTzUq-OAt6A|nzusq-ve9hmo~Bqij~o$x%CPOL90Ct_eIJ_xE}^k(kg(s^ z(Rcj(vc1aGX7hk!`n*jOTv#avje2fm9%x@2WI=7IH-q>|C9lJIFh{TrU+aIyW{Yb& zp2Pwa0RXD_pWOR2mE}pRU6WUi<*tq>#e_LEFwy!Xu#+!g`E7DRb4P# zC8jnulM?NQh>~l&7g#RSWzi_olry(`e6O+}Jk$!<{D+W{Y%o?vB<9dPC!?c)`v>AA z$miJr+fWtezF;=u*A|cg#V)eLp8;8*qrrE%UK%*m0V{BhY(Mpv=(lL*5?08#D$+rh zO%-KG{;4n^KN9WBY7-td37dE0j=;6;3OeTtW=yX6Pv~(7cJUQ+q9NQcUz!X0j&1*Q ziZp*fwX@Fn$qL%E1TWW)a!sIO%iORR)%sk#x=*>Di$;Nzu%9{3)Dk^gq}0YbWG~sf zCk~VP;q{+qM9Va1`MKgLt@LZlkx5s(v5_r@~t%yM=6G<3c=CF*jZSY)`$K?<;JVxM-1frQbGcS7*+=!>U@T zsaLIg9S|7sec)J3diE-b(0jVT>0lTa;1H!pgWNeQ&^O)5m+LViK=Z3Y$U*J^T z0jPR*Y#10v#qHB`fhRa}5FT7O825kJ7FUx!Zdt2fBK=u8=e!`|4d}iHnc8UgUc5>H zbuJC|hrrXGDyvraAHuqD4b&hS0i^eV+_LevbMaA~y?Yci>Z#((e*01<9Lp_XDW?n} zmm1U)#OZBIChaz#fB#&{uh^4`9W<%LE{s<|#km9J`_HfaO#j$jR;q{P6O~YnD z4^rC(R61@dt8q}IZt*Uug18AhJ(yX5!V=;E_kTofiIELT+2hXxdF0A<6coEF7gDai z4*yW-F7RU}v$IIej>E&4vK^y*+3FK{k?JPq=XdxD5@E7WjGpbIzAipkxh5TNvz0i7 zN=h7ckQK0VSB>k)m)29wyd}4qu5f3uLVMk69MVCji_sj}!{f%KgLKu259*NtL@9$Q zg>G^qrbWW^G?!@-D@4~xj{4wT&7xCbNj6^%yltGL$PR!aEpL)>j>B0wDrDHgToEgl+w2R{^2r0Qy$pko>?jIwhP(L>Rx}R45J!)?Y<}@%Lg^eTnhH8?(1*1% z{j^2$t=AlD2PW8xP_}Wz(S9|ccOtX$jh)+Z3idiZS5jFh{>I{_8Y+Sm4HfE|_Vj5verJ3@F;NicS(uII0%uK>d>GOO%2=+3%6Cr0MXNhifk;iY=j^UCT z6H`5-F#Aed(3o8t5ZQNY#VJmu=&j}YDX!QnB@Y7wQJ0KTr@O=xA;6CZ!a-)OBmwE( z%3UizDncc%F)Y<5JwSnXgaU?Mp#UP;9O=j*n3DROH4%1mq;4D?{1D{UWqG)B_3Z)2!-(gFg&mOSz}ebDaF{CU zJWHNgFxm&YGsMRM=(`VITWms+ng6$d3!`zQEf=820NSPt>DYFnCED7hwOZ#XK3hdy z)7tAX^p|cMjGUK9Xu3CK z<`FCo6s!SwtTQwpQDj-{gFct{mMl16Cc| z`5)j*2c-oo$``bgnQ|*Qc{SjIK5?}?^R9`HbedqDd%U^&TjlY_f^EKM&D4#Yg5p+0 zNjrUX)Z#%gsWSW^=-%)QM82B>-!>k8@PHJuWygrDC-gqgQidYzv^ov?`vXP&oE`-l zfp7i1AA+Ze?&+_jS;sC*l*VQL;9W6oavDd0UE?IhYr{QuSy3bZnCY2+oo+#Gu4<)qrC8vn%v5 z-q5K!{N#0JlaVD?AD-)XxknqT&5HDM&FK^l4N5PNCLQAz;w3w8S1W8fsDixT%nj`; z%-BuG`Ll>6QG**9k0{38L-=U8ug+WO^E={}{!1{s?jl|?Kp0m&?Rf7qW6FI}T^AbBRQ2p|rdV1~-+i_V%s;N2;k|ZdPuQd5-A$hhi2ris zR|UXOpFZwz*d`19kCCL@?v%#52b9^Mc0>p-X=|Fk^vRogIi;g@Z(+Bp&wQ%qA6+0V z^Hsaksi%4LPP&K<>{T~6^BR%ckKMPs#L&JXQYM;Vnawzz3Dyn4wkTNzJbrA?W{07x z*C;5KqHGmn0;bNh94E{CuJ!Zcqxq6+{vN>1LQn=I2SeSwB1W1GPyQ|LA9#a!9>D7b zen*DK)8f(ns$DXO>Zgr9B7O8OL2Oo1aEO+sIzop_F5X{3gJ{~$iq+|cH;0h&4ldtr zyGPAA|MIiZhjWQN^qL_l0x=l}k1DPXiqcLHKnBZst=HaPxBMQy2#u|9-%rZOw-Ue| zA0C|L-A;Z{tFeW{zwlzpR-&!`(Z7@@gy?eij%3ibVe;G%H3fpfyv^pbLAa$my)XwW z5|+_lZJEyUQJ>QXg;qsN{W2JW1Sr2An2`PpyMx7BY<&gjkc-Ip8qPIP7sgQ6Rrl3U zj=N}+TTPe0g!Jhh9P9!gs(b)`Vc=kjs`Tb;c|L2+G6bxqp1m_m6*X)7dV9_*Hh1#g%o)yMqU>O(wY~_4`!pI zbY3_TKpK|VpXDpf;Kzp~fZE!9elq~BowYA(&Zx!5Sz#yao!A>a6KePo?XGukWB95mz%ms9H_Huq&|n)dst-C zD$+bJZgyoirNm!Z&-wbjlH3-x#L+{VBfwP7ygVj4R;za*&p(74ZS#nNg$P~%wj(?? zz2~h*32~VK?`v%iw5Y3x$C{MCF(TOUhlPnc6dOyp(4o^r>#@*C4QFUk?}>4tgD)&R ztYo~YaK~#`!d}gzc6e)kVM4Id)Vjgsa6*GnQ5+Y@LgbG)}8U`-Jf)Q|!NIRE|M{C~rrZNW#5Q3k9tOtd#r60|eyz+0y~uUq?t zg$JpYxx5|31U3q4TGM2w**VTFdmjxrV~&eIh?Jk&+{z37G0hV4dac>@PnjT*K*BRq zL9ym0(Wsu{nX-JiQmz;*=Sms)-32N(5Lre4+bKA}(BO7MBGG?FKkw_`5tlWVb_4dd z6|?Be)ZO`uzE;%A>db3;FDqpaJqDQExvG?VNqup5g5O=CrUSAhq>%HhY(lrlXvs$e zY?WITFaDVEQX_Di*zV*|JF`VzHJ@sQ>?~jA^V$tgHwsb8A>8)XtuRmZaT%Fw2i+Ak2VL;)Z310+)D zj2{qD#?obfBRgr~K7>X|%$~pt0cKiLhS3#*#vrH6b8a2u3A6VuuJM=B{W$+ZhN*=A zcNh&e)Pgd^3v z&o@ChR35KlLPKzW?GVhAWiw#A#e&K`6y(SRM@fN`WQhew3x7cUf043o2#g9i4M%Qo zV)880!%>+7vn69wYRSrd*3;n1`T17MgaFOIQ{5%B&E za=Q@f=xnl{WYLx=^v}qN!L+CHqbo$4^8E{~T-at?)jK{94Lq}XMc+U+aVt6U+s&l*%Qt@6@=6@*bod>EHBioz%?b;4zy$!Me zD7tLo7(2YUJiQ$!t=f3B5I}s<)kanr5b1t%wGWzq_{{0~G+fiJuI>|2=2rmmj~+G5 zKW*j?#2l_m&T#eFBXP@3-56XgWR_(aN9+OUs*Wo=8Pi*xT%2TXHERH76VRu|B$|+I z9L$cZR(g$eLe`FWr0q+G!z!Suymsg?d8nPYa||! zH!XAMvn7%uB&hG<=;%Sj%Dzm2%L^WeXknUV^h~Acd8$#5>duddydq19e)}p0eq$+^ zI2sg&v(=)P3e{;UHEsTh0K{2tSi)^#7{IcySbukTDt*E|*)^bO=xqnjWlD~g z_6RWr#;JG0df*3WyfcIZ;)5!76!6a$3Alu|{K>M2vEe*2Q_u@7FrtAVw9@XH`R1mh z_(_v-DiE`QCL0>;Y%MFEsk%hGNjG`9+=+c8(YzIr&fTGiBjd~%>Jfc`Zd4IQ2_Le1 z8;NukiYq((kVWj#F&Q}bAVZas-E~S`#&*a@qfkoXd=FNm=*Pv`;T|VD~SbFN}S3c z_yG83aU=mHTU_hte{*}!_O)y%F|2ylN-h?3yP8E2o2%y}5oJK2>Cl3?{|~ThD?FEj zPI7=iu^C(3mxD@6fg;g%Bgh)`i&|qWHA+_vVf_h&ZHT-5R5{L8R|v!Ld;CUDq;uQCW7IzqJ?bceSim5SK^*N@kA!p zO6y@MmqIr~rFgXUVh*4RsJAWJovm{`0(XvF zdE*sBkkdRsmYvPhX;@2=-1MQ(7whvF?~~97sBFIG>dI-Rp8(oz6Eqx@y)ccKW^}VS z1QVszYOtSAeM5fTGn>|>s_RU6qRQIUEc{cBrgpinRmn}Ar5}Lur~IoAfvJ4ffK1pB zWR-UhQG6MkbQHa|ub*WvLTlKr+=`_kipbzPcpt9DuoiZ}K z!T4rIGm);b0ve#Aj^AqLcGcjNZ=$4ED1tn9Do5_aSNjK{yoYa`$}xdZT#6B~|_D2i0oluPfT9?zET2jnBT? zUzAlE8`#Gb5)+%|b?^7SGB76?u$V0sgW>_L;3%hu&Cqq3C_ zdaBSFQF<1*Ryd#bM3Fir8vQY)N931+N#T#kI!mgondg2_pYmRPS5iaw*FHSFB^YfC zjFo4|;@N}i;U04yj4xKw9i%47ubVRkr{^4gg4jOn9Wy@xL8dK02Gpg~#cCmU>dP6$ zZ_(!hwy=CsjPpafD{uB$$$jpD=0UV4@S54~t`~~6-qyNTS3d zkY)9++49R}k(Nr8g0_u>t*O;7Uj;CcauE4EuMLJHiH$~Dy7}u&uR{`lVL2@^Gnr0( zMYgU8C)1QN8?sktfqAxK8JuWaP8x*)j3`k=WBruKr0-gr9Y%vB@4o1(#t!1!XohD3 zKsC*+CO1l`oI9L(%S_gFQ$)a-c03S=rg(7FFtMrG?uh=@09VKj-KGZeF9t?5|DP~Mg8DNo z(4RWBBz)HSsycPjnq^Zj4OurdhXP9XcWx}d8;f+OuuJ8KJFB^Gw@-WP5R*cjC-bv0 z+y?6}KePfq8=UuN5*56`N*Ki)qi)toWk>wVtS<$-^fL>OPiti=3mk7Zmah)| z$R<kd8HcLqv}2et;p~U;V@x1=eT!^*bmDO_|YC&}JUv0~_rqmPRjuW01!C1CaNBFcHU{6 zy8FhI7+!2kP$QP&Zd`40cz8?hK#_}>4No^Zu<4$C77z2cTE&@WZIre|EoV&Ly_3z| zRLNqCSx@ke5Qj@Hs=5Mqmpg#DcYW(#i*N#Gua5+1IKK}No!7+-lk53#HN8u}=`>Yo z=#f`=Cenv%4D}Dl8}D?C@`9`QhaR5wtfn&Mg|^D z9=SlA8WQk4;uI*^H~>wDdTS-4T4?!$-`-oy0yQR82tJ0m;a3V69IE z7d9-```~6#Ik;fYClJ~uOJivAxZr*uzVi-s)jzw89fIq#dwH3LU7UOTEcghO5BB5) z1&^_sZ=xs^>^4CzO>W9hO^vx_^5O9z%C z$=1BHwA%H!qv;!jvwVPE$)(?;5hmw?_2_g*h@;qga6hx)(ez4>+4&vGr6E2f5>ebS z?GB*&opfYOq_)ETACs$YCpXa;1!qu37$kFVt(gxY`WJhmPVrXkC)Wz z7^jR93oF!o;o1sE07$i`(M@3#LEJ^nZ?z4eDCBhG$NjpwLxs3{U=&ku1tr%812uB{ ziq!sJWlFdjy;Pw%*yA*;>$b89h~OA2cTwUZ&mhg)C2|zfffaVTYKZ}7Pu%OL*m_SP zZ8ZHf#W^f=Y?C6Qe()G+8P!Eenwp1#dbQ7o&N0P)c|w7w0RKXJuV$XbkbBQ?yu10n z=z1C7Y{9Hen7JV#ec9}|uDRZ@nzvx3zDk|pj@drYrBqp{{!FS+G;o^mW#xX*${$%> z&<0zjZe#XTp@YPM={#*m%mj5@LxqB83GA58g2noDb-?|=K@-$pO~w%V`P3$wmBR(q z@x@&VPR&VjfT2hZJfQkdI}zqGHT?n?n5Ci~{bGQAI)3D9et8|J*CJ5yj?!!YBSrK{ z-qOGxJO^43Z~3ji6)dT-%sFzJiPhCqVHZkAi}aMp7!u4z12)n}=^{a#D*4$3Fy;yf zw^n9AAS_^%YLpWUVs$j(K5>wWQ#7+PO2t0zo}`BYFv8}4PZFSHni(MS4sD!GwvUQ? zkSGbSGDO80bx(4rRqq!l;?#_0AN*hzx?e}F6Th*&S{1Z%O8U2qdXOhF1A*em}ZG8z=b6R8++&1I`H zB8NNZ3d&O;Z?j(t1X@9B4~U^c70STpq(7e&)7Ul&Srr-*9y9!fRD{w36z)o*b3iG^ zf2!0J3MvmF;Y%@$ZTG*XNm|qdKgm3e$|XUC<)-;TrvG;U{GZY+C`Tkl#DR0)NhAr+EILcJQOo#swc`GiW#DJ_&-taeI;;ylvx zBoX#}YO(HK2<<;|$=8Cb4Yu_y`Ikr~-yCPzaHU>9isoLqJ-bw4O`uGE8WSstoxCQo zt*QWk$z`})uU#cyymV7n{nN@iIWVp*grZy|qR##0k3tJtR_Tc)&aM(F)}G zIsVA+?Q;JU>(^HEG5XLPXc0q+6ob6+)_Pe8%~7NJ%O&q;|HG(ZM-}<=RlR;r2LuSm zBnNH`=%F#8K_GQBkU`@ajzXtCzeZfm=>GFD|HVl2T3y&m$Db;15&m}a$HIN4uK>Q; zxgp)8UnNd?K-HPZQTJ_OrV&`fTE&vxn17Es$5CIC$52^f8f3BJ@J%B+ShP)n1!T!@ z`hWj_VQ6*fXC>R2KObr^rc$a4q_sc4b2z#%&@nscBputfwS$gr+wR!u*tTukc;7kqygTlB_ultw)?8Kl8#TuM zs&?(Q)?Sl#=uNLN%&WcB9=To1_b$xWz7M4kwm{92O;n7ddx)B)0!ql@nwNv{YRp=3 z#S7}yfCA$^!PZ+-MVo zOp~r1GPf||49VI+!Vs);>2zVaB^QsepCM?y9(-Qc>#_Fs`cI3I)=`}Z^S)=z)&KLb z$YOyhaa?`Ts=yAZ8~-@obYJP!o=u>kb03ztcxC0*fWIlt)k16ChJ*d}@4YE8ID>dl zgU~~^lHJ%F{1lNQisQYL1#q(dR8H!?MlXBM8_39#d^XzN{L2!dAwEz?q5Ml)p?Q*P ze!xnryoue)JPl-+85+u{j-``WgU@GqiV6nYrpsJb2AKl=G?cF@_?NT9Dx$WsbrQ78 zF2dUBAOujhrLA0PH0?LD`4f7s4=013cT7g>-q{DStY3PLg~40gf1iJDJ}FxamOhheTDCejK zQiB9ptn@CkBrJy%>P$8(4sS0yha&OlgGn;;1l@C1j)EQbmmKzVU`) z1+@~e!Q@IOkEQ}MvUgQFNv_kA>Uf=>y1K!@XS>?5zI1zZZ}$gd*G!ah&Xx8qFgjPi zOq8)WXAmRcYTyOr&m&^}Xm|Q0n~(@yZPtdnkaZtiKHQQaMwon<>i;lxZ@eJ0q49UY zqZcT|sGi5Gm_w6K+;Cy=VX>@v`#w14&-&}`GAy;K!_NIvfXDSHEo-lW59MRCIU zpu2{veL^jumNyCJ4r&XY>%mo4`zJh{TVDh9(=OWa5}w7oO+lNWeE^vgDOm^68wrt% zpLLL~;H`KD&Qs|3g=9-E~3n#fmW5-JhIeoOm<87EGdghifb z%Z2dacumwutUxI63;Nhm#1X6%?H?|JLc<)XAJX~Ho8!PPNMb1 zxYw!ElAj6YvK|9%qN*;$N^xaheQ7t1cjCvU2Ud^1@PZKflwD1g}^%XCV;w{5gWk zH>twsL*b@O-cFvAwM?snv6wKWvv>d~pc00|95mBB;}u-b*722RtzqZ$>zj3Ay{9G) zQ(|JNSt-i0B=Yw1YEJ^5PBLahUo#wX^%G|HG7RNG5$%1cS|;3Jsu=GH>U?-uaMQ=W za^?OdNK^J)x4S^)gA88O+wISf3bMWy)B==kc%plcWsw7 zb~9ItXYuB3&Vb)6)XCvxmIF%AdLf|eDX3(E{d@vmT>btepkoSH( zS^m>NOtqw@x_;#8d02r{&}<9id4A(6bGj&L!W05I0QOAgB2|y(F?; zUAGx$xab)8Zj}QSSDL~V>s<2IFPK+0V|n$Lgkm$mJD0d|ex7KT(0C*v6YlxtRm{(n z&(i&a_*o)QazDL;6{ml3?EtyZv0oYFaE4pzFl8x&t1{w%X)C{LO5zsF%KI57qs&)wNY`;|92yZ4e&sB zST3{io&Xgj^Mp+EJgQ79zC|_mP6D~=mz=?R#{+V=3N&}W)F<$}u2PxgGApv zxN8Q#dkK$A`csUTwKLq4?swRB;S-S^Ufl0j0;H67y4R)?oVN(EO^(QodMrcV%{Ke! zk&3-3R+Spzc}N>ws6|)VuvW4h77}J zJBPa%G9DuN1gNHSw?M|Tq03NSgByO9n2g(a;^S6I2i!NosK-N3V{ittjD_B0Ss#$Y zh86jBTl+LL{;xM8#bF;!{dxhE6DV~ohc;$Tc_LKFEPUiqH2k?=O$tQD8j~8$CQ_Bm z+J+xR%bw>OlP-tzU$kd}dA`ZzS~L9nRw1fjio)dac)8t2<3uHSC<(gg=qwiWOT(;^ zfe&EzQj{0|_bW6wOG*xY{9i$k{Ne+Fp8Vkh@ddb15@JmI+{UY%lo=EFWA|v?u^b~* zY~~na*1_VSz?6s~cSUrzwuJlUJrgIa3T)pOq1U< z%hprk6$~=JV4%w8&bRht7@WMdw{*x2jUt~Bw1p0bWiU{t_%UVtm~tLfB<;9kl3EBU&g?|M3eDBWOMe^gG)t6@n(xn?}XPME;Gjbwsd4N2gf(GxFr>nc{P@pWF2 zGepqXLJ;fcJv*T7gw$)=Gw(e1l_u;tcawES?+BN#ThcRsh?P6d1&|DiF zV&3JWnq^?a6N)B8`m~idcDm7p)}W!6zpc#r1-76)YchhJ9zguH`40g83;&Pc?dSYB z?LL}jQQ}tmyv(Wgt2*vJL4#ztGSY|qwiyPeKuuYx$31vsw{c3&O8Ay7{qD*EeZh|6 z%kOPv4-^qNF9dG`%Y=<1{I5!}eb)0hyI)yb;w^N@BB-BHI|L~13_%r40;*`g6ZOwv z;7|Wp6O6trfcQW|{|Er*Cu0UA(;zGP#%Is%F>A*KL46tcI!%?dF%5acdSG z11Y)(%@hN@Oc!lDaX2ONHNH|Venb_S2KG;r?^Ci3AtWk1je=Gd0Fgm-xf`39ZpLfy zm9J|MFPuGzZAW+4YdvR93A*N&mvj@?@KkigQLT~ zanhro%lUH+HiswEYivv`y2rs3B_1MMIUrFdR_a=A@M|o|cv*!Q%{^m1<(fOM4Lrsh zRDQJSNzPYBFUz40@YnF6t#CN8c21am3v+p1!SPU2jQ;6Z|I!n~EHtwbIwUlN_7a3v zq0q!JOFUmQV&5WYvh0G;BUBa4oe(5;nlZ#gG;Xr0BuFI!=~kM%lu=Zc`%=~eUFcSU zb0WfQq)LB@w2;cE-;~KosD#Q@3^~8dqDJb=R=iMIiV*4zu=Z)F;-B#3?Rcn5Sm6$R z{c`DgdPb}H6*ebJA?~I@QL~<*!KXxZE>?``Z{*Y!^*W3qT9abW>=~m)bqFPIIialwT?Z4mF)MQ$( zlX2c+MlLdhdfTWK9q|)VWnrGj+iZI%1Xv^fPI^_gLJR}>PA0t1wxz8dCTI-EyBz+K z>u^zQ^h$|QQj|x4w6^^^N4H7H& zLW5NJkI_swo_TAE?X-dGy^DUxC83TZXs9%HixdzUUkW)FPt?GQgsj;gLb~DRC|U&h z;}HJ;frqKluDTHB{QWuZHz91iOGYyWH-JoKPGtYvk?`jVd>+g;cS?QP{$rn`K_2!# zcS-@8SY@w0v(#ybM#8RMTu`zrXK`9yzG!S_V1~16s9*Fn59xeEwQf1vPwip9Zot0#MI+8EMG5 zEdpHG6=G$*4ErdH*>bnhkbJ`K zej=A%b*hrrlM7-k-rKOI0NYBk=&BQKXs@nIr>B~~>`EwUJYUw(t#dGlMUcoM0dtOp zjTFCS3z60$2)K>NkU#iWy$h9y4X=J*nHi&!2}FwRlu5B(uWl@#nROfg#x4}Ps*CxL z#Llnz^O46D;1A_#9oBz$yKgKR?!(By860>u(6iYZuyi$fW@lotlYfF3DYPN*SX-e) zOvl|rh#SU)G(0!Gj;k!P+2wkO23GKbZCFVp3^jf<${Qp*7k3hk%ergM_8nE5jphqH z;^PKhgD>>=VxPCq`p<1CXv}Hn^U|6nO9<(6J5E2tK<;i$@#BsKkDj9Rc4u$uBEcq; zRLl0=$xG8F8~T1QH{Q-}NsDZkluH1u?VT%;5Bl+H;`DL$@F^fk;CTK7swsR`4wN~; zeaxq4nQr(teQ_Cc9JW*CS8kI;%el+wkV+0#k+F+pl3)lrz^fXQVO!Z?PkQj{;C;YH z^cO>HmAsfv#7v zC$qTzwG@;Ge{oNz?QL5vdSq+RvbN@}vmgBG4T5F~AOc9$h1YcLu)CvUz-eQXsB zC{yJY4Rj`zQcN%%z+Lqla8$uigK<}b;q-g`2^>B6PDrNmG}aEbMY=%iyeF; zJ!s@t@qqh^;FtH8g){?S~s&iIMcpOE9#q7&_R0v5LU`>=nz* zun;jI4&#<oiV~+v6Py-v)D0N^nMgppfJk#Ffj`cP3_iV? z_5k9b^>#8Ks3vIsFW}~FqPf^k%#mri?M@~+16Hp2{?9crDzLs`QQh6!rR^`kkz@Uo zqKkMevg?Sux>`$`M$tCyGe|bkWoqhIr>;h#tT;4%r%=qA2P{^g;aN%<(~^uG7racT zeJSu#71Q>@DG@6Fd}nI7%r{lKy=8J9(jwt#U`3BJwP$~S{P)58kxg-E;pE|-8h?xp zTqX8HuBg~n3GE>Jb41@vPlQP6BPTLICkZ6MByB4A1fII}{KHPCBdEMXAl0Un@-EU% z$-pXf&N(f)1+uFTo^cLupnFkJT zDHIL(j)&qaYZXS@?z6upy?ARAtbdorgR9IXc~1&tP-ue84aXBS6`Iip8tN|2S-4^p zb$|M{5`E;vdt$`Ry}O)+)_kze?U?H5Br|x~zk;7k02pw!!L1FA8(Bq0%2d5R0!GZ2 zxsw|&rT0Rk4R}nK6PC~JN##{S-jmvZ9D{DNd%j^T+89hkH?1TONL5}Ao z%IXt|6KGkC?&78zN|oYyjUtrTODSM|MgBoxx*3}vNH{mwOQ3Fw!Baw0Oc1N!PScxoCvu9f_?&PAZ{(W7J~%kb z2qd${+~;=yhSA9PKP-1w3S!kDtE|(W)4|-qf{%CK))V3XB}uP3UORFG_XPO>=8onz zfUN&*&7wq z9fvK%i2}2-pPP4Gt1HQ_*{Q7{ufDyfHB<7ft)uI;7~pvRKK9;3!~f*rt6tq|daC=8 zurlJfo+wjl-{B8S)E@ob_hUTFJ$IU3*6Kl)j$*W4eO`ZSxnL;S(RiKXdMRgi7yAAW zwR=1=D{b=C^`jr_^}$LY+r<_r3*bZTO$6uPI2ngnFa+OdDtYt9iq1kZ+K zjBniHV%J^J+p24om!|Unt1@|D-X!Ko7Wc=;EgdFh?$~zDH9Oog*GAlo`Enz+Wj2D% z;^lQ~p7*SAQk{J&PO>@1oe$m?oYE88WM0!k4^W4$dMzwuTI|A3+Z*wQZMk%F=Jo=6 z@}HX$ANHEA1ZaGP#m7Hqg!$WHdYnhO2>X=*I7s(qTAcN~G>mm->NGxghfeM?XC$Rz zuIFNZ#edOJ9mh^kI`Q#a@}|xKCUvhR=dlEzIqvHVJHD3^=}VerCh!F0RSc-M2BQbt zKpPU(YBbf4pRx?fW4jil--z1MjH_R_vl?nqsK>u1tkpKfz42!JnbE1rjX%}Z%1oRl zN{c9-#&XuyPBLNRH24k52BwN!r2=9+A|FbAHe~rRc{mhwL$v8Oip6GnwsO2ishFQL zOcN;+-$m|UyMSYkiX7+A*y8Akh&@3i0!;`xc6f+V&@0egYQ(lUTL$jToqey+3R9>9 zHE#dF!lbrw(Cs}?Ba?4@z%ilvL5un{O^+^%8@w228#$F`kap#X#7ZK~p@O`hs)N&E zRT-y!?LcARK)sWEI;Uw(y{5Hex#*4*8VN;l>gs<7;6JRgf?!Bp2uff~Kf&9X8?JhU zg7Lhei6k83!2E-;3CE>8Q7++m9!WMOEPi5&@R^THXVgFD&~KZ`t?WK6_bJvQd1^6! z4Ui7Z=gHg(if2&3YoPLv?<$Qb_?`3jP+1&(O##l4mI8j;Dk10g1m$nZsdj1%gs9mU z)La@s@J|sKTH1fH|3Pkq(nm_3!b!P>KEn&u0!NAh_+@&T*5cwtjs3u_hBa35qG6NQ4DCZ>Kz# zRdFkayimjJuh&-|HxD%7G#~?c#}9Z3AioQ{>q|c$A?HqA?%;80uCf&;ukz)#LtS6r zsT@Q{V%&A?ZP?^Bi2&)x{_VjD?83eymX5iZuoY5&ktUwr>KM7pPmusJSEA`KlRq?r z%l$?M`nSULiG2s?ra1BHFtZ$dE;SrAS9PJ3j%tqI@4gp26#12mkzhlV^_g-M1RZn3y>2{yPbJCv`S`1`8LM30&hB`29S-;)_v-hQo z+e7OUbT?JqN|g@rW19G?R$E{WzMe007@A^NH`oA~XrYMXa)p7sPZBx_mfZ=i@sk{f z!`yNc<24KuRU?Hj9TUS=Vw8P@7F9=+vx<*c44rtWi?7iuD!LYDNn4Alq2{U>PZ-kh zLED_=-zH~FV*{s}PB3ne{(Vz!OOJ1q*j+phe$L5`%{)>lvW2y>Qd zr^5vvX`!^%oB55|v(mbyJRH5Z`-;mez3aK0Z1-R0omVD(Xn&HhW@gQvFui?L-Va&# zU+vA+H%Da+NMy=hRy#MaI03>Pk{tW&u4mxuq`CDB&#i&0g}53+hcd>0)>nlT!Byk2 z^sW-?%ZSyfl@Vs26DZA0o-4-HwUQItt?|-VUi<7ct)4)Y73Zzo~)htqZ4a3OH< zB#@PEi|A^m;Q5E&QbB|%6cRKn2pK}6AeI86gEC5z!WJ<)Rx13;DS~2VsO>K5?klWN z9!U6=7DtmC4s7aBEbjZFFAEBoH!)O|BNFZ{$Yk8)R0VEG9MjL|+Te&ZCi6flTfP9c zC%aITeD-K&ViMnG8ksPoV2!X2q#tkJ?%%s>nde0{2E-5-ee@qa{Cg_}-@c!GA!cLA z010;VH+(agX{I6i8q=H(^n#Gys9zA z*tTss)E<|t?m0O686R9c)awg}2DbJxr^14KUMAxgR0?;d);q>`IppjU=Ii8bH|4Xg z%vs})@SV#(U5t3jEaI&74U9f@i<8CGEY7zqxofs>(iccNU&$7fiJCBpH7@Y(b>%g@ zezvj8dgNf+U;Y5HKtjN(FwUh-hbL(-#4p09IBEL4uap$L*@(mYJ0)HOw*Dn=3HdiP zjj)C`th9j0n5--nV_F3iN(aHo1{vwXb34#u*9nETWh{C-|Vs zA{X8(|cdGNCz z(0@NMyFQfu2Z8+iiP-hQwy~P;$UxXL4hF{#Njh~VHrbfg8*RZ#Qe}xvvC$9S%!tmC zinti49*q}#I+N6AXw=N;#fiN570cJ5f)%YQoZ!@iuu8@PGVBM)*Z?lZHnLulMTRDy56{GJvbHSz`oV5PzWn3WEscZkvqjIcIH)uv?99 zvEE$tuNQC8XKm{_;;@vaZg}=-*Bb?e%RO`lD9q2zJ_p1pnD<`;dNl!@9QTiyjX4jbrI7n{Ij+K6VK0(Y$&kY><%m9E+wfW0VUd7R2=sMjcTGEF z?)8L;y{%U_C#6%K?f%~BguRs>yZVPlKn|MaLMr1nJvG+${kRB^G{wYMFAdz^90u_%Oc{X*IRoLv?}`l>?KCzOPlxhfQsoAQr7Fi`Gc7Jmgy}@U$M_T zApylrHCYwMZiyl~;*~&#va~d`4~ZP@SHLgqa+d~*OCR@xm(JbsH!m`3 zbFXg*$#kU2k+45o-S}Yjxiu2O??b@Z$&Yh30MS;Ggpr49qLfbYSgv+Z*TpEwa~bwa z1;0^I(^8)QN->=2XHQ1-QdRc!4p0TlewP84_KfB<=YX1f$>5Y)fF`CeB@juLERfx? zsZW(pXV)NUi%slGjLVu+-?A4``6pk<%fRCeu$(7{AdZoP; zQQ#DJNy!Q5hL0=wvgOU)AEGRT0&7?d%t=kITj)X>N!eP0o|!EWLvh3+^^QnGSfD96 zjPWk|wnH09P0k!^oi3jkn}VMqrH*6?St%wW!M`hJe@pZI=f+AadQ2nY5r@SBS=(T8 z@noXlE(@y5ZhIBCRr|}c(lL&vzK6-Y7++hSBnQt4v0<&KYbb{of6^zlo(g{ynzc6b zXz4ZW=JOym1kDUVt{+@Oe!GXez$^5AJIE$xhK;~D9OCxQPu zNTM`t7X&?)2XmH0OIHVSz$jZ0V~$t_^G3l!86p4Aq&alGr7>Dg=3MMAk9<}67BZ}o zsi7x>5@p5`#qZa(O5OGpB8Ao{fct*6Fu!?>dt~U@`qw(cpR!X4pJU@(fr-3N%U6)r zMX3#*Ii#9Np|~-W~fMLi6?SVx4k+SrfDonJL**gTCiTcSe|S7Twr!m37ud0J7*M-iu>; zbClDu$iAqv`2AI4pn$}(!4<#U`OR;d^Bt1d-0mQZC6qq_lAu?HumV1GT!?spd=?oc z&e{N%eQyfu=BpqfoqKmK-CiA-=I=VIrrZHL z+@^->>-NwwEKIK7hI>#k0P(?h(;7tXnWZo7ap29;Fk7^EzU4+>RdIpav?ifJ)zFo; zb$dOF{tHd&!rPYJ?kqCoUe=qk^>YlOE+A36f`K6&_BDo#Tw!w53+xF6G8#x%1k;ij z_TEVMbaVE%Olk@&n^?e3vgkS<8tcj$_XTgmtcjlE&+hem#`+)_{^ID#Z zJD)!S_}FjcCf7#-V$_5aZj_vI)qZ^D{#MDw?r(B1F;oMzX)mRD%_Da;=tnKQWG8%z zZZ0qM4$pVWgJ8$r@SHA%=p1kQp6(^qizZjhzt8AL$-%2+$8_5SctDz%i}Xplqy}e< zr0zDXi}Ix1HsAUk+Lu>1aU_bp5Oi<(a1jmuzTYJpD&=VaN)sPq#Rn8Xv9F$P(06Rd zO>R+(<%e&x%Xr+mmF&-ky%PE9k0=>#pkmnXE7E-OHAE#Tp2lHt&VBC#Sm2MLy@5Re z(&h{MV|RR`syAQe^Xz_W%w3(2@2MQG@(7&Tk^2g~*9~tL%F3-*OD-3E+r7V z6Gm$nw|QWjRk04WXR)iDGI}#k?)%vfDB6jK;P*p-@SzC-$0wrqV^HAqk{9jLn`&Bh zb_d9xZ-agbevg`Z|2h9+>CBs5IZTpny*8dp?=7jRUN$3JNQi9>siDbc#CGCBg^hm7 zk<5~4XIVb07WQZ}8MMQRk-e&~Q>XKrD}Jqz;I@0=9`?`F8ELPm0tI=+?K|(vp)4*%Cdy zq+AENUKn3U1R4W!ljprIoI z^xO28xd>fd95#lL6(icCHLg7Crch!3F2DOL?u&U#Gdl~&AmMyIPX_Ezc*c(p)sQ7ut#)S;!S|n6LwSLXNeI1?Hq2Z=oVULley=C#mGev2mh^; zTC|%6E|$rI#1npqci=C56Ybz?za>?WDar6ZP16!4c!AY^?x{A5yMWc}n7%UtQ|xRA zX**rtA05$8MMF2?YOH9xZ}xG?%iez@Q}A~S505kZ0y3>4sAW;%g|w3tqIKAKImP8B zdku}uA->YWuEp#H9ikK3iOiry! z%>!HI2|tG7n_$$RP=N8E7c@P0o@H1tAb`gW%#5`dJ6NMWdW7oKP@rosglwV-?)xft z7_wUohm6vOZ%&(=_74(wQx=DbBkRkR?jI^(JgKQU(UIdHFDE$rfA*al zO03)6&#VHidj?pLeRo|_N9%siIhChy!P%Z}9+T|YXxt4q0j6i6WIRfP@i*$%KR?OF zoloyDVCJlQ#ffvLC-bvh-8Xq`xLx#b9Og$1H&P7P#~4Tq${i+%Qjw>^_cM5FVRPU6 zcwCKKcUU0agpXDDf;^K~sN`zAM?pqU5!+P9i=oEeTdH6@Ju`n$TP4uPPmnSFWxTx2 zkh>+q$`*LC%Fr^go>$^qCe#+60EucjC#%!y3uLKpY+H7XAl_b&)gtObs+goiC%dh^ zO>pQL2R-YA2A7?JB6AKa7*G5US6&EXiSeZs%zYmceIESvP&l40YXy=nae?Vd){9-e zMjr=sWNdBe2X$nAwcgA{pY`74;-)evB?a8AF@O;awi$Wr6{aO&6eA@AbRmNTPTYep z8XSm?2VGL2$p_4z#C!*bu1#>SZ|v0u!h9XO?9~c{uD$!LROk3aB4g2# z2-?7l3}{?d+nSezr2@M{LX(kJT3|4xaU)XN;R4VwZ0nq>zyr}?DAImobi!a-r{Dp` zoi0x+0z;R1|K=DFnS3B^Nup^+^1W52s%Y zVH*)ezALEFgzglioZ=^T2&NQm^Q41F+Wx=2QdWFtO12{+nw z8exg2Z!0|sc6TopvS|GQYSEY-B5JC|)$4x%;S}W_E-9<^)oVzwSTPgdmk&eirJy9XEGFh&ax=tADcSr2w* z!x$3}{C-XM*X zgg+zEg&(4#=|;vH!)2ZNA__q;#&rww{VwDkfP_>R3LBK&msN(&Btnz?9YE3cVwi>Ke!|E zAA~-}as3r2w2}8IK}nt>u|&Et=QR;n_0_Ofs?i)}8rSxD`pTQ&$d5p{qw}N3!6AR6 zBxP-HM7MQhw8clCCd|P}aTVRZ>Bs#oFj#yTpPr{CpykCLr)DNyFWfPv zZdUMmgOm@`RGBn%3iRqhIRGL}_*ec;KAif9MAJcjd|<{#t9HXU_l$S7orF4u6d zO$G=rpb743o&5i0|4AmCK<_^fNYoe6g7yIBWx9!NfGh>Jl3*&=N%5j$-O5C@eVntQ z?mQPKiIh)+>AQ~kCdTS1*#kB?iEo_0Jiee;bwJDdR~GRn9%;8~_&sR##<8(Xw7UI8 zVb6081Zx6e;_p`GmsL}xoMHojCv#!z>~vMl+#upfr;IBxE3K~WpRYqK{6_Oa;X#HT zLmqvGlt1OeDkY+h$#$V&@VSeE>E&>zw^E2rdAfslGl&frwv~&94)1W;u;d62@6<-& zRanK^ouYnfa@+qWn3dhm@YF(q7OF<_T)5zCQjVP>W4L63X{VzMU>AP-43`s3?n@j7 z=0Oc{l>6UE2#FSG#adz~6pH20Ge~CO6 zl#4!Pec_ZVS#+^S?X|wEFcynhsQ;{OV!P8Ou>JA-gg?pESetz=kNMAV!7!5Y3yW8` zFMycD*87(@&f$-JrFI`(tkinJ_Sx}&k`mR`Bw^<2?7wvOyE_37m}PQ*4o$@Q8dYVbzbED z5$bS&I!UBZs3!FD*oT{=lgQEGfw&(5&`MOJiUjrjUq<2Pbj5Q%Sic{KK9WTFhq&>x zSlc$&yYsUQ)0xe_-uIc5@31($!)+jcTvu%%KM5EtFjtgDx$)P;7d~zGMICxA{$(L2 z#KO)LZI1~tA|$48k>?Mb96$(_WE9351cAMEoa!!eEQLZPp`XP*oHA$*8UPQ({0Lf! zN|a!O15{aJJ_f0nptmg4i6yy$E=C8TwD7uaU3j^LK=nmEhxM}3y^+dX^5~8KOHRCj zqePsnR}-fi#VwcVzr(>3fbs5AD=lIUMTujpObt7Y5Ku}CPh=1{H%x&gFC(jVf$i4# z!L}fBvd&Z0$s?gXreRF&1q7u91?_v#1{<_-QF(@0l9CEhnjwjsNVHeP6c7+oaG?II zvDh;Xq+HK=*)|R=zygJE65!!pL*HtJ^RaS9yGFlAaR^(cs$#_r^gPCnL%sm0CajdM_h4ytFcdq0VpT6@OUO&`wFdU$k7OHVEgNfSY3$2XcZ~AUGn>O7tTH zkqn_Ma48geasBWILXvesf4odYX?t>oFpNy(Z)lODyAgXgY#F_7X<@vGFCFb~W72pR z?#_c(H*9p~_P!a(*|B}Tjo+Al-}=R{jn&sFjn)0D)zVR$>+|D5lw$=yiyX z+D3XV0Ac?4>pP}`lk3oNXsrd}SK2CC3!((qRV$tW#M(di|F|OGsj_Vj1BWQ8%bg+f zAAo;jIHFJU#dq@!jX8-zADT5QVjK@@1gWYBu?4+(>B$H{Y;&+dN-{$1OOK(^G?F#5 z4x=bKRy5kz#~_}V-rgzS$JQXtd+6W9OgQ9NQI`}dF}-pADal?j-^B;q#$*H}%SmN1 zZ{tu{nbz>orf56rP)Y92+|%hr74|Uw$cy1HdBk#tXduMo(5M}5Rz_W`z!@+vV6xmQ zmKHdojh0&g>?|AuzO(DIWtZ|L?>FOgqZZQ84aia}#n9HuKQ=YL>=-0}{^cU6&(g$n z(Vqo)U4aI7Y|aEH!qaT8&+Fq;RT9pRgM&wscWzMm*MIJdV}38HY)D*Ox1I=CZS+ay zS~M?@B$=IA6?b>3>gUQ#%{NZQW(w8Wp8A}cuAa;Q?iv~W775GhtTm|A+JSZTu;s%| zie@C7NO^<6!Gy?+I?;QMIpp2N@$%}UZNl4&;!y;$=Q{olXUBY4gEnWCSW^8PGWxxc zBUveAUxD(??u|>!+{~_$y*l36*5OTS3N_^M3)K=X#fZ+a+xuZ1@JaW4IvD-=k^E82 z?fwAl^dJBGyx+XO10G0!LKLN&MiF43iNzb}xXT>Sec|hCzeyTX#gq(n-)Cr{9IB7{ zPjrh&X@u0yPQlrTTSk$!)NzxsLCk;z!38=oMf$ECvKtnDi@;U-4K2F^mZHsrZM;Yn zI)t$%oM}r-pO6guueK}r{SKn#(_EnQoAh|~NWb-|>LO=y1BS}z%_vT~*~YAzCnwsr zd*ka=g}K|l22*zCKc9{Zn$3%^*|d|#l>8P=GPg0`Iob1mVp@#4%~~wx*Aw4Y1p5Cg}$;d#XEJ!6Hi!Oik<)>45hbb zT$z^ogR|u-=UNE7SvpkuhZ;-QcN3ngi-ON>I1?uz>mG3dD7ZByH;$PojC`D3qbuy=;P3*mfZyN#CnJK`EasX2 zC^9y3r=vzo2pLVCrJD3x03Lo}yMIQ67~cTfL1Yb_VPAW5WCjeMIOhSG^MR@=iJt44 zMV`I$NQuVMxs5OS!_`sVvKl6Z;;V%vjpV7@|B`*;cn*NFPqK(*5}-uLB8 zWryC&Tyko4K5mM+i4rWQR+HDohaM^#)mBGWl5Nol#{ZrCaKb+Q-J-nN|JHSFq_U9w z?6AlJ0hRP)%hmqHqBw6TAPnKIEVCkNPeZF7b=$ z?0I=_E*YR)H^V4J=aVM8I&5F~nR+wq`Mu^=1i7Dr_VnP9gWOC<^@2>4HA=b6s?|j8 zv&2x2eInl7e6jpB<%YQwoY%G6YA!8kruyJJQDRX+&2Qq-etZQN)Y})sLj&uQ-?E%I zRd0&p>_*g=jbDzppTHV}Rm(vU=nTxRhbwd}-bKJS9%6}D=c?2ZiJKK5#%;g-IXOhmVs& zjQu)4CEn2W7pgjlY92y_tsOs28G)E0+?EdzpHK^S+-jI>D1)A8P=+XQD{2+qdGI?> zSCNSL*vw-Vve(5iEKynT~@47xL-^R{?t7=E!m@WFqTf^!f_0z#649M|HJ~Jbvgje{fe>XW{f>-H?N^#ECRo zG=FqEAwyKeXksXEcpWmCI%)DyfA8K9{M|dPtOLr}wVY{;B^aZBvFY}AsVIxLv*RCG z*j*y$)7X^=ac^rBn>k|sqQKnG<-X1z>dOXeMS21T56QY(w5u$q-bJ9R6>t5^* z3;7U69GHPzENL|6rUc*JfE0WNxsVRYSxx(ITFOTA2SvI@S!kghIh#zrqkE zJnaiiHHq}E7M)G#lz%x!pbPAzOR`a_<5=su%oTF2DpkXqt9_E#R)AWg;!}? z%$2S&w_UNwsd8hL_ zqFlv+Yg8fQ%D7eiI~PJx`t|PxN>OSStr6wRufJEg);sL<*Q0gAC#w8<}N@+bb-nc*uxT2Gz>{~d6) z-3u#OY8{-qVz9V$Z>!jgd^3sX+8k)8oCXB)+a=iQGa0=aDyp>k9;LjEKHudS5N}N% zsRWip{ao?X*OQO77I<%?_EwZ|ySLvY!nV4O0)a_@9Sy~elX&Y#kE6{5P+*4lGj0pi znY7KK12rgWs3)B=2-HvG;`YZ~M{^hZD!o&O1rCNtl1g@mLn{AZYGqe;vo*GO{9EQ) ztsMl@TD2xLU`IDiv%|ufdvMlBWif`9fE~`8y=el|P;t=!XA@Squ#i7tBWxpGKDtN- z&c&Z%O(m2(QIB5%i79$suii7pRaTvd0naTGsnP4^9q zkQ>Hs3%AS95DYd7{C_3xuN@N{sG|JPw-6;o_O05h(L^e8c5Y0m`cr&6S2~vD!hh|? zwmXc%dIIE-FTXmX5NiMqE}-rwf!dbfK`3PIocEJn&&czjZ<=Q?5WnJCO#R~ckuP_1 z1uNwtHiPp8hZ}=BAte0bNb1nU`3Cm>AFkd3ypkt)6iu@6Zfx7OZQI`1)&>)6gN<$5 zcCs69Y-3~F$veOQyZ3wdzOQ?xrl#uDbhW1YOm$brgX$0&C`EqU(04o7)8VGVM6uxi zC*s}g^NPD|G87Pw^M%kNi@@I3ARJLDdF0%YL2r-LYvx4J~{NhTohrkO4IKUrL<5r46tc!w>(z z2t?Wd0A~zO)iqz{%24Hs7SJUNc0=nu)0jU(XhU)nlVPo~u|KYJ-rgtRmc-+4osi8` zS*+lcu>$EkIb@$K(d3d(#9Qp{YcUwxP8a;}5ixBX_}w#@Eci>1t_4FZO2FRsEMv_A zWVapVz(t{r+nf6qoQ;4RIPxTEvia|vFEN}WfV9c_%(_DU**KO5QtCmP(^VD6nHL5j z9vRVxiK+5GT;U#xf&NA_ClRukV9RP0gt-bd#2kvRL{QYIIQ(CcmQfLN+zr7&c480Y zKe4x@TX^Hg6JW1+?IjA2WCnKJ%_R0%Si2ApQZkwAB4$)l`au7XnL@zkz!7^<25hH; z0YR4k2Nq;GAO?WOVz*r2(|M4>!3kDYrlrm-G2vrE_Qx48V*(paZjXuUU;5@EvrMPZ zxLXwp?21J>nY~HKCNgUYN|6NLCKy)H*(y@nP;W}zIM+I$U`)W0QMPFj)`t7tst%*V zupSdL2Yyf-9!%!K`;nFbjgeNd$MJ-{x%LCj1w{;3}lp+G|$t*!L5{ZhW6%Um?~iku^pMXL-F(_GEn4AFiS*|608f!@>hH}RIu-V z*k8$q&C!xM)6UTr9zI1dC?;_9E=c7oRN;QP|BV3ugL&ELfQP1huWJ?j6*zkaVP{spEiidLNMZdFzX0jvA9N^<8 zeK-gwH9nIvv@0n-Zc-UpxG&wb_d2qOgU*G|AXR{@8~Z;X$|E+#^#wsFOI|pDlgn~k zr~8XFG#r)5ug!koF`mpyIoylF zsbEd|{}}Sp|9C-H` z80~X;FEa6Z!{+YBSybdFSU1*$HQ@<_0i|^%W{HYu3N^h3z0LmN8gwZ~LoHe@bl;me zpbMv59~1MXwX<4(*78p9HZpxyXlPxRPun|3xtk2F#a$Zu@v^#3*W|X99igX`k`GW~ zcSuyI$DIk5&Eqa6-AvvxCB|7g`U`5gR#Ek$X~a?gxRCpmf~@QJSL@?Zv(_A#1|;I% zN$*URw^531%Q!YHb@UHqWh-*kORnbt%yHTDyBG7b`&G^y&9&XPIjZ)JB?)H@1}M17 zoMi1tkd^g}e9zH!JPc9z<#LUq z8>R)vuY`1}Lj6CHgw(!Xa0(wd>J>TRQ9~ErrgjOVT)>)+zQE23|B`ZTJ3f-F6WZ8W zpwrdJYB(Kj(CC%#x6;fo&Y^?=n3qj1! zV7fkX2f+HaobECP=SIkl7GY=XjN$+N6M}; zwDBjtUuU#r$=`fSW%#ewW6_RVl3MFoT{lkDI_CCK3jYgKjQ<=%+|7!eb%FCkZ&vR! zz|9ghF7m_NTn3GWz)}uQO2T;;{Oy*%k-y>y$8OIa+%da(b@= zX$!kb>gq(;k?3d|H8UsthdG?b#>P|8f=bX?|u02 z$Krzerus>uKxWtKRC|W^{my1gCcB@wvG#-ewL+<(jHABN#m%gG{)x8=<$D+XN$@fa zCH78={lzfOgjW9eM@~gd!x&ZNjc#?|RJ;M+#U&rG%E634l~@hE5!oLgc9_fvl(xY$ z9X!Ayajgo*KH<+4V)Sk$$qDXv>dB0S)K*@Yxf}MZsO)CO9bbuIz*O24YiS3wzh!LF?&0m;SPYjTctsGh@shRbPfqZYhk)4bV3vMW-CMWov z$jm1tb&#wzzbK1aHR7J%^wa7AM$LD;#xJ6l->O!up6Ad^ZVsmJa^ z?TEt;eAd0EgB{bTMvXi2o?!+1rMDI<3V~*N>;xn1M;h!na{Zl%H4+($U0JpLBX;m) zqxSlvGT>>6s5{C&=XKHk3GQ=n(bcYj8Cb0Nl3USEg|fPI+){Lt@{-7PGNmV`E0&?8 zFnl&bYMV*Z&Z6D~&n7(zJbdA&ekri^NVBXrQDuW^<>InQp1k!z&|eywsM0=;G1%-s3zyHS>Oy};NDOwp5MYDI<^s_0s2w(J_OV6ETk}0 zv1;Hn(vVcKdn42*pdmK9)AFRi4mWGmTfdrzB3U8qURY2k3zZ<1Uy)^NL@i1tR_o97 z%^raP-2mP+uoGj5vS7G8M9TjQ;os?UMF=?nW1$28T}8eobz1(=@vFB9&Yb4mL+qVX zw;brE^v}n4Ph|d6HpXXxe(_R#RIiX8bMp`s&i{t|XSqxy!+og{vuyERT&;Q!?RJf% z&;2#&WCFZq3TOL8XHB3-mAAR0adGi;lQtK$Ve90O%8Q$S@1FSl%i3IHYoWnUwy5(v zbc;=eYn*nu3%B+IIV_HbY@f`FpYDzPvEBg5!s?^#z3mcl)6JM0wvIdFqK$jme)HxR zi#9|tkE&{_p-`RMpSsRUV}jGxvi6sa1c=osr}=*`U!B!VZ9QV)w`gzgM5PMvSFJ>? zq=p^n(yC1ivvJSUpnJ>$>4yKczc_PD^5C98F9+I-IL}=8Xco zedkD5(V-{ZkF9T=UAHsQ&TE*E7&u+EYo&d%%;>lb`OpZP`-68KOjcm%7p7(X9 zx?kJ{#smu!f^EpuwPKJQf&4YrF*AU9glRWrAm6`U`{lb3pT-bkPEhCKv&kwMn+yut z$&ks%3VE~s!R=c?79LIU`jwtv^wrB=d%Kr`zSg);@vcpxMDJ5|%kjlYZC0JGlVX=kCZQB&);At6ZSo|8MZ_2>e!3@+8q>OivZ4#!j23Spc@~G2c#& ztYJ{&bPblEyf@gWzY|)k{DuD%_?^ond%G8BEO@s}kh}IKba^*F0@3hy?10u?!FomV z)U;W#YMDB&!NFqStZFia_rQLA5uB(3L)Fx+sIH@tLAfWnQP1aXU|~B{S*g z_*yaCuVsXJng`9qx(dch9vOhgmDE{kN{H@c+}xYxL;g9i$beL)vvu?E*cVe}JDu_$ z`)l*pK3$x9yBpVhq)D5#vq*%liBvf??1PJ)?DNyXCR3;BJd18tBYPEX+na*hzSG8V z-}>pD?NwbSi@#M!@X%r1P6@`u@Fa(*J67TPzk&+5)F!z~>#$^((p`Wa9tp=Q>~>

1QE`U)&CW#;Cra|ao22GXD_(mjc>SU?Wi(Q;s%^;ooeDfI^PyjN zM7Ke1EX_Nb=}v0YM3~$7=}Z-;d*wIN-L?eVwZJ%Xz~-OO^M*>nI0T`}u4#m0l)!C# z;g$E)HlgxB7Ts2v00ieDdL2*cjK_H-wD?ges<&n&ZCe$OcS;M$U2Yb?+%AFxk75qR zby(208ffBk9X1SkGIupN%2VRC+a)M2sVVY2G}=gB39{)t{PmAI3o_jm)>Wr8%T@XY zA?|wHTsJjK*kh!8B>rW6671ETr!a9lH<|0Tq>WV_s`qap(DpYV0z7Svrf*#l{J;aA zxm7KoJsV=;9NpNV6n|m82f8dkO&BT*f_9soa8<-g8@q$Y*I_Mgj8PxGveV{yt*Ar) z7*e)TSe`SDQ_>!NP(O0f@L%)8@afI?KpW?nZ&zJlYO=lWd!FUkZsQU4N>I+)@(BT* z;j7k3oGRKRFuA~nb(?-=IYwqQ&nY=g4tZi!^x|+mbWv(xJR&H{=6rji=o7w3#GSLw zD9^aG8fr&t=;8FlADhFyKdp}HHf{V51O}A%oGoarNv(!KfCiSn&72m?pEKPSY4~YE zovbaNWjwuHu~GE=PkwpP18BZNUcw<`Z2P-B8u%TOG(;oyJpm_p>#(>i#^mdaT3iyx zk<&}6p$a`6rX+q4%p`Kv-n1C_7xgpryzix87<^D=%QV7&6v1gd;Fasu0-~~AewKk& zo}dIc^FT$9ThBI9%u4=#SRBwGZ|@25ilCutpWXZu^hfSDizvSCY}P-UQ0_ydIu=w- z<^iBVnzCJV;3O$gUq(k5DFg%*cUi!Tn3CSIm}G)bm0F}eIYp6#vZC+)Oi@}jNLy(v ziD}oEGh(I|&V~-OpYj`6O;0^qoGOB!dcbS9s`YhbLoA-7*Ey61xbs0(tYDxOzI= zEG#S4tQ_vX`f2UZta{&?d;2Hap}y>6{3CNlaOmFG;ICsX)}7ITclV2WJIw6o0b{Qf zblU063r>dP^^!Ty+~l@WHFT=B-Wn z$I6?LB?=<$d)F=T)RGdC$5Z9fLyzZvRfmr~+UUlgN?$`PG5LYbj0y&(oZ3VEoad1o z_;c$M7=_KPFvU$|m!I4vk9P`2t4UUzem{V$jU!ikpTxV@jD;TF+rtDPTkk%zDN#M6 zapT;hlnv3P)3Fk?q$Rgj;v^R8lw^D;Fp)!am0)b~WkEdpv9TRDQ|{?t?o#rp2#{Cw za#8$D%ewm4^#)FP_zCtu8ygsGxU7xT`(w--7M;OMpuB<0IC@uhb*dI*HSafc$t<)7 zODl`YL+FDgRq1C-jRFhazxcz79z|(iZqQ0Ee{vckQn;ltg6n+{B z^1aZA*;yDG81kq$(bV3z{)UKGgWrXpedxgm*(uNWv?{L^G6{rCQpHYI3c30|*nFEB zq~~vqoI+sP+qZh}&F@Pf!lv7%?i!o!HiBjB;M&m}I8_@uE%Bd-hwnt$%uNwT-1o~( zNy4i+&Uw-#e?uvkmUdZMrG!z=RtjVcTL$?6RImrlk(7B2mFB)<%21=!{PEr;QR zn?;(cJ|LQC!u&SXTYYh4KTORt9hHtWot0GV3*==vjy;!TU5XSz+=H1++_T8YnzrOHq3N zr7Cd>`VI=a9#R%yw%G2oy`wDt^}JKntU!T=#lRt8ih;S~O0AjBB^5ONk7Ipp%HL`jVVCTBTx(GhC zUj-DJa&K8q^6qK{q*6axQJFWwXTuJl%}}aw#=LL;aP_p1lGl9n_-%I4hz0e0$>jAa zcK+Boq!6a`RZ`>gia$DKz@7RSQbkdsQh6#{?Ms3AB17`2vJ+Q%gE7+*qcJHbQXVl&7JHwS zT2?hYSa5z zA(+n5)1u3#W>Bi4DH<`S#~JtIzPnt62`37(&n#(su~< zDH`P}op>8y6X~-I3YdZf&xL~!M1xGCiqNNw(1#p1`$^~{NN74)WrBy~vAx=Qwl6o_ z`SYSUZj+<0Q|rycTWZ&SZOEoEdi_2joJef&aNS^oUWvZ3iEYj)bzA`(Y62Xo-IZY% z*NYks!0>l7;p{KDPkQ&U`+%J%KCYj$CX1o^-ix#yKgHYr!98j&Fqc za|2%qXm<`iJs^2>BL3 zY=4>g3(^|Wx>ooPuQZ)de=}Z@w`)*Sp#MYyE9j z&JD~cQ$H@RCuR+m_V$gN?VzPCsnI2y{2nItYXWh?v-C$6#{{BjNn0?^!4xAqlT(o@ zRB_leSICfKPtS&irVn7RYh<4R`&Y<6#m%=M-Xu`jahU^Y?JBTm2ky@f3#Y!2iLhfB z@^%BuBxNizrBDz1_Yh$M9O=dbI_k$sS_8@B(HaQWzVneJH2oLi(kj!}MuK{8=@%jvEr*;V$XsN~g@x;RI zlz#t^?Z3l$CW*pQ^0X@Vlv@X0B1`{v`lu>TxvYzG!BWH!WF8F-1zp^CrBa74t511G z2o+uh$|P_lZP`^^1*RuRBLLEJzSg@zbErnU;_-9k6~u~8VJJqiKYr}W$vYJq_9Ju8 zWxvJxRiJiVBX89S<4?|Q3^VmjN z#RM!{2d2%7urJK}h77ql1N)rkBumJQtu&x3iMI6;*wi)j9hXc}eFwFWar-Ezb%pVL z)|2FM^CV@-^OKhr5v7mjkae6Y_!2%Odb(dJ$xf4zfDW!`S=tq^yP=8U8Fp)?bpGUl z=f6~%z06R$NkONdUT_**T7FaItYET|Xr2wfKTsjzTrJNhNl`}W8+^Uq+0=fWM#9{v zgssoLV9o297>s$@ZO6kMS`Zqc_$SC_q+Yha%6au@eC}s=B#lM;r7Fogb7kJIBIVf{ zWjUSu0Qrfi&Zp{7X9w0xc9)}9zoCv)XK!Ww)*N1VMEiJUPB3yt*+XC<=S~kpOOOMJ zQDA$lI9tz*g&ccUL?MI3iM7pD0%0NXVB=sR$2+}PljOyTBVfZ}AyIZf+@$!V$l@Vl zkUvZLwt@=_EbM&EAFsr+tK$SoVhwB4cgfhsprUUmgmj4mWI3;uI=RcfW7`p8Dz5^2> z?#Lzeb0jKkF>~Vw^>*i=dYYGLohQU!xjS3Om0LTIrca*ee81?uu;>TQ4 zE@7FIp*_Vgn_Q51T#YC|Fo~DjdIjMNxiOin*Ep?OLd=i-I}+qR^e=Epv0SMa7AZ~Y!Yrx=5lE84@+Q>@2!gSl zqQUo*Qe^2TR3e{q68CRWeGQ;Wz9(;=3Vk{p1@eCt&e9+QcT6s{>+JsL)#ZU;L>QU+ z)2lrqwKAK#Lz7spOJ53w6k&JYrp`mOOCKRbs!M<0Ahl!(f)rRyWVm)gVOrW5Fy7t& z5l`z+ZdkKat-rfZx^Qt}pJ0RZcUCa77Bw^uH>Hir0UY1D@%>%29CjL*kbtx*?=B)i>*FmfEk5Jr4#< ztThL*09O0g)T1s#m>!gDterKw->q+?&!pU)Zw+f5KX&4)t(JeURbJWuhFkw&H?dsn zWYy6?$;LLJH8~MvZiZXY4s|5MHw!5r4lQR;i6yuXAd~mIPwPnK_KnC}W_0#)Q*wUF zN9U*TB?E=I-L*3G6xc1psGz^R5@vAQu-k^9W!bF|SsGDtkWNez{gl~o6ai!bb6?im z&{ILws2~O2J7F*>uu_;d85%~EJ_6nTbNps@rRz7z+uNvBOISfAaKUoyBipbEd`{Ae z4fv{3uZR$*WT#~K1k{?A$jVZ$gisLbZqz0ls$}H2Gbgs|B1h$9$T4`H@7ygk54c#A zw+Z_4w0-O<6r5`v%rS_#!y*Q z#-cUB+`9Por(`^Vv`W^*K&KCjX}tn{F&WBnhP1szRa*B{W7SdWLd7ru%p+Y|gU0@PXD-_1oGIB1bhL7gc}#Iscm@ zKBJ9N6>Uk}W;a7xVcj38J#7BB##jHt8WIlYSLy0)LDE!E{Lr>(zy-kKlpl+JUo6n> zK%`#Pvo7qS>Vg~(%t7$JWQ)|xatE;K_WMpR#hNzBJ_%Q&GJ+F8mGmormG|0{)HTk? zn?fJ^$Z!N7PH>4Dmptji23xRS?;T@glXVO?pE_g;=yn`Wl`SlY{-gSI>l zKe8yLEX^R2+g+kq&<@zb!XqG~t9B=@b3lfw!%%o4h>&1>b6G-e{|1Ua3%{yWpsu0# z@&BNesgCmL^RY=6?-qAi%K4yaGVNCjtp2U8mz1AtK<3n;BBcv1YHCF=|BF=vbKjX= z{P|S%caNe_qW``v-sUyU;vla+q7wb2`SxhZ|3|B-7{F=E4&2BG;|X=fn>3U~zDgUC zXFQY&ar)ow#XOnPr#u)8dv$qQK2G!G9Gcc*Lkmdnz${j zac-ve7HIvhl49_-iU#mH^?Df{n2Khd#SqWlOkLavxV}EFFN~#kR$Y!$mGk-M{-gWn z>5+%A4kl^}2{3WJ8te_?9z;uQ*FL@H2zkP*&;rPU1DQmhW0#gEo8*$U$C0{=f=jsu z=RmE+!cykK@KpK%9q*XIT0xOsYPSc3mJ~4|%Y{7MVhX$ZhYO>_BY3n#mEM7{cvL0_ zg>3P$7h6dg4>A0@*Xa+Bt0b+k4s4rcJ5A$v!xbe-zzi_8`u9g^op+{iaCLp}F^vpc zQE|KOQ|R^!WkK`hU$G;27=*`*O%v&c$(|+rYukyFhE&9gtw6)x)Fst$N5((Y?GKwL zZrSTvB1@cjXY$58exoATLu8+iMnbtpew^APk1^dx3P;>7jNcF{`F2G^y#KykJt(Wr z4HprQ0VH?8YxMcD$sLK?`J>R=>Bm{B(n*s&n^GTQpEjNO{rfzJ@#^=N;E3@6UpouC z?~nnE>!gIPG*KuVuIu3grWe_VjnHi~*O6Z0q?=pImSXU@f{`0Rkg%%ie#qt*yrFP5 zlUW)EW-PUPF=t*%h!5E?2OnKBf_~xY$DNK@0FGfgo~5PVg>LM@W>UW^Zj_omKUY7a z-dQHBM)^rVCs)qvFr^2FF~>&zO7@!$WnlWcfNmqnZc(H81=`!pbU=RmPsyIu)~dO^ zi|vW%(x(Yi6E>z$8ImMmPp+}p6b3oD_WkM|>3x*Bovr7~19&3d5LqHq8hv}v*5@xB zU@gw5hX^6muElJCkd{n>r28NWV#HWE*;Sx%azb^TPJu1wo7%X0&r}K?BG(&lFdE-Y z`sKievclCJrR?|AeBWU`aJ_XX|3Q4em4B^poaN5~kt*$kzWPUkbIa+y*QD38zT}zb z+;0azc6sggx#cYXAav0G&USm9EvsRT0}LXDqvbxv1K+oSfJc|x%`@z!_B!GEFLz$( zWjpre_ICU}?x&mfZwez2Xj=TkzC&hG6Omgq8VQqhxuKQ6A@8kVT*)>mFy~^}!HZ00 z%{%>eYc&qITaVQ%b4LYyzvSO2iWEwco16y?+v)m>`^MOjQGngXQ*L__JRvbg1H?2- z?80Ejm{~zwcEoIbAMcIz%U*2QV2&P3ZqaK9PxSeA6@qv2qMp}}SXMkubV;vG1!Pwnj{;BP2Vd@?PfJg6gYW0=mwtL? zfM;&!IN$_FHt#m9B6comoQZ#00YUF39;~&Fa)GYHPR65~@CN26v~lfE+YemeVm_FL zE4SXnj#eGXSbgNPM_{V-0baV_&tH?f5tia{iSjwA-5DANSQcz-4z^Cu>!a3(hMicdk5KIBxmy8} z6(kYovTjW7MH@i#w0?pLNot6r7N!eR!=A#$I|U!(igW2i4%f>{ql;#6M}2l@*x4LH zyk7@NgA$kc!*SS%V0OkfknrE_a`?Z7cqFf>Wa5mVSSa$hTPWu9S?Tr6G53DEq&3sV z&`|2~pkAk8`^-Fr_qVDCg%p!N>&8@+WnHkn%_xsd7$Zq%o!g)fA%;K7t?Mpt9iBta z+9B7L;|gGTm>VWUSTUoY?cxdhhIR$UYP%uQ^#u#(k@JWf5xC+FTXXLi_0Jk|Os2g4 zdrP!);gu@Z5j0ddPU_U&NNx^I5_2oC8^@r1CYV~0BeG2Zh~87~Q-3uRQmboPR+@S z1eoM74-*DaTc~WeOZKiuu5Uvr-(q9_>TY)5kd;P+27G^rUZK%Gx{1V7S|N@!jS#n3 zpEp6Pv-LF=z5nLfj43AvT7bKRLgXhiXuO34Ex(ZB4Dvm#+t0+hqp8b3f)JD)l+y8) zh{CkV_H6-hBit34xU#SaSG5$4UGWxoSU;3>`Nj{w%^v0Xz}8?JS?kO2>r%bsCkH;E z7#Wv|pYx)BUV6E3Pi~mJMV&4drB4AD5fcgTgnj(bPbb#ozzr2ncBu`)TfugL1ApB4 z=uK#!Xkb$^6fBZ&+lp{Y`mbCP3K4E(%-!+B6Wa?coPq_uLK6y6Mix(oO(EAEj$Cej zlq6pYr>JVS#eRAZ=dKtTiyRTjjy;|YnadlFUs3eQa6?nPIZ3`+%qBFiXH6Rg3N3bZ z4D~N7n-Fm|GV%;ul9_qf$dY;Wy)zDuZ<7XM1pv+0$P#+;u_okp?Fjwf@zG;f$pTMm z7$sHpplxoRMrf*%`>3(^rjC|mr&X9QtY^L$7~x>KE`W@NESqdCo}P1@Womdg^Yc9- zc4Owmz&n^Z77r^5>-Y$5Nzk)vhhFsEyX-@00;hhyS2Hg#yXyb#m@*J^5{G&`<5>9T zx&$EOEC1eXpRf+=$V>L$-gD3I_Zf!9 z1lZZ=`S8Xt?gNx1h^WrX=~j7B{T#fqR9_f^@?s~&Pn))-ep3Fpbe9WzR7MouJJ&HfrjHI%8 z_#Iro@H8yfRUX4CA{%EB_i>8^I0u34L4ps#K}4fLVpG8~{|^Ce2t9rr6q~kKmkkX< zd}%l~lVl#8=N4|s!4BnW=y4TikrJD4-R&erY$Rdyq?8t+wjwpMlTCf<0A#D5p_P?i z6?RiO3ChS)m(Hkrqq#lL`KFMb3yS5D=IJHI{#f>WhqHzw%&a1{#EismZDMiB*1NEB zi$OXTO|~NBSKblx9j!?Gw|O0V?f4rf-ZxvBe;`M2xx}}D$BOAI{OXDYxt&*La@!dr z5$eD%Lzik|2}_d)qf2)deioHw z{ywbspwC&(`WHN_oF|}m24-o$pJbV)e*Sy1lQM>(XyhSb{|Cz+PHhJX2M#|EKI&@L z24AD2i!B{WSBI1C`m?S%TK-`yam}9ImsZX*_vhXGW&&odVE1H!9-t$}HR&H7Te|$= zw}1c0Odw@?QJrS1D3GHK4-}N-7V8zsl+qp4%#GZxwpv8HD7ZLtKO65oe%hDIbF0vofhdh}$w~op zfo{IsS_hlsQ^%24%?p^dT%MUz0D;@W>kw=K<(-XstS9xLy7D4V2+X ziLF=RV&`)m@#EJ_;FXm>z4(@TFycylGF7%WH?9fx|7Dds8KmnU$hE^UAv2)sJd8q( zFh3+{4T#`BZ{bMh+ZALSaLmVsGF!E$+PHJ4c}lZtj{ee5es{SZ>+J z`ViM%ceAmbY6ci(TxJwtIU!?`qfs|^2fTKp!bz5vy;HV9hHKC+LJcu!$E&-L5<$Y| zVgd;aiNu3kw`^oWuFjq-ePgZq^9S)sOgCxCL3sglD7V*CgOVeYkw@qj_! z3%kaq;4JS@?=4C~w(C{@qta7~6`opT!6#%o^vr>EDlP~-GgaeUC0zBpkI?$t%bO)u zfCyH3rObpZ97v|BJo2NDKb;^nCo-NKqDAKkw(GN;Vy0AZ7_9P;Ls(7t25I4r^_0nR zD*j!y0|@Q;ZJ@oud&|?SN6R9{jcS*Ipk{mepv7gRF8U=~y}`S7x>{Y>*!cJ)OJB7) zhVP)+yS}-XF4=@SHhwalW0GqkfVBY~&tRKSV%<5R_5j8?@zQ)11<&(h{8fh2estFD zBDONoacGbsxlWH=lBSx~fW_O~a2@4C^j+W0zs$n)c7hYTut`W46O8!SH9ZE@uXp2fcA z149b%NF~K~d(WtRM#8&00}B#r&SyW&x>Scd^RP+h^!M1sXr6Ju4j5yCUn?7o9AM2*p+=~0>RogMDXwS zMfE7w6-70$A6ROz;xgGaCzkYQp_=|a1Bj}jN4LcF8i_KfcK^__gcD$X)?j^YS5j?p zYVipA-H^~mW1t=Nh3GA0OYYV{PagK^Z>!ozR^=Jz3CAsQ3WZi8n`LTCr`h+<0aBl7 z5oEwi1N9NnFyB^8vdtDj*@L z{jo3c)IW@bQhefil~IakyoHS7!oLyI#VlK5ymT_(obuowx%BsLrQ+pyHqN=~)LUD= zQIn-_%KWA^Pffq#{?7T$%;Bi{33BE{RV`kiJnvhL-Kq=7Q{RkVUs_e-ms#Q`S>A=i z&CIc>y^o@tHAOC*TC26y-?>y;+5mIo_2>?jrAos?FQ)f*-p^?S+THnr!-Q%T3v~D- zyFAAY&M(BG|DsMOp()9#3~ip!W%hDNt=HAaV|=2DoR#9)FK7~m1Q?X|T7K+XuNw>O zFOAKu_2Z7!CXYiU`52BnmUl2-kp!3XD~tpK5!u3EsywE6aF{}PC=RPN(?DA*k#-uU zng{%nNZ7d%@Y-oCK7}kMy^OV%#c32SQ!YbtKutg6WU0+eIl0Ghb(Vpzv>U}E9aGE% zk(Ttk=wC#FGs&ak+v!0RP~-EW%n!{& zrzl_c=hr-fr-fY=9kyS{Rp6gfPs6NQka-{-Z{V@(7MgcV{E_tyI#o!8cuYIRx>F{- zJ(x7~ujB>@)pGA)C&1WSnVurtTMZ0~t-B;8L+xzxL03pKP&SwM6X&u0{vYY`wLEd= z{7bVoGI$noM;@&Eg#tq-tnLs(?9vGYO_RMvehQW6g$ha97yE$V>@Up|q6|ueRe6Eo zy7L;)c5UCH__OGZ)qe8PPFelzC^!scXfCUa(Ad4P*REonmj^m{ZSHHo3AYT>gyOcg z+wQYS1afkCB1F=tkHxHWke4W%-u@3LS8!b#GiCT%PGm!JFUEi()QVI3+pr+}(Qo-% z29oi58dQ!?r7-%a|0nKL+i_0=cT@aR)kon6BnC1&FG)h>W{nsMFFzy8E?U=d6IBPg z71m($zz!iWsMi0LdPT)VG}z?D&JW||JtO36!+`YJNj6AVbnjkHKW|G=f3pPEhmCJCem(l?vcWhJQKlu-m1BR%~u>l%>T zkkt{~P$P-`%Jd3u;%V@bv2vFPHpS%gY}TBK9yvIxwG3EsnE{U*_FMYbQIAu|1S?!* zOq*scMknPtRXJPt&(G4uz|0hMBb=-vY+Rw}Mn$d?$8 z#BdUrGfu`C-ZwmG=S_5GJrHcH`Aqk_DCPJ7xO0{*okJksR#(o|)t}<)J}qj(c9CsGF0ID`A8yVC z$7+tymW+q6Vtji#La2@LxOvx6N{b7ib)xl%L;cH=j=Ux4sZWR6{!XVQ2=Kkde=6Zs z+B<9pReuTz_@I6~27VMT?3Pqoyyy?EfA@Pf`&|FdK+tw0H&J<>-)mlQH)+D8u=!?F?JYG5IOopM zdCziL>BTC^e&bk~p^)(gUeSB;u04m0=X9R~K$H7kC$Yf|Wl=8%#gCsPUv{HNE(BF8 z!bYRUO}4Qot94etA)tPxaCQT1D7p+x>|*SO5&a!5{#0xH0`8TGCTEr#p#u3h+k$KU zt=AK!yjvv)UH;3Y&#|vZ{9K{YVa^8xJ4x(jQ~|p+ORB>hg;vpCp`59={l_P53&D4z zV~;s~x25oNpK!ab-xfw(p@HK&HYtKy3*G65>pKvE`gJBz?0o0%_qz`-ulL4I zp3d+0d-sq1=S!U}n-@)M1beTKm!nBrISv^IgMY$~yC)L&>H2-O>#Hze%&Xh*bj<$F z`gglNOm|joYSrfItPcTNL`t$yn7<4ax}Te;CW6oZ#iO!Q#UyQWSrCs#jKIjb{N3?@advC*gJ)TakfvX7RvHep$DwSU(qIwf zt8}?r+I~gaaJkVE{DCuRM>}~6R&)f0xT7_dzp|*^ub3;pr(Scw3~FDRhAu)%R!2lg zbqpTWrmiZF)LP>*AnIi49$Ou~cNa=qy>q!h+{`#WsR80=Q4)qWd2v-=0rWULy-n81 z!g}^H!^}On%Du>Zert$?)BXKz>6OO8qS)J!+XP?a_YnA?K5HBuaP5L|_`aYjF#2+H zDC0;*I;s|kI^0s=2SPd}#pb`U@mG;6K@B9NL<~ntSTC&<#KS<0ghQGoh73=88bw7Wq%ySc0mia!OJ| zPy;SK9d)I1g_f9(pR(pVV_9N@L!=lzk*m&bn@AEE(*MT@5}yPt80(1W#He-Sj;XHo zRlV2~LtB_|$|3VbpziknCwCGg*XcjGjUc()|H=KWL(5(1kB6Vx*fTQ}8tuLZJ?6xc z+i56FNzCBH2N8otzm(&7bDwU4fym9-CB9?UIRs-;j5>qxT~;Y5N!+&zmILUi*yVm5M#qkr?Rl=URSk8#$HDSXNRWzBijv8`; zcFdA6)G3RrvNqu-K~)FCIRz1ztk{AMa>Aq>hrAA^W+BW2B?63L#vIBDq=WE(Wu?ms zO1c#eSoMp29gI~nbcLbEsBMrmfpVy_aQZfBNqrPF$%u{m-7z?MFQL^hFP&e7>Lg>&g%n4> zIS!&qd8#nJg57}H>=mfZ28z0mMp0D^LJo6*Usdi9u6&|6cEHnD8eN&1;#@?cihG%` z3OJ>MN^KmJJNlH89Z-y*QZv7j#?W5`PhDUFycYDshCktGI+?u*%j6|>M9e`sLyJbX z0+HMgnaAo?1W$V!G=py!iNsMqQER~!K+0Hwn1w;i5E-BrlvnOt zLG(>QfWj%+pXf-v7dXSno3mU}yTIxnARB|IBM%tz!eB1)g`xqM0ClIx36ipX|8=KV zT^Pk8ED);SHo7$rT(?_Uh2`jlxF79L&;Bj#9dBFU&0qAU{0jX*<409WN8M^Aj6f2s z*bvwzlZF!vO4=raD~2Qj_2yUcNwRY>v`lJL_DAbvg4a2~$S6$n24ZP2Z%2)>Xqo>C z3kiAe5E!8}+;(6R7$N9qSM2g*kX{2qWZ_#`cuSeOli->Es^1c{(SC^YtuMssKMv2| z_<#E{{x!6Y%96^Ua185o6T>>!l+p7IQW z4e74&-^jOqFYN9wCV$wtMq>oIE<&hVf7e5>s?_KJY;2Wb`V*8oTdkZa)>*9CY8Fmo z@`^ffYKvR?CCxnMw53&pG<*1|->Jruk4L$?*OV6+Sk$edU6*${|C-&;?grA$AG3s4 zFt#e@9@|_nSG1-JtZgrj*di1c^9uPxhuEP`vuJ2pXM=M46$^kpj!zTThj53u|T`FH3c8aQ3YVWzjo#N~~l# z`)AA^nCB^Ud(p1AmRWSrrFJ?q2<@zs+@-EVJlSlM$63ybhtZ$Bhi&NLLHat5tsqBX z;p^XFHEr61!!HQ!jd1uD2dJWis7zlsDSJeLv!mT`9c)K}8*%(U_es={i8{tGLW!Zr ze^7Rw2O@U`XK0&pSbgg^XW~?zSo}-Zt)e85`alC+8p3ue!t|I(R?l;tZMxp)5c0Lp zt=_E3Z9k8}T+7al=^R9?#$805F2+9w%tc3bBA8v{vW#D0XWhp>KmQd+Stj)w$0txwrz7_b7R}Kv9ZmKvBAc6^3DH! z>#MrAZr!Rr-Ca}j%skU)`klA}La7cuc8$ z@DYq_mYL(|^SW*DK5%?GOSToI{WYC(vFQDS=19&-2>91~^qlRDKqGHE6XkoK(`Yae ze%Z^$Y5fRluurv*Ug-|ER>1hUsjNJui8Cv1Qqnkv0_oudcZRGJ;#i6kD}Peb-UBzT ze!PpW_bE-C2I9$)&xK!E0&yD3rOp6PY`s47clB#{FJzxz{&`8?d4CiZZn>BdL?Xty zA^q2Y|2w!vmvMkzKEoQcnOWgKbARHcDZI$FxbWDz3nR6LsLS$stZ12W@$Bp=SuL-d z(}`QE%ZRtx+QqWtYTMKsVaQ-8b!xcaXRzS>Gug8GhEcyB5KLw*q7(Z!#19^0ar3bb>#S_7vk;cW3g?{Z?Dk zS#Y!MXkR>O%6|LLU-=s$`6i8%@eRg!pzAQi;~O?@-z6Jg|D~5?MU&2Da%LNciCxxut)pNbUo~z{&C%*X zbOSSZA;kG%w^(=YnIvb8pzBi_!rwS=x29#C*%6jpfrm~=j0>38m6CQLiJvY z6M&UV|0o9sz{_P|f$pJ7l0}m<6D|Y&*`V_N@dvF`d=R^8DiRgq$)(VxJ8*`Dc9Cb_ zrg4sEjtBXI;0xw|AwMtTHaM}u93)QSC9o|iSK5|_8544f?E>U~$(hd+M@!_dWyiD; z`B<+z9RuyX8G0HqDZC0%{zV-9q=_Js9>^?2UwQkBw3nTZy)l;@5}?M$4?TZQyZU-ZQeqPeE@ zLVwKiYCW0Q-j})d*kkIsKJxOCZ^Iu_tO~C)91>`$v30=`q{s2E|CHurkSb`C0tie^&ABn=)M;w(y3=89lHB@W0H-c%vw7Om@MU);R_ll+icy$K zX978fG1HC0(x%-;SzFd0XT5{?t7n$DOpQs!Y>#HS?ZL(GF*tg`7oi z3~i#TgmlQiphOWOBZE;@jLibpvNK_gBcb08_znI8E5(PD+_BP#O@8@{*A=0bLnyuq zgiXk1p1RTgKZ8#7e*-YJ4S3hmtrtaBY<{Tr*A^x;iy*!mZ>KIbrMU$u>i%})Bu+oY z*6hYsMq5UCSKaRZJ|5xB@!W>0#i4XyVpSg*k52Jczb1dgzvr`C9aGUnBvxV!Y-!C~ z7jkLsPL-;>;n>1i(IlKK0E}3IBN^F4hVhSZtOU$l55y8XiZ#$yCk?Dmcv4GjbrLMy z>)ITe<5BiJ#;-qpIwomZHJdmPFM1{rbRNM2y69N=*z$xRf27bQ-vvVuf&)trS`T_j z^S(UrzFeCMoCE6*=xTbTt@(m3P~5Ybuo(w4Uw)%vBIis|`FBNmLv``wA9m_PqNA4T zLuZm!>WcFBz_u!Q)zmMg-Ryfm@HS1ON^72{A%E$=L&qP}@Ke91UNFLQ6&%32&u>l6 z-0ds${5gGBT|?;gm{X=Il`~SsdanFEt#lgvBKo(KBEi7z$Ypfjx!6P?yoQ`aT|pSR9RN> z2%QGek{C56wj26R*-(RD=-kxcaSpsKtOO4tX--vU%B2w!sTB*htWgMhlCm6yKlvhI zXw$|?X)u<@xT@&0V%|j2qI_+X{gA2JA&dR0X~!w=(wkA~S;oU`A*;eTqg*l`A%BjL3$s#!{bGSjh>;2~m7S3JMv_6> zQsr6m&q8`N!o301YR|4*rxRaPsT+d6|(0&X)uT`Q@Zyyd2P>fI!;!uQD_PmjM3I^!)zbiU;?@Ucnmc0=$!`1-TkfKh0Lfr(NynDQre^WUS4M#uJ|c%aiK7^NeFSCf(<@k_iaE5h^btukX=9(uPmK z)HvI&uKMfOz%JZ0lqvcQ(ux@JXU{Bd*INV7=Y1i<1cHooEW!4jx``=apbw2Igaew# zsO)}-E000SH>mzrHv7sjmq{5JQ+EPt%9uuPvV&qtxSTgc?PiLL;CV`|L!(%LeBo<0 zr{`R0_n5$NnA1PO1R;our*q3`u6I_gdHb6`c?F!3UzzBTJ?lQhpHJ1xQK2okdRlQHaos^$Jb& zRQ;}q+lDWCq$u(v!eHh{Kvf=EUQT3R-1NYhqkA}Qol1Xd@O{k7Ihgnm8+n)ZClZ~6 zRJX+W-M#fm!<&rZfdAeU@Q}apY0KojEKX~i5tI#`!SV$Hv)nRG6m31Mrw;DI4hffM zq6!H&RR3QJGXhOWf^x+JuIDrd#CmGq?zmCE*bFV3pkc+G8qK9OUO8#_czG1u{5F?>6P+&K_y<)GGzeQbGeudDN*(t1=eacE@!g^SlGE zRSd4JsFpZKzg1v}l^LGII9M3;fz0eGSzz?x3X|C94p+RM&+qSY9^d+M?AJz^7h|RiPoijj`GYR4or)~$Q>!w6!o1S*i-4{aRD z!d-EJT${lDXZMlPJ5!3g)fF`~N-!~u{RS$q2BWejK#9w2I+P(6Gc>yEJ0rxwt0u#w z-r=n6iRLQt#lrXK|v^kX`Y#& zVWiUjftn$B3BZo!^eC~%XqDVOTp*KH{mCd)m@itQnEOMw>RA4qlO6@7ke56srhI!{ zA88G!zx*h0zS{ZEPYim>FQk^y=8{!FpzM<$wtk*Q$=ic3Z`*w1ya`--$WA}w zH5{rFK?dy7Pl^b6QOF2WQAk+RI9W(TEF>+ck6~m~^#w6JfohHM zdo=cs5(LI;L8$C{dLc8fJ@S-@4p%^`tgkq~`e~>Y`>!KK|Ee-&uJ$Mw3kkt#YHfn^ zTSIysX_Sluk-eaB zpmA_;h>tURKsd^dk29g_ihu;be~k)2T+|Ca0Rb>T`E9r+^kP|1(slI*5@#&jbX{*2 z;Cq9Lcx#8k#0KaOhXnxp!@s?%fCHW_7y*Fm*@g2Suxm5(@LkV`u1PQgrk2rKHe6UM zjZ>Wi&Oa$8E&FYv%WuhJnnwCAfa`hE(Jj(9gKXh<)UW*Ecyx+C3T9`S)toEH}hx|`gyMgbT2oq(&16oFJ56)AGvrXYMB;AgJln03EIlDtWq)V?>aZfFSdB)s@#c!6 z0Jic{I^u`rXwj#Zs13fI6d%;Lmiho6BBZ4K2SaZzvf5Vb5RS~{df1NAjz*9 zbQdY|FLABzOqbpaC#@pby42|K0akWaX_lrJ=gzemPe`GC0}!(Jv{-AqpKcvx%2p#N zy@<&us_p5i>VZAUK?7wnfe2M5C>7sO}f-V1uBIIQqBjV_MY-M(IS zw0Y_3;#s-w@F2rrp2@?L%42N-jc2ZB^uee4rB7|4**%YdgjKi2&4)E^lQe}mQy_iW z3smA?;J4KX+i|QL(FynnP&q~pA5mSlNSh%9<_*ePv$j<$Qsd zm3mOO1nLkcK%FquM+Kl6hF)mK{$(Dg=Js!q8oRDYT*1GVu-QYL$_vcfLvE}fAbiTc z;}A5jL!ILsQP{pnT;}$_Uk>zFw$V^S`Mk#`un#1C0`)TAAg5}rA1@P8Fgpi*d9oCW zJN>$wZB2!h&i|ZlHtJl9Y-Cs>p2!CeOuAI5jS$apAP5W;&dYWwhk2+1^y4TFM zJf)6`0wXp`HixXy+~ag}s`sG~bL*lV_``+UF~ zWgB?~L&)z-BjYao&Xa)z$}^>sg?UYi6e!SBr8u@8%Tb^v`#QCnWw+uwwVS&$QfXgD z%3*r|S3|z=*9NTz-luCg-5eX5Q@|NxfMA{u{1H)&b3ow?~ur7P31o?WVWb zQpW-5&xGCAB!kW+Tf46Xd+=S9nREkfuYte>`kZar-A?ON`s}Z)X@?`*o}CtqV-qY7 zC0MZ>eV5?u*6)ZM3+<3VO5!4Rx>C3z=XF>v5lC1rBv~jo7cK%Gqd zIoziEvmhD$>gQ{dZ^Sm5E3GQ%%(9(v+3w|bZV4J=bZC-}|Kt+`4^t3$;;=)^IV40% zVhkA2wcSzYX5l8xY#ofVlB_#}r8DYvM{fNlk@ar5D}^e!9*3I7I$z9N>;q3V1=rVl z)oQZP<$c3zv-E5rM&St?k$lTu305DdW( z8JchnPr8RGI-nCK-W5`i&9!a;$44GPEB};Cv1#plMwt~)n>NMPbR$3PfS_W2bC_<` zDSL`$zauaHNVAGI{FvzX?|!|kTQS{Y;u~co5dLWqCF5M>ZCU{f+~6WN6{^Y&Z7B)qErR1VUorPoeCcBwxGvQ#iu)#Kb~{ zpZUXYG)p{+ZnPA0(tgacf~rX#$-;E(a)Gc3!c{6@7&~kq6Kfy%k8cMDTxS9qDF!cI zz+Tga81>?xh5J@FDm$*2Up-T_Iwiozd!p*=DPs*qd62&sa2;?0Pyj!dw${Te*1_o1 zzGeSSJ96QM39;Lp+7wos2Elx{J5ApL9gq|5U;&B{>$g4nzeQ^7T(WqvKIt+)>KA9o z<9=Ulb$C#^C2{&>Epf?T`LC@5Psb$X+evr9n+cwn`B?Tjd~J-)>StJ@8nC-lym0pPBwI;<_Zksm>q_f$b6jQ*LyN6Nf& z9UQ)Uup1!E2g+#(ch&}qK)R&Fa2%5e4?aZK18A%7>V6LcH z95su;NM++=-B_^Ac2#6e0{Sc(wI=BaVP}jacFHx$a%?fOd*e=hg~8!NNES)IY@*5uVj~Gvff7y6<~0laoJzZms#pN8}e=J!Lm8zx-c( zZ!YeZr-?T*1lpvjyC{;)6^F3u)>#=jHZ)!%C0*&|=9Xc%zKv?HsRS9bwK^?&Jgye+ zW+SMO9TipdaITcr3)4K)2E6Ox=*1u}?%~{2u`+tuXH0(Kq^z>fClc68 zV^Ff2j4Eyd>h)b2;H7@P7Si}5V4fmZ>Rq-Ifq=$}Eeb1fFY$&cFYa?UWTyp+o^Jcx z(N@^CX9`NHeMB>U*c5c3z!r5ySD}oRwpn;nyL-4PUj0J|&uvBhsQW8bMtmh%W-$M^ zLW6g$3UAMu=bpFM3Ma`TRXC?`_xWlO!9!92KMbJ>_`V?-+$)w9Vvvg!RyCW%=8mw2 z*4uSJu@>T@Bulgt_7Wj*i`R$I`!XbM{~=Pa@D>M z9ct+Fn4)q#vt@Q z@cnLZTHCq!!ZL{o`G$S`Z?K@>8b2FpnAtWTQt~ioU^A7;732a@Km5XWRUl@uz`7BX z6^bF0RUPy~ZbT}CaxMW-BV~ONOZF0^c`Pp#38WLkn zr|m}iHF9a8+_Rg*Xa{@9$wPT)Xu@j}=tg@{akn8fV@HVZfAQ3y(%sptA0INcuI|~I z?-;j=NBUC0mz#d5B{y6mm1D|M~BH8=)sd7 z@~`8Iq-GgiJz)j3S%2Dq$#tUnkjdiPY(J9i~q95|}OJP*s$ytcbYBTub)1_dHvg-dDv3>X(g^$N@ z<{r#RV-tcRv}(Sh&shaclboD^WpLW2FO({opIKy1($WTFI4P?RCd?1J|(WM0C=IDqwzB=hg=qs>^7KFeeeJqfUVq3f8<% zj+sxK5Nuu+Sxhm&l9Rpql|QR&n3C+|hw_wRNiL-3WKnvFR)t4?j5#{fk)Hds z<-c|2=_VueeMYHz@&w@fbzwK&*m54Mj9w5g@#rVEgHM$iDD9&u^C84-ah%j@Fm-p; zuGxnAxj`c>c*bMY5Z1siXb$FIE~LBEFErS4pNA04r5+Hw{^g$62X$(IZgI=U?w`In zE=;iiPqi?bj?3xw>x8SWZ6o=9!kNjN8kUY=%%eKrV|sk@k;7=z_{BGAC>AoZ6toKBDxj|@Oe9oKumpgJmUbRi zoTwL#pg35OES!Ow+T!=ibE>aU5Bs&BD7-eRb*0(0mnagXTop7F>oLhz!!0gfSdMs6 zCl3b}-VHDX4;xn&O*B<%Ko-De&hMKtvXS~UdxbFhk+u))K5&%Y$0pI9eu`3Lz!h-4 zaz|%vI!~bSl4rHTW`H{C2oAQ^TUsZ-V^iR z#DW8*R#xkZZZN$EOOd`Covu08RiOzyJQ8X{Z2%8`2Bk9`^Q|KdA2+O;kRPxeoFH?p z(*C9BGCn-IPfLDApwdQZphxczYul9Oo3|<#m;;qoURDyH&PDUpRGXfpuYN}W>2+_L{dTAj|)`W&~NKOXg5a@jvq1DrC5Fg zY=Up=qeE-K!)3|p8k#pR7zl;=aSgy#yv>FdiSkv;MWKm`SL6!?T69V6GHPbc>@#nfWV9VU0X;q>-+P zkDZ%wExIPAxBA~$N)2;!*eBWyx;6??1nYMb!r5! zEbGR3{@BwH?h&_n>ut|7K3OWD^#(22yRXa=2wG39^F1>5-=Uq1p2QP3Kg?bawD^AF z-Y*bCpU(=Z%WaTwPn$ZLQ}6?sx?arweZ!{NE|le%bZk>IaQf%T{;W!gWcn+;3S2YF zNIon>TQEY4kqptcZV?|g#@*W)1Vhf37sWKXE6E)spXkA&H~S4eEAVyGgZ_5V;pb`F z9Dc0q1C?#}wBJ4QWh`QI+F*~9;^dvfpWU4RAjD@Z;s@q4!!q-3$!!1-_iT2k+k?2g zOR-tw+Odq&uLYIjJW`&{lE{!s>=D2B|o-7l}Yaq`=%hNm3Uo~nzafUddGgXX@u z(#{nHwk8-{#=VWA@&FBiL!Bi6hN- zRJd}Kr8?#ZqhS5%&D$H4Yzgsmk)NTN^M=1dq4n}brY)JLO_4l-Rl|YMKgt3n<%M*M zi+;3$ijr|Tn93csVQqbasB2~i<6JbV_9$)$@KN3>-+8*K`vCKS4RTSXVIIjUAgeoN3{w z);;gVI9r-{(F^!qs`BF$?x>u$K`q!r>h7|LTV5pE5E6r z@#7j==2E~jDthGJ5HClrtRVSpSTWA>wz#9yrsReFHAwD}teWM)q0H$jTvi5*GglU9 zrLIotVf08KStHZoFdT2`??at&4mD!9mR}|5Q~&UOq?=Vo_+0Sk#i_tg@JXcN9xMmu z(!;^sX6jCegQpuoe(QfPBqtxU@ki?nhEF1?I~|sl%6)c;?hoodMnT#A@tU6+{D6o- zRc^-Do^*0C)bg3WUMaF^i}|*O9mvXi(@82w1-Cc=6l;H`P9B!d$1kAKx!Q->Q9|w2 z7nhh%Oi6GPh?mB~L2R0C;6X)H2{KI2`Rz?>?#9iCL&=0})>U#Xrga-^R2llNZbdi! zz-ECIHoj$xAV5}Tk^Egd`8tFmq%9e+h7o#4881gh0TAft6HZgNmMUj!S2vwfMlRG zjQeiU)D=Ph1s^|}H8n0J=?JH{ev>edWZW#i; zO=|0(`U~6Z4G3`gYa}>y3h_*bB6Kd6fH(0M2zE2+IgJ;P0>37UHl9B`fnwW=V=`x4 z62YkE9K&L{{f+bLdvGM&82zr5%y1Z_LRM8J{T=fljKqJ#dzSJ!)RZgDo#;~Zlood_eJnEKEe{TqD~m~19P43Iu6j*5(NhS&a? z@{{CWg=w@Sz)r_mv!F#CUOl5QO?V@<-VPx@r(}GzJQeVSyg5l0Mnj{j4sNDGq)e#M zu$KOp22tA_%!lh?BX!d;yOL$G_KF(@0oL=6`PjH97ziDiOe5 zyjn^ci2z1IFg{rP4~cTLjO*a$1@lCuiG9<7&9zRd|w%%z+Oh_Hno~YiwOV& zeGq`IS>4K4bgn7@GG9Y22ncoiPwgG@Ot7{AZY8)GqazaSz4>1i#^`N{+Lw5}B;34I zx9?Py+DhHyMh=IaTb7;MoRZj#^JICJ*^++QqD`w#q?vXW=vY=nMu{(Hi1lKcHLCJ4 z+228-U}grQCE1+rC9reD?4)N|pQ%CC;f>;cX(fL{mVR-Eagm7K2bgon8a&N<@hEKf z@D_O`Y-gW#`UoQ}BSl|y4!(3=IsUZ%UG&GPM;3j`6mH&Zb?gJ4-Rlplkc#|MA>q}9Dd@&wmE;+=c>i;^z`&RZFF4GV;RF;O|Q6DRG$=LBfHXzbZ-4b2sDa09C~76 zU91N>)CW4;2Rh^jI)L^A9r^sFTj*NRf<^TSGAK9O!I?-jN1Dc^Mv*}24 z*W8I0FYRntsI)67lz|6}!1$0$d9Q58JvGFMhmswWv~7lK(blUs%bZUqI#&asgv}5V zV|j*}`q4pTXQJwo$omjQw}DsUT%6)`@2Fu#9o%Y_zjM}(WWZ7iZ|yu|fs5vfA`?7p zpDya#h%00(o43rAvA4KD+MX?x9sAwP`S@LAbTS-f#Gp85oBr!3*Hxy+C_S%MN8IPN zjlr168{9rk1P?ds(l3%f{|*yyMmSnmgA>xvAcGM>c95KVjU*b&@SqZS-}}0}nq^Hz z2?}vL2rTf-5a{O}FUQaxYW0En!ntTSN~k@uKVEFY=suKR+}APy-{7!!>IQbz-B>#a zA06LX+wj%MlU=|Sb8Q|V_QU$Xv1<7*;l+)=OwU^2b-Ydw@|9(pPgm`;TZ(&AkN?rN z(xUm{zkzynM@>2jYu7z$0v35U)8ZlAb9WP%uJ;XwK_L10&l~6ZDgv?&4SgHTtO0!I zdSaq6Ga#DP(o!WLRSQZETb#Q!g4wV~zHC?o@wRI<04AstRt7rCU(C8GblcLjauMu# z!&3$bI_oFE&`rEO)eNEgwVmS#vUsRi%|yU~;O}r+odxjsWTViC?~%OMyZ<-G@60(1 zIMzC9P+}u^KA}1s*A8bTPoYLcA>XZVZb@%88?Mr&%&^p$K{DsqkmHr*u@sXVmTVIgw9He*Dbav+jj3WXBZ+FsX>8 zjM%=ePfwxHBPnU))Hfe-=(jLtpWmB0x1+LZr9Kr0mK>anzKSo{GFl~B+H%7SDqJzj z!d3mf(WS<0=ieqOU8wJs@MHM~teUEczw7(zQVq%xo26L;FpJw0MD);u9B5J6|1T^ng^jTLRNWqM6m)C;FR$)-jI^jgJ~kyxTisU`C7l#Z>&qG*C)@^@90+Zd0$ z>wB!7M;jXZb$_SO@m+}Pi8%5}EV+`nufYz)q}sqn<+51=>pCye3Y2(U1XlNB@o>>q zldj7&sq0{}rhNqJogMiQOxf^~I>WpUhOdIQ^wa}~$W;x;ik#~~4fYW9=3*ypF3OWE z;K{KnsMSf~bHTN52c7Lt+98MYqWIX3y=lqUb)urQwhv@_9*kEZLqlY264tRxhK0^+ z?nTO-i}6OXKmhzaUnI>6@a{ZHH>-tLS(cbthm$O9NkNk`GPNDaHF>j5i;H6rgnZJ8 zHL>pD)wVvd6_jycF`sBm+2F9k{yI^2oaCudkgR11o;lUL$^Dzh+wIQmv%s)`C_??^ z%m@Gn-30zWbQz!(2>G;7EgTdGxhio3__*Dp)c(=;;)K7u16)a&7lr`OPBU<6oALPd zlWV{UQts%gZm!DDkqYO{VqK^xCGaXi>|L(%>!Hk|0aM1_FkS4=~$|pI%(2$C^ISG)ODZ^l_tFm=(m3gem<@%%7AAQ@jNjbFzZE5@+m- z8k1?uQHc>R0!T_%3?^{QO>Rd0n(B%oi|Gu1VU)>~vB{ycUg0VHh8Wg0TPIWXPOsZ% z>3jTQUAY|GTk&~@9Jwia?smC-NK(IqEf-vzFNu+mfwp;u2?4ERsaEg8@$^EONL~xD zTD%!&HY?u2=n1J<=OS(VRNb&s;0}F^&I?sA#w!X<;4EilT7l_K_Ua_&J?wO-Y$WC! zK_~!oU(cwO!1W;=A87Xn7`)wi?weG(AV}wtMA3lkKzL753pfiWd_DwW%lr1!14(rH z*xZ>{pysaiM|DN^{YPNc!(w&+@~f5lu61@6X1g}iG`ucSyEeLS@pnV~_z>2cW@f;6 z&XKfzu99ZQJY`nny-YdrD*_XE@R348r#5NQ3HyE%LaAy-s-GuCspWtgH$&Y}Ha}MB zZA(HHy4*d21!ShU%SZY%f0D>0CAYFCs8Z_$@RL5qc#r(arIMYc`eZ*3R$uvoE;Ma+ zhyUkom1Miu+~xv?5j#N)21R9VhgFCxo)z~uQzb&oQnW=YNF~+K#7aa2bg7Ji3KJ`4 zjOfL&^#LSuBNC}lt7KO^B{d8;lF3l3ur4$7A&93U^Si`R2sN6`Eh)T`#j#t>WXYm^ zpzp{!`{2B0!cZamEr|}NTJp%?K;t-{D9+fvCS0DIf1i{<+G)Ha<3(q^2l4S@Q=Mhh zmd||_hghPI9K94l&GV0~g?ndK3G6r%D{n_@NnMBF0kv2eRZFXc-nJ#4g57LQM|oOq zD(q|(_!%UG8O-w&ivK9~DK7~jHyTK9n`3x!Y45roz3+- z&S&rB`9cA>+XPgQ!3>b@*d4gB_u7#8iqgx}S-Y4xdfVcC+p(o$7uvxgL04%?jol)0 zN4@wbm}%?(!NT+I2ITBm_mYXlhPEorE_tQWX>+5@){gP`(YODsx}lRP@BoY!&`WL~ zHjw}4L|Ch}+!cb^4ZIH+6vX>LKdNWm-<6t*p8T3~A5;)pPq{)P9&G=PKg|>~`yBqa zIKg9DXDgcH<|fAiad0@oPEn7!R!s1k2UrpwlJA;pSE44_%RQ9@?>u1Q(yGAMpif z0YoW9KW09h-#E@Y)boXc^6TqAsVU( zoSrgx&y@00&To9Y{+bNF@_Zzt;={eSYEBGPfCqT{e=0gj!8aF~L0Ds&C@90-I~=bE zX6qjIB#2ILY3mDu&0~A2%=NYZJ%>w3)_(s_a`i>7z#i=$unT_Cu$}9?Fv=*L7AMtX z&^iSX0aUnauoOm@aeVy^#i$jO&qD&&^eI=;mQl|Mh+pnX?pRfO_oA5s7qF{cQk+|? zO{)wjsnYHYOr&iywd;Tk4KDn7iQGG@UB2jqd{R}}+rAF=h~o=!bTpPzoW|~=BGVPh z_WPq_Nkb(Bm?rZo0Hamqh~+teW>-!oN;fGP|I~>Uv$%v#1~^gEqw7dsw*lr8cEw0- z{+Rrf@4IYYTY|kM0G2+IwGIwXyR$85zzP{|88&6$=}FeATAcUCwBmY^aB`lQxV2^- z@p{Uw1)FnF{=wqVmSoc8VtlWEMAX>9kd2fvZL#v=bhcQJH2Vi^?2TY61iYwX?3II}jzKIO0J!R$$g3)?n`9h&4(P6TqzEPCA>Nh}f zsW(r-K*NKpoZFYcl#bPPY?ww>R1!N4C#Wdx>=KA!1X=}F@@)g5N};|3KooG4@A2OR z2W&OYWc*=$7(yW&)1%1!=dZ=YoR#p zr)@UslVcvK)=qkS{@S=enT?8eeTfQqah<4szrO){34rbY{Uiq&;42Iw-qIk-AYVfP z-?99_{Ob=}WwThBe7;Q$N1Vo?I$#HW8Q;dZXWgO;l9IP&(q$Oj+61gEj2^V7B~P~} zGr9{ZH9yN2s}Eb-jdh8QrLp0t2we`2Z7rEL`njjOaMH=atGsSAIrQiJYksN4Y&%;M zt>5Hp>*J3?FXWpS;xn9T1{Dv6EOjUnzYCw}OgtEzyJaq$JM>hdB(B{bKNt)Y1edvyCy35gLR58lqR!XM5G%iIjKAo*!%{WT&}8H7ibOHwKBwk? zshj}`klz6?J6vdhpWtXfz|Vi_@R+9C6wN@R3>(&h@qQ3uIp%uAc0F1lClfj5D|YzYR(jJS_szlX0#Kw6%ZWToV3 z0_IR700h1};s8rn5S5$Ia)-hJ2=?`0sgOU4Q{%OcR@c@P3Qy6E*;{ z8;F785P)!D$lcvHO7H+N5)cup{HBow?4n+YT7o0*Q3Z(cZxHOxMYD4ClV0QUzaj>R z<*?ET%>(*LQNg&Mdm}+_jR5Q_j;cDsqXW2yx=`^5c<%XDK0F<2>k!;2Ajy}uXi^YGWg<9T3w6T^gpNYM3ex zh{gran5~AM9?QR$ zhCr`Iayv^O{KSf01aR>OZ27pFbq?vzhld`~(@tyYarYEoJ?ab2MQ}J#Iov)>eFEuY z_QQP!TZ_5ks+GrSRb6isAekxz4{0A0TOVII+t`h&;VZcbB)`qbk(Dh*RMJWx6lkVP zj+ZK7xCzH&mEf9BP)1cUD`U1WCuYi%Bf)lf<_u8{vaWPw8j8q7V}vh$$_nwfEWTdeaj?b~6zP!@yz8X49(9fM0e9lP1e zj`kpvgMpiimYZuED36PgjSfE(33UvgE2Az|;WDuzht0dFs}uaqj(a2a`Ss%?`u~~&7ld2a zh5--`=6_?VQa@5 zx&_r;sOeI{H5P&?Cj5Z^ub?ja8<4R!rWt!EoBcjd;YkR)gXc>enEM&Cs4v?=KL#& z(T$q)ZNZq(H*;j(_2WVTyH$R2%v%z>H0iyXXFhy)j|!*|G{6g#z=bOs{K+@t(W94fP5Z1Gql~8;oGu*FZuacopQUPfx0}JX_k*6RRIY`L^t6R zU@1iwDJDuK&iyA&CFof-I(v00BC?z{&@3KGX4TN$ zzjqh3$kmjrI9cnTKptDU6Ub}nZi+XDqFj|}x-5`1TqW#Uh}Ok<)#Kmvi#B|Q??E2< z)35b>4M1{Cg?n@cTKoYwJ1usBnOFeR;ZlrUJR#TaUHU<;xi~g5Tq>#9US2NuNs=iv zN>@ysX}0lM?2}ircBlZ#Z_!2{{p}H;#;u4*r6<%+`@v3Um;$|o^k zdo23iiTC69>g7DIPvX>+c%sK91iHVgV9MF zI1LVvGms49(p=-;Uiimm1s#&7nuMb6?T0QuS%4yYe%wA+1kfMN1{&O_-y!_}m1%(q zJuFlQ5|Gg+yJf{rH8C^aj5RdA2LGt4%+J$X>I*k+{yiDDFSv2 zWo(PAQVXSJ&gD`($Q(Rl1(bw;7108n-O*IH-S zZl1x3es<;LYglJ`Rk&I|lR2*Z@IgBNd+F-}YN@xCyHFJSvdz=n$Z)X9-Ige1&C2r+ zXsr@cr)m^$56|7@n^h*SqANTJL#mWocVL&`6$2;D>_CIf{HBcU!pND3dG$TgG~F|| zxMxT4DM98$Cz+~OGe)ORJaZ0udb8r?&BR@W+lQE7n9K zc>LKl7`_H!Q?1KHjhcVA@GJkc<@oPte4EDv3=tLYNb7X{F`0RGthDzrrA@!Jkt{w(s2~((X7)N$5R#jo|TS zl5~SpEhtE@HPIeuRNO;%zhPO4{uZhqqVG?r{bFdH?rt7L-j(WO^~&Kduu+p+)1A*H z%Ycu6kAE3lzR+2>=g_5H*Z6hzw!agzGT9Bir!3FX1GW?Rf7trVsJNP-Z4@5d9Rk5! zgS)%Cy9IZL0D-~XHMmP~cX!v|?(Xhq?&p2pZ+&O2^QXG@o?d&pdur;co~gPz_xlAJ zOQQqJn2-ryA37O~}86DsWzd34_RWyM1&IUJz&7uW!!fA zA>IojxefqzYFUR8UB~Z;DWb+P7*=8ebxLhF3iAkAs>OurKf{3sb=r2u&h&6aJX0I^ zO=J-!GuM)0yAjqW;gf>Z&J;kWId+IbEU%y~zul8eC-cci zomO49%2@xAOyriGjc_z3zd5ml3n_eRFJO@pA#pGzyEkPMk%gt}5y#FxZSfvi5;EWH z`x1sC>@>12e?I@p;r?ZW_OQF)Vy07V`w?V5g~oiYb(rnm=$StO3C&Z^C3YJUEH z&WM`4l`dgk-#NDVi`6J{;|^T=9(0sbZDeC4M0=a<>=>lHoAqFpb>gRH`63;=R-5yu zM+R}f7Oa1Yss?OPqKXFWD5}23pH+}1G>{rMMlJdz$jJry=SPSOHGooZBgDN_MS`-% zw3jXPhZMF0cz`Kzb~6#%Le%BL}FfMd||YmY*%6*i)CaMwam78n(J0)&o}+w$l%;iGp_@dRMXC-8?bNHJXFbzWL`)J z8j3YF9$7qzwlBrj*6YpGp9fnl|2l&2cGNG!+e%MAJj2(nZgw?odlh3_^*(7@-6R-T zg?nRO0M4s>8~sw-n)eLNFkc<)HYrr@w<$K*>@KMd{9)mvnK^)CsUUwp9sak8r&FSG z^Yqn@>?YIxK2xW2^RF8(ufnOgqBY0bhC$`59B+vaM)kUUd$x{3`#1iQO{+#8&Pn%E z?uTRU=tubicTqz>t0Oj!s}fBI*Y*=P8~b&|Xy7JkBJoA$;!yvkn{}2K??A)UesR|P24Bfa`$@yx^oiYKrLN6ldl##`ZMJ=!f=NGGWk<r5~f zOkDqO7?j(wxeCr~(|s+@11*QQ+DG}ZTAi_4ud!N*v0C%7T8*(<_p#cfqd5gnhKtQr zd0=tZP}kA5MwV&lj4W%50)6dl5yw9T{#m-mxhS@d*Lvl@KJe4wG@t^nd0!Gk%81?S zD$MeSoWiG&Ji!j|lGnDiWHz_kRNSlh+xg2D9lC1Sx|QCXQ(&%#%L!zt`9AhyKp;fL z+0%&5(@K-x@LA$)!2`Jzwrg8c=A}nj0&u!JMm=~j9sXqNdJ@SQY4H6M>U+9okntzg z{Zf=x6D!lh!Fp~1!DG0>8(nO%A<1JZ@Rtv`pn>iZ$;>X^#r|v72G~{X3v239ZS0Dg z=DVr@UBb1~5#@<$H=O&TF7Y2tE?zbP9+(zv!O=b$Hdr$)H{slX+8zh$dtN!Hc0q;lWl+;g))UOLb% zrH@B2HinZGDIrzV+3S0>@wZ^z#t&R~O6h{artm9|Lub%FJT>_i% zCCN`>=%)H*_;S)6V(W+#*^z4cbdWb;eB&?DJx_~cXVa$2$~GwvdjHhjB5jDN@R;X3 zzuqdl_}US8zwU-;u6x|_6`n0kGj+#H>gc+yvK|3^RUv<%b zqtEV@+P6iQxH^^1AmqS$Egx+?XdW%SEkvYyw{<|+Hatbvo+)wsLnM9Kv|QpwD49Ez`pChj%Xkb~`n};tWD2nT zg~d|)8@-39*-Ra|jydsYu9q{$|b>!U=8K8uA1S+$mmFgO~xtS2iFnq3z!SB6vehWx+`8gjoXU z3|M|ZLABlI5Z+9WDM?PpMV`KsV#8`pwSc3`<(3{K{%!wDp*xff#H*376+u)twAM2D z1I-QZZO0X11&MDylnFDgYi82*ctRwYT6{O1{${cz{?pJp?J|eoqt0z>UgwF@MRvu+ zX6{*{lb6VRu-)esCEdW=zWIv_myW1u$|veahfvDf%Cd0E-3^BK{l6r`pTbfjGx_7P z8*C=;-pvKZU&?8%Sfi*_@2c{2&fvOjLvAKztQ02jbtuj9k`RsHK;R3Fnk{E`Fi z4P8sPEY2v>d#L;tWaPdYW$In#@V_tl8MTtjYE`?rFY5)bBIx(m_i6*7a_EDvW2L2R zunjp#VlzB%n4Y^TeG8B?a5SAm!YdoS{YRF;F0K%Rg@Uh%t4<+|xjj^LJ_g`SG0>3u z{@>uDi;}QfYC$w}oL!LizY%d@e`_I9DFKK+IlilBC!qoJO%8|-ar*Lt|8)vU;5R{q zd4ChK5!RZe6uv@cFYq~)b7Z4F`k;Nob;kcj_{N^PA-q~4SB+JBZ0qvP>L+Ri!GmwD(FHW5P2`Lr zDkLJnHB}X;;dco#t{Ht-ZLl^_R3Y>v8+aLtssXsl$CEQAS@Zp|i=n6h$7j&@B!V6r z8-RhN*|ljOfDyLxtq1b4&y$AbD*EzH--eDV!#2pAHBA0LGviujjh?`yok4gb9M{Dg zE3kn{bNc>cL*|TSrU$Yl)wz{S5b}U|WOm!^0Z9Mn3f>siru1lVmZPjuM*a~`kX2%X zBfP-{+DfuoD6g9aH*K;8>#M0byLV&%8jP22-m8de4VmTNe)JGSq;2RSsZ9eGU_s#R zOg%21Q^{_}ELh1I6r+@ZR$r(QwECq@GjX@XgC)f;Jd%rN%fjEedlIg_&)(a<#IoY;IUEZ6~D@VUll5oZ#GiV!QsWL-Cv8% zVPAf`Y*fx<-LxTA+x%F?CcBkAKnuVH zH0vO(j_g*J<*{oY8L5Gv{Xb7f=A}%>C2Em|4@$>BxhcDjetiv7@0MhB0LR8>YAgyK z&aPfuUi-`Y)SlX~I_>%42H%T@wzA(FcsG?aH#2_Kv$8CF30)n|!68qMFjhdpz-TR9 z#W!A-*|x?kVdY7lNehu2+t_k%T*;E>013+BE7{#dKasZ9iG7v(|35L@!2*Qglc&Jh zd%A(oTa;?W?O~fU9!Q6F|S1VGRm|}uJ)&C`ltgq3#MPsBg1@?o+)>xlITVd-@q|=q1V|}rEN)2 zPYs)O1pn%uRLIY2Z{b$hsIRaA@eC_)aL;tJUbs46d??h_maZ~8PgCgb3mJP}?DpS7 zV(TBwH1J>GKJ|W|ZOPwW^~*Hsn-Un^boJgYYVwN26VE=df{rTAL-c^^PP`prbW8cz zAMbJ%cZt9B95sp)S+OvZ%j!XtSH(dmGwCMth0Fq3Z<9`!qwTs zc2C4zY9yH$pv?zE;mGqq#y0bOhl_W`aY!QPaqhqYQ=zrsyuyBaL5>oJP{bs5Qj7Z)X#%gr zO`PCD-&#wP%Ix362z7E-ju%r zq?SZ)`C4oDl;o5H_3@5)jK$Q;D-ra7WBssupPqg5E7>MM%w~Ye9&93)7_0HC3$<(2955MMfC2Os*=ps;wsVt#lpZjJ+q&M`e@-M{N=Q7^8FOaB za%j5uc`EQz=+1(#$B8eViE9Cf`yT`&P$5c}HLB)4v$TA@-{KWT!;bKq!>+vr?-@Js zk?P@?!su*s>ajOnRuWb!)et!`?%CJ@Ya2$Sm!A*a9#Vi{Ue51a6M{B`M%Pv72A-dY zW=D2HLq%Psv=-of^ZzT53G#{-|F2?asUR3!eG)6^lby zOV~tEdT;U`xyCyU@-M}6nU}4vG+-@hPx>vz;mg^h(yiqX1bsh-`AD$h{dn0WTJ`K0 zWmoZ7d*PvEwetObAq^ZBe{ZK=kdhLfOD5fcpil1cZv6p@=` z_eA)uuG3OukSX3lthvotZv$?+61(qbd4!n-uONnd`V!A1nujriX~IS!aDY+!8+^=K zrOGvcTAEgG+diXB;aMu*r4I4uj;~^>fUO4l9|||y6i7a5SiD~|Cf_)&b0JVc0)VtF z3njR!BzN)ym0X9xEqbH=Hcjig0J% z&~7{bpXowa@&P0%xFW<1nigVjUE_(gtG1Kn#=Wo$F1%g5HjgX3u1MfiDMJmcD4`T)wiS~5zF8*c^a)5E@ZOgH`$!o2%i9{nEIz*qf zyq(78A~D~%+A78wt8=_7c%`0XFgDs;unAltlT;0eUo9qn(ASQjb>4Z6iB@nVl#@WR ztlJAjWL3m;Gy_CcgSrE`PFw1NA7plU>qk^9Oyom#l9Xz|leQw7#wtBl_LydnITKw^ zz7plV{~8HYxnEK2Q*yga$^^%uX3f$?LoqmKWq3mSUz|tYJ_R-dn(lCN!EC97AeI&U zplh-KNJhN8vC&8V_&7FL(v_y^5J|^Owo@6i{VU5ds4U#AS#rRsYJWHaKEl47J*INf z=s5xVAhcX57=K(szV!I)AkGXjx(EpJ_p8|D*v~6uD3N0x4t^m>!{cGFPj6$-MNTn= zLa8d!-Uj0iz1QB?{TT3K9W4fT2BEpA@q7HlF{*vTCYu3U_Qn&jik{xuBcM6NWn~RZe2q@&6qixd zTE!Gn$_0~yH*K1G*gyH@{=EVkYV|%zn?mi|Wqv1Qlo&-EsQ>m1Wk0kBj3HvMzw~W? z;q?TgIPEPSc%zDIz6xY0ZAId})wsYK>mxLm9%6)pQ$a(9&K&zdV z0Jp^b3Y@HP*4bvqwfRdIp9vlA3%lEkN;gGNU^@leLQ-U_$ReUg+gPU$l*m21$fxhM zoj8$n8IUi5W#i`}bA%h4RbeFAtaz;oGQ4#2u(IAt zvgFNSCM@YiaeIPRElC!n(YOb+<`|WVg0k0ODYDt||6g5>gwq#vN z#wBLc!GAAqGF)+{D{)Nu&jg&S=eEjQY~r37Ccw;@Uag+?Q2EoG2M9VG7FB!8{ISEea;ziep)y_j>1QOnxNf)p zqYC@qL7G>cBAz+b*6$K5934CB8L?z~3@IR2p}ojQW6@edCBKqLD^grbGf)|`(uS4=lo_C&|J*sd~0y4ieP{uy+g|`3^i+THPG458BvbA*el^uBUc#7vFy0G<|t)&-xo-f}O9U8fX~emKHzEgB9)Zcv$Z)z5#h zhA?U;XnIP>-dW5c*?E1+vf~EdX~Mev#o1SxLEFeZS@|;y%+$w7yvoA_H*+OL(FWgp zDwb>9p3fuUnOFstG!}9gc0f-kB(@*IQgVniHo~0-$IqK6U(27Juu#kY3Lm5;;uUJq zX_3X*3{z<}vRWIdwgLS^`D6mRv7XPr%s@Qi!W*%!^YC-ndd_98kB~a&#hwd zYai=qdd61KE*d=H76~_l{-2T|aM(n?{F@rwN+>(nm#?8>qd<_C3K1c7>t^1=drTO`|a5(W%}-5+Nf zgx?=0{!gI(Urjb=H1*TGy3Dk?q~=FB5W(YD zTg=Ew)f4soUXO&xWVi`plhS>B(mhR5r>z+7X~K!Gf$!$UUz&8AGEeaJr&>(30|n6yHA>Y(eFP`D15i z_tk@>Czi^z5G(on(EX)TSfmfw*NN)pZER?JqG0eih7OQ-(nYPFree!ynga>rJ_vk# zPz5&evoN!=QAmto;5IcH`m!HjM)a)~k6U&f!J(eawwdC$;a)Ao;>)r`f1s!El@NR2 zk2lhBFW>K`E7;nLiDSg$*&}seiHLRQ;Xg8Fh6B+Ky;*wRFkJYtexX8t|MuM-yw)d3 z(Ev3!ld2wQyQA2*$tF6k`^&^n6#MC!S+UiR-$XCqwYCA4vN#o=X|-8m$x zfFde7Va4Cb&pU@bwZX3>)e|w?_wuWQ!F1%)g?oD-eY5T!3hXnZ@!`Y~^>WAS)YAqN z*|mf6{W;8*(?MKuC&Cl$EhWE;Q9N<4yL3vz*SjunGDQXSn{k1$5&yYBW#R|wJn`bE zU3Vb=Ocu5cuN_payIw^Nj91)GyMoFZn6^m7=i-5qt}h>Bs4c2^tT=3E^X0i12}-M$ z&=Lk(1mYJ&y^-(f-oE0}qu?sktmg zy{b6z0EUHcAGQ%^zMpTs&1RzP;-d2`aV%$2gFNYMbK>tgx{?fn!*N)uM}m?xi@lq5 zg=1uCAZT2S2jQPY2!j)yRS`CeoOpuG=`rwN$XG2RqPNl{3D*KQf#i&`d8$-PQe8eR zB3g5J-7+fJyxCItM|Z=xnPShhMH$NNLO%e3s^Bkl>sO#h_q? z)z5LkE&Z5UjnF&?UO0KDSUuC=pp63Ud%R<}Ryu_LH+s4%r1jDO@tnpc##mGkx%T07Z+G(g2FLXh_j@+zqM2%VAG>=bEer!9>h;h;n3g9u5Nm;zF+~5%wt%K(0mpd-Au>N%i~j4Bb3CIc_WHfsIp9XHif{S&TrM1ppktgtDKXV`gr@byg4(K{4y3 z{&wQS_oat_lgkYMV)4r~m&iL5yZ_;8`%uS@K1WO^Ha z))SZ$B}`3!$sK|3OrHyjFNQaW(z_kGIQyuwzb$W6X91_%+cONqaa+ z{r2o200u#@3OBCU@Mf9a;&)?F+R_QM@`?Otj77^laLaVErBb9+ej^ATw1Mn9GKm1z z{=h%19!kW|cYUd0Mi4YWmz|9$)GxMW%ao>QTPMSL6u`~+y{O5FZu-< z@vf4cuXkAcPQB2O+q<(Q(ye(|Zv*OXniSHldL>`qB2eG-3_rXfhVX-!0#9g6`z+8M z^f8C9b)H*us<5^`A0jI<7;t&k9;~v$6euy#b5AR1xxbJ>Z2FUc?yY-g0^CoBBrMMA zLTSjRY}yl-dZkat6K~@eN1EcFn!}42rJAYgpypWPe;RU)6zR-muW$@qM)f0nVyV9j zd-st8C)m=4crusIjx}1oAJ?_-h_2?Tk;V{AKn^C9-gh@zh&37B6ZUg29>CAb&Oao7 zzNGdMb$5C)zMI3!Zwdw&`6?kR#mF4^{T~JXe--3Zf;ouZ_gt1-mUgA@u!k_wxX&`; z^KRjb(0WYzVi>MPQfYX55kpl357vYK?Toj#(9uH(?P(jfsl1c^Y z#FkI%;#9Uj_ese4Q%`18<)80g@Ey_?3tn#rFxx6Tj9>I>?NEkwoU4O3<}r5SVRLjT zb_Hgpo*d}^8;E2Kg%%-3UBG}LwUzM6`S}h|M+HH_i=N>ru@LkaORh`gnugG5bM&Z zKk~LL|71L1lXIa;QJF|SO;W)vrUA5`yqnhQg%-1^wYrVbAkF`dT;~gOrYSK_hl$VN zRMHsB5=vBX<`ve6benq*T3-*pm2j3#fKkS1bpy(9BhA0ZzaKFr=ti{lT{X{|6G&H` z*wnAXux*iYVi(qdL8fE=+o$nL(4Ll3|7guDxM8$i8gYGJj17_oZ7zj_%-2kT7RA#3=Q1&gdxhLgp?f6LS9zeZcVn!9;{lc0FcBU2 zgT`vl`_jg^A2E1{tmzLm7Zzb1V~Rh~%da5JY?T>XgUO%%gg4K!Qd!`e`I2bYxeRL z+dP#Y)!iffjb$m&zaUR4Sl%FJ8j2ndlwQSa02u)VZ|Ypv7sb1zM4s8tm8S7IG-aBo zu=06@5%T3NOg5t)jK2`i0YKP0i1az3uX0dLU ze+p~v&YcMW!TgjrZ$|yxd3!9t-^^(yKRn(w#SgWnE^O3)@+hn~{WaSnce88(X63SA zFqE$hkbh^l&+2;Fntt!8xlbhe`+a3P&%K!T>>#V8kFYhZ z3(Vk1AAKSG&ruEfK!>%aZy&TGU#or`vx?({Gcd09OOJUc9poFII1xg%ClclK2h#5A zm-F}a_lf)}DfrUGmfG>8GW<9*6U8*j9igdDgz=%SeP}!ifE^cy{ za>SWPl^-i{+`4)G6~9B8vQ{c!xQ{QSwz-cnE}ZmTPyEw7mXFr3^C;FEX&ftydm7Wh zm#pFS%0U+|s&I2=FLL~8q&${%lcGOKEE)XMmTjjJa8gI zu{mKeVM;+w|E zfjz&u9G7R+Ghs<7_p8YA?TVf~OxsbM}MDUhdjI*~@PvcV?M&@yct4)%0yj4OPF}TgJ|Z|JK|vto~Ldxp|@A90f*X z^cE%V5xUDZiLUk-?MbEO=&Cq>fnsARCUAiq8dd@I?@LUC>5Zb9kCy_SOye}P^Mz|X6G zn^~fBr$yMSfRX+)xbZRP%XZO5eLJ$rBpDiog|f>%5?!qfbe)8)_233Snyq$kL!l#eKl4X|!g1M}!@&{xx&ruB9O6;eWLLns) zLFQngaP1n6bTMRLeuU%9e6Ad&l-aP0O1GZ5>Ay&e|I7NVZ^xW!WvD7mA0I*le)I?C z`q4wepH3eUF$dV3&tTRFqSpyZ=8-a>{Sg-Kx2yzB=LWf{D=Ut!$cDU4c z>I?=&O0!A>iNhO(L%0CP-Wl%b9erb;R;Qd#>3*;YAFo`Ozf-XL3@lG6O8Y&Axa}XK_ zITrMamM@pN5Ph4m$FL|IfHNbipDrSV;xyr8>jF#b^kTQ~H%O`av0g?*&obp!&>{_c zk=%RRX7MamyBb8TNeKlI~KSdiS$~bLAU+%J&JuOP%VRUF@|?+@5fM_rv#D#>`{pUoUo{Vcu7!@ z+t6SEt3pbH7@(^hJlnu-Fam1cOx$Ibhgav@^Zpdh&;D+}@KSFYl&L}JIqh1NMAjCteRyCG01&0F(0!fTOJe%a%b1Muuna_}Y}{`K;FSXr~G4qab6}_8nb1tb?zU z#lM@Fb4WvPQ|339PE^qoeqH>!k(R`5PI&5+$W4oM?91Dq7s-~~M5ZVmyHjA{g!@QN z=B{!&NPIGLXV_?v?jQE7cV1HoA_u2)IXaKP5ha+AEG|6zEaRpaW*qBc0etwgs5&>- zwL04c7IC)_>ra8Qzp>CEH8ClbCh37YVND8Jl3Q00@_(a<&PO)=Gpx63H*apqML11iJUK{I;Vy!|iI zWGCI#n6Gk9@TRgF+X+$brf)pxnbE_tu~|9PZg+D`a%w5kV@h+?tUbT=EqKB`*rZM? zle^bPPv0?%%f7hiHBPkyAqt_4%Ac|O^Ta^avYZC?N|eNc7w^Tv*R4bQHv(|_i}k_k z5_%^BTKcR=avt_^GQg|KMbHZMEeUf=GifFhjUb~qh9@Pt!cYtYw}n<*Pg zll#Yqs8Qc*X+6FtwzBTybOv&sx(uT3=5M@u7RNw)D#as~#JZ$O5zuW^9o z4>M?|OsZUkJ%xw(Ph(xx=I6GvqW@mySL>K)Qw05Nf97DF{epwOSsa8j67VCu8Qvz+ z77$?XXQa}*3*~Kpo9G8d?g|HY&%(;-3|%s|Y{=rF1ctXdvpWgrX{!bBa|Qfz@@_A! z(=IVerWo?!oFK&bbpaF$ReeRQYNqTFH*UJg4Q@SINP-dS$32k1Ut!PlH=Yx)P`FAp z#H`nyJ_u4>^7-5s-=1rqndW5daD4JyOZ^M%2PVGVa$u&I9MGcL)oip+@q#F-Io zUQL=|4eLidh>7?Ik-jL@1?9)3$XtO~?PcLSl47Dju>|t1skuHg>8yi@cZ((Tk(uTGq8Kg}F`*=!SzTdQ>Gpzeftd|6{QtVEqz`?<*F% zj|VQ+-adr~F%CX`KX>E6NX7JM%BseoNsI|{3wdc0A1m~p+A&7mEQF+qUQV`!3`jaM zJ>81mwyBIr^85#i;Kw2hM8suS+0mTF;IU}PTE3-X(W*#X(=pJg6-I5V>1ix8qVXw= zb9Kg)D}2k$O^VNF`=ye^y}ZC>@GQTI6ouZ0XJO$4YbrvF0iKo?1zjC3o0{hgfdMS- z5UEAR84(L{8#KzAwGFyf9!7*tEBxHeWy*>d%%b%fQsGbc=v|$ux)NaNkR`W5~3tg8x7g&wJ`Up*$?>BK1=f6+ws0zi2N)4qK z2bR#kgD{{-Au)S6tQ<-Wcbq;*0uQ7P=zB;$5w9PFhi}rF>s4cKJawBJe`$bZjuRMk zJil|a6%Yr%2m3%4C2D{3`j#R}j>Y6xNNW_=0|2ie2myoC@(*~;1l!k%hyHN1QX+}h zxI`p*^W&iHRN`J(+7ULd&OEjWhfY@YIbfp}MT2)IvKhVP{qZx!F2Tx&p9NT`e*hs~ zFMBw*7`j{DL0x)|YrXoaS}tH4k9ax+msV3oR59{n6e$P`@g5g?GZzxFPAVBn}k>^OmYz!1)D?y@5iMBAjZf z#H%d^#$%76@Uqpd?vKh0B49xixnL7lcZ2Jrtm?JiNVFieN`XmBt%Wg)*}R}Sug=Gs@S=n4%mS)E^nSZ@#n>*lVG zR^3PBswM<_d5{$;iE_~oR)cQN34e7e6zTqHFF5bE)(TYC#8e&P0kN$n;n|HIGJn}u z9Pywoj#?cJ^>wAxOl7;<7h2K%>s^@q5CB1U3ra<26ElIH)7oQ$OB(W}6xL$x-86<3 z7~Y#e0RzGM{=z$DQ6R6u^ZfMKcu!Wfby8P!h{TO7!R&ahi1s?{Y_M4yEj7l-?kTvo zp8oYu8SMX~0`+GY+kCEuf?4&NiyT~Nn<-UWeYg-4?E^#3eO^FNmP>+wwBmaNn-L@J zhy@ArH!L<$YZ(h2;dpusKvL@AHer+%&l>Ed39{OUDv;H3HO64+x-A6!w3$X*eubB& zZj$kb82C-Vs$~Hwgmwq&ANKMZ8Hj|bTLfc>Z4NvKX<%u4BoKod+t3k}ezN_J{y*u2 zzy}u<3M?V~!|-$0u)=0!X`0ecN%UbvD?!ebmW@mp5mT2L|BVknLopuUBh=kLGkn>Q z9eki<3x$}w439(3^T5gG*{_w)?hg~EhILY)7I zbD~TIC*ebso$E!;>Qc=sS#AMY;nq623uIx`+U4G2C|hb+heJJXe^-&WlJhLUDu}e#Q)J@g!gpK|+`MAWEYb z1%QEy1$zM?-Wnr6a!xv&T+mx1Dm9$M9d9p zGt*p|^KcaH+zmlK_@HPmBJxQiVDzkYPH8rZY&%GZ;p%H5_Y2a5tp10DxNzzz<18;} zc!>Jtiudes8Fj8f8a!bwOoOLEmS6Zj7$8UHZw4gv*()B{Alr;Euxq!GU*XET4gVE1 zS-adz2_`}TS1POlniX+5h>a&sJs|_jR2{TStdp@W&U3>pM+^k?$++XVh17T{YTyYz zS9CmBsvOHh!Tfx$X;}CIOGWwxApwTpto93H9}K9C{VzPTv~!Lp@psmZSR6&xFUtxZ z>slgp+%wvCB6>r~By#nCYU)NBbCCoz5wz5_l3&4e7Ul7VM#<7nI-Nb!1F@z`-hBS~(@V-4dKh5NRfF!&$A7Dk&iHOEb|pQ0=z{qgaepTC zI!@vZonl>h8}o`-zFu<%tJ={tcoB|Hn6nG>pE#PQqjOA)=kkjlf+iarBkbP#uA3e` z#CdCdB^{}ojpHhr<6uY;T~0L;UxaC!%Bn~~Eu-i+SHKdO(SIPu9zn;J5;!ri`D}T&1q2XQ%;KdgM-g_ONO*CDt0XL#2hap8?G8=DWd-9OqA!-O>Qr zgi!JMWQvmlCrgIxtj32*`S9bl~PJj!+*{98*y* zcODB)-rsift#PeRDodG_Y^8w^aKJV)fa>YVJyBH_i=?IIGL+=;PyE?1k6xTbO(qhw zo|+dPW5ntdG|43x5=r&e8S{(3>?p|(A-ppB>nFbS|EiG9FllG9}agfT{ z>zkW(5RVPT7yG2i?j{O`rk?%afl!Y!2o>H(U_FRNhwu}QrE%VOkFUT{OA+hdc%M%w zUI$Vwu7>GuBkX8MgyBbTblU<~qqk~7TTF8>JeJt;_LP<-`Fl_LTeNrRYrI$Uv^q(l zry9}VK$n*g%sdUzQ-L-av^Ctgf38B>o3h54-_!~T6e{!;aM?uWKk@>V#_2lTAu=;{ z2bOK%BS1f(gyL_R`sZZwR z=Y3h-Pb$+_NK_#MB>X*3&A$%cU){oMkz4oFykAOm&p9dFPLH56HrDV>+Dn&C9R(8>&H<}lS`En5 zN|~Gb3bRZsFP)nTfD~c`gY`4u;X(y;LJ|YKtc<9S*W`fPihu1~xNjWUv3OfdWAGJm7zW^*iHs zMFlLe>Nz!^>_ZIqhd%QdXH40MkpiDSa#ZSt(fs-LtnPC<)! zyfv4jun6!M5PicQ!#ip0^EwQ*l3&kv53V62TAa%;UFBaC05o|A{fhUNA3a8(kE54| z4HXdRc1#Q?vu@elOtu*$uruN5IF4zGJOSQM@B21c7Mjr8*I{D($S&CJYI1r%=jFrs zU~gW*i0hPNA{6tIBy#Etz}R9D=xlFVT*9M*mV&-r=6-eRG`#Ap8PuuT zfMOOZZx)6ac?xiqG?A>4_C$Ia??a)LG+Wa7a2+)y#=ulBe+V&f73|a=e~3%qy=UIe zoN$td=BmAAMhR=Y9H1lee5i{G*ul~aG`9uk6e*HV2NmA~ujZf}ObR}s*0MU-pSxfk z{RXZV<=_kqAIX;;F5pwBvdyVUEhnn~xpLTeC;HTv!!XtqdE6hIdVIHz4<&G@^}S3*Yx&P(`8IZ?#)mq z_EJL>L{(S%%WiCf9QDL0$We3sUq`K9Lz;p@hTf)cbF>5Q?QtUN$;B7yE%l~P#F(S| zpQEmWW@);?<@Mi6H-jL?frd3lBLD0V^7_wD3#BtxDt!k=&HU3>b(;a;_{RQLm(7XAT@kGOlJYxJJ}Oq}4SD zTpnt=ef6V1I3c6YQ4}ZDI6LtnxZgkf>I6D@Z+^@nymat5z2CdArKaV4Ru>v7uT9?y zv|~uz8IS`P=K$rl|JKj%Pj?@GrVkh^RGV`KkV*xVjx;wnPrx>ZuQp`q{fWhm?VuRP z`-bzQMpMUVgBQe^2w>GT3c+As2c40qD1o7ZpfGjIxa^71+h?Wq3Ds^%uEn*pnrPI{ zz2mh)Jps;PN|@?F?^K;}e5bQd_KdX6c|XZwHZ2FdG!9)p0(;OwqIo-}RkySfDqH@~ zOPBvzX3;b!>uxh!# zlMl~;K(-{H3-H39fib0zzcJF{kSB$SLWRKrmpHDBOeVqx;E({om_$OM!Ht4I?h6(P z5o!Y!tOxc6EQkSzWDgF9aCOJugJ+$Wp^gSOPZnd{2=MYaI z4|{nuBLrAS@dLEv_~+%~r4qFe3HZ(UM?SxJt&+>rIP$MEI&FJBV|fV93c5t~ky24Z z-@SMCDHQ(*qnoM!2ssEUME$-FO@)ZIfJ@EL^5VKlVI zZGv{6*tTukwr$%spI94hY}-zDW83z|PBz(?C+~N@I;Xn&o|#`$b=OSK)zdv!a{}i_ zMkznC7l$V#>@MF%2p(00znq@&n2HLU?$L(OU4o`WbaVPdzfDy*C^7)f!2`dbs zU+PnCpu3K_mqaBnOxZa#<^5ojaX^oA$KQQ1xZXicAG{sRKAXJ-Ynz9#$(0vFq`{y` zDDg)0gl2rD`#sxZC|KvsY?DQ|4_pJM>apV1K=Td}EIoZv78^BzY81PMWT4Np$ zqaomz4R0CMv)SG0fKy3QS5YH#X?c2A|2%K>ufhK@Y6}l_H<*#o)-d*nQ5Rp*>K&)t z-8f*!AE&7pln>gtHVSWs^pR0mefo%S$0vTUZUYiB>s@yOZ}CN+q6S*=0{r`^_*RTj z6E!OI#+q9ww>mVQqrdmXX`XgoGkxpna0g+?gS2xij%Fc4M77b?5}#CGT=A-%F^1Ya zW8NN5U3tlC>tYXzvmtJ_GJoe`?(+@wrxfkVPcEdZiYh{in$N98_k8}t_?I1sFBNwb4K-KGV{ z$%zoo2)qMn4Q{tXUkHb2EaByAEMXYRohI^^zO^)L(sb5lpZg{RVhjB8s=3;0DeFh&ec-8ItVhvvSk>z|TWO>fa+G zL$k93kT`OP*!UhIbEYGx$S=&|h?O!s+yG*Z@oaQHUx5e#w5wqilV*Iz)RI?f(g9wL;NnQ@uB*6r( zj7UwyK0$(<~)H$b<@mb1*sF+ zi^Nsl5rvW>4_~t4L%L5+pnj56ayvm~7xU>N_8r5It9nx->BqMbgp&>$dOo77CjcQW zSEJ8ewkp|3_GGm)q zfONQLYKK7Dmg>3>jt!}Qso$OaY?rM{BUAE zKc64EkNqqpB)1sPgRc@9GUQb9wy>1|CprYpx^fPGQylZF)ylZ|&%bqVsdwNHLLD$H}fK~p?N-Y73$yHGmmW5()gkA_n9H5$N^_!nam_E+6XqM zF^-J#(&(hcQ~@J9fs}|pN#LsIuVMzn#^~zuYcHw0V(tqpy%L%9%AF=BJu_?DsavAx z)n(iLQrW7OukK4EIr!FZq6dK0(ieSG01`w7)A0>~)svf1gijKT3o_L>qDA6AhXWZA zBXYduISR@yh)L8~+wtVJ+^Hc4ik+y8Z;!fnb*4CRMU zi9(1Ss(L2a!xa=^?G{mAxn9`X*0f}lEVBg)cYnTeH8a_}sRE5*1>ZqBsUMum=7>^S zuJlKdUubQhiL1%(S5=KHjs~P81jTKMC(&P#U;M)MiVq_X8AN*f{GAw!RA#hb$j~s- zUlYMtfk%*`Rf3bKh-gjySFE#9kuVD;2^`1+dOP||;dSEYO*LE0B(83%tJWtGFk4WQ zqd(fbGl)Ih+L){Km2{yz>wtf*r5uSiF@LL7(lz>tu2O&H^~`La#?1#-chrC7Tgk}5x>#AstvV#fE!eS;IBfXsW;!VBJNqF{2i+~z9I97f%^?*oMW%ahsp_W90Ye+Y1miea^H*iqD! z0c*<$H<^-~TbZhllPO)U-g&)Zbh<_W4>@8lrBN zR0m0W)QaJMJSz$Z`~H*kr;?{ubQV<^6Dsv;PW`L2aAnXPuPPbJDq6EzTP}DsPymg%&)tsK{mHtxKN5+J=I* z)}YtdgyzEA^QY!L?38p!YwiZkBe1Zaco2~j17ot~B^Ka1dEjz(6v^XZ0WembqD-0! zpH^qj+09GIJXlJfkIOCG7?$0H4n#_HbQ001IJ0M)tGTYgt=GCn$#9n1e~MNGD#4%Z zSG~g8guPc<*RbfDfi~~_$|(qt{WD}D4GHDu4#+-&#$}0xnUIi!`2C9%Quy|Z z?W+o8QOBsDOYKoABn15B9QNAf%3;YA$qZwi41;BtMqW9FML;ap=$ltpPA7TM3dyX| zEGq7Pjas4tF(xV?`YV(bXZUc3a_fSP^PkYj{oh^#r+&KZutDwieA;;RDckCs@zVT5} zQ6#z->|xbk9sjSry^hd4<&F|vh!P(qQi?&c0XQcR0~9<`&>Rp^-*^l;=(S)8F}Nz* z9I|JJG^lmcf^fgnIPb>qd-FlWv=g$hI5JRh9|WuHTW}w*Pn`3)T)an=TT$)F4KJRH zNeoa~b#)7^2-TSv8>}Hd7hVdkSRA9n52`3GPOlePvN1D3_7H}M;zjn5VnmMO6~GmY z;tc`<#0jPliV!U!RG^weD!^2riWGtM&VZup<6~U@Tuw+xB`Ecvaxf*YL(t&z#s4NO z9~@tW3azF# zKJC3-WY5oX5ozsOWZ&AQMBbCeTm8GX1A1iz{tM6eI_Pygxr6n+c!6VO!cV4#eNPo= za>Q;bdKZPs&)+azFh_lV-iF(inegR<_iT*sZk!o?+9~;_XS_Z#cFyFG+W-%Bd+P!^ zj!+s4ja`L%dunnra`n(3!<^m(;3|KyeO#B%SMQBsFA_WRr+*;E4ZIlrR%bfP0Y zd$D&sZ3WQ^51mt7=_anEmmrYaq$jmh@3VK3$y~@T$jf9=$TU;fB>6T{JS;SGDL9so zlx~!F^%hGa67ozsY3Bv`NDRKoe?+b007<@CBJ>9T#kIHXIVbR#{b6$?D!xY|Gi!6F zQZd{)|7miL3IlKYd>{Ckp)Ao<1blBU5uqj}Dsg;C|0o;K^N?`V8R=@2eNJA;bTg{F z&CRyjCW_^{j>Y4w3c7fS5Fvx*MAKBiEM2dEmT3RyUEu6t69X9pRJ!{xxnIkME=6+L z%_1<|ngLQI?6B%nP3JJV|5n6bczKU_&hD2I5xo5qQks<>a`(~SePn{4jb!eQgQ>ea zX$Chi>jSJNzTTog2qgz2%^NRCz1C&l&sLVBOtH53ku6zHqw5|eaP;^N@ep`djne(q z8RWw9ohrU;wtwp&jrtkI0&SkMtKaY3#Z@2(G7;Eps9P2;ca_i8{KpLXV#;4maxJ+(T zd3-98gSA~Rrmenp$`e(gP+;=YH5!BWNxGJIZLH8`>GRqP6sEY2}pD-vNIy%nIH*4^f5B8StC)0G6qXsx)D zsc0~agsVa`j0DLSyYfjst6w84jsdO35);Kxoh|KLj8~m%0fVJNlS^$rG5$%7#|8Hz zzq5{wbfX)mir1k+WpMH)uJCbRww-qBVUrx#URh5!W?vr~umfTF_W1F|PEeFQ9`CBq z;P;G>oGrH+C$y_2;=>D#T^_PB7jN1X>u!)(*Qk_)LUST3Qc&@4=GLjD0>o@-@Eci1O6m7hTTx_*9_JA0B74b-&H@j8 z7;=KNpn3(#CVifv8Bd?r<}H7N%#_DjLYx$L>h!;~EY$q**R}ahztx>xL+XD)&pC@J z@q^=dFq^;0eJ&c%@$b*97f0-%*mzyhG&!GNxyi<(D{XzKZ#tIQ44(9$LRlg-wFvkG zN+}Azjb!t(^{~$}R$xzUVapc^+E@C~J{!tCccZ?fqpV9AxMcG5D)YQ-)&JCWSRdfzR&$Ap2&?BhyE@C~tE<*!}xXb0I9qY&QDw-|K$;hHakjM*qeEa!h&5!CJUk$tx33TuRGf{QCz&j(KN<`$ z53jgz8D&|(#`s8{QwXYc)yfLFsK}BrtZSoXvF{MjS^*v6-xf7#7;m;~CmjzN4OwXu zTH}HVngVtdC&|NUYAsYJ$sW3bi#ZRkYpX5JW}RY!G7X@v=-+~N4FdX%j8C({+R(HT zXKNj?K%^8==zGfgu(le*z(T0Tq!H83VeWa-$aGHpba_ZR`Ae+CTGfF;epEl6?Q;8p z1Z@E@Mh5{4@xe9Tml4DJI|gy9dG?oO9r~g%!SnfepSwlG)u8C7)+UtzG&$j6V%kmu z4Lbj(*s@uPvDhX&3_cJWiv0X9D)wg!4k~vAqV&=q3g@xz?F?aT*gs{Ujzf{5?K4h@ zH&JiVlH~$%v;ipCotOtuvAKvD+{E1)=X9)%%$h||bSM!F))lUn;Y=ISRQyVCRL;3U zsg|HRHkACu@B8wGpd45oD-3^hk?1TUrEm8hh^&Yh1!E0|i3or)(o1iRoiQpkOB5P{ zPvuy6M-g$(VzO>U=aKJA(z=f_6@QnS9wn;}tWcZcIb1nAH*ShOWYAsFXfj&j>q@!n zv9J8a9WIdBWjMe?++*0XY^xPnLXa@UgxyGM&N_e*qI3`w6glD_3g#DUHuAo7Fw{Sj zO6X|&we{621{Dz5&_1*Wl~IJ#Q#lfT=1?*aoCfHR&J!WWNRlL9Q)P|*`)3`A*kMD) zKZgpm|IKpN>oV|1<7kTKa|GsAVnT(qJH=A|el#t(pV|(z=QxuC(1YZF;VYh)^dJK~WhxJPz=sS&$s|=o*51y@aPXdfmH8Jp~FJRyv=Py=#AZXIosHnvM zfct=;sV|u<0@g3ygZ;v3UTfDn7pLy#D;UQ;%qVqk{peS%cKLXFW6fzRJ1lY91zQ3# zCw6A`1}ao8s9<4e(IYO#pLkQnEe^>X7 zRAr{ZK?!t9e|d`IO3oKKx;r*^*!#>f5^ON^Mh<|RS1>QMRH1OMTt1Wbdvv|iJ9RW z_v#|Q>_e+XL-5zKAkkkwisRHg^Elhrtp$h$kK$;fT< z)$jlxDlTKG+9&a31YNNLniqO^`LLjj1yCIBt_r1irJF{+us2LqFI1%A&Bnc=fn#E; z$}&7j_xq6JXwl5Vh_S?FLSG&upBVipUAl$9L~i*DfYKJ0HgBtb_Nu`6||oP%XQ zm5jgYbWG&VLJjGq_0ed^3OWL9=+$PNTPNJW`r9`NQOQlE&D7^BVm3n68mHOF%;n6x zvXiYk1R8X0ISeXHHyr~J^gSIMKpPPCE0YZe#y=PXz@RVuK?m6X#gH9An}oymb@@%i z3{eP12OP4rPj)}Hebs%P(7c1fPP8y%9y_kh%E~l0hwGM-S~wufoer&K!%T;WMCj7u zHdIzB^nx-a3SC7+U`{&_;atayu(;bL9ilrh2)YV;GOfEBeEEC)i0ed}5*i4Yd;^=j z;AzGSPH#L^_r7lMxD)K#EyDr%b0aee`@AWw0|Wu$eRI(|sr|WWn@oy%$$!q9qyQP` zr;DeUGD#Y~dSx$(eVkB8bv@$(G}b7P^ZW+t z2=;y{PFhbzZH8?d9X@XNE0Izp;GjLEh4NeoslA6`i$W$JYRUkRZg6 zMDlsrE7{Y@ntq1AvaR0Qps<}WOq)ZL}(RUyZI#HOJ@*VD_>w(#4mifQM#3s0&EsPz~ah}H4v((d(5zHq9E5;v2>F*V= zNmOLzkA{?8rECTcKvAIeM)mw!b*j!Cy7W8T0e6cFI!8z(YK&EvVA$b9V$QauePs7% z68x6c&dnr!v>(BILBl8FFEB9W8Nkl0XZiPb=7?hspwd5Jc*9irz_P! zJg}ya?asulS&MfclJjT}$Q7J%tC(6g*2WY~Xt@X1+cZObCz}O49KR~%PWN!lplp&~ zX+!G9X05gds*-}N``mDML6HcyjVc1HiQF|XU)E+a zZouP}mYeB$;nLqq!Ek`*AU=H}RQ6S+i{h6DiO_w;8#p4Rlk!2N%N7vmwk0(|qH!r0 z%F;H_&iB8x5TO8)s@oy9Xi4`rtkGb|j!uBQbM}=>U(7i|HApchi{Paw%4ouop}ZOq z>c`>RoI9~sdBPfW0u(bvo?2hd+(w*^9lYM<=Bs}zfAW>4Uf99C!7_Q%)62lmbJsDGn{;29 zY@M)K;G?DHua#?WAsq^tRVgooUq9d)#|)C0^fb|4`hTHaY-@e@|%D zPgrF3I55aLY>d*=ZZ1wuk179tLjEdBMastAy^P9>;)A1b`o~;R-05s!hM36=njoRZ z?V`4AuK%Ibf_FfX%1zVvLiV)A94vI_9F`!VOJ3WuQkEnZ|?rX%+1UB026t9;i4aJza)f!A5-W(Z}vx$Daq4AQvx;~&XAkcF?e|BYMl}u#m%ApcJw*oJl@ztCaKNdK}Gag zD3mrL(k&*@-&p%?Y;7^v_|6mI9F^D>%!sQSH+(0sxT%#xSfku4PdUIPSUtG(nD5;d zPClyfi9Eok*T$F9;is^F%@N(XN`7sa{Qm|N*M{lvp}$Lj2JSMQr&p$8(jG83?%ibP zoVjT&aQ0KLqF*$*3>OB4UnyR*aXLn8%jS~`21fZ0!=GyBaB*pKDsmrLg)jk;U9pV! z`FFpg%fA--C)WOe6gs7^Di}j&?Ih!dxKQAG9eU`Ufc$j2IeDEO_W!kXpN{A2DU|Yz zW3X@K9-TiAqzD{Ie8v&mw}Ow(XCeP@U?jG{7*S#n>&UX}0bqZnm8GS@KWIXem0UFZ zWV(o@N;~{#6exaR88O~(8zGa$ADJ;!Sg%5nw9YAH85xKq?Z2Q%%X6fNLjgCsIaEnD zxYI0gKKA}1qH0nSr*GK1RUyl^Ao(b6v_tD)t_6IyxqY*}(zJTHNaR#~&>EJ;gE?4> z{LjWF*^o(y0m$nk52f*Z_8}X@Hl$UY8D9eg%%wJ@Q?E=%6WMaAjjkL0a*qebOb%N) z??l=Bw0UZ}Ry5_+=0xGeU7GXWpI_+sk zfc{BQ|KA{zwJex;@nj;EHhN3;-p6T@#=W|1yG&%*3jXG_iYDnUq@{H0GaHi4vr8E7 zYGN!hZaH0P_t|C;*$?s8e54D_3Y{H$?%0Z4BkHNaP!F$%z%Zt`@^Z3C&8*O$?F8iWYN$? z_&``NFqcDN*~V`C5pC5OO{bK6gZ(?DHwp$(=_neRz^^MJLTF*fcL#L-fS|8XJdi@X zp*gY_PCPfK#|R_)iOR(M=yIY!&QV0pkGTRfHuMmMlSsp)q)&CP@!rAvi18nSLR?3G zBbG*-Nfxe1wpoY?yblaC{;b@q-^1x;dKZ_sM6cnv{6hm8d(3uZIj{}w!@0YVHelaZ zJWe$G&&GJRtnk;fELg@sU^;yb7(U2Bx=aliA+Y@@5TnWL)WEdx7scYo-yYJkP3&95 zcnge^`f|$4_*1*;b}xwizvgqv9+nsdCylNmTtsTD!OMLqsjW+&V@Hf@cLUV-EtW;| zYHoiY%CnW_HH2X-)GcC_%Rn-aNonO?amf^>jdRgY0V@Q;H|NINt4u*2G5x=7&8VS_ zy@3c;-j87!hnegBTX4-hsB9Z-ozF!)*$P+C2aT35$*i3|oM0ExPGv_^vkzm<7vW4c zJ1@QBQmu_v%b-sVFw^_nqnl=I$6Q*?=Es%kMqCz~?3<90ouE`K*>q^?Ymhv4A$kxz zb`7S)R^^rOlnKOE$c@5JyiA4gW0}7X<*8(~gl7;7ygUvs{~?TJnjXSO$Ue8v_k?S~3Rb|W{DliNEgwJ&${5=~l+`qF z+MwM(wX+aw%wZl{2)xd3EwmD#wC0y1Ox)`U)=g2RyB54lDvJnw_?`{=9KE9%-( zq5NrmravVId#`C7&3%DwU!0-5<;dLjDYKe}TL}lma}7we(Tzym~91&X7Ru8^DUT$o>4_gMg2D z9Ma{=*czE|XT%WU_~U79zNFHcRsiml)qL=yqV%@mdr31s*Cl|;o3vwMg5PE z8-Lko4vrJSkC)J5)T?ydJ3^ftO;FALH^rBMc zkNPJqzW)&bQyIhvC-B`5RI`h{)TmS;?047OBnBBm=lV3Kt(6WWi%nWb|wE`;_%76ZKwi>Zwcou4)6X>FK1hK#MR=zQ1`}nP|bcEUY7LW z<*irjq^MSOlmqbucnY)h#aq&WtraG*QkXzJ8di{#8bf`H)V8sduJ)_*2Z}J*w;UV> zLsAQGQv;gLs(5iAA(S<6lmV$JBET^*FmZ4Qz_(PeL3qDEeiEVs{;#OfDFdh>VdtzZ zghA9*A<+v!NJBt_zGW#B)c>JUiZEld^l*ixwlAO;f$*06{-82 zi8_vZM~F=2GA3s87WCF_K)(_=T}fnbUSN^F#x^=M6=>VD_zV>F+1cpU;^Rdha2d}L z^1u{K4LDJn;Eg$(KXO6g|0kZ&VoGr&m2nmtdt#U&l0J8XS&G86=b$|IX2B6=%Okwt zp{MX@0>#4Lv?eyq-F#i7u|=&F(`_G$^I)HjGZYr5EDy5jYg$Xa7%*P;DMfI8t3J{v z>(M8hn(OVw%LeqDqoi&ovS5Z$i{UgmiIye3u7bBtCT+2?0)T9|1HdX`I7zm|b?RZ= zOK5o~3dF6<&0ptLGOuIne;XuBZB;sS8zgR;D_rv~Hpufb*k*mMnG{6HfI3|_TksXm z{J8psh(uC}?u`C%CNnUXFT_q9en1)?klP*KOn)8}Aq>PlXSNPy$M0csP(TAv6g+{5 z4oA}UV1V;Gm0z) z$~HPYZsuUDIVUdyuV8LZQ*QjV69I0vP@D({bSpR_{>oC%K3o6RSBL6^CP|sbSUF8k z&M$@uqbp4iRwg7kpk9=18YR?mGmciM174Bv5)XLgYLPLl0gM3qNH_3P;A{MsV?jCLITDH{dT8#1MLRL1*FD@e|C%_}Rw0r> zE}>*(mxS6pk|H!+*lLGFiIw3z)}E_DvKc67Ryym72JPJ4;z7d?MRGZ#0xGoGwXoO+ zn6_l9xN6g}=90o|HcrbL*RViMb(aWfw-xb0Bp}D{sLcCAvjcTse{P`L5k<=|#;6~r zl6qUmJijxUl@T@DleM|8N-KgFRVDo&hOh9;G|=2RN*hL%4zl%l_V?n8Dy=OB`PFie z^=2!>zje-o5E#(5FlEFjlxcs4bj@e))(>*(GeC#j6^Gz?}C<(l+v5b88oYRStLGb2h`Sq~LKdRIrs$IF4xRrMF=py+X9UuL0uI%f{J`#LxbH+>7!rch4v8aUL$=;j*V|WXSQ1MVi87>Tx_N`*2SVbb z%GL>_>^*?TI^YxC<%J8Cy%!$aRJLq_ohK3$@tq3%*a7x-HX&Z_i!kr+KYw3#;wOl< z1@EFcJaP@=;q}iZs^xvNaVBJg?-9R9Xm;Ny0;k^Bsu3TM1 ze|gQ{rAa!V|LIaMVR=)h1D1SEPxd`p3X9A`?=~tNsfd_T32}xA^p@%dmVzBfP^|q(= zX9W1hmvEXZiHS7cT}|njHa3@1IQfy%4-W;%ikb7H!0rODq|U}yVigIeSIz%5K31kH z0DxKgTp<{$go8?#T7U$lx+bd1G%QrGNt#(I6H7s4fR1qSCKmrrEWWaV?{ZIIH23*S z4EII98PN|s=5R~zat7vu5b?5;2Ko`Ye*sO>{R7JG+=Aw$ueC0lYnth@;0)9<7>17I zf5dT>Nm!sU*qaq*gR87oQfKrg@yejDENVM~XQh>v2tP?7YuOl z_X$4?fCdGB@5Dagpy0qCZJtmI$)UQkqP~KyqhjoB>q$uaO;`>KSVmwXlcE)mw!onL ztHO;l^yp(do@p-O7amQPDEU*k6B@{B=bA#r@=$P2)){1*nJnut4BPCJC-hmEi>)oD z7fB{h3tJxjQJ;i9Mlmi>Vhp}HpEVi_YRdWrixq{R?rgFX3JFgRXLAHqWvpy=m;d12 zwuNaMKa45V&_F>>>zzHpNwpF9K!GSVSR|mN+TSY>1)TI*k8}hqh#BfO1qRtSk5Cx; z2M0_n6DV<*2WeQ^H3SzHG>tU$x>nC3#sDIxYi{if_t)UY1WO4@QN}f4kB3vOboL{x zek3zl-JUGwnCjjow0Y(CE^Ja~S^$_=8a_fcft#PTn>z#MR1wd4Y|}cCfDw*N%0?i< z>OsHslj4cVVcWz{lDbjA@Y*nsXA%~Ii=_RaKkU67!^(_D`1+GU_XezrYSqF$l-*^c zQMM>L+UA`^;0Z@3gTTC&vORjdX$p@^Jd7 z5vR*M>n`QYoU2g@mV9;ea9vO@pZ?|YwtiUqsM#$-cZY+Vf9!GPz&)@qGNEf#R=RW^ zV{VBUvDCmTq=vGJv|t!v5eBegRT~vJ@;Ewl+jT^l_@*hyxiS`+|FI5xWH zLP`gL#N0-MR<+PpaBnrQW*1z38IAq(2j!YM zq$?U>%qOo8aNS@r?kjO-6f#e-GWIturviJa_ygI&Q>5WhdDY9A?h*H=t=vcEqiG=? zep(|~HwjTl8Mt0sKMgZ0miVzAi$rBwHaU}1mV)VYl6o?5tKxw!ek7F#8(QM>rG|q1jOw7U{$^Q6nWet)9iCY=`Zh&wOe^m?T?fbPv8GWD1Jg`U;GDR?K zfJRy8O+m-RBN z;*GhhXxS+%125>X!sZ0GMZInzhynaY3c;Vl^~`#XO7iOkXr@C(LMO_%Dt3!3vTqJ4 zvOo-s%r)oDjtyIKnjYfEv_5SWYN04Cfha}sq=6Y{=RhIs9Fofaj-l^cTp>G1w|_XW zdYvlOYZiu$h0b`moNRnXzFg?6rCFhpA;*F&4?bf!YsBx@gsMN4W;L&oyFjtlLa>W2 zv!>GCYGUj|r*!1D8!hfQrVQ@$tebmjfGe6KTLL578uXSR+nnB+4G~sF(v{g|f2s7l z&%~Hl_>aph9)j~S9_B*~Qiv6_#$NnZoMxfDh~4#a50*mV^|la?-AgNEJXI=8qC{szu@d3;WvaSu+Ozh0#BD>B7FVHfYrwz z;!@fg4_cbr_G8}5aZFvV1V}0+NjPb}Kj4Hk3XbdAmh~GXxDlJR)5Zrjq8vx7WibU? z5FY}qWBuf-wAE&Gwgn%!_bdW17HfoTp;LXid)kW@ejY5H(rrS8{tr&BjIkO>nUef^ zwY^xWXE@1cLwfve`15DX;2W*pdr0L3tZ-JvjlRiISDf3{H5dCF5uPx|wyq(niCy!e z!Hr|i1jm?={ohz!zQEcse2q?ypAq@>_js2)4BO7PG=Aua;~3e0d5u=;cE#%WU6zu_ zap31=p$ECrm-@h@K?KqX`oUO0or=?y`@zV`6tGL-yoQa-A2QvCqYLewiUJ3AJvQ%p zvlg7hZ+kCMHNGRL>HT01z|IDu-3Y_|N8Za*g|+$WADV0Pj}~L|om^Oxk^k~&{7!hJ zcwtNw!YUqIx4su>$WleIsySGBU&kouY9Tkc`d+|C=!)1#MEXr-kUA}8KAzHc^ zM^vE+qbVZzZo7uPzhZ;ZoSM@_6n=*e)zcQquNKQ5d`B-D0D{Gk{OcdfCEPPIa?5TDV z2gfUA5YV%Ci>$y}tJ^tQ4b7Hemnb)Ww4g)3ME+)VExH>loUSSnckdUqn07Gb;p5Iw zwGOV{;!&D9A;S4Q;+HVwT^I(nya{81rd99nJ#jtyMYL3S(;lRdx!~374nJ`{ASmRO zu0III4jUMF={edxy7xAko;3)@4-6QTsrd7mdrKVZI&PdK4#`Cv8Z$1eI1t37OB_l% zM!c^X+PygqCG(Elfks70kPfLBg=3)MKB_44~mv4O2q6BXHn!;O4 z2ji62CRkJX&vN`t9T&4nn=;XBLW!BY!&asvd!WTSrX9>-n>s#uL&;Xi!UtRBNkrkWOkGr^t87FBwR+0 z2{({idXt0{j00}vZ)Zj%Q#_G6h;(koHkw#Q2~gAAMLI^m$5k+M7em~fN1Wpp0v$sW zvK9r3tifXL5=BwltWIFM2=uoo1(Ek~Co8vqqt;O04zno_(kH0QB;q|iN)y+x>$2N> zBz*6{Ldb-IXkAaw8vdsiZ5)M-V_w(%^}`wihLixS#1xR3+U5mr4oM35AJue2F+akF z9D^4JjMeCqj^)Gwi0C395ywX1Nm+{~_&iU*NazgJX7ds~f`N$yMj#L%A|j$~duWp7 z){fPf1`Q!j(Oa`*(u;qZ1jERWUZ4{y0l=`YlNGL{J_vG;T{UVqp>GWVZbZyHd$tviY~oqXmdwU{D|5w5>DN%w`7r@WN&?cN+GaF_ z+v%91P{Gi|?#NL9QK)4FaAaO+aUehj`hq5eoEkmMPNhmZiHfI!Z@sPwn7zUN~-cv;|@m32~|tV*&Mgyo$j}6j_tk zWzM4)0|N2!!CS;fvuKm(#ueE9=Mf!2(r@i18l5DHY*$QJ_Gs#ul$FuV(cuRI`FenQ zIyf|SWv$g-xFM?96Wp&xYC23Y**rl=1qQrrcqyym`LWfye{wF+Ou;_E^X&$SeH53E zdvHzPR3X;3YIeTyK+`C}vDqr!V|AeJn%w-r9<%~h*?C9=LCXMFvo_Smb)PVxg&+uE z-N_pYu;v4R%y~MYfiEkw^o@^$gu!zE!T>>Md{P85FhO%^ccyi1A$$M&AS)2XVz-Jw zAd_u5Thu^>ThEg%IrwSx6MR)vX-Fc2#dMX-z0T&IWQGL|7|GLY@9x4SnX}ydvnTe3 zh;laowT#K9ExVHi*?LZYXQT-Sx&;gj1lbw@N<4QC|NZ&qb|~mpKt9}8$l>pTNwjti zDtwn{T`LSHJB0fH%Vj#PT5%7EDgY(;4iY8B!v4AQB!*sFKbxt5!Xs;U?qZ8VHNIEO za@s>iuz>?+Lx4xcvC7NYo1V_Z(rk!~HF3f3=rTG5pYk#z1Lh%!0Y%j_-yb+(fcWYr zcz@lmxRCqRf^9Sge=Um+sGyvyM7MSXS5$U9Z>Sp^&Mm}9AcQZ1p~7a*_>kRM=PXh> zkw5eN*WV#FCId6H`vzu(?|WF!9IWpO47K1CpunWM(MAQW9Zt?%n#OgPTCDBd!e7Db zjSP2#0+QId?` z3ulSVuc)!>cdEeR1dnDoc&ld)Q>pOMVi4Hd;SH9f(TsMes5M*s?dmyLAI(flviWIy zNP(yOxi?e?ImIE=a-5F)2}8EX{|+a)p?;+~w;?N8+jK9^RJv~P+W@5nWiw1h{N8Nv zdF5GeNzmETFDO!zZ(r=3(w`yGN26!AaxzKs27KK)^k01qCD+N_Z+`j0$WRc;-bWfu z3_}V(G(z-rBF?cQXZ!wgP$2m16PUZ5g(hZK}SAbu+lhBV2x5S+eFb#v zW%|vNcsTB^fnrDy6{9AeYR#$lvmMTm_Q?=u4ldIY;{G_ZtqXxke^M+j=?+FwD*=?t`q>!X2gbqv8l@Wt$veTC{i;A#rARftIfc2K z-a{H8q6q1()c~A=B8O^yj#3xj#FQk*{#h`sDM%`@d5OT1zlB4fK4tLm&n4P4nc0{{ykfBXfx#CJ0B6lS26t)DzNI%k3Z_< zUe(rI7`e(=Nhp8o{03pKQRSryrwp3`gud?4FeH2sQuJQYy<$g}@>bOW{kiklbQo};=j5kh1PLUu4LR~}x?7Rr2 zg)OfM2?^Z*!hsX_AA(eETsseTh70I;xY+Cs1RM>hS};Mn|A(!2imvPn-bMG0ZQC|G zwr$()u%ph7J7&l1*tTuEW7~G${Ql>hd+x)1ST*KYFKdmtR@GNkv+671O7#+pDe$vg zNMl)!Si*lj64rDq74M;07+)iyLX$RXY)Sk30!(2MGj?(Z4dOdZzB!T?w(fcS1ToEt zS?wa4Py*-!exi$ao)0LpCy}07dCwS=&vVd}iW>T7lVL`vXa?;!IQnZ}6D2y3l!#I@ z?@oJG*7nP*2`I3!QrE*aG1;Ecf!(AWk$#m(6d-~-t431MO|yCefc}6~E&#B`<%^W& z6bTtZVwaq9#@qj^{g>oI+l2=n&mjRub`yt^`8sW~=E1MH7?qop zy^qs5;pQHye-=Jtz6NhM=!g+3IBaclx`j31Dbe<0Hj?i^D?nnj&w8o}#L1up8|Zm1lN!y!kePwZioE)&^fZ8SP)379L-m5Eo^{aI(d0{$I_S;343w$&2VS z2V}0cozz>3RS56uhVSS-!Qvla*ZOEHoLYLw0)86Qhnr{b>~4Yj83MoZakTTheMi}& zLwJXo*isFN>g3T_WYm^uiAmB&N#)5Hq5gO>CwA9`QxLu`H-{X2wx4{IsEbxs#Oh!3 zq!}Ko)u$Xyfir{BuRnvPBeSENs(tTW#p@q?Sf<23OiRqL?U`4-;~vJ3BMb_?aOLDt zB)Pf6Qp$3^cBq3TH51rrl%M7{Po7X)q@vHquU(*kkgg;a(^#VsSS2NL>XRKcdxe~z z$jncGI(c$Nt)IR+GN-`Zhnk&Cb@?fJ#@G2)^}ufe znW=OCbhz#1B3t|mq7HYODk3*vp<}0%mAGo$-=s}K~?I7Tmy3si5ni)3{r1yC# zhJmm!RP_+(Fu5aRhU~t_qe2^@?uNhVJz$GY#!2VS^OTOR)%~rTmyh`FXF}3OWE9Q0 z>NX+D02*j2_4?qZh@Hy8!fQwztAs6R(lPdtfc1w~OE^*&xPalhk=MBm#5Cf|z%HMao_i_L0z_FyRoFwDT8lTdx`8j9gN zaAW?AgfCh)weF*vHi0KZh}v7+TBiJ_PYTUSC)~ zAJjlLSsuSPt8@OXIldd2(&Bd~&5ZjMTdwQ%o;RY$NIYkZcR4=7vpsuccE24!yrGO| zfzKj|%lOz;zxwx&8C(y{M)+NE%SsRODuAd_u|?5$C`Msh`ki_mTCPuWTWU%IR) zz*A^1)J2J)z=Z)M08xBlKroj-0Oq0}90)>L^$(0bH$QoQ%%v}&)hhf-3szkCyEo&n z@(l(>0Do2b3O(a^>v#`RvYPGOZjtlWlqGmY(ZPHJeobMBz})iA&aAvUf!w6%&EKRZ z(nd@pKm5CKXO6O?=LvRn2?o75-eV9;o1f>ib#|XtWQtWKh&Rx8hqq5uPNvnf*8{?y zDONh>zJa&Q_U96L=37FXkVbJ6IQWIUbZK5yP;|iLB=PMO%!k0joIi18-zl$6XN%sK zI0-e@?}IyoEX_FTCRZidP1eX*#7I{!E{u=a1R`0jLkMO}J`=>%6;pVzPpl4#GRCpb?~BK7KhRG9)0etK{7*bA}-3`9Z#}5c;Oqi zB>&-Kc|z==HvAnM&bQ9!Bt1;z%LfI?zL>j-3K3(+-e;X4l@?wF#Z?Kj zaqvEoK$-B%c!?wfARYj{CH{lxnZ>>P4=g-Cql)e{K|>#kHvbFc|4y=?9|Hgd;5{$C zj$!&f-0A$0+8hl&I+K@QhXrX+fuYYs7Le9qTIHmh2VE`r`6P{8GGEO(5;^Gbm2e?j-+e}k^Mx3UlU`~qXSXlLGkkh}4_VG}P)gDDF^Ky)@B7fhj2=O{*Zheuh@ykG;(jHbY!|ZY_rR7Zbc+WMqN!HW5h3FgdX>RKn%pjZtxf$92Fc7&+43wxq5xq0KfmacKK`Rmdi{zT z?zJYBYaB0w)%<(~&a!UX36cK6DL#8~UOZDnG#4wNDFUFV8Miv#Rk`cm6O;?jO!*0F z8_%uXvU1Vmp6{bED^=-ANsozz>13cvDgNZC$Q6i&FI+x`w8J~ZOE{51LVEK+X2Q_p-nTnKRv6-^D^p$&p zI2C+=6cG`jMsX>x9+g9PLv#NmIi?T-G@-cJinUi){-wuo3-s)yWT5xJtWJ6HRYW|q zXkgLMikqUVB>v97bz9U3um!kR3TN3IB9%a?FT*WXGPPvM3O+%g76ozIv!YVP<8a_; z()DAZo1pO?2betBt(=OdZu_?fAI5;zzFHRNEvt|<;c8UloC}qi;$d5uRL=TIiJ_Z@d%@;wK>$MIiadcT|&?XAM|n%A}98cAvy zs-x(ZoDD}c+VHqGnJE$v@DgHuCKt{;aUyQKpF&^eK77dPWA!Jm1aI~D(Aj|^+<3<( zZ^}(fCcEityYRcgBG*Ltc-@C=&C-Gea#Hej@k|0_JV)1jWBEVqRQoY57_TrSk}&kQ zNsL3U1gPA0LlNN|tZ=VadZ&W}vK~|yHmm79bJmuA804cY6n|9~d9&I!T5Z|J({Lu? z6}(@8tvfMJ;f}km5_p;dfZsu5Uru2TG7`if*-Q`KRj#ly3s`hm4;02Z0p!cU5L}|K z@cURm5?t6;cU4uudS$qY9LWzM@K(Jqx3JExXRoSWw+UOCPIf?-3jOJJWrgy|mS=!k zm5`%YMqg=S_vPIR1@Xfo8g&g>z-1Ghuoa&dja=+U%PQVQc@~~)3>ru)@#kFre<5nO zAD2V`-(#rVwv8PdK6EygFo2)Y-*}4zko}nZKWl*JYWkmCjLS-rBi>`WJj`C(_c&mW z3E#K%BxGpN$4l=p#0RnxKRxBkC2BA=6062;J-F1APeDfdlzKVA{#4D`JU;`S0?l&Q zsWJw!@QCGPCvdHjZS zSs_Bs&IkTzM`{5j&_lmFZ>MB)PCCe{CcRj|`rf;gxP43eWhKb4zPJFtWJ~|UF)O?Tfl2pQ0DA%7La6E%` z_S4o>BnikqF9$U!)Po_iOsgRV=b=Fo>WqN z$qtV#j%GOM-HB`Py{A5(n|qgeux&M}O#EjK??a?`dVD`KN9QAOK68@)U|PqH<|X@V z<-yjWXK-Ywp(gcVV`2r7y5$7Q=4h^z`RvDQ$B@cnZb|x*Up6deHs7zFYX`Ez|$)HF(RRXA4T@>`?}2>>|vx; zuT{d(;DrYxV$IF;WyXS&HDrahN$SJ1nN^&MW)D6t_AXeimGC!XiSV*Q=ag4FhlhvV zkkcJ!j|SdZ+x#Zw(hW_;z=NQg@}V?$>43`cB}wp&aG9?0zC?QRg<(7@{w9>%_Na(a zP1nI_|6}S@Xicl+jkQk@^s;18qdL&i`5c!`=_GVK#k662WR15VRPJ$Bp-ibC>~*_y zPDD~>*TL1nJYrL*H^9l^Q*{E8`K0T?XsQ3CXl#K0LOCcj_O&K)rU3Rnk!uM#c1|)0_d6}v@~6-G%0KXws7-JcV13Hw zCb%#3o4Est;ABIy$riXj5bA=9zDF3m`Dh!Q6B-nb1~^`<3|@D0EN%njS_LyjsHH0i z&`1lx>w3j&0!|tsPtu@l;p)16SXt?Gra48eKCx#m?DNg6j}t5y@OV;JhPO}W+qvCV zOQY=yc~(Rh+#!#V-WKB62_1**OS;MCE$(06YD&f(LElA%+_ROf-Z1K~o`9BfUq95(dvqIqWTg;7C!fwOpZv46 zUZ-ZGM#5>Od@`+Nd+u_}H#Ru=g+v7cI<@l+{W6(;K{50R359U)oMjD~q()DE_(8Mr z4ApX^aQ1G5ICOGU-mF%0I)+?_LCzJ@6dfjxQJlR;ASSc zjn$wKOTh;)3nC*NqiVx0^*-Q5+!TL_%jq3p6e93;ZUufun<-WtW1NTQoJ0jYFEc;& zh=RMiv2P^DWr+iM5$)31n8y9^<`)t=a}|Fpw~&_#i)*AId~4CUSLVg-eok$>A;|QH zOQZM?3+CJ?_d=KQkG*k6GhlmZIEizI{*%#e`-@S zw0PjPoak3`FN{--T4W3C28U?l!)khC4Q`??yPT%)~lLe@6V6R#JXbI(&*- z*$q187|bfpw(Z@GEghcb%E|U%Z_3W<@JVTG^+|7iAagxiW0W0Pr5nPxx&swQ62l3S zYH?cbp!@jYAb}gvPhv_Kbte9Mle$G~hj3!gq|Nm8dMk_+(hE2y&nzLbZ0;e^>Oyu{ z9KS^PtX)?b;)3e`0own1yT>;&;m7ya>c3N^h?JASM$qk$Z7J z4=1Cn`4i{iz0~&#J}lQK0avbe9sL_L5QiF&Hc=+6UPbo%dXszc997?-q!^z@Yb@VT zS{R%D7bY`Yo(#xlg9Oh@Ov_)l@(#)CW}{zfxZ@Au~saY|G~dDvE> zTr73ByFtjl{`ojoA(3et`7$4EC`0cuh6S@E(0op!bHCzdxGNrB%1GhU{w~cO5$ahE-nmt(c z-t#lzTw5|_JDY@6P5w7;9XUNFRr<6W#-y?=Uh9Dx^1En*FQPVlD)g|ED6`wJi~6?4 ziq}^~Ua?JCz;RKQ>vldZQbo9;^wq&1f665r;C0&N;6nLg2!gYUL^;2k%k=Pc&Q-^w2Siy7z+RTmB-&1p5ex~|$()S5tl}9m>h6lcF$(SMknLrr-nI;8@ zK}`t%!(0tAfG9i}O?p2u%!MP#I?~@tB6dKnLzOn&h(hs>{npzM%#k&QH<2^ECxUUq z5c?_-%j)aJD%%K5lm~WHlaTOAQ&Lbet~e%$umg{zv8~CFSN)wIOA2!A=aqZo<$>68 zV6M%A)lA-+f8Ns&2FsG8c=2dvE!XuA6ySds2QipZNd0Ci51e3330X$7tn%$>Vm zMZIU~O8WY^{z?>%zlUg|i@Rq`j}v;@OW1H+jK2Zcj2rUrRIn2Sn-SJy=^B_^7UHNT#IH(0RPldbzXFn_H z47h>roUU8-A^mY7`rY|s)BaZg8H(gOjjNWOCLpnrgZ`Tp_#_-_=NGo+2EWO}-u07` z1Y34IVp6?};}6G)nf}U-9@N%F096SH7G{o%ykNqH5oIH@^sC)OCN<;GN?W7^H8QF| zY)kgrJHq6a336#rWezVyuFU$f?#H3?1;|Een-_7t#XO_(RewKJz48%H|Ay9nr5Jm) zIf)+UVyy5W*V?x;VYwrMLI?x+h6w{m_YZ~1Eodp7Yy&(t#tXbe*TcW_gLecMN*wVGXf&M>-gJ^zVM;8PX!n@Duaw*hz;2glY6#cs| zKN#CWI0F~~1_6#iNoZp(u9EP&?O(7@MjJZnuPs0I(tm_9D} zaU-D;Nkx7Qy@wIH++OJ))&WNZtg_a>?bAmT$hKf&FthJpDuMydNQ?K+f7^DfRI?Z; zQ@n3b1e8@~9s|gd(0@I0^u!I!!aNBV072sc{UJQ_EU!bf0-EpFCIPvc;mNFk#$<#>P3k+pCe5>=GYMP}fY+iB!J7RW863p8$ZtSC0}quOxi@5wnd7Y{;M&s+ zwOT}=i`xJi9E`S96#}9TuQ!{IEKwpznDv(kZC@Tr^}C?13o}DAb}8B^ExdRVr28{@ zF|UK6W$aFRr{vjvO#m4rkJgxN*-Ex9-bqlPrC|n^hVT{S!YE>QxMDVFLl~MN((4LE zvl%l?0(_CkXj=Hq?PVx(WJh7FC7mMzbP0uc1u>y__@LSG zQczM5x)nfir0f6?3@X91hu9YHG>2^<@JAPB0Z`AyOS*hF%{PO;7RQ~^kfjS9_Y|g~ z&`9uC28gQM!Jw9fkjR^-u*83d;vu-Z5<+26<*6qAj;B+}vdvnj3U!T>Mg#6CKL`Wm zDKBuHN|DVk%+@Mnq!=e}`lHvalJ*9XrhRfmdj|Xuq%c>)DM-cNo}^OQ1twI}{tk#8 z3g#vlE4dGs;syov{K9Fkgb2Z{lV=A1&y5ql-1-)4z>TKu(0b+YB(y7bCK_}EvooX? zv?B;V2UB@r5=V7Za8(s@R3O$Tzg#0+F049o!I0{3fd~+Dkb#Gh=qi{rHL6p_S4PGy zVT>mMw~?cE03o?Sa7g53PRL}rHW@3Orh`KzW&~T6UR-Q6#yDNh%RH~r|LzJx#cOL5 z)8}3jNh!0PO%LBE)MZEQN$aG)aq#mds{@ZAXVgvy$jwGwcT6t4B`8uR=#%yFA_p(t z+%Z?HS35lgH=aESwjDH7rte8j&7jiShe2cQ*ulXQf|z3EZhp@In~-C*IbvF`w@E&t zgQOn8lx%jF4y?SE40(0nrjgqh?&Z0SE}-xdVSRFG&HjBHRm|p_2n}xp=6fvFHdU7S zDAC5Ipod63&-nIYwVh2-BmB|ZYNVGH#RS3IgE2 z#)I5@QxKlP@j*}WQau_L0~$c_q_~Cy5(nX7?-^8-`A(9e15ryr`XSYRVNj9Q53~Ep z!KJmOwot(DOOYSoG`f%?6&qdylb-3vad`n<)Z_UWkp`8vq)1?ENJAA9i{d6>nE{Sn z1{*gkt;$A|;gzb{5d!(zbSk+eL^&{}k*6U9JZ4yKVjzjm>siS1N-J)z$y2}BswyT3 z=`EsN_=QTORm+h!(+f6JfWns>KRk`Vx46<}6q!}N?dRb}`+2Si}6 zEK`JEdvpYI&h zk-mh?!D9c5Qk2RtmTj1$EZb7NH#Ib|K5DeBocABy+$eR+=L zWUAc;$Mf{6GcnxQt4_m#s~^kVW%L@P?y9KofKM3ZL%nw=b^^`w1g$d-@S);t zrO|z2@cG(U`}BRq_KxM~b(_-nHXfFa7T(@DvCLOvX;~W{8lgcdQ}SmT zwd$r7b2&@D%?9VNDz$OgDsuH)%Z`r^pLbT}*0D0H$k8fqaO!(e-z*#g_5wz~>}n@$ zq5uY-8`7nBH1~`a9Cf!Xm*VW|)0uV9s(mTwla(KHEymJw7v<;5*+(ja{Cj=$c(vB= zR6utT%)5ysQy@b%TDz1U_)NSCW+v# zuFJG>_Qc}AG>nY5Keuuj?XKbr`7E79-Ck0~r23X#-kEf|8CZLNWcm2{2vyRUSJcvf zY)BiBbi3RsfG~m)e8fQ{cmXt87I}7D7CweMFFx0)7mA-n$qAdJ5n zTa4W!vkRSFBz*Zq*Qq~=*MPyT!N=&1XwbfIV_MA2b~>77#Kjb(*qNMs{e@S9 z_%R}6bM=}~OUyQcRM!;P_QE-){nsmxiAf`mgP@MUB4lh%{vG-5xx2izWOpD7M|_&s zLA&%d2#L+XGc*oFT`aR-yG~zrxGHrldxt7TMy_R4vOAw`4avP%nhSKv7a%S7IwzLJ zMRp2I0(?q%i+THpDO2HvYhuv)3Qf^FrijK{jnEqW_HGFa%7z|N|8XIWm(Ze3*oU>N z7iCQEL%3!dwc;uTgU?YOL1?Z@W}8~##!e$Tg4O?{GV%ok!Bb^oEHJ{@e<}Xj|Jv-4 zxORCiU_M;f5u{>|i7PzkX49kBeh8n%Gv201MVG#LK=jWo{Qh=8f$PnsMKYX;%^p-+ zw$jA2n3`rZ&~W!fWrdGDm)(!-zKhaUZb z<~^tKg!aDFBI7NNL-#IbI=_GBmGlM6MK3|fEq~QP+WDa`2k5A@|IkBUtoEzZEdMHQ zEo`)kBCZ$J;!(?Sg+3S_-TIOQaq2Uf58=^ zwPw{vrN}IZ2M^i!yhx&l4O_>?R$G&k0)5v5_58s zqnO?WYRmoS2QQxC8D?Y3$7Urb9n0dE#Vd~9oT^|qyjH9o`bSk&%kM97Z})zCgrb;m z*-Qk5v4(VE4ode6Tdm)2HeDjK@OLq8Q&Rq@5 zuA)bau*za%WvmUJrc7SiHT}P(1dVTFTs9|yslP@|4Ql>1M(RLPl|Z3Ku_<@>cqb3Q zGz6fR4Zs%QYM6~}Lp)5r_%>QPv29u#G>AhlYI@~EBaje+>oZ|_C+A@z=t09PYt+5< zB&9}Xusc86ylKCYctu7vcFrE)@JKi+1=>c6sqYuFoKNnG|RqCO9%x+d4j zruraF#an%^ApZdW3z?pXA4L9X0cnM%mUyXkQ{z3UXpBz7-M<-fmvrD^==n^jbztDp z=!Hy*b%aN$?B7zvSH5VUH!S|{70>4MKsN3MruYCMkU%k34NZZPos8RR#eZdy1RJ@y z7N$zYvL*;4dQ2MlZk~AUly$n4Ijw^$EX_b7ue*t|A_%7mC(<_F354(u`Fiz>yd_S; zrnvge-KsZfbd&{Pf&uVlWj@-ap^dzVs|Y{mI($vjWsv)z=_0HO^Zv5=we7L82c`MXHW41Y@O(nSw&^al)B288j5KPCX!>$pBLY^nA<#ntJWB>`KF6BbfmEhF<60CI_lT3y zAp{Ox$p=k~Hf|w0j=g_>YYqZ9AikalSqH|U4*XBZ{U?aqu=caSL&>32FyhD^JpUdY zKmf96vwGgdth&H>$r-T=M6KA=HNwewtj*$+9P~L-oxfT2Yl>aE8x6D*N%1U$vcpqn zq6A!gkL_|??`He|Cfjm~yZOE*P_$m)?+d9TF+#a_@*B?@%-CX9s)eG#Ng?0_HCQ5| zh>*}r)5l?=^uqlobQ8XW_Z%nc61a8_!96pDp&ZW1Fp7zlnWz*1aFFN?0N9N~`XEe$ zK`3!SD6OLdE3nr}FUABwo1!pJ2tYAG13WATe<0v5U2-%MKm2cj+dlIpxQQN;ZI*-UuGU z4jzpG7H9xY1zd{slGC<*(xYeu^eKHMG;~~gi(fVVI3lV z*$JUr_io#!pZ!YUiGCd8mlw&Ow82DEs)fjyYie>C#-V9QlGgjPbJM*1LyCV&VeX*9 z&?99~N$zpFjpb%X*IyA7ix;Tg6|FLEUSvT~;=>fCegC8bwIaLANet=<&8HqSdJ~v_ z^2awP-V-Vor#Rx%pGtu@A;|;M0jYo*cNyeOFkM5PI?G-eAQN*MqBMC*+ardsq}r~K zF}-J%acfTMVQj1E2M%9^1av{EIYbr}ey~VKmXII*sNu8|8zKmO z(74<#&o66a|zP)sUdI^D}?Id<4)nopvU+E$a)#mXo z^R?&cxj526DwiJ&FM;?|i>j^q8xyGQD9@tzD};D4u13UJ>v*keDs!ZIt-Q5tQ~YjM z^wDSgy*}3cXNmS7wg{WyuMg+=rvII9hKjY?)q(VXW12Y4vwwy{2&ZkTksxj8DX5R- zU)1{`UBjcoMi##K(;Pjo$seD@A7P(^PQRFI-YRR5fsBHB>9U~0?_U%;rRZH-?sXom z^E{aP7fnoUdE*z^$F@=n-)QB@=_MR_IyrK?S5wI#>LoO?x_<_ScFF@|H&QvvbTMbIS_w!fiL#!rVlk!j*TfZn?Xq zl1r_>ZgltdF~Ric#v>(CJMN1{B?&Dv+Ke-LxB?u?@*KwGh}TW`M!l$(hF4Msy>Ly> zXj8#V;ZI~c6?F>`_*>O~_APxgXEd9{{6!|IJ&Zv=#-a(OV{YJYaXP}5&+w*<5da3| zMT{USSY|7qpPAdmlT)32qd3HNp(%xtS=SbL0!*obhEM`Mre9bV|NZIf%dfX7rekx& zV8?dn1yOdvu~h%rp?lXTm8`-bk$6Mt9HuJM!TpK4u?AmK`T1unjPU5yC- zO0K0n%j5vm!$x2g2L8VL%rTQ33D`>Ts&g-Yq>41eRva^(yqZW zvhQI3g{@-y_;rw_h zt|)CB&un-U^Vy&#^XiB8irzq_O|$+a*Kw{8VU@Jpg%T8`L93Cx{Zvg+fd+jUR-xh)+)pO_tGeuom zW%yW(FyHbN$6-pdb8w^Vp+&(Bx}$Qom>oA}QLn?}0ZS>eAB63=%FoWhKK7YhbpkmM zJJ+BM_vgLa*@@rUr{WXrdXE=%L{uWGU_Dyx+v zEMqKfLc(gdk8G;f_*F-^=_PUl8A=|S|NDz05e0Sz`rZ!VXL4_2tZz?C)3^&OE`IVR zG!6$G6j=o1HB@v^KwOjpd^nwIPp&R*23D7k6As*fImo`QrVSpuw>k!rX-sQS_AI1da3U1 zb^gmVevqCH&gOpa4;2i>BF$*Cb%FV<-d+tS9PQ;IwUsWE#C$ed<~ ztb@p;8i6YzKLR5fA>^%pdFvT|tb!V>R&XDSq+6N;h2tz9>&4pe_c%e1NCq`{J|7b? zgjrh=1!4Xs2?GaOrLce|ToQk3z}Gk{Iq<-|Zy?D(U{)mQ2LKTjG*+@~k^l=RxKn?y zOJ9@$_)%qm1r4;aY%YQjijxDMQ4;<51A?8XF#Z^VKe<3iLIy#Em<0@#imq|k!WatU zRYD|W2X)kDMs<<-m?y)Kl!dR{p9=k5x==PwEB0L$Ryez5EiYtAlB3$A!QH@ue5Vi91*AFhKe3hwCi^K?~Efs#I6>{YAw>#CqYtXe@qc zFFiu=sLn^$?KC{)xmdd75wM*<=3S3Zl?cz%Ye5T9vSo1aK07jZ^F6heF~}Kypz@}>r@}+h;=!Vv$tb~t)=pZOFrLZq2d^f8wmVjkM(*O32Yf96 zY%iqXov_j8l3Xo?t+Z-md` zN7lr_z3@V4esooy3SEhAci?F@>7`T@JGi3Uxl;M z4?`gheXvXf@>doZ=~h6hXgR4A4l2S#;q$A$LT*9s z4QR~(@m9(&^?zW?72lX83%i=vrF~oY{Zn_W%VSJXz`{s&u3$;wZ%RT~>4Vy1;k_JR zq0uVqPQ3meD3TrU$u{-LGbWNjIl|5#=No~b10aZrW+3rX8w0%Vu9Q=zS$fv}{*<@> zJSD5#QSg3Ho4-PcHFSs!@m_sd6ntC0q<8pq=T6TVNMD(sBbxq>`P6HuCtpW4joAXR zYQghl?Pmg^N97;F^e!*(sJOX5^#gtGRwnhtjE(Ldq+>{rm;uV$lvfd+m z%e^+2baS6MaEK{-%Bp-fYt^Nm?IROwFT*OS@6Z)HD|lbAWi->dA+}0(h}W+sjMe0{ zVIsftg_^$MwA#$Qj|2K-DJJtq(XcRD{>^VmdM>m2ci<=&mi6W^3cd=44S$Iq)lKFWChZ*h>_CwV;&HM}sM1j-A;9r&50da=_axLTAw)761 zR)E5y=N^#@@D^NH8z3BnqYynAlkmy5XS%TuXL=&PI$PM+ME-YRfk23fPn)M4RPsAz z6U~7-yWo!$4vlqqG%ytSC=XuILjx>brPTv=vz%B;Be~s z32`)C`r#H!m%l1;1^bgVl)qv_p3ny-aK%YTAzPjkL4rkK{o0 zwXHbS6&o5k%9vh)GBEX#>7Bu(od$J3Ez-6$%|BZV+OrUS%uMDb!1<`wck6C7*#D8Y zm5O4cxwY>==GeFPQtOd9{XwOcKB3tSLoK5K^Q-#mzT;b#t`E#eoT;$T@ap?bpWhhE zX$Qs(-7agsEOx^ojm0BxB)UF0=SB=lYDP~kLliA^fj^>~ObO@UfdHV;p`~`_26QU^ zGxW_c|6AvC`^qF$NjRULj{bPTlW&QzRak?!8+v7W%8C_bTrNMwa$p@PI7&qfo43oRWpc#>8JKUl#*m0Y&Qv&j=g6dXe! z*5xTm{ih)1q5^SP%X$pwv2|;D$ftgQ=4Ss{CDe=oh7e|O@deP69ilYG_<+*`lRQvAxHYDrIDGmWZA zKhI(lWocWIXgHoFB*!MpHji-RpusZzE#GC2>Ee16x@<0pp>p#=7Ogda!J$M)B$;cj zf<%szgMMUAtz)S>P#t_&-{2KUNNi|zmS99eeN8+=UWwg=lx(|4p zoBr`}eRC5-f~bTR(b`$h6*g{(Rg??0u5!W{V3I83?S7w}jkcZq<<} z5xxFUP3P<{V6=3QZ$;C6)2_~zooHAI?&Dgo#(8-{_}knYf-@QmYP31nP73ArS4vo~ zFpZ};&Xr8Zbc+kNlz2V*`cd4J(NA)1zX9STTv|fON694kk0@N}5k#BK+vc6MP6*jj99H8@(>C^1=Q%-2>d3x^<oGDTx?` z6bk3-kFN|OJi;`|aY=}Crziwo+K?w4FumG@|9f-#ol-*1S@X&xme7Nt|6Obnj;ZBq z`>@xg>rEXUa&<&r$E05^8$DS&@J9@J^!w@)JDq7ZI`HX1+~uuOdm78&2K4Am!pqs& zljX&BC%sHJLdc)P%}Ey@-aJHG5Z#^X??p|=Z5cnTawJpEkK?!ynq$a!Of76ZL#uQ1 z_1EkURy`?VL^B|!)dW^3bRq+fY)W)`?>N53TzP$I-b7_W2Bzq@;+{JK%_@wrzakGK zJD7BZ-kXY`Vn6f8QLw+{glxi(nc0&EP!FEkXa7=L$b{`#SyhTI z?-e^SIt=qYK+wd)`E^OS;Fpigc2`jW2Y z`<9UCKj7roYuCd`PPk^=H{Cu4S&R1yYfqAZ*RGi$qi2$_!NMfFw&sg!`2H8(M}%Jj zF+7D&TT4HyCi22wE{ea#5613n3{D_#$?1mQdd?ATNgLq*c3 zgf7c@M=Iqgg*cPLV=4Ul>1`oTsr39v>DD6d_&~V6huIwXr*PW04=XKKM6uiS4aSCdT0|wy4v2 z)h=EbKP}3~+8%ii@+IV2eSO9Yh59aY|AkC$PLprVEPDpO8zufUI?3@k&@(2C$=E18 z^7C`xU!`}dx3l~tnV*~@O`CQ?I2x^`Xh7!$A+>3pxq3M9i}jt%jvVFuv%S(hHc<1G zKwh`S^~+EG_#_;3@`N4#{Bd5LcG9vrlUCrbo}=ITnYwmu-*g{Czagow5T>5FGYwlu&9ORYm94;{*#VG#rT-7mDstKo!h8IRW9N*X%=Ur4K zm5))Wy_Wud=DhTA9RXtP&6MFXVh-bKeJd4gbPR&VeO8g``JKU{c2X%Nrul^-bZp|- zTlk*a<#fKtyW&SS^Yj__Q$ioahm1UWkdV^oKtcJn5nQZitzjInkg{Xz{>Vei<}I;3 zW|T0oU7uarp%@^4snE#a8oxa7x+^dvv+P|}`uK+E++|M`!9=6&xlCcD2idD%v-YrT zwiLzs$L|s=EfKPozjj|?vjGle0UUxH7lJ&p01AD zhG8;~x>|ZHvH(!)Pig`lmD?Yng`?TQi^-!5llvH3Prf!gcU|4`N<=}>=X&J!fI~6! z>Xas(xKPJkpynw~98O#U(#UNPx32~007es!0TONjoc%;5YGgCBd)OB_hK=7n-=;?P?LlXjX-pdO`4U5&U-;WZG$_K_ktyr^SY&^V0R2(1;XWHw&{X@BgB^_1#@xvU_Opi*bOaB>NFbH8!d1W@r$?YSXGN!-!;3w z;WCOY1>^#xYWQqj&Au3!-FgtBG2ADI`jUdOcw0KnZMQ}Y zdgV6V6gGAU8>p}K_soctKkN_%Alioj=YnKY$W$%4TCnW$LTwXAO#KS~nbW|TIaz{R ziO527vg&c4YP!PLwLFrD8;+Y?<0pl=tz51lFq)v=Ic}yECSME zRvGQ7!5fdr4ykkf2>zty(_ab-!lykG|4LAvTgjd^%RXc;iCRc>TH+Erh+`x1H zz;m|otHZ(2uW5Ao29i+Oiajs)50xHPI%-8}G=C4F=5b%_|3lY1MMv62U85D-wr#tU zbl7pnw(WFSF*{DjPQ|uu+h)f`$0zUif9K+yG5(u<^Hi<9tHyrToMZ2~)^rr<7O4>F zK4ntRH2{xn1ep%79ul(&g6X<^gg&6>@+_Vig`|hl}h6T>ttQ zn=G`zJOBE!lrw>!-oJu-UY_@PmtlX3Pm1a`#Tf+FOmL&ls`dGl@~T?{iKD@ds#Ce2 z@9EfCm+<=SY?`=zwK#aRD7br*W6O!9j@JZSLLK)@1I$Ask{i&mcN6WFbZ1~3zr4}% z43ZF*MR!bgbh&uUV}*)j5mlB-8Y+-d8V;b$Z}-txvGOC{Nf467Jxd3n*i8Wx+{BO6%s+ez$n{{a!6sw!tA645E4G@9D`Z?+G zB$|3TgvRpiDU-W-V*CDS^VrdAwc6TfZ9F0XUiJ3{e2@P5Xu0oM^`V!VZ0m zhe+)62-m~C=m1NDh2TG9OE1jElenGQ#)Zf9VN7VViY1##GcZ^T!OXzJZ$l`UI1K-4 z{2Ioz`-aiKb!(PP(xeLF5gG*sz(K#9lhLH+T-AJ-PM@R#Yly;jE3#abO&CE6LY?r) zTHmXdbh2I{t{s*%U9!O73FbxNV#MGiJ-gV%+l2#0V#N*`@c&%v0|P>b0v}!pWk?%A zC4SwV=*NNJu*HC!WLY4S;!c&SR$Jb76utZOTeUeJ?CARVyFJ|K`f{@ExrQclf-l_^ zi;lNTmB-x@#tZ!VgSP$*IsrefYYl{34R|HwjP{InZ3Fh(UvY!s7~qI!E);KN6w8Vg zb8p~!+jXFtGaNSIG8Cq5Bq@=>tq(zHnufGf*kRiU$M@pBP(vV`Ka~;}X`391yLLoy zNlF>H6^qp=&SI|U7Ia9Qn(*$1A&do9RHBjihyYsB4lFhvWg+V}7^<88&y*cuNWMbI zI2)r~zbKRkp@?ZT5+cn0C`WLu-H>^9Bkqd+ou6Mxt@tac15zk8r|4-B<|Eh%@(z|~KL z#pi#e$tC5lh&HAFnn(R3 zH(%ugT&h;-#95SNI}6#aogd#&X7;Vc{N?%R0g81vfvpb7aH}Cy9*L*bi*q)>bIqke zqpN6C+w|e$um&$ESBU(gf6c7Vh-HVUg}H{93r%bJHn*h$c^tn(u)mc@vPyCPYV)$* z+4RkjnhiSEqo_!pm~XE-mW!mDU$r&SaG{H`Dc=8-S|!ArAi}IMSQ0tPj&l6I-{;)F z8K|~3y2U3};L$qcAN2=-f4#-Xx2i_E4c&YpH}lE6QYYk5em6YJB|u+JpKoWZ8WR)f z;=u|Uruea0d9gSFPCBBGU3YdjTHUPiq0WcFf=Ey>ojChUp>3?a8p$T^MW7ykp55}R z=Bov5l*R)+6Czz;eA(B33DA_S1%jXaznB9!IR!tNli84<!7933&qS#%wqBICl3C^W~&_&!9utkuGYGvY#@KkBx%D(k$MB4%4P%s_wZ(|YEKY4 zR}Wq;9(KL{J<_{*Wi>AgQ=L>p!wYo86K!D$fL~Jm`vROr{m7>Nlm^GHjWK!FnzCG2vCm!!QelqAiuY+x$j3} z1xTeHVpMXs%<%9$0dWD{C@6|9ez?PzoV6_BkvXE2lzX)jL%LlMXw~?A@NRL`K^m=m z_gi(|C2y0#Tpc3BZxoJ|3{X0h)9`7+#G82g-P^#$m(f)bkzRq8VK^T4GnT^jB8yL~ zh#SCSRify4X|f9rrDPRSI?gk$6fo))>7o# zL|i!Vhmu=2{IaKVSI?-5T+W}GuI3%w)+QB<)BIZGY-Vg8Kz_Hr(Cc<*vroyo<}({@ zv6K(mUx&CqOM;fBqHLPeHwSQdR+NM79e^|TKU5cfn60&&rKfB@x?3Q-ujm)7$Km^t z8^5Fox((mtv=-Aej*<}Lq8Y|8Ey$4Qp-5T&W{O&U>ejxuj@EQBk12rhNYqHb?D`YT z;i@3RyR5*w{DXH{p4TJIk(q4tZ_|L-U+9~^(38O~a93t=*ZR;Glh<1RL|P;7=+l7{ zPHTohX1_M+pQXjFwGYs0Dc0t@Pg06SyNtEzd!yVOyW6+VK*`dwVj{XPQJqJS{9^YA zcc%{Qv7Le+&(!B@+-aB1U+xNqQ0=w-QS7>-p~(1dIgfB%8Qqk5$=iceI;;r-f@z&A zyV2>NCG1X<9vC+D7st0Cc;NuQE^bvE2FS z7xb6rx_11(gZ9rYZMW)=>qC?O1ET*w42?d)P>Hozo2gg+!q7GM2)fI4>e)jU_w?^N z@)k&+0U7eEdIPvT-6L(Mo8Ni-P~Otf=Ig>jj~HF8p-*Zl@YSwUP zp9BwsQ@if%L{1I!`1b|Kvhg^wog)QW*5Ujz@>^3!CvRbaEO%yUlS{gry3_(qyVmKF z`#X$Igd&(dqc!67_n z8s>55VDhul^?(40f#HeYYo@o1-bb_N(LN1zwsWp(pBwyW6VrFiQHEtdncD_w> z?yCR2wAwiQLU{*mBNKkwUMJdK+OPq>1wcGW`G^%4{ch(6I8rne@a%~%NyJ*>W!SbF zvMm?TN7qw)s64(OJi$kP|7wEOZtu}(m6v`FpXwEt4 z3U%D9m_7Si`w4@0`!Zi;OBejFz3=$ynP!tbPtSP1XM5@M?bRH9Ea{ONZZV@ulVVdY zuuH7KfaJ1!6UFxvSi9SAId{%oX#QIFaIxO3pD#9>o6(*h_bRq*<1HFxdu%*2h`cZe z-+&=vBWg1^r(N3hyN#M*^#+9xr76yfRC5+eV3KO3#0nacA<6KMZeU2Brbus5INSr( z^s*6ZbKD;CxLdqMu!00~FFHUr*IFENNE81hgxOdyar$2p+!f5p_E^=TUJ^o{S zAd-owh0)vqNV!d7-ul{q3$+z^BNd*?B4OL5bNCw%{6GnnN*e1Q&7d=74tmdTC>g*! z7%dpB=wuS9;;$B55S+H7BhyG%vnNS3z?>>nCdqJN%K@CNz}t2j2`g9i&>5OmO|dmO zbQ=G}DA|s*?1ka4M!njeQ zL0V7!UQQ6!Pct3KX+}t-N_96mkJn8YKZp#*>tPNMZWP^g>#@H3u7O*qWzY==LF1*rW67UiIghw6=G|f(cB6}2Oz4O;y)Wc5Eh47+lpXD&mrNE_R=ap*4 z_DX;?tTsvKn)g_)_{s&FaT_I}NTr*{oNJ7jg0k>;kNkMuopUCeMfZ;{#hm}nC~BI3 zr|lRu+)ChvcBJ-(cEyzHhIYA-J!`>nXJvB-ao)8NHlLILq+Ca1*SEckJxh-`(mW!k z4D3T(5`T9%;d7J#cQuw}v4>Mu@C@St#aU(r^PdNi`nG#O!al;H84^S>&*dC4V<{)j zX5^`v?3$P~5^M8~}h2y>mZhhx0~YTP29PD+634cdQT*^^4~*Z64B1cyDYv|5aJ-E9+*7iG2*_ zu2?ni!3Q0mP!9?EF^k%!hCQrvhw2?m=(4${0g!xw^`blBWRB-K^0SV@dtRBG?#`hV%Sf z5Cs&O84Q&ICtg=Iu6l|fhpfG0@m~s-KCh zLH-0Mwd2C!iEGl1#F8eU1-s@XJMfauPBwvRUOvA`exREy9iiGGHdP_7FOSAn3)}QN z+)b2y{NU%}BZ`MuE{!O8s>WrnUR)Ft zSn;HciWfIgD~c7DTA~X{se;k~=3MbZzikb+j-N2zcTLvL3tSX+_04HeGk<%kbQJbD zpe7%!SC$${xn$snq*OrO4ri8WAWN%6u7UR=5!~)=@Yk zbjLbgeS)jMaCE|bQ>DNNINFGse7>4ksBv@y=_CU6pGUYn6~75mkEAKqGt=GGyUdC} zJDj9aq$rK?xN$H)sUQyWh@Bw^lt>1Y8i?RI^Wb$#eqRXb?vaUF=vD+8NIfK0@RF%1 z$eWV?^9J=0EDnh8nvBB4exY+Up`!0_GG8aak`MO>vyY_YP&(c4rX+szA4`^mM_|cipSYEo zwAs@u-WSJ&Gcy3WJ*gj~Qj!G5gv2rJ^Jmt~P|#=p#_^G{o4gv zx%P|81`fs_my>ddbt2xMEiT0rB9NQ-8QR=-FPy%~-&Pk{g1|5k$w)IC_%Yy<-E4jT z5}x?*C+HrKQ=??Yp^fXKXNvRj!c}zA;nUROMFn>aEE2iyVDw@WVY3_Jjg7L~VrK+8 zIP!gCp8(EEo!(@p$BCPVm~>%sijhqm!*TX!LY=;I$?=DddeSbtxQ z8aB5WDo8W*HTTkm+UC@*Ek0x;itd2%^=wl&_G4j@NA#6JD>3;X4B$r< zCPZ5z(bvooz!sOjaumF6!t#K8MK5pdiA_A@=#5}sCwL5V8Ent0KR-u^ow7%Y}@_wb>UMzeS)l#XZLgH;~z9T16ZiA0o+ zciw?jKFIxnM(C*>N^2i~*w+erJ;Cg^(fU4e#*Q0f9XQX!qV2O1>8oNL^zCjIzqbyv z_ZtaNc)>N^OH00eLZq`}dE#8obTQA!3hUU`YW2e5a;PyHvVcqb**5< zVxQ zkxEYt0Q203tPzlp*BYI-&B6U~xNfTu1L6R>HGPC9w~b1Xo7HhjkXaQe;9*AJ#eiW> zf{{T)7U_=kWPqjhe}~4DKcPz(WD|nLPoe0?Ow}+!qDv;niY){~Qh_z`K9!*=VsurM z{nIqc|L>-z|GOJ$xgSM5&ijaz@L4=2~Oa;<9zqbOY6TJ4sMiX>-zKx?u6( zv{G(rJ659H4&+BW-%iKFfyTSkO4V^x8zL`2B_l1k#V%6TG^VIV!YF2U*PsFu{28Pv z{23G1AdBDQna{@R`n1X-Tc~v`Y$&VXNT`zw$w%NF4S8#rV0!UV6cUoxmaOvdBO~F! zmK6iZ0nmIJHLEWP;qujy6g(5RIoZR(Yt(@+F51FDH!WB8bW#NPV%g(3>m&KM+c_pG zTLCVmwU9DiZ3m>tEheSA&xwU0j_c>{&{AU`Mt);+1AX~uV<6Za%ZSKtDt#qj;? zB{)@MC%td^SQH-ipV@Ui@Ag#o%RGUvCr$be2AkX;ZSSfM+-t=wiqi_y206f&`;(`7 z(59S(h98UGT=msx;D!5a~tHVtrf^x!(6K?P5B%wtkd6Hzpf!B?LN?>5fF~ ztK6#c>80qSf5Pg7O?fssf+|=L->%4KfqN=zazg2W)m7T`#L$r$+dwP?9*o(fp(W~v z0U6vx{<>A?Ez4B?#WVtHMAs#Fj>V&N7fVe?{q3-tM#=jfD^2yF1Mmc|c7@=q^L#xG zM6RU-VL6AtCn3a{ryftt=<>g`j}E0Ewf{3F3R*zmDUvET$MwIIPSsqD0KLSXsArBk zqppVd{PJ*qz6248t6n^dSXK`w>iivcx^aRYtVV{y}y5!8DDxMRd8eH)}e8x44jd#m5%{UC**M2jW%!|ImD`d~+t zq|kaj6yR%O7d8Z7U15nv#iOkLI=c|!*bj#-w04~( zNMBJ#8EB-pE~5Zm>?HVFCrMYv&NK6bg+BEgS~j=F>#JL*<>Z}CgPN=t2Dp4e+iC}z zwydPceA4GGjZZaiFY9hd%;;9|DJ9lcwVJ8xUX(D}L+XAj6{{X8Wm9s@jFdOxU!AEp zc(zr9OhXK#?&qBPLdYlzvqF5u*@-rh_R%&kZ zDHddNukY&0cmFzb7M9HX2Ks*RAxydZr*Hb6t=E$Ln~)hR>^h-Xa(MGYMK0xs{w7w+ zG;rF#Ve`3$UjQ1Tg1^2cDTXNk@EQ3v`#LNfiAjFM1cfK)EDu&MC@|V@qbvkIh5&9-vB3k zirt6y=667nssY5*0nS3Aa{-TNZ3lyO?m&_{Z~RfxJ+XQ^)c5vnyFknp4!UdcD?X9~ zm+rGcAuE6SF%nj@uph9B`TpU*IN|%km6TDmVx>T6koxMj-9VM?T9;nWe^`r@|ARZG z2ne@-q#!myfn&t7O|8nF>>v~?dkO9vTEw9an(6`l0jb;FlL`&UL~v@Tk%}-xS`3YN zQ8^@2{|S5wsT&^bK+rZWpDW5+$LucBF8@dU8sM^eBOTL0QP>9gDzi-K#V4zKy z68V{uB>;6M^)}<5+z?wZs3Io-QNO&tY$;++gYUzg&pKJ|S$*QRsU7Vw9 zk<1oo-0;L(atNB{=4(QKEJW68I;aB`IZ|Z&!AepV7B3BFTap*K%D;K+j<|QnqQh2X z;h3mEy0Gw-Zz`h7s$&DpiE%=vk=sh5o(Y5rsN|LFHl7c%6XKNEmH@o1@nYoji{LLs zqFL35U8RC$HH{g3a@u~4i$zip%*kM$zDsHiX`=g{$|sjG8A{E^;O;C5FWg@+Z+`Y; zZCwdyg{j66=3IK+I#wmDLl8YTtb4Eixo{nD%@9lb2vEOt=7c4n6uSZaEjCaoL`4Qn z#J#0^f;IZUJB|p7b@VXLm$TmowC~+G4V71i1>GT_nXrIbXOgv?%MvT!6(QrebCh`U zJHe7P1PQ#_BmWM&u1?0jD*MmFN*9L9GuxeX~Qk&+=1K z^1F);W%==T3Hk|=9KP*TDN623Az(Y?6+iUue z-$(35-7iC-6j%t0k`#&(O7w4iOKeqqx4Mo&_D&-r&0J4cGokDd^u(*GM`D#gx2zdX z@nlSjB{lE5V{4?++q+?g!TgR5BlDkKAr^d>o|iD2$z2ti)ROO>io&3u9=X&ipbH=K zbeDoz*Ht1}{%}89CXM3c(mwcGs`lS$(ax%1iMmA#Mg2wIe@%0`4jk(*&)G)TXiO^& z#+U7=GA7Gr@2cWAG)yjb%;ctl9}6j?Dp8_a%F8$c12zOEYOJuxD1t5nc$(eX$b`K$ zB-?QtZ5`Ch8;SG?)|*Ty$kv^fLvYqa z3vC$-USs1y>eEi+_QZ*p5$ZW*sI+cMr@0GRL|x}X*^q_$$b_P$U$KGL<+%$16#qRW zXxXr;f#lyb8?u+RiQV=?Wu!#X`n@Y1<128{;mS9)wbFWX7-GJPM{p!3SH=@9C}T%n z$`dPispQr(6!#M?%+|7H=HncV@N@u)cuYCH{yqo}PDZQ|zkB?j=Fc3N@J|u^lu3g@ zhZC1CbyV8kxOeT=889Tl+cPD{DLF(xE@x(kg<;Y9aD$896$zj3j1(nvyVk?w=>QpN z*b6YsM>sp&+BAt9gGiSt6xi>CD&@$#mtL>FadEFUEEG$V(K2y9 z9o&5Emlu-NfA7zy|D1`jvcL;xC*O++|Ai?<4I!DcSJE$)0o*n=?n$d)#1k%3uC;Xz zG32k!$AP9G5}?W}W@MyL#{1(=;gT9CB)|^eHCIC;Hh*$Rtg!*dDLM;^ z*Dogy)g{8B?t=!DSqV00eiFLdSfNHMOuN-l5|Zgv1eEy?S=;_Y){M*rBWK@a&)SaH zQrdde9|b?0GPqhmrpaIgQC2b9=8^0I#&SR0(-W${(g7~;Y8SE~+oTh2d z8eLttZeVhxhIu3-{>Z86T2RyD1zb6;3V2|+V56YF?5Z*;tF1_>H_P&IAQySMdCqr~ zHCF<2;uTZgwyb#^PA?Q2z23_f*@cT9_XR&K3U2PC+8^$QpS2FpAI@@wKU91lwxwWM z1-O++h_0O6IuQDd@=03XzuW75rj)M4h8?j#4PodBXX&<|Ouo4%boFX1FO2lNUqF;r zqX&#$h!WCSZZR#iBW2gg3*4IdRd-ZmPIAILri=X>+n7xGsRgM>_YXy7iumsLKWND- zFFL)AO|5@1CsypOH_Eypxn#gMXA_|s;&%CL+3S>1El4I{tE;l*uOUnnL|MP*yR4!( z^^7Cm@Fr;EKln$lJf<->Bu1$~iEopf3m2)K3Zd=iw#C!yE;Y|5dhte3S8HLD=eB!G>=~$9LmhwYB`Zi{a@*;G zjDBAm#LWOCbH4Lw>q2UcIoVaDQR}{#&7s+ySz_Zi)zZ7JiY(E7l`{uQ-PWn{@X_0m z7<`xdp?Bjf7|=cKapM#RSTu(5Q4^1Ix$Yw)S6a6t_Uw>nEH#cOVqd%el_8MGIPj|= z2`6(%m{!z_YSdZ7i+>O!no%hGP{FD1o(0@6R_GnLt{gS_2|w}4`WeMF3d<+k^JYNj zrY)j*DrLLD=fX}zbFe+)0srxBU`g+v@&LJG+~LBH)#Tlx39SodN*`A9By4kW?j@~Y zo2L1rU-R_-x%i~GW^pZZC!h#sOK|kEU`XX?kNXl==7&irH5jc1(OzzR*cZ#D>sjAYgmA*7^Ox`p5oJkWoQ%_PA$T)R7j1a3GbtS zD7TD>?m8|8fv_bB!oV7G7HofboX~6oX+pS9wgGNa6Pgxh%v%!>dirn>mx!=G>2Vj2 z*v6BU^$KUCt-B~aYNJX%;w?!s@!Plv!kieexuAFP+I{6}8!@zir+@up@%XFV5hsB- z)z;Ql8CYh^LqpvXhhZLu5z}8!<~Bo-K7UMC5$x_M$ZLpy3`l;O(g+Ur2A?8nxCz{_ z>aM*p^{`DU2A|G$kOHHWn%Q{ZfkJ_XQLA>ZbSnQ~jwoqb^zc&v z|0&eCNiymbf-K4p#MjER%JLueUn&wcf)*-})^>LJ;g%POVwepSh&ZK}oKjnbWk@pWClUebajKqlnPFs(F3%9B7xw*l8`c#!brQBRd zu-;vGSl$x&C<0#EuWs&20Pvk$0Mu*IXR1F<^4JQ(FZ{<>gFr)?E2KcqP8c>EHYY{B zZml>!L2VYP@cd#Dht4GCBK>?6kgQl@g_u0{jEExcZb>W_C489pZXE3!C3VZ6@U-uD z{I{rcVNrmf32)%7e}J@2K^ZKtVxd3=1q~NOjfDZ@NhFjxXB}PrP;+n?2|qe+gKWhn zhc0cU&yCzeU7Fg{Lk$L{&yTDgr>pntTFnStQ3(eNZ8WAg^s%?R*L(9C&KJA zD*`^A>-^QoRXja2Qu^$I>R>L5Vs$g4M_<7s?%)HOE{&i;6s-xp3hK3v6j!_9N6~%D z(R;g0J=zo?q9Tr#TiF>X_J{{UN}E*>W4rcPA2`}CZYM91kKpVdPm*+v2$oKnY#iN? z9T842uVORWmD6`Z$jLiY1{$Vx&+9E{=3Bj6{j^Y^&(3(cf6K7pKMsLJ$e$zA@)}E$ z!)x%Tt7L?2fkpuR6ktLpbe@VrRNsG=8FV1W{Z1)|Q z_1ZrUnS>kysc0Mx3;Xwf6+`$yBg<)GCRI^_x7h>`=bNS+6@G4~yBT{Ay>$3*WC<;bS*yLhIvEmDv45)4!R%OozH7(~CbxZH(E zDLRyfc2_TQQ~U;8E3%Piy`XmuJ7Gg=&=ppm5`ao_r517|<3)FkV4BQ)ncg3Po6@HR znx=Hw0_bb|NJnH-!2W0&p#uKEk^<<_L;$MBTuL=wx*~;uqwmyXu&`2W4YDT)e__3F zbpWmfygPt4G$m61$X|?`(iDFcVr@abyKKQCY<-s47JNW3Op_2%049Y$fL0P9x;hWG z0@(--ru18c?MMzCtd};_p3b+nLsk)(r}NiepOFY(LQ%lT9QwEI-@c`pa+>9}y)~{T zGVt?)7E(GLAf>~<%|gnj`FH}uD2ItDx{ccCRoG%VEddQR$(7j+0=${ZSnC}X0u!rz z3gy`=g9{*z{L5WM5v09q-K~j4BCYNmmB^U7+Nhc{7&NGYloX)+OY$G8`1kPJx#x}nA()DLsLoBat^Bp+Br;&xAB6(p6p%jbrx)X+7KjX_+U1irhi z5ru9BV)yQ4iygJO0hqOFPE1f^jF7 z0+j}7q{)cB=djlE%}&pGA>8yWYJp>Qgd8Qc4PF2 zw$9B}t1j4B?h>u`-oT9M-Lk-`BOO~^6^tr3jH-vdYAyn}<%3|G$zYqxU>ljfM)$tP zU_UGBd)fMS^~zR;Sx9K~ztfa2xv~?h|DAdu~ho@+pekteIQ_4&s4IoB)&QcJ~AccVuHucjOFaik^K97@(jJDDHp)oMY zPtX50et}e1Ila`x9Z}!yKF`;C)mq0%%GK9iRiYws^O#~Pn)a(yYsEG3qO&sg1@zYl zGBwg4$bi0{54g&~=#V^+qH_#C{$wlMi0hDMr8wFpio!5}B2$@3&3|hlHZ2%a2Z2*V zq#^>1Cwcy4u=ZekoO;xiKW|3m-&5Br-Z z^RCrB)#BzJ3~mgBuMP#S_=Z*ziUGfGiE`*7wuI~P`gPAVwktVRWj&UnVnjQxL*TE` zM%UJw$l1Q-`r4vUz6+l!!$Q>mM+7w#nHi%6L;fR!?*CTL#z!1pEv`36oo}wAd+>;} zcWaYjAgUlZ@bfwFb&(vx-g_ceyYV+U*P_kE;uqJ~*DFy6ft6m`T4xcV{PaxShkQ)` zSJpR@bOU<}9nP}igx&i+5^w|cALmWm<%=LBA%GV#sUVP~BYS}J;9ZJd=C z9=3|W9F@Ve7K=H`PTL74!s6bUOLS>zgkC6e1=mGpzW4iL zD(5BQNBq7WMpLI+H_7h4C+8q+z{MB&n!1YPYDL7 zKy(liocJK-6B&btq2B_xvD zxo!_^!5+%O63gh{-=sLCL|FVVwU!*<>TLd5U47^K2+S_#8*#dmRe&rI&pkmiE*Ze` z_`uY?jo8*17O6g3NqZgUP9%Tg{ItMtOnk-T80q889M|>K-AT>j>in+0=fv?dPPnkz zQEEG)qoj3Uh-0*2iSt0Uo<`q}fJeb~erVp}egyBOv3-GSKl?~nh$bXL8u8JyOzWE# z%z^H+7*H|}3Np^6FA8gf50xR##ViU7yaxbjCQX3bMbF{$+qZSAUk1=f6H3l|EM4K# zS}s?~z9uiip`B41`!dNiYnzOyJ3MjPCemDDo6yU4x28P03vy5>ifI4FP? z;h7kRqlnW4#+1@_gk}X++AK0~ zED^GlO;J3(EqQx$@!1VjL}cE$sg|ZZ8osPuNlzn6zPlB(%s^c569|Zokd|%_Ch&P{ zDM?u|vOuU2RcE_)BqsiatQ8kG^;7nWV8KchCil8`wEYM-KYM&!(g<*JVSfTN_zzQb z184sEkThB0K(m4L#p#T7B38GIurvAlvAJpGhEaCSO~B=_Q)NDRqWe)8o5kr;iz7KO5`Ia%}2`0PjYYF_r=vIJV-aM)>oCZfREBJWqR*OrcQE z@)NOk_Nodsdk2w>p>RA_jhU$Ruv%LF&uhYbY2DIdGBTr2&#t-~pZD_sRYw@fV^+rn z=Ude=Nj36kvjIoT^x4Um(OrB9>}8^HS?`@5k88l+SI_`c@L!!a#)%stDQ=)AJ~!n7 zzsvlbAMxrek*DqN=~w$obBN|AtM)nv`V*cV0=o-I`hrRqP89C8_IlR!Y1g#qJ3WCK z#W)6(O+-8a7RFE4BhS(7EJGUQFtMQz*^^&(Fn302UKlMYV+2(@P+uhly$Il6$~x)Q zuL0IS7ttyR2ZXPW+Lh3~0ld|>9eE=Z#QaX{4=$aDMsW^ea6}I$HFQMJOlm<{tI?UE z-Y|vvE-oav7T>eZ_>@%S)3+3OqZHbXYZCQ=(}I@FNtfKzlOSm!J;yeUyrHjwituX& zcEaW^`zd*Gy;}ooyPsH@n}#^W4_1Nzi|)@Z7Z@Mb=JEb@BG2&~4p3I=RI-`FhbS&) zN&c}&)WG2~!dpS5-suwVNkCeWE|Ixa6-VYB;k(sHH}Jjs871WY=*!=}@O9ed7XLAU`&eL!WX$5CKFc*5 z4vMYcmjL6Q@^^n;4Y0G_i~yNf7d^Je@SkCc?o9hOIgB0WK-h2_*H$Z;3UNYAIN1u{ z&n_c~ZxE;q{}2^4D;%Ar3J2i7K>$QWN&QtsPxoY`yE!8xRufMUE}~b@F4ry5q_l_Y%@^f4&dxX8k>6+&9;sU)Ny3jgmSVztxq!-gn3&U|Fn%$mHc+D6_*8S;SIkL%f7xQ^Onk%zrXnZn1BHqQ*v9sJl$v~(OoAvmSqek>6+@ELvTPd60O*DKbUbahiGfc~=Cl}b4Qd3y zrRnT%tIQt~hupX8Gm5f52!NbOs8u}neyx;`2eeRc@04ZG<>%bZ3&6Ag%)D=1r%yAt zvUM}91wLC%6r)^zm)U%Fi;l|n9^}9=MKJ;CtS$5l16}bizWRR85ED3~Pvv+8O%eIM zP@L6RWj%r*gR+%g`bH@HQ-l{xE`PUw6_h_~cWixOMx%eDQ(Rn4n`P>}# zO>Zk_lWFXGLTtdS1CafTbD)&8$63Yg8pp_;gX?d#*#q>y(K?p6|kZ5YLV(Z7NsJ%zI1%ZT}$b);1O*5y~N2r9AVi zY^K5pQio#q#Jej6R(_d#aiEoI$*T;el#4b+0xr?}e=kI}=bt*pN@2$;ND?Lco7?H# zGibqH<#gdB%UI7C+4x#Q-BMLqt6qe50Vydj*#XJ>sG|{>b4nW>;vF3$v4I??oFb<8 zJPVr)u)-(pYnG;`JHw5>n-G3bb5)TBi_n~gROG?vfF*u8Cfc?kNTo&m}fAM|o*5W0s|#YD54<>9gKVqQ@>kkZ)L z%1cwTOLadmCbYkoEqe2>+`C2C2c=+UyQ6B&Vw@Fy!aXFh)8Eo_B)NFze4aJKi9y5A zDtX%zKbITY=pqu~ETSU=JmkQ08Qml#Rda5Cpi{~KI4AK=4Dx(1)^cGD;3r}3XuUcP< zv}4`IAKOzS5LrKAEo0xebe%su=4zJADA~FFJrs7<&*6;9<`yJ{4fU}CvsN|YTW}n7 zGmkhTxU^vYtV-YjqrK{Mu;7a%O|akyMh7%eO{afgkaCDFN)TYL&YrQrJ{=_U_;RxN ztH%(e7zY@t%Sv;V@V#p33Fggo{1sR@P2ul7w!e{L>#8HpI?|!1C1hhIppAYw5pcqlyjwicP!YTUWb|9*RSHutXY_RM+1a990x?sY@! z-oW(q9_H;jkl+_WG?@s@^A>c{O~>E;w+tn*v(_g>6!9UL_U)y+yEx{PCE^o9NFrmP zq#}GP-GaSH5m{|$U(v51#%luaDpHVBj%M<@Tw)+Bx~1G$lE=anDEC8E9;tZ^-V5&W z8~HR4+zE*^^YyFtZvZR_0Q=XT4h(fF2%8~pLX0AfL5vZQZv6Wr-JjZDE96v8rMk6HW617>XhxS-J zlXP@sbuEgtZ=M!hcxKOK?RWP%Kr5uyu}Uwv`Ezc6wMK&b1RG0cJsK1_yJJq%W)eH` zmrm#a_dLyNZ0HY9dt+yJ=Ho{!C=I1q;~dpu<0_mCJh?cbI2UB=Z~OG4+!lLOc;htD z1|L81l1wZXsG42a<60XtsWFE~kwR;jDH!}TFSxdU$C=VV#i<2&zv7s7aaAe!!P@W5 zJtIarrBh*{qTwQoT;q<M{{;e;L%5v*n{p%rq(iVwB+BfH*@dNoQjmH}th z?M~E2JulF1@<}Hv%B=Ud?+C}`8weMl##-fRD%6KbqkLwSnRV_8S~SHK87f5wNu_*d zeD8Bpz>^dO?{6P>p*=(o8;$DCvs!RbQIu5rKYu{Hv*eeM*x*r4S8-&a)^|mMDatly z`n~p=ZADv%0R7HfCTSF-$X-2ndHx;G?|SG*f33!3P4jjnw}{H3Ny zuu5N&8VF_nBCg#`RW4=J$;@G4KB1KL4{`C78>pjPpHY(%!N2*7NXzOeJ#uZLvS8rM zHA!DKVbR{6$gNhPetoohUbaa-UZ+#ve!Zn!szIT+fb);KJrUiiLz#FH4OMdtVYOIQ ziBKuS;gS`VI;xO_@&VP=ynY;An%bgnnmdNqO#Fhqikd*HTifWYlKp>5iDbTJ21-{{YFrWXRV#%!9s%K zPJr7y#Mf4<8Q%eHeavEmW~Hoq7RyuS#+D`fr_hE?@v^X=hHS-BV1x+`V zPMnm_r`5-=9;&z8MjBkWt5l(5kQTpdT2=WrW_hW}w9=ym@c{o`t7*9TpY=5N1WM0( zvmFV~7j^YNOp`Zv9nXHgvlFagFRAB6pGoQ%)Op6>A5FK#`cjgyAH?Y%&40H60=seT z6n2&u$s7JaYTkKl>!J0g^EuoZsa;+nL`7C8&YS+Be2LT~-@q%^(ej$zFln)&h`A?- z3%Tdt3Hcr_m9Kux19G2<4{&p-(6S0Z*k{CB!f7u#;rex0?-m@UZA&&A8Uo2kIglRW zZjT=T)z>APoIXNeEBwl0y41+S1zhafGJf)WR5pDVS>5`Ew=T12C19SyG;+k|hT5dr zk>zZ$Iaj2n6u7ArXapD0+`h?~oZ*Cs%xT2K8L%%wKh;(MnDaP(9~3hl73YZ3iFY@K6_Wl^`T%XW3ywr$&Xb=kIe*|yQ; zF59+k+h!MUedpYhoSWS2todstdu6UZDPpL`_#agHQ(OyTnzmnG7}KF{a|k0Dq|;`0(Qc zc;q2h_I$e{L|4QKn!}=RgIb+vvio$LZDDj38j105MIA zVO~E3mb|n&kH*qN)kV?Q7I%T}uF;{^X_tkRkta_QfvcJmlp!EGUe0;w3Aw#n7&#@4 zYz;%)m!PKR^NzwcPI~1>0FJGUWh-%KFn@(UtKm3_sK>3Hy&Mkcv&MxYv1|HjTS(aB zfMLXz=&s~im@s&$IqN04z}RjL${{VN$IXzb%K)*M9 z`;cWfHlgsFZZ>kU=74iE@-^3{9tXeW-a7#|aNdvXcvH$vp$P@$$sD6WThXH%a%G|$ z|I$v!zH6RP(O z!6YLL!f={z7@?g2;qT%qg5>k^2zxRIx-?k~c*a+6_aG?Z&x%~!t*!k_Sj)1i@fjR9ef#FH%(pKy|=dj{M_xN6Ol#K zd{i}gDdMF>9Lf1AW8anvKH(`75<0y-`*S}HTq+Wx2B;&l`Q6cGB^;r4SUa-cLyfSk z7Wfxud1*;sdi83oJ~P;Kp1T2n*6V$imV9q#b+*d#IFh*{$-Y>T}Qr^!cC$yT=vs7*Ai5l z%Az-bCB-*Bx)(K;HW!C{M7~?~zeCHu%1oc@|A~?h<9*H7m`z=|$3!JVsWa*eTw;ZI<2jYD{kk#*8F`LiduOekfaoO2}^3|hxoFEm=((wZ>I_h zSLX}LJ8rzBgJ`R60=&kPiiAw0VJN(6}uXnMu`>2zihXf z@-k2BJUATrWBX_`(DRjbIIn5n24kGcMt|xJ!TM@#W2#@3qnf;f`xAd==fNtR?-g#7 zDQH$5&ft9_ z`W@_DLYcbM*C*2!iREt?PVeJeDXbh(75O?rw?jj@qxIhZFOs6_{n4Oh2HxZ`3_AU7 zc-IL+lXh&IKDPfO@g4=vG@AG~h(dRk6)@;qw6_{7_PQC|Qqsk!u12JtuPVyr05YFd zi@7(ICp9pB5U$8kZ_M>Iw=qsz1}b^31n-hYdqjuK*$qouI=*Y!y)^QK4T(S?ATi!feEg;3qJ9fd<{$JW&DRLG0U>yZu11Ko=?karBu*G$d za!6{ZqqcBKSV1a_?!$|?$+PfMayh7p?Q_83NbA-GkfJ@-Cwdr%D zdia%#JD9c53BKhctN8OEYM{zZo9m;dCvQPpTYVC@F_+TQc)A&k&H^?~R zc+bK(VwhOSZwCRNm2m@hq{`PoUy#1*QiCVuKyZm*I_T!yhA#KwP6PvwD9%pU2yflt zT#WvL+8KXeaSyp#UvctkKxFQNc3?%(W|BgeSpm<}YL1gVsoFAWn@iFkT6)iY8g+68 zhjyzmZq0woMPo2iNLsRYMWhoOs`jfWad|T#k{KHW0P^Ak=PExFWMYf! zmea6J!)gi;`jLu7?Wq+9mTVH0lY__HEFfCQSj=|gi}-NK{&_KzM?gQP^!}-(10xAO^>8{^LMQ3CCAvlfCSET68(7tD2h5Hy0q8PY2wL#x zH-4NFKzFB41*{3880a(>0@Ps_8Ebocz`nBsB)z3)S`Hu*-p701!F|EOUd^pp^OFCu zperSo$EpZ{g-CD5p;qLUet+(>++4eb4#RXcj`7t})#XDCfDMY1Lu#G6JkV-y)=;`kIxbS{LH{p;)3`SGt%aJ_hR-qlmV2kM%p zW`hVw797Cn{A3qvKm#`qVHwo8Pz>+Ayp_OSE3X*Xo(!aU!e2kVuL)aLdTOOI;d%ZC zXWH9F)>fp!*K2(4d6-;b!!y8lQfWxhxryoDL=`;(Kjj>`c|IC60^#D8BDj#l@6WF? zR@!*8b>N7s(vx(r)pR0mj0=x`dLEK{35$gi)CoXi5BTP^NYQJxtJez23lW5^sObI` zt$Eeo1F8v=j2gh#Zh6g75<>03RosoXJTsaeTC#Hu2>1_x6`a!q+@J2CS>yfUuH?uI z8229O=?};O5U#Q)0u`m=Uu5mTOw~y|l75Ak{)je?B^M`O`yv>^TcBdC7p~KkJ>|8A zGQ6e9XMTQ;$wkjxdy>T-R+q3t z=bp#A&mUW5d`ApnV^nk~a6m})h>eT_F|f12D%*c^Wn8p2Or_NBDV3Juq6G!cfG$FG z9&;r}fjR=e*$CQmxvL_)$%f;&WAm2n6ac`S=k0o-Bpm1~yA38ApY9+TV z2n|fnuPo!<(4wk?#&NyKtr=4P&eZq%oLch-;N19}0|=82Xx!MMqQ&pKOTPQlYyhGo zr>{jkOze^*rK#b{9h@J=yiGpNMr7)K>8EEl%bmp9_UVtiiOADgdy?329RoP5{h0!; zOx*X3;_bz9d>;=#3_6+ebroQ4{>CXIc*hf~w{^%wWHxn1N%6(qO+qY87H^u2_HLZ( z7z@#Vj~Hm$HgxH9y(+IJEm3)w{Brt<#U0kh1n>;qe;{+wpx}@FnoXmrd}@MjT;FM@ z;B9VY`f{w4^s`ZDAw8AAi}G`s0}7+Ej9FQj3JCZIEPgp6H$|@H5z=U(;7eAe=>>z~ z06xA@!uuge^|?`u)y$!*%Q#vcoo-}5GXop0V`{BU;D^Lu(hWrdI}6e0wZ&3djPgC( zEkkGh|Eusc*Mku*>@gEhv3N<;RvD4fd`^eb$QHn+iBH4Kw8ijbzpD z7H=E&N4;t|0ndirRpK+S?M8qWg2hJPD6(d+->Bn><;H(aPyY;0zuRqaHUQB60C0;0 z?c9tg&i;Vwa@alix-MrGbpQakxL}Q9Je%W*8i@yHc_lOR6g;@+Mq{ZaTB$bUSidZ+ z^(YfraHl^w)5hnJ=bHbjK+H9-1UDBG(}uU$2H;3T73kEjBZ+R5b2s>L(TUDU7n`hU zy&pDxtObluyOr0zV2xJ#&|AP98*N6AtoT68WmUA}01-?5U6-(E`wNi967^R71J_^q z!}bjnj0_YcOaBbNv z>l@|2JKz;bq9d-MvhRu@AYuvilVHrRfeMzO3^Co`=R-16jy`MZn|I?MDQg(88;xIl z7;Y!U+D(tfc&D&fn*w5hwNA4IM2?(gE-7w<50<_R^sf+;ajYg{K2CmZ47G$@TN5Pp zwCWPZ6s5a&b^uCJ)~4*fhdE>j6t>Q9VI0_aAs?YQwvU z)hI(HY>u!13+#lSJJfviwW_N-jjzHFFM$HqLmY8_bWoMTA1NQKkcwDFm`Ac~^~NUl zQdL?6PCMC7Z2loW6X!RAeot0n2C*{M6T?9<+XetP@7klA`PUo+{cIDmDjON1%76j4 zk!%ObG7eIG%xejHCrt<%L;;`fpWDFS;iZ^q0dam&fUSHWPA-NU2El1aRqk#pRulr7)Y(8@4pmzM1Sn z#YgS4ERYPBUJf7KH7+z$RA{MO<~g|Fs4t*9TrR`;tP(d`d??-*l}E8pC2>74DpO-S zdp!q4a;3O0n-h37x59MI24;7$*VfTnjxu8N|%Tp2mYMZ*lKmBnQs)ld0f}~ ztYpZGu?hnD>&oZ6+Y-<9I<+?%|4iO>Wav$sULQCiO|cR;4x*X9HVT$<=m3P5p7N{J zA90Km3B!ZcUjp=^Zk5k?EE>5_%+%v)$Pu(Y5P+LwEc)cPieLdsjF%9rR(f#3boiVV z+lsGNNMd9SV`$AIq>iM&0fKtSzM2Nr1>n_msaB6R2b==C}VZB9?bkE|GVgZSgT_~4|aITvQ~JP4^U z$Rr`V*?jDIcOdpb6#VhUV)`b-8asCZ0w|dM2yP$p+=KAJd4paJ1<=i#L%V;xMRCQ$T!!Yhx8cnn?=4u2)T{zhu0TnZ5G@`A;}(4!(^`)nbQ+e0gZ;{_+Q2okwh2axZ41lbFajHZny$ z%f+{*>tR*oL+qWRn{Q+kK<8{$@|3fQ+5b1N-2~NYjtSKmOl87A7F9i!*5DY=4N*>y z!yHM0Ex&))3uC~IOm1|2h&Lzze+aJo{3$G4<(V}Ad(9#U!ari9U zO%C~Mh8=2w(d|f~?HjN7;>xR-(`h@o7+=|JG*d~x{T*G2Q#$!kCz8F=o+oaZg@sq2 z#rCbK%fsCiWpX(usu!xon`L46AcRxX^|>4_G!kA$y6=9uo3=B3U)X9u;2sKe{uF#SOZa*+euRS# z6jv7P7W()Kv!dDXA{K8S;3Hq!o%+aB81GNerx2KiCn;71OVSB63p7bY)kRmUY+2Uz z&RuJc=O+IB1FP%^-$i&O9VNlXWK+2&z-ZWJ^vNEfl^_gzrHDIeIXs7TpsI`rJ)W?I zw2AMhOW_e<^022I0_yHnW|*#`3D`bw@<;q6$zdGnZ{o}ixe%fY*17vcZeryl1se1( z72-Npj0!Yf%2+tI`q$bY2}oNNj_yuN7H3r3J&}4`xeg(ngUIsxqjaV=NS=s6dq-wy z$|XELQNMa2d+z>l+7lJ-Dr_#8-#!noDQ(=mOQrz;*4p-KB~tx`6kARB6i3=1I~2zA z_paPmlHbw(GVoi#H=se5KhSG$xU2~HO}K}FUFukDV#l4QPrlzTd^;Q;scx4!COAzD zM(F*ghG<9iq}IN(oZQ)z`Xz=^?_>=3Sbjw{ZMpp&NVjh<6-eiyP!*{iKZ6%(3wh7^ z=4uJxuE&p||Lr8!M5md!xm-Q$+d~)wpk}xUenVZPi0aUiH8+)p?V-C7)$(;wG@3&KWB0vY&hDb#*fE-T zs5sD z#>{!@nlm5KoMj!qFg11W@E|3!c#kx_*iX;YOdIg94L0@w9$pO)te)P)uI~589~2`o z2<sh;sTW{e3%fUielWSrFVebIr zYc`c@y`s$y**5nSpPPHuBYnCfeZHe@t?{mhWN)emrwnEW4Rd_ZN=*=%3Z{cljrjG9 z5GlT|nIhQadP!12GO#P|$eEqTQ-LnosU6)?He3_!Opeb4?tSY7&>dbF4J6R9VEu{| zc3vykhuLf?QG4SFN>I%7(l{U1CT0M0Iz>sGRo1hKZ_|^EVXXscLks2vPrbQ!v_Mua zGx675_xwr_=#^Ktib!WrqsNu__;QB3V&^H$+)B?phG8>AOXvsWLSU9{$%Wqeb8j|j z%Rx?ZRL9dq`bM9UNB_l_lKaOyg^V6@7dlUv!0v(yH4fV(13^gWsqYVq5f1Q)?KI)G zUc!%ubF;I!8%dx3G5yE`*7LFPfN}V_-uYiRM%|$AKpY{Rbpz($LQn1&dMNs!8NlRH zRIB;Sg@#530sn(q-070pap|+PFkUpm&9d)eduS=6hWcN zh|50(3^_o1pn!c~aTQBDAVs#=+MCMf)pwUMY_TXpU4gv?1&dt7MAr15sW;fSGA(~2 zIF}s0%0_ivRn>FbM5PiVC9F{zoq1lcZNX(DP8|&!Gw6rnW{_gZ$ZMWW zeHAgPY7n#+7p32}jlStB*!d{5+CJD^^l&jFCy}i)+&&?s{USY%R((2aJaDqH|FX%S z6Dd++1t15=GU_!xfPopuI?>_N(Qq=+Z&Ga>9PoqCPknVpc$Y{Sq?(yvqtll-grS$+ zZ$naUhn4(if9D?d)Ys2NW*hwSlqJNUZs!XC2YsTz29t7Z+{tU@QN2**Miyzo$@6kY z_XWS(##Pvb-Hq`}o$rb_r)~DK!c11v54jk;v?|06+jAoVz$wVqnTt_Weh@eaUVa)# zyTd7TEOA`J`j8eAe*;f)Bfr)CE%e}TQ;`%&Wauup>WAOY{_>*eWDmtNDz?hW1_s>$ z-k+Kj{>`2?18g@+O@AYMh<}oBlF_T!$TB;9TSH}LPWne}>e6CK_;OcR1S13cZ%yzF zebo7^+BSk1z@asnP?kfwP*fI=OmYsT=ojL!-9>fdd8y>nl?F%jY_p3145_=mQ<}aZ zTX#AYtvfe6(M_nwa0jspJ%TA|_3;sA!JG*m+0wmW>{^vSWqC4CVpE`r*rdI{SY-H4 z?5K7*%HL72C7liETKsu6qV{U$8f0gsphqzcd)XNnz|-Eg;Uq}-3d5YF>vbm~OoKDO z;ICt~1Re#ijO6032+8n29CPi}@h7~aSTYo-dLMzbMt*M28yFM=wVYZ4T=sqWzs}3N z$wrargzJg58+S~^8lmQhHzQsgZAr9?$n_=y;gGbHgXE++PZ2c>tgWb+=Ap35DWIKf z9>U4g0703=y{)PDhq7!y%R4+R-mxhFuQH>r^|VGqW{SBB$s;nx$}sp5s8I2QUE zgAB%~=3m$>+~%TC<|0!I)=I{(2h z@mytVHAC_=A-gH3!m=xzw0_SgSK^7UI{h@#|Y5xOg|?URnB-q!@FWxW4RwQ0xApt;19Q0c-q~| z3Z8y%T8AAjv&Qy+9@q_8P!l{e2$RK!guyKkspve0uMb+!cX-o^{jX9IC$Zba0v5jLx$Pf0GUc+nTQr%GwT~?wFWr0V4*a7+?+xB*0RG zIhhU!#DGWF0l~Qxj7>St%3@l;X-0BdpyNKS%wP)_bfnRwuzDlGh>;6Y{>lIZ1T*ttG6VYMz;}&g2#cdcOMJ+)Cf}`;V|m(oO)!c6rElKVo56mvn)MyB38BUR)NV6#v}C zgn_GTc@wZ*6%puLSv7F3F2M`Th}i_0-2+&t=Ug&$%hL|U`{JwpB)E5d|J@@8AmFAM zHDo)T{Rpb?(ohZS_sV^ZdfqC2DtLN2fakK1!&_h+IbI|;?9^|>82#6Bqw9}$%2n!z ztMrK)`ECbEO_;^9;`>jh1~g9CG6zHWgkW(9GVbj@X!0p7l|jM{=lc1A@^r=ieTLI_ z;e)?q`Nca-n~=Sg{802jH4-ui5F1kDajCcCO3-ojJmA{$Qun^veZiN_E`L#af>9b5 z7l*N(zG&8Kze3mNzf&zW(cE?=NlzJiCYrTqy)ZUnsub@hpJ*)ti+X5M5yn=hIw_i@ zDS;t+yR=q=CM6NB`01C3#`N!#lqT>7Mr#48n*^2c^$TXSOOBF_;?U0(pfwTLuq2-V zU_Z#)=-mHPmff$f*brA50(a?g(j049{N56RGjk4|x!GkA{fsA0S`K{{Gb9=%X$G=msOiC64g>^lANmYVdR0Ml+g_wV707yO|rl53B{W*b;BORXMdy>91EUg+SU``jDmG@WF%w0G%uEUitYe2ba%1kY6JwPjZLW9Eqna3hsKW-*0akZ$|PtyQy%w z(00uk)$ZkN8rP`ncggOKEq++eJhRiN`Y%m4uP+Lz?ZjSmn(G9&XH>2Vtv`xsX#S4> zXXZWB55CQm$5tgT7T&P47flapn`hw$>Eqsh=6C#y^#eZutnrn0lIWEoUCfrs&Bwkt zsd!?y9mV;H_ z@<)H@mia$@ccIW4$zQ6y@L8SW@H(3%ZW)Gh8Op#YG(y0@3GOOI0;9waXhGfF0R`xm z)Fg5%!ak;u9~(LHWi3?cTajrfO{3ZWQdxX?gCa;+k0AS;4*AO2vJM4}LFp@le%-_; zVYLToxM3yl5>cl>W@SrV?cp{-F5)k)|4H67R`f1QUZw4OI-y|^pH5nJYe|*6{BLDc z008o8SLkn6bX$*EO~KZZJOUVVd_glG{_s0N{mvS6q6?*=zc zF@*==b}Dt)3|>J;bS7Cq>}9_qHb<-suOmURMaYA*QdzxIwKgwlbNHVni$t zJIkCD3OY<9+OaswzQXx|F9?>lg5ABzQil3{pDOwwei1;>H-Iy@I|H!Zyty{*KOc&4 z31;rJCQO4gU*foZtWAqdZ1JfwW~a5b-H7S2&Glzs=NBD?_5)R2gi`IZ2_HxvG&27& z>B@MzzJEbZfz}(IHogU4oeBzr6+S2ENZpN$WZfA`0O_R*9 z1Qb}9=jZJGR+*fZ6a`dFHx#NhsjgNeloz~7zgB9ghSA@THTQ=iMxRu=H7r#$JUp^t| z>FTcyI^F}lx&pVw__z}Eh0a>@Ipvy#Yvimoc8(b1LQ2H<9boG(JnvYKs9#meio}*(H~>e-*Dmqx0BPBI)TTbY(a}; zFYHzjA<}CMDLHY!Uc%7}@00^0JCKpg$;m=~+e_MD@zfONhD(hZ;S@ci-xY4Lv{R!~ z?Mrw|sSn02G6J|SPYU1J0z!*5kZk{Qq7tqL%f`#05U#5t@6=W8D^~PE4HhiM!;@jw z@I_6KzJ!ZjWw(cmc2PUkq}+P6JzJ8i+3VNsb$CAR6z`W=j-vU?ot>&Rp2vjgXQaBX zV9-kVTCq%ZxykAVLsisK_X7SBLPH^4k!c|lt}E0N9|8)4o8sbUDoj8I-F}o3dtJ^x zoTsScqULomw%^#yOrrc%&sG42b~TH)sQ=S2bNH)|{nW%RGZ&oW2SAMvpnl>xA5 z?!%8{+CaZfFFx}{PnsVclcGtlBPhykvq0%rg&v|#$vJxpy8c|UKS{?Ad_$%Q<$~b@ zOQad(f)M~;r}^iCp;598!AuhQ1Emj0k2Xb48uoqz*=s)a`N4%Hqg95aQ<{W0+D z^qEfU$_2v(u)nal=U^=K0()|ba=`L%0%iIUF#I3}#NNovP;0I=rD@)l9$a@GeVi`~ z{`KeZ;6s>|`Iw-Ugf^>9L)7~-f>?safz3mBmAhEV%*lAVkt@mz$^l`iai}Rmj1WpG zSo(^Y)RnUW^S}3<>{(Py5x!5pBT*j;__`nqk#B7Q$i{0?Uo#ZL(2os`){U(V4T3%b zMrHE;ESK&f=`jnSx*W91Y_VBbESlEZ>G2Kex4=IN@(;`fg+`ede z(2?C<^$A_L_ZzgAQl?+)v!-A7fM8H3eEE_mu3e7iG;9__e)#jfg(5_J>^fRVpqSG? z=Z}QSkC)^6{)Gxs;kt$ls+o(x4UoSKQ8j@8Tx#>K`qnX_ElfI!%y5mzd3Ixg8*(#{ zyQae?Bc^Qn!?Ut>dKKBMJ4K#Vh`-SKlA@VNR^}w=l!TDPb-HigY@}3qy^vjNj7^mO zf%>SmxYIr9lp`DB^B`RZtY$Wzjf{?`UYt{L_Yde}vgWB^Fzcwu=4N`9_{Eg1oU$$g z#J@YAa$|#??-B%y>gjEXw?D85UD;(-zE(C3(WC=>f`=s3O(ZC zZzpDhS6TZdmUF(&X+K_<2R}k$UXOuvmbPdzX1Hc$r@;twrQN%Wd$BdGX29z_Bozf%IB)fz)|Dgfq`BG1zqiUz zg8bM3O;%Okx%hFW@_pQ-L@D*AVCwUeME$Ej+=~fUv)JCt)2%COM$4ob4s_8p6H2t$ zl&PO3iN>Bd0^pw0e8;1b2S>6Tw;%-xbr8AfhL2lb!Rge_hr?8M^u-8gcFaYdLilTM z`7J7YO#$07IH!+=iylKWnx*oWSCi)|`lHeS%8M6s^U5+Sg|nAN^<$mIW!UmA`O=k3 z*ZT3YsVC;5BfEy3nQRDE(?Ym2jRu^Mg5qSQmI+ELfeu;gF4>N)D{EvT~BI6GKo zvpNQ%JwiZ=_6>I1gNOg^IYD(pdeRtx|A!y$I->CTF;k%UWKwIQipxNk_*dYZ-_q80 zjWCIsbeb#Rs?Heq^3Ekwdr)hAQFXl-+-^TVYv3^<$DS0TR`ENB=Kc9_V7i#hUvqP%}gvMnr6i8VD@F2J~Jygkw|ljz6QxfuVih00}{i z%db3PA_UzoWl@_c{dcX^!oAypo{+1PStg8=nqf zRZ*Cw%9OPGKddRhLnucu?e0FS1O>=q!;e-dB4a}3p8DlqVjEzqf`X%r6M};~wQ-7S z>S;psFbq7D_XxBi!sZL2gF|v!-g;iGzK7U;nFmy9 zm|%+nGLkgh&bgOB-X@9i|MWoDc!aMeqoP0B5*m%fUlfs}UtNOFO*7NO)RvWpZzI9M zjl=J9K{hvZ6H-R*#Df4kw1XK4@^Q+ z^Jp1qhfb@_+XN$bn7)r@GkRTa+(N8j;^5!o9qzY@v;az0#l6JehSeO-1N#4Pk}SpL zU_HmLCaqckwQOqp|N|7cpiV;hihrR|U6?raOUic8`}1Rv1h`2HJn@ze_0OLyFnc zr9Ole@+8-x(xsJmPTA}R4caHYig|Nmue0my3c@Y`IOlX8p3dR|;n}5+^ijKAJ%(39 zJsqu`YmcwiP1tzVJ-=;(AFlT%9$bf&9BaeN+Q}jBZ{z}jMg@L+0RXPZKMPRcrx4KL zj#Lsr&B%ciTCl1noc1P#9LP?f>A?X=v)IJgq}d=o=FX4t72DJZ4nH5mOluQ5(Pio% z{~!SWp8^56!K;HcBv-wzO@b*+EGLkC?8tHOJt$bcIWS#3@OeC#gH06IO?+`Xa{E** za|9x4xnGc&CfVdl+7p#0X~$lnEj;cUQ+<7LYbJ`?>MN=#RuT2@k`d>9-_7jT6qq+2 zSn%L`oz|}DbJy%1wmnJybAHcc#bO&2%5MPY$#)ml_JBP{NkJ{28(d(|hkF|9gNnen zGv#8mJT!y3CCS1M`Q}#bP|f$0jT^qHAgAK}Ir4%nwY;VO*Zi{)`X+l-nx;M5fp^RB zdQ;RAh|QytEy3RfsxwNgc1K6^J)M%6o96Q)K{d)%=a_L5hKw$OzPa9}4V+Bgq8Y%_ zi#HeUI3(5}c8pJOQ%t4Dwua|KWZr>oM+91jsgZ6d^Cqjve*~d47}ic^dQUC#4z9sO z`^wg!nPfRdBlM_V(@Yzl!W-34p;XTAFQW>Yq7{?KaHW<1)`Nw1IRC8&|CbyT{gH#i z8-=K@;eJs7I|}esU$Qe1+9-v=@yN<5;0DOmRGXFzOvAe)bw*cP{i{2_4RtoT*O6qD zL)|NiFs$RJJ7f034d!?-)>qwEKrTFC_S^I zw2^(W-d81HHnx7GmGmGqDPyZ*20u}sOi=joFWKn& z>5caASP4g;%zAv{%?V-=wcg`&uW?dk6^q*x*&0i&!e9Rzt5phoD<)8}^IaN7#a_Yk z@lN%i2xz$EB<0;=`?f8^_b>sn<9;IE%Qo`3 z6GuLFV?}U=9h{69UGVXn`i17iCr&m7oHPGwb7Ne&XS9%J!ShbCe*)0k+LMJ!TPeP~ zQ=H-T#B#&&+A^ZI{_Gn_C<)w%G{VRLLjn-s4d@eFga9N|ev%gORy+|Oj&$yA#fUl9 z3nU!$6N!weFa;?c$qW=#Der=k^PtlqmIMQWnI(n#WX+V3j9d+|z$WtX?zEYSN+VD$ zrO`=N>|oRur;MN1rIqlMO?eunk(*PZz0c8oHEGun-wG{0m4HW9BtG)MpDmWzbE5zp zCb^Y~RZf}|9crqZ1e?X+iiA;t^J>FhPGgiYq!Y+{!|Q{(cZCl*OONpmms0;QxpT<_ zeuWX*=5q+G_Zp?r+bY!wM-FI5GzAM~3-brIP7p)AN&(!0Bw*~9q&;ZlsoQ6(KA@6C zV9u7LNxDuUO@g9+zwwVOUM?zuLGO}#Sg}h3t*p0b!~@a01KF_EZE^tXTK9lCyyqb| z1&cbwLm{B_b)}J4gV6#g5GLkd8i-zW$Q*#&#HPR?+`uVs=N)T;aIJkF+sEeXK336TWB=rvI#U_ zsmQ%(|8G_B-=aW-bSNU@DE=MZ0H|#T2m(26t{RLDI3^9U28;wiQjsOpn8D>~sPBgm0RD@K>9amQMjQugI-`khiqFI#qj&)(dV|dNqmH1b&2kt zJ)FtpO=ZEXrjG=b(^tfWGC$)>+8MqU({ZDe>RK1qmuYegtmCnUvU4b?$o&Yh&gx_l zxc@~?3dduMgUl9?Z!eSBT&78MrdKrxBXvVfdriVbB1YOp6UzYHU4<=uSSvG%#(Ap} zLN*4!l26BqxB&&Be3sQoh=pYK-AU|eWmgKQxcUfgS@A-|;S#}o#-)^&%l(@#i ze{RS%^!2O5D1(8@wK-j<;=sxyxZ(1%lls^NwCFpOj z%z1PN7ce)#lWjnLtrouI%HRC_=0{AVh9$vmgwBZgKVtzSBs_MB^x^ia<;l;lXq1cd zLbauDW9U4!f1kiZ;VLp6rQ`FDcXQ~IUAwPHmB}W*nKy2_2QhK>p#2^SMPuz}pw zv-a8E*+A zu5dg~9LY(pCqR07`S8j++y@MP{3oolDKp0o28D?7nStlS?qEXsV}R9x0Bd6WEKr22 z1Ym+d%M1`&5CkJdzW(@?q4;YoxDM`%mjHd(kl8NFtcD@D&#I)M*9NW$PI4HiAum~> zcPd=MUlp*?Fidh{$dQinf<#sh=vEbEbLx#Cd6bo;if(85b;jNvowrkIqu?_WMM#$I z-SL8rclY_E#F+O@^M3?;yDX9Xd$x5F*;mL!!)Gp!rOgjCw~?==}^1fiU0C!Id1%nXD)I=;3hb;?-gQn!qh1+8Aq? zFI9H@bJRJ={jG#1hs`-qz6+=E#aLdPf}pGW^B#3KfBw?JkNDU4g?PT9X z>X%fc+yxCWjZHDM$GSoV@2{Rg0K%W5?XYyh@3TTd$&bU}7E}|SfSQPti-v#OTrmHp zYE9oUvlvzhC!FhW?}b1(f0nTe$?sg%};y(i-fA1I5US&yB7;;?-Z^uc2o|O`f50*>93{EqQ zW-zXh$LwM`$j=7; zdS;W_w|egwc@bNSldBxHpF4J^R-?2WHX8MfQr4qywy>>N=+$9s`-G|rXFt*tODXPS zqj+HRPRV>))EFS8bj-UBEpK-5>P9fYXkIw8Ldg-w9-iM1;F2XX3sQ*)4ADqv*kjeU z=Q9D!1XOMlCM|H_Ep5MWwA|ll67+qnjlTNDeVqO2F7(||2e^v?xw8)B?o0e9ZZ=q@ zzv5_r`~8cms*cx3ZNd|&DsPasJ$aDWV(%xnIjKppM_qXO2r#BIW7p!Gr9sDPi<4g@ zdZTO4`DO5uQiNDX%b!pz*+`1T_)dBc*Sgv+%MtybOnIkSO%C;oiENHbqhs^9egCQ6 z)ca#{t}rldupm|WYkN`BuY|#eqBl?MZ}R* z{*cok@q^kqI&kYvw16h;-5=KA- zhHyf7IQC#T%;bU4+c`#7VsQgee`H|s;KwXTOl1Ec(Ez~kbjy>k0sU-Qbx=A~T-xe; za}EgNyY+<5i_{edOgFs^5CDwBas!oNU`2jv$O2;Y5t&&9*hjTv2e|cb?&#I4Li zer`|?S&hV>bO>|7t&}%$7$_}v;AmiAK$(AqL){U}*58g3k+&M6Euh#l)UrZmkBN8OWa-A9IP&-+=BIRLT?46p-m__*4c z(=G9P`zHOQ7N;#e_pjb`f6~WkS_9q(x+Ulk2Lo*trw512Y#09$8+8Yj1?5sC%!h+ftVLP-)tau%3DL(?My#*H z3Be}w05YB>-Udb=2QW8G4P&@o*ALdP*Mr>B*JC}t07^&R;*Y~LJJ`*I^#@V<)mTLk zN$*@5q=TX}TAy>v+?}LCdYJfy7mFgFgapFx)*Jw8S9;=@nBhYAO@}haZ_w$k`YtFd z5zk)hLTF2Ppq<8Eqe&!fTspYkPaNtHoyY|Bm`;as2P3F91}M;o#aI;xiix=J^uYT3 z-bbBPs5;p7c!wnwPrv{lS%AQjrV0uVY@uWkco-l2Hs7bnInhsp8uFPmQ6H<-Zb<%H zf5Oyf%F}RUhA*~a;-rINZ6%HAEobDS9hcfgN_0y2;PAeBV}k2qFx(CXVlXVY-W&a- zvL1g0CfExK0?1!!j}APj#TSen15N@xgx(tB;r*?>lL^ZVDx7*4f;FpsAJJ-C^Y`kOpps1+Wg4apLEJ8x-a{xEv>@E4lRSB$r`vw>i9!0Y!YVa14rb+{0j~nhxVH@@ z_irn|hKrZHj-rC;m>d6=yg;Ewo}^J${JM;aa}5CD7{EpGYh4!=SSh^Ar8s}mcM$)L z8Rj5-dZ4#?;)L|~RBn{6Fq_?&$XiE)frTUfsY5;(vbR5`XwSCjZz=5OAOTQCvQ86L z)fMPa(apR58OylE)84(Zh4y7@K5i1E%p4G4#xz3pe98{up9L5U^2g~mc}uvjyESPs zX@#^CKq8%}5Ib;b659kL?!}ey!PLgpk^M8Jh8?3CSD3GHQgvERKO*JE@=sasE0oTO z#xhw;N-US$9aX@W-qa&4dAg@P>$`^I+J=>RsURcU8}=OT!IgDDwGp{tno`HS5_7$m zarHCW+116Fb9R`#AvU$D@Z9T`_c&flVrE$hpsJ<;w`C#_UnjsR#4pZcqlM zF!&dB?&OR+lo^{E)C|wGCNIGX`_gamV=!hiz>bkZ9_RQ1%$aMJZTSyb1f4TYN>%&Y}>YNJ85jYu^XR!=YP(*IyY-( z-^{b;87$0N?>qIX-<8w^5FILZ^)(LPdk4HZS7DZ2sMjk@B_QIMkczFOC>Ak~IflE*x`qW-Rop-@&A39|~oLWd>WHmHx5LTrs&S z{UPRW@t0pwW)EYUT@0I;^4Z(mB4${H_(jRlLAmGT7*vE-j5VFcD-kcP>5FLC8me!D zV2X>`wYS#ZL@BItwKq14BEEF3sy$1A0HW_Ug^3es$H4D)n~QgH!J_DxRJiSYxhB~j zSphqAC+_ASqK>#3PwFBIu*8zgLk%0$(FM#sg?n~SS64L{U%-YF+u)p}1O(CMJkFPU zVm>PFARi2GvhBg!c3#b(Fobf6R9D{s4;SaBdxyAn*Hmp;Tj)JM+*dr{?fLr=K$KxE zP88A<|8Ty5KEUSG<$C}-t~hq!_Ky_p(<|CCIPNz&$x1y~5}-pxL+#7BLxld;T1-MG zb*ayU?hp1`F%}$JR`k!mZ~JE8MSl2HC<@R}R2rdHaM~3N_yOD4DyY@xXbv9Sa$?M} zMTuw*H0nGgB*jd4xa@2>u~)t<00s#uoqv}05Af{es^jR@sOn=_SFDjmC$7#^8EJyK zQ-viEgCcyOJjm=7XijX>4#F zCKcbA#4j}W$@rb0nO=<(YuC8N27;mS)7gG)@o1vo;~7=OQ59S_Kw{+geZ&3E(Nk+Q zjQV$ELBC+~Y{Bwj6u8(vM~H`@={f$4RL*=Fu=z`f7`zMjIe$kig_$X!kNLS06vU6a zP7b)3yp_OVQ}{tcwJH3l)}#ba;wm^-K4=il)5b_wJ|N6(;Efw9k%7}2oQDcZJ->+8=t4WCc2$q|bO~>q~73uTOYwKSnX{|PkzNo76;Gao*T@?#3C)xlf`(MZN zOBL;N+?iypKy4L&U~27GG6GkOtZYgFwX(up5e+5Esm{;ap)s2?xhtqqF|UEz#7Hc4 zh{_0(cOhbzMQ80Ke(1aSfQr4073RTD;)UlD?tkDVEFzlzkALO67P{Jl1T;@`s8JBK1{0_G=|$5F-n-p-^^)EUzm2%Yc301d1@)SmkE{rQV46N zobmrV3P{H5emL1u^_D=?le=&C_Q2seuW#{dPVrv!*?+`8TN-%2d+aiB&{A?X$IB=A z*;TC@3+`7JxT%xSsk<00kA0K;o;@ih&nqDJ$WKvyOP#HRz8bAExBq^lKs3j{P_kk1 zdLGm;^pF}a4#k-ALy^>5{yZ$#Fc->55mk5aZ>$n8qoOYN*nst$J@o1?Uox;Xom z)Q^8V!_+YR`&&)`AM`^CUApU~%hoeE1Z_n(C-K-bt4mkqC4}Rl`C}5Xsx{`7vjGHg z3m}<#3d_j6Q~x$J0p=@1M8b;MBc90?=bP@cO>yjG6C8GkA-j&L_#IqADT3MBb&S*k z!R~}po1d4LPP8h;{=gVKa~3&9J0q|`mxrB+?18(Yo`dWG?PMWbP|!JOQBvLHsX9T( zf{^}4LuQ0yDQa{_?kyCZxJHx`!*D-QECBk9k|F&dveA5)pzD4&2>pzbUFX^|p-7e? z%;0;#1f-%M5Gw^>FqzZ*KEfgqKxabS7xeRGp%UzsGFIL;bl$;+9L@=Ivrdg+eF|;R z7Jjz+G2~lLQW&wqnotB?5Qao0i;4@EFSC)4oKF5C1ccbI5PX>*zwFQrE`Y`k1^P-B z>^i%N*2kfI?J?eF6%4ED((x}pI)>%Y%pVao#Yx;)iD@irRE#j!zt(29^3^Xco82uc znD6AFir5E+3hV5wbRI0fhy8|o;6O&MY7WxqWvNI@g6LsS-i9&Xwb}cI2+Hlr5JVXV z14-Q83kxZj%GxOnC8nb;V(Uwd0J+RaUl3r|X_=kZ9kz9iTJlM${XF+#B!)>7;HV}I zPzxn}RFSqkD?*49p$CnyZ`cWkF$h`G89@V7gYsJ~tg1xO_kL3p!^11wQuxvuMrvbF z#Gm!I{VF%TnvTwQR++Vi<`Dh(OsCi@+&`?DRG`VWu?3X_LxBhN7k4TCzgY<(_+woFkMto9HF?PjPXaW^Q#v~uguVBfQ=oSIr3Iv zBB6E@kJ%6x&(!{>PpHWlfPI;FV>kMr=@H@1jB{(~Fl6!-wr#3hP&Tt|acJVZzQWRK z%+KM1zw$|Wi_j2ld8X=0C1Wu<;)OK7lD@&tv#7e)U_`MmuT=`0jHFpvGZoSNauL8) zRjfZfRv8@1f(U4P!JXiKNyl8-zEgsFRvRrJm4+G|8PD`x2~Y0Q-yxv3+m@;B z$j_qzi~S)6FA(9n_J<7>ah{IIW_EvQVSStE{x=S$kjl`P8bhe}nq)($2L<6;HRL2p zB+zmuIi#RY?bn!4;-$kAzx?4I3}vLkeGrOb9jPp*Ib-!{F3KreE&F`CPY;)~&k>l7 zBzUWu#(jswWSyX--KWP@YYMQw)-+|{_yiEr*;;Fj&zp_h#{_@$&3v-f5T~_fVd*|0 zT6|+{+l^3Leyp_Z!ItzT){hWe@4@!d@MHd4tzi)?oD=*^W1SPs?PxCGJ0LB$F1SAu z6*}dH@z$j=VEf@1s^q&H>-AXT8IumWpX=&CmU~+_F#gXyj5?AG0&)mC(Y@@uddbQ% zMR^1Bj;R;p>;!4YQ?)FYJSk)=t+FSepS%pLlTOXHy;g&x$bu;Bc=#}B?RY-18tr({ z!c_mb!E_aKz=FDpS)8|->2DUsY*u|VInPd>bRP(B$rjzKOE2ZiJklc#nT@?oHO369D~s zMOa3(!H4+5T>~j{F*EGE%qqSmRn5$BI5~IQC3o;wRX(AQJ0ss6S;qPWS39nrn5ph_ zp_uC8lEFqGF@dP&F69Pnl&TG=2{4--ZocpU-x0hyFh8m0-TfUyZ1r zfcX%Tpu@+Zvzuoux5zB&j|&I2n2pBN@Jyqy8yuaf<*jdRyfm1vEqMrD3hyUkwVI1o zg>V!1dJi-TJ~X5t%$NiWT%iT6$(M3RAwirmq%sK46l1p>@iY3*gucNC2&dg~=x~e% zHAko2;z;o-2rVQBbn?bX(toDYjPdbSG8|C9_mb=?`Z=O}lSUya0C6&c;_i2M2Tu=K zpS-!X6E5zLJ!1#N8N&9ax3jr`|A#332^oPKXd8H3jguowFkYJp#VvSRzzUWY!7+7_ zJ(#CJ$2Aj0=T6>g^YF`qzO#<}-h``&F13hGieE#&xRyQ?4OuTPdgKuwk<)Oz1>8^( z+;S8m>gf=mcy^K^Ld=i7HZ^L3SihNQ9i9KhW&ErDeE$=``Fm5N#)~)a`_rC5-#h=Q z6SM&ETE6!3h&0sX4U_6{V60`_!_sPXS<&sh5zf$VQ(eF1JeY<5NB1of)f{;Nu_5@^ zMw!|foQ-Uwq52i|!b5H(w#tQ5i8hH4n6I+V4{=DqF57v$Xm0g|ypz91tKI`azgZbe zy1hmVhZZ|(#_rgVh~dT&A^bq^E;P%YNUk!N@9SO>T_W^LN-A=D(03#8nr<^T6b8Oq z8L~?{u}P3diA^GfqDw5t1f3@QdinDUs)w7zR~1dt*Qk`CaL>MC!{r-t7Joi^ zrw+iMXDF7u6jf_SPwD$pGT)=DzrxbDOQpo7^til&sQ-&boCeYx1zd*3x=jE2x7_y|2oC;julF$9a@2gY-TZgN8|o}&rP8E6SzrVe-3S=7|q6S1`! z2@EO_76}C`#iCrqm)sxms~;UW#1$MWXbvcwTr67{W}eZMn(_5eMV9IlR991wGJYJb zkDz2-w<8qx4Gx7(fbdr>m4)QDZAUBL0Z5Q+5;&ZoF-*Mhnx2iR5o;2npC>4g5i^Q_M&MCFH|#QyX`xPv3}_s6dArcL#UH?!M``J#8vs(}S!Tmk_8MFQ*cPJ(hC z-FEB!a5@C_R4y*P<5vYei9&}`U&J3Y#3QnCVHrY7D}Hn-ECotRG{nRrXR|M zC~WW8LP**$b)LQ=|Acf-Pnb)hWLWum! zuXx;?=wVhIE?L4nBL3RJJ|B|XLIMqVkGZqfr=Fbq=6$0m=E8Fo$lD58NEm-Q(3IGM z%Xe8qBz;8m-c5WoPINCY)uP_H~5YUsoH`#XLu6nFf~V)6VYr$f^TZ$ zX`xz5=zTUEl^{+E(26)qXZDLR^1P#-WOrgH-pybK>9sU|*#lv|(r0ub>*LFOW$(9` z226OSs?l#H9B7~+ziRz6Q0*BSyc$*$`Vc{fn5r?y*XXP>J1dw-Wm1jMiOK`p?3On+ z$?uL!=>mp)xk}%9J^GZ@eOX|mnzIyKb-yKiwchu>SwHZ907ULchuIJX9_peMGr>C4 zx-)ROOT}aqg(2&%aFv+ZH6VK|DQWzRP|+g@7d{_vr1*PG zrAi@|&*m|62-&5nmfzPSj`^>#4(HQ;#=cC>n}#p@yti=9d6*r^F3YvMOQ46ft}gH5 zU0l)EcXLS6LA9=s|E5jGpN1p`2)^`)`*kq6_-YvU|F`1L$pirr;!AIqRi1z>_=b_I z5l+Luw_7mU#vhanM4RhTVgM1J_Ewa@hEJr8ehROjH#8Ob$x@rhQdBJcv?srs$%lJ` zt3WG{3pvlN)0kcAZ2Xh}(&^%-6(sE`I$NO*tfhPcnH*-w;drxWE&-!HYh`o6A|L2_ zXERahCnmNd5R)IN6wS3o_d5n02Avg#Cfzpc(GOT}gF4VB>a3^j76p1yGHYE6oz8R9 zT=MG;C(RoqN2d+vhxl0yvhUZI&0)gQvZ~4JcE$O@l+Nn{{3lVUdY_?))F(?*cONE) z^Mm!=*eGwqQy;ra3INIwAlIu#hV2&6OD3rd-{KqB|M1HDAPAh~c89w1IW>|!b>u&{ zSdDqKSKsp);}cDGg|6J%^IqM{-0ARS*51-_PM~V-Q#4amm%v>z^B+K&;0|%nIDMWch{~h|^q% zA22~k6`=$v6>e99PFenDt1tN0rOVA)bDmN}erC@I*A3KR^S#@@A}M7!R!AaoNJ%U@ z;mPL2Mk7Qwfjg!QNWY9A!DCTG+6b!4(a&0fly5g(M-H4+%>J#u+PDnK(cyvgbvJYc z{UOxFByrfy^Q_AzmNfKc7Q&*f%9Q~w`^H-(UnL?i$KV=o%x7aQmH55Is)ye*7jhq0 zOc*&&n&0Q^_&c7Cf8NpDT^>b8Wxo^fjZb{Md`MS~16tDxN}msco*(5Nv9K+S>-|00 zopvAGU0vO89z0UIZP6FQ$eH1C&5pSidfh$*WQMz0M@o0Rc-3o+dvVff5;Nd{#+B9lyE1w!YleBp%m!z754?{&9=;&fio{GkJGGVZpCWY9nlwN6ATG- zdW9sY+1-7h*xFvWRfXvKhs$fp+#Dm|Hnw=02HmPR>%XZjsWk=u6cVNQiwR4%-S0jY z-ID(&clDqHtt}Tk8PN7u1n3$Zy|3CY6eiadBlBMW$$I&^?xW zf%XGd``X;_jU$v)!}!1K0wjNGgJTzqZF9Yw8Y^+`$u^AyUpx@oG+GucLhcLxf}`60 z4aDH`%@@91-j1i$$Zix`qYNX0mJ*aq&I1T~8t2f!wsA#>V{<`Or6k}BZeO-F>wklp zyUhNHP^mpD@%08}m!fK_4445^rWBd8vk)g3j|#K`cOsJ~p}vzC+i26; zExIVetQ>g0YSW8%sWLxZO)Fy4rnGkr0gl#?hi>x2l{uUlf;y*nhxNq%h+_mtQ?9#~ zE9@q1UL)S)nCKZv85Z4-xK1}X_!Ey6$J!1-gqy$>m+EiT!XE1jvgohS;g+W7=SRVZ zKG$!U%P)hf?0TzyjWrynlQ7#A0zUIm-$9)6(vYAG6fn?HX&A^Cy^m8D3#?}az~~uW z5T6>_yxMfwc>1h2^|UC*m>OGwTo0G07*4mXuX%5Fjpx%txBDDcxrl9}7zyu+&6n;T^X-ZX(-u%`uvk3N!Dc)UZskw&t!t4KJQb>%xo_iTzM z6sgyyrJc;?rPggPk18GAs!N=zAXV1^Yu7;Tk%gMht4lW)^9X7T_%Ky9S7jO*V=MYL zZT(04!g3@Z-7)Ij9uBWcoVZKpoj#s-dgq0X-{q#`TA8?e#r@jfnSJ{JkW}nu6W9j1 zm4X&#k0lTahNsdvxbz!IpL`BF5zCr5m0e0~1iDdxYL37;H~rzSSQ5`)F56tBb;UIb zECW}ShompwGZrC`7bP_1=1|c=>i$(L`8)nPWq(HXHOwpjVDU{4`4{_WJ4oKbvx&2b zlcyWqE0akO&Dz%7t<2T|)(1a^A_f_4bFA+~N7KdG4yWq=>uEGz)GAeaHSChi-5 zy=)NK(m*fQq^uvlS=6ayU9;BSkRAD5+5Rvh-hU;dw@HIJUvK_tp!{vTGCLSoAdVn~ z^rd;ksbq2AZek4^Tv-W`)3CeF-_8^7J>X1Tq}kM52m!C=#MzNL3<&>_Q0}u<&kqet zP}-h^Hi=`xM{)hChEd+g$s?5EPV7v5-7k-ob>N|Pb(5rFcKGw3Vhg-aW>&21`rW@z zcmSu8$G*}@yLu@q05P6W{|Y&}YcD$o(-6dOJx_dO=S35@gi@`fNdaD);1U8^iRPye zq}(B<_yf}U*>Rg*%2AY<9&Nuv*bgo$$Df9Y(!3d$rNq}|%NzVctvb)Iodh9~T2XTS zJcg;G0Wwl@e>h_p+?S4k_-Ox*4^4HmL>8>_S~^=*?gA4InEn>jy3mrpl}0EITEyk4 z0XGbW^<5?bCw@T30z=^u0S)-%(UknI^sgUb!J>hvaaN_lwj$``R2yeB-H)gV zB-}=p9%eo-Xm4?e2(;u9`i;L8Bw%E)Z<=wn+iZO3p(Uo{Yl!l0ArlBT_&F&-<`9rV z#ppK>MgS}T8kAFkT3g7BuOh*3I?yy2u3vr=l#*Kw8hB8PnsiR((mSzOvX3nHG>Is` zP2W8)mi*;69QXIE25*{&aT<+r`1FD}pSOu(++oa3-H~#Phqv7GszPnCzO9?W@MJh` z=%u09LT7VWrz`RMBgO{Fr9*)3iExH1W6)_kx=S%|kzY0j>0P*&CmWEO*p@R!54%{9VCY40 z-aR#A4+I-xboW1%U}9s-eq7M9xxTr+_%D4lvo8wtD&uy^Cx*g4xSmZxBv;@E_wf=t1kA@X$H zYwFjeZ}R3tJpv0#8OsF=t$5s_Rt44G2(}QL?2@!IB0`8)QB`VC&XP=WGXMGr67p_b zV=*jfZrUK-y*sOTK+%SZ-6X-~=wkkwkaUTqGPBJ(C^)YQsq9W6yxu6}_#WELRJ;gG zq=}uB^y|m$Lo~6_hWmVpC#VLDQuqmuM7K z)**qUg&_q~P{8acMSLw3PDP00ep3V|3qv)^1UZJR+R4syK8f%0f`aGb@mG@+CgZ0i z9Y|Oyzp%s+la9g|lL?8Tm1b`J-<+mXhqWd&A50ma3`sLXt&VuE_z8e4Y=bkBV8O-H z$J89PE>)?3M#*`$_@w@B6sad%M2T2pra(lAC$p4P2qbhCtaApV-yDsls1+)qq%VnB zMV{!Mgprr(1V(2^HQDt{(3^Om)m-3IN zd``@A>DLQ2TJn&xz;;#XfS8emzVZau5=|#ewP2Qn#0hF;py{~6^u+iNtTUnz-i(Y= zFan1kWX~~?_98t#aoewp-=L93Qb%m;T3wl$i}gC_2LwTo44yAYqqWyBN3H`(qX`)S z(wPkma^u+Vwkba!DMOYc=MT8qtxf18;#Yp(#mmr`6?;(^o@-ua z!t0+FDytSwz`=MQ{Fzd`Z%J%U;yE?H=!fTkjnV;TT|f=u*#4K@*bv7~NpvAE}R z2>2yf{H_VMJLN0M+H;36?b5qrU?$N>RM#u&JNE@Ri^VN`8?YmKZGKX3AwbW{6o1L$ zU3D-HUhaHHtD)ccnKk+Azsek3{7(Un0xDl%#Q@mkOhB0nhzJdWW`U9-e}bna4bk-* zxQWe1a@k~BFIaP9(}x%+Vv5GhtBie&tyW8#z=s`iDN;Kg5MC4 zAOXQ|pT8vX7YD8^JRL`X?}pS@=`Z&;Tn9;7D&O+Q<|UR%Oecq(6y(Xk5vUc2Nl1sv z%pYdn)LwthYLFTZ%5OKSg-0K?-_X^-Dp3-bO0WX)$ePicfyx}nwR~E)IERAnvx?U1b=e4 z_&9iMNWGhFiie$?-#6-ewftbLzD5t@Q0Smss@)LSwNA*^t(IIg|N48R=+@sba|(h7 zR&wPxQ0RWRA#0hfIMO$pAC#`_vBSRsxDHT;)N5yCS6wj7jLT=8qj8C#NtlfdU;{dB zNd%dX6?7}MijH@~x6Vdj)>chqhh%7{Uo6Zd(C9m#?I?bthCrsb;KNrNv+bV6=^jwF`Vb`@-aqtlb9iJkBTQ8kng4f? z#-=NaQ_xs0m<)F5wdQrZdpR6`?F@V`M_iMJ(bIj1lkz_&2Z32Jg2C#0TG$c${?FGv z0@TZ@OiAms@km;)uNXglGFXT^p<&gUAcBj$Px~Y(1%LKGkF{~ewhz44JBFdJ4xPjX zwe^JNJNy!EDzn1z$Q*YdlNp4mb9sb~z!6axrXvm(G1dp!<}F8{Tf zE5p0g_}gwKNlLTPu=dlxEg(Tzl0Q*S^mjKS{+x^V-JN+*Mi>FAqjAMW{@V0mXY>ZO z+=eZ~Jh~{Oa-czM1Y&>O0^8kmXFrxKcZl7=d1INwM~G~=j85xpSO44cR^Z5-lE`Kz zhbp8F!AVexIgu#=pE@AUN+!fcW=H*J7sOObT~TFt{$oH?1`(v_j96N4W&XbI$R9{qHe(xt?;rRp*cRMC z&8;A@FhMDedP!IoRt&>PTu-%;)fZJXvC)>=;%b*N1)W|cN@}3c%bjpYy+((v6 zIcLiI#&P(8$bws51T*;Pxy4^N#+_@-NiJ1UyC{OwBm*=THbNc$+3A@N>!ViYGRd%4 zc!@4v*FDH&0#w@0%7`8`gpGDm#HyeA!$8;UJ`Ck>t`I>;!@t&t6J5o7BzECtL@KB z6cNc)phM?IiH9h}fVxeQ!*A(GU* zw&b;^2iwiN80SDR5`xAKB(b?2W2v?#HEt`}J$O@ajp3kByph$OG39v8Ie)&m(sj7t z$^A|T>91)jgq=d%9u_;LvKhEjs(;fe*s;SI0OE>3Dp0QCRV;>PpvO;$UK(FjU#|Ay za+d7c7ZhH!$jb}qX){()hFba7MUu%ou^p!rF8NrylPRiloFJ?rq#`HL&Qk}vOeErC z7+8w$WQ29N#5Y}G8Ei%?I~4*yjBMqOyb)1ggLF;Eb3h<&7+=@$z<$F8X;HaQk(5Vo z0MqmAmB-d!P;+43nE`8E)yY%JLkMwtoZfqPC^pA#-WwPomq8 zE65&nPBx(gpvys3=1igxGFGKDGlm$g1#uM7S)z0!7r|t(wI!cM%So-?iN*YP(f2;W z{F}P!_&?~OIF3p!j*5(07!{P%F@vA1(tWerC+77 z0{GV>K_3nJL`BkONs2^9CN`Mh5jo9(@jhPl()o#L$O&1P)O56ks|Sa#M}>m*i9Cpx ziDbFtZ#85}DAjq|m=*ZDckK3eBH0%Jx~Ehimw${!P?q|3L*RXJbN{ACCf6%wA~}KHNA!lshr0mHJd|A}EUxwBT7) zYL7cv>`KqwAGu)jU~(1&K;%V5Z9|em=as;)*eWJl?nB}NDwDrZi&V+?9$}Ee;+<-q zC&KDS#C=FCqa>QE3hON)R_1-CC2Bvyifjw{h>A5D$Un`9H!6$UBkRwH6`I@L$YA~3 zIH6en4N=({Tx`ZW{6=D1S{c1P~o2z)O2MMxBiO8TC6njK16c z{UtLV`8E-K8J?1ZlUgm7B4x9H=|Md_uo)q4eJ~k7cfP@ytik!S@5AUFG2@hp@)N@c zoZ;$fu8p+V#dqhlLt`gmgLn|mO1pXh&g={XN$&?LY0g!!o#r!AkF^Cet-?z)sun+I z*nkOxb82?bIRoLi+MPh)xO%Y&;NuMQyQ_`;F%eYO>g8?E=85+wIN?}VI=|393z0`c zSQP{Y;p&}z4WXdVufn$j;wgJ_5D_3zUaY7PR@qVDcDI5TxxxV8JK;y#Kv(ppP_!e) zk_%qS_0__^#O4sr=cCP?XkqT3KTK$ohghqxqn8^(LJn3Fe)JMsrVG7$9LZu%#)xTg zK{$M-1`!Bhd>2|m2+$fGQA7JKn}86I4kiTP{U806`GPMy(ixLePP!4(;yhqQ@TtGH zM0^OSKlsD)BJWU}qcW;V@knKlqW$9VtbU-g%_y`u&s*oh<@I8g6%xW2y`Ecq=mc=ltQIDD|$p8!a5IF#ri zMRsE+)~aqeV9ca%BoLmA7IVf z;)FEk(48fDrl#IhfgKN&C0eZe=Wd~OmyNuC$*Fxtxi)R4r6(OX_N->~mPB_IF(#0N zR-gE$X2LI5xmiUV4eU?yP*%ffU0ZWyzvnkTrMAL#zye4X&jCUop0!!4NbFitN%!mV z1bRhaNHHiEE}_m;v=%K+ckhs!cHonlkR^>gJ1^h-SG5fa?iV2=v}i`lO!02;L^z)armtg6|~lJjI^wdh3x zF4Cj&by$S5+uBzRYZ7?{Do5$DQF5Kn5jlpsufLarA7&4Ffz z)G=83&C8Af0tAmhS2neFe={18aXe~3-k6>f71wc=B(#va?rUbiE0iKeXSZCe@ zy=DCy$9NI?#f^~TnnAw$kHpI^HfXv_tHUq>>w_mclIyqJ&mCyJus+cLa7JBq9$3>% zl);W<_c{{mEmMEQHnY*^@(dn(eD59}A8J|$gLkIahaa}7(%e#qv0uV;g-3s7$Gp?y z!#v6C0F>=BVqi)F{o5wuMT<7E};X0fS3(oqbH9$f@f_nwR5n5zw+coju(aL%j!CHEotHk$ga@ zQxw6<0Bxq7H-ULjRt@8K(`*L|b_0+I`p9|TQwaL_?IxuLeL8T1`etrBrh&{VMPNsG ziRTE6PPskbD}tuj;$FF-9dmn5)7f#E)ipZo=fs|51ZH-H4;E2V!{KAK#0_!1-yMyM zW{#FtG!p{D1^mqJ=Dy$rZT4sq0Ai`6e{$6=u-WMA%tB1WGk7naKH z9W-6NSX=R^N$m?tZkDR`+yNNwhFG=c%y|Rm)v=%Pw9Y9pOe8$qBx|m6pjXhlZU7NO zh_g>Cq9hqKt%k%mW`$m1v{2nIU*jY|aJVQOWU(NDz2nyi;U*ey`jV7NC8?i``AR$_ zr-SW|1z++_xyfJ~c@hqHe(#3o+@ZQhRsEDBV3U}`EyzTVc-pIt$pi8&PvIqI>{WJc zC?$+AG8Kc4BfNi$sPA@y?QneV%?*yvy}9Cg=l9fu1_4XVZ8V+F`j!4K35Pg`!d!>Z z+-39l5XVQ+H@5l;H_@+R~MK5x=n_|Z;&vkCkjvq?*<6qp)I@Z7e>YlFk zwa}e>!eg6eOz9W}BchG&9#O3Ys{44VqRy5=>hp@5yixbq@jKD~luVvFq)Xs>Vx}TLwC7kist@HEDXT0hMp5a$ z!@55ZE6dzWeg6t?ITVYk#ib?{K~|i(QYl%IgT-O)`f`*#JhSiJrrH(Z5t*cdqCY)Q zQ8r#{F)E=W2eZByehWNJz$0Sv z9qn#k%v7*)9LF>8*|)$ftyD-&4iWqlz{wXVDl8+94_C4qs%%>tN}K;$S$*Omz>_av zE49#0?lo~Rk;?Jl7BuW0J#`z$6LjBVUKF|5KU4^!>5qy2-A3=8Dw?g>jB;60PiY3! z#yw)u{!|-o%PEWyp^2``7N0lHTyn}v6W^F7E$tw?g1R?9;WZLUg7j$Uz4jp#og>#( zJ#oJaXd2C{QeLCDDfReWI~F|`E=Us{bHO1x^RHH9l9Z4?nz#rnL4}Z7Cz@i+%cED~ zfUC!kL8`4p>4Af=Vzmg+c44$L?}^F*(3>`n7Gm?f#qVo95tx5l=jm7T-`{~drj|?=I<-&^5SkYMdx7rK@QYq^YuTKH~U)l8BOSs^2)(|{X)@* zOoygH#$+acB4B62K(rV=aL6cca+GVi(X)0$;Z%u!(N$#qdV)moQjud|PfJjk$Iiac+#oZ1g;FsG0R2 zLKD%}DT=|6z()-|y1p6h0XZ-Ad&KcW!=5NJYb%B}G-dvDqk)#XsMG6AvD=GBihwxl zq{ZY&3*e}Ni`igt*RxXE%tz*#bTyr6qO;cKtt%C4lf%f}5kQVAxIK&}Z-eKY^h2UG zwHyw1hUBl8?_bUI)z;?%^XC=DpyK3$8{3G#KPpcYJHs&CA4|nycV%wl z>GtZctq{)XZ|mwe4x2^ht{Akqcw@cZRUrw3b8E4&Q%R%pyyv28{UfZ+0B${mtZY;J zb4u7+Y>mRy2(b1Lk}~J@*$8^w5(|eP)2IsI+1yEfFaJrZ0K>$^W8uCSm2I$>`UyTy zDypba=RlxRQ==ADw&;YCh~{p0LlmV0Egx(!Xmvhb<6nHbP~#Gu2PV(Kgi@mce&s~z zD9W9?YvSexHoWK@KO+dL=i8hRsM}1ropi8?*<;``0~k6fY3*u3`HRontZNXLr^iij zy>NMz@claR<~-cqF2rd+<1y2_T0{9$GAySiRC`9a;BQFS1=AC)=>;4M$g|&w!yDb% zs{Rl~Hf(n~J?I|M0kyg@3|Bt)qC#(Ca%cm&mOd*fSwu?n+f_)}^Th181~`1@7w(Jh z(2afDfblP?ZH>*J%G%D+x)F*=);z~eM1-IkkN_JB;7 z#smCLpOQ<$(%YjGDei+j?e2S7H&QzSk%~JH@RWEvQC(!YTmW}h9y@*z5Dj->Q?H%I{;zdWJbREqrK1`)uFA-0^ZQYo z@SzPd+XQrx3lD94Ac2Kz7R)#7hKD0V@u_|NKhWG2DU}fTYE0(mw*Fd_^8eed55eca zfIdfo$$^4J9j9qMBg+BXI{Wo#=ryYfgn1DpHPaFz*J&zBt&s4SHAmo-92c|HmD7wi$3Q<;G0zNFQ-=bh?i zE8d(Im-IB9AD&Q@nUh$Wu%t4z1%`F(axytHbG(h} zHTcwXsd^_l{x8=-cZw(dTYHq&~R?qzme(XFcvDuPWC;)Oq$#_ znt^L&FJIE-y&f^3C`JuEVi0-aRxHFb8TlIWD*(gyftQ{#fk$Z*^Fb}QX#zVNsDsyJ zbe*(4{c-R2ngMB+{LlJ%rFSW=z|_0k*CnZ)>6G;Y&;Z`XYa1ExYA3= z8R!yyowl;B;v#V)psKU;n6-O)o)aqZpS8AtO$-t$+*wTf&gqR)BQloT-E_I1Yiws^>73 zwPU@a)xl9qS=Lp3%}KqyJhHs3Zxj$I3*^Hul)@n3CGC7B1ud!{-Wa?|G{GlmG!1Wj z^Xg>Z2)4$G$qWY`2;)`+X#PFdfOuhg!M?takM)SJHOOXTn1Bug6Fosp*?fwS?a8r{hACeK8`pbe1BO1k?6FN>(pVoOH+~cXRyR2pkWC zBt_C2>tP;jgMN-je!)1%>iN}rOtEncM|{XJ23O-?8;5AU&TsU|tOLmJ+MODjy0MNw zzZI)jiT?Tw1nALso*&gPqJMaP4BVSCkC21uv|jveY$JhX(Tkzjh%Y+gSR$&Xyq2CF zoxF=ucZ*eTxE_usD!mY|8`G4V1=5w&@{@>8y!=i=PL@YcmS0i7{DHaiM0hLOVnBc% z@?J^W@?q7G5JAKuhJg<7{EA)D@7?$s(5F8H8BlSKqHpJbjep90=Sd-eZiU$92M%o% z6W~voB$|s+9&UsZC4_ms%0iOdF|00FpvXu#wxrB1qhD~+K~@& zcp0`gjj)|>YVJ>Ew!(Wm^0c+@6?G90zD&+_o)At>LJ1l`Ns)83Mf?FZFV3Btj+(zd zdZFV!T7XH&>C2X-MRux>3jLYo!{5&#KY|mtS*)8O)Ya2nEP3Dj*1s#B%>=QK1$eJ; zo&xYY$Wn6}ebH*6LAaZFz-XJukM=cPHjPBmW7zU<>&vuh)Tz^5>pZo3t+RXY+O_xdm^3ZT)S=1U%kMIF8Ci6W8<-Q0q_nlU z83*?M6PnyBJ)D!h?qMx^SqMV8+Q)&Cei#Fvu%c3`Y)4(2ot9dHZ%v|uWe2K?JO{Blro$RbV99qq2n_Ra1QAF(f7wDyGw>(tT7vwECq}i^=%28P(Kr?NcbhSc@PESfO)T8nnA@ zb>wRvIdrL1biwDn2Y6@bz?_*`E6VcIsml_(#c53c+HrCC3xitgS$Nov@=2#9ki=d+4p<1z!ljA&6)k|=9B zFs=9S%m1P=()<8$%wQT`EWo(Hy|xlu?HIFyAGPbftqZH<<3Sy@@5PIXXh;RT=}a;C zOG?i{R+naC`iiLVg#yWCsQIhomCsnTV-aFh2$77p+N8}e1p}#4cd;s4F*;p`a-+7^ zoP^VA?Y>zQmzw}V4ES&!7hE2p40nk*qyHavTox-X$b8B4EVc?OuG3pQ1L=( zwX0NK;#ikx`J3=TH56NY&Ou^vBZa5S*3`aT)y|2vO_eAuc)(8A^jMMH*crkE5MQCb zvH7u(g#f#$0vRZ*Z$PGSBM`k#f+3JjS0RAw86*G&FKB}s@(9Ih!aET{6h{qGo}S#1 zGZiMINBPa&3`bRZm!V478;zJ8M#w|0Lb#Fe>0s@tsP%yMS0F9y=b|frPnPWczl95? zm438~(UQ_Jpq|^|Wd{S>^&O~TJ!sH+adP*nGTKLFvD^ggVIr!-8cdPkjvPZrh#emq zq(rUB$-chK3#jtBRkPr?W_@Fk+?bxD$#=-No$1ZOKS$&Z{DKt08h;5S%{iTpZs9(W zjF=tG$Ldu+W*h z#7O)dwEd?vx8Su+xc$}{3v@QYfs(l2MQQPwdZ36+YInV{_ONNROz9s&!sMvRv3?gE zRi17wChT$3miAYF{z}cfC>c1?rQ$)w*=stR!xUx&L21hFlAvPd(|O0jDy9wr08}#m zAjxJxgMiyVZUb$jKPckUw(9x$i5bgQF?Z>^f^q+*3JH^TlShehqx{ks*G8djzKQ1U zX`d~`#w~o8d`xK>?_?3B8*;MoW7i9Mxa`2BVuQdxOknT7F#uY-e20{WObN649kUuX z^2!`f8`|pw>E!AN9{#NkY@wGcP}gXRfSe7WNV&iKM}aU14>}P@&W46zvs_u~mW8Q7 zGGZCfL+SIs(5;t@P@sn3mxdg;GFJ2D=A-tX1*qbhFVf_kntb;@JNAp%>f%w|67iJ7 z{5zj)oX(i_VwjDf3tROV>g6OC?vh=*;uyV!x)}BfyEw}=azA%*U}>Ay`lJ01To)j> z%W({U?w-?j(S0}FNsBtu3g%4ng4bF*nl6P75{&PvA5zUXmG;JCxEt@Knc35&o|{er ziju?M3fKZg@xC6D;~zBF_7AYCe+u>y(4PSWYN55%FzC;zMj%oPx$s!3e|VYx^fcU+ z`79`1EULUUD_*fFC)!&|FY0lBu0sM7uZMEex7PfG7kj=9?CU=RE9U*b23G9-{|qeg z`hNzth~FMi%=@2#5uG8#3oZ718(3(dD$M*9jigloP^4fsQJw5xaYXgerDsf}(iHJo z>>1bL|L@X#b!~9gTJgTo0AyQ$AS}pu*Bc-++&37S(4sFA(KoqMj)@{e0!0etVmZut zrfy}v6LC`+UX}3C@Hs0^vjj3tGTWoS03X9T;=7aW`+^tTf_0mQ!OThRnP*2Okz2Wq zf0P^4Qf2GA+d(fQ2qY~N4@z%i26PeYkXs*=5`9hZSZGdn;^;l>aVsLGEcBBNBR$_6J#@1w?<71i?4b8NPG|FqsqFG&drBKLyd+yn4EJ zu~@7OW;&(mbO%h>;ES?{1XKn=%jygIFPOyKpEu(-D788ibqB{pN_GoPQfiV5pR~kH z5)5yH=0KIR!K2T6Zu!G}x7vcZ0ttlr!2>BYpyxd)UCMYC1W3n56z*Zi(TgJffGLRW z9diA!R`OIV<<4M{OKA62g0~>ggm=OTU$WJiXLZ7E$~`mfkSfZkpX)Gg8VNxm$Tzsl$H$&fkTPqDW?Xf zWiqyO&-PCDZb}=F;}8GyAFISm*V%cxKl|1ki&gIn@)uoqIxsFqD-5O=T@>gx4z17Z8&TB) z^gORqYo`oB($Ep|T%o}OI!#^o8ZfwKHdrh=hJ=3J)d2*Iw8N1y5vcm05ppsWeU|$6 zV0%NSA05qfm_SY4pJeszzqQ49FUti{T*r9Ni|i!76|HIp;V+XaSEcB=axQfcqGb4D zef{t@^GJl>;(JFI$JEPm;irt8eqi_Sqp)y|gJ7iLOyyU6)O|x~LDaWj21qi&pPS<( z!!DMd6Uo`jRj7BH>q3l!4}et?=Kmrb>DHhk=ob69s~i ziX@DV+`KN*znmD!6mEhJ!jJP-8GU8_9);%d&lff~dPJt4l`riT*I}=Lok;J*`3!CG z12sOj8psqb)cKs|chB?~T1V~iTrX)=|CFY|vL5|;;ZU2*=cUt$oRw~j(vJIXE$qa2 z%L-aic+-yQJ2vFKV+0=cETYubXwEpXC~ORJa0$gkutr<*d+`>jop}uCuRh}j@Y$dR zxF$pRD_Dhtyr7XNq5|^EIjZJoP1CZPSXh)|fqX^K^Oj#nW{Fd6?_ovM>c@c-LCn6a z5Pqt;A;q6&m|rp63~9kBowuGULnmGJ(^v8sc3%Y3GkcEK8&CZ_y>k<|8;Uh(yw5NZ zJI=WWC;y%d0#0axo#?3F1rqS0rex5^_VEG;T98kbc;-z$Be>rr4KhwN%TC}ZR9?9c zfVRRhQQ&TCpU&YOq8c4H`%Pz|RGfwC;HQdOhtK_w7=@0FFMA0e7E^;Ukx$~UZ#X)M zCMFXN5r^rfb}wtGcuCc`d2nQ7vJ=b`I|51gNq^GTHLo&kSq0@;2ytKcKds*IrZU%9 zU3e05P0Hr5(RV>64orlk)g?qxdIOOSy37i`^87O6vMa5Ngf)rxcn^0}+jJv)m|w+*z4R&xvf@ zCu?K-8SoO_o*`%VqkPi&`(Xwdb1Sn^lYb==EzA@7Sd$Jj4*J-frUhaZ&o%vWfyjg3 zubuP0izC@G#_sNKBHon8?rx&OOVp*otVYovq8aUOAvin;kTP^m0hD5ufM zoVk91?LfsQQO~GS2HQk@Lff?4xLvQ_Aq=0^JKVgu1fonnaH+=D-a zYdk_k4Sbodn$?N#XRX9|mUCXKDn{ghZ)Prt^^256&3L~{oy6LvOSn1~kYF$#GL-Eo zv=Y6ydvNvm-q1V$7{mmVYhtZ56CgY4mKZ<5$L?9dPBsP>0hM?Pw!TXTP7^lSqRyQv zm`JFh(c&?hD1P@{Y_t(=2m1h~GZTuvi7eTDe!3Ehjn6VN)}_{WWPBds33-eiHWxm_ z>fE5}Twwr6O=L)84U@(MW}-VcDyhIXR&r25{2`;Amc0NUWrv+h5YC(>g4bc7iWQbN z5O-DhWf1dzQO1avhpQ6<;Lb6Nf6I0{ePA8Y-!u6*PHOYoc=JrFqG>$F@DtKgTUH|> zub8!4a-W#H-1Rf|h)NRcV94@jfE|JP^O^`7icOHFpY07N;Lf85jJNR-)b7Rw&TyD6 z+`QRZbX(M&!t6b9qeU5df+N+I$;@~UMz zV)>Ao@tsu71A%csTlDVR*OwCs$AQ`RqRCOIqvx}L-^k&=(088C-80sYIe-iqUql}7*cv07 z8iYbJFTMd&7_SKP^Ur14R>=)Mw|& z=wtukAP91eMq%0qld~Z@V-cbjfG1uFFb~XqyEt#Q#Y`Bc+bc;3JyBfAlu_0lt9^+Z zpl}@DeCe#EN(d*wK^ZgD-sAog^>3;A2h3k{#C>0Y2kW~G1XL9Qzh~oOyr=vC-xQMq zfhm)M@_HojsT#`hzOgWd`WiwE7b$6!4-Dy^L<}TcitA4>acMFQ!1zBvr28>aqW=Ji zz5(UXj8VReYx$@v1}DqhEzQt1tyIENq-=<^cN3xTb`w=Y3;CA-?cLRuCfeS@3y|%_ z%xxg;-IB=V@?>?wRMbJ`PtYZ3*a3>)$UytxyG=|a=^7p+r0-xSi>jcwY5FepgdCpu zD4M6Z7=pqx9zY>QUOHRWq;|}|n<6UeuXmVM0qQs{6Uo6vAv!PC9Kh-A&soy_!y~Da z$#p2J&k(ai|Ns8bpER3e1jMVv+gg%?&sSY$;ZVt5UB&9P!vBd0vv3W3p4tEYgI~*$&w*RhL)_o8oD9c=#Bsx5EFI4y8JeuNb}0#*aJJq! zydOP?HskZ*;7j9N*77BcN%O)w0{)AGjFR@dWY~GSfT!aJT?iU7P#t2gXizNuc|t z&W1*r4y^oS+CS(qmUsKq*Vr~=j2>$^!qxIdexN7*tJYNNQ*9~lB6@K{%DhG=A;1R;D!0P^O-+m@r zPB?6=a^Ua`ara_`rem8c&$H`J%17(o-=i0 z1Ef-g6Zw3E5{sQ7UfF$5aiHbJ0EEcuisI5n5N5%eLfG##0WLsgacrq-VS*AW=);6g zf9u3CNN}>6OvqHpx-@{yrEs_RG|D&P2+G6_R$YDb)4%Wp3H0y;RTzM=XnOz_vO1A? z&k)QobOT#1m?5tW&b#Xze90QrpZHGy&XdqZXVcx#hfV~?A%fwqu|M&YXv%*a;q2E8 z3%ndfXsCn7ZGm7uikk@_?FH(4keruhngj5}sp8K4*ytd`9>U?s5Em^NiqGN5@}910)oR^56F@n0gTVb*8CqP|lrf36zMrdi&x z)ceKz#UBn2M-~G?>vI#>XwL~aq_vO@N!iedR%`F-Rn6JY&HMiZG2=z5WVYm zP}2?UD=IH{Ua3AkW(z|S%~duaqb0dcnqZP(A49ERTk4)4zpmw>YwK{RZxc z=it}dJ!c?BMI+nq>IS28Y24JGOPtOpB~1g4(EkF{ej!0904vZz#H(P6W^io-q9+;h z?pCdG!}a;)!TBTSkmgzF=G<=vmu$D5-oyqO;uWRObsyc%jHw^ z3h9!3Jl3o;(Onv7GSMXwBoUBxyc#46L5Mo=e>#@~Yn%NiCH^~WCIb?y{Ci5|)lC_U z=C;xVb(n!8@YHlN_U@FTdw=nA16Geme@G|AxjsE2kf&bF^zqd*0Ha#gnxh*8xLd9`E&n1gE{)=C$YpY8)8>0pH2QRd&0@^>>) z_7=n}1>X;_@_mc`4e3nudJN-Yrc$*6Wx(hf#0H#%r?AlgDGbW_2?e#Osu>*>F;j5rV?Zjh!}4NB zPP#>2%FYDu1k?rcwB*#E&Z9S!<#IEBAw!O1-yD-4OxJdM=U~9XUar!uC^49O&LiL} zhuNg{eK;v1eSZ3;MGh6TrYY#W7*%Bp&Bv5>;@`n?Ev}VkpH@U? z4rBCsK=0p!9K3-Xfr3(dXP%_X{407xY!>tubrKe-T`yi0I)pv8i$K%FaNO1k?1;Ws zD`KOFkD?t2!5s(8t&4ks^)AOXhvz?p2o*zQ`Ddey=N<1~D5(w%bm9=s$SAv@`-Mcv zHtLu0B7{EYUIX7f8GfFAi)`&I%syjA10Mfmugwi`_>cw#UauqK`O}maJ9<0FVtm&G zz2CpME`D{H-h?USSO5oC6JKV}CgA!!v@P9^sVGo+c4az;e?59nrh(dy9q4d7@m}l| zrmU6v?(OAQmd8cPS7Xd$;e~ zvN*p`Ud@}g{CKR{Xl_Jt6&)ibm%Ljb;tZgs2>F%#Xu&bM9A;ZME$7)zq-HhpaJ7GT ze0LrQZ*rR67!MpeSQ`OKo_IJ*xZ3=USg%-mnbdE#{@1PLW0SXUpZJyX5((UpK;#{CnQLV+{$VvnofA zb_5W7bH`m{Qp)m8mM}D-^9w3_JV<&|`XFOL3tFa?gW2c7VejQymKLp4gNn$CHZRO* zE@>wfxt-cy85ur~ke|4oYQf2ng{%``(QBnGYI z^P;$wfe66K6!4zLYHtPT2>tqA1%$E(YzhB2vv|KwKFjA!z)sezaE?ex{<)9K)3>x( zYQx~?q2?Cpi5w$iBZMJs>GPJa_DR{U{^GF4tE!hEHX){_x2`=tPF`72Njjdb}uFq!UVoENqua=O&&(rtyW?^EdP<8KeIO*-AgjFH#C4({y7*vx| zr&!M(PIMymt+QOK&8rqcFwb&ir6nLwm|#H68IO_?m>Q63hp`AOH0EGIsAu8+Cl}b^ z_~%wEE{Q>r!AdrJoPU@^%ir+4%2-CSSI%)9+YMltQpW&77oI=<#}|pNWEx&oO{&Q} zv=XKWE&N^i4aAY=2e~3g8EBlc7XQ(0x%)c`n=}qskhm~i64cLv5wRj!HTr^bA>KWAlsmYs-er4(O&EZ#N=RQbI+PlD@NJkM_yDnt3R zPzHiyT`=HrvcprL(X1%&)8E;na{do#y~~`g5{(GGPhlTk1&u<6_sgYmHt~I- z|6I8-V5)U+iu?CHev}34*$V5e-bd~Ux13#=FEH;kZbZLRWz+eL4qjRp-?Y-FBu&1w z{vv6R1SF%fy+gRvP+j!2G6UU8OpQY20?PDaDH25qdY+1#Pn1BRo4Y#Ua1v)@R`f)L zzrK8NhHlHmK}ZdyoCLXY@?fC&IeNl7EsqUM4)4`tup~Y8g1a|gqKS{(mj^$~Rp>f5 z4fwLCSkK@tR(J5r9ssc=<;-r`YKc>wZe$7|KFrvU=B+ z*Ua9rRXUU1x>N7ZeNg@{=?HQt2#^QB15hle7u+8zT>(KO5$yP4G2%l~>b)AaSEJL{ z1&d*SLg>e3W~ji-!i8Xwc2kn!F{WJD{!gCcACjvlHJGpZm(5II(Fi}aPoUFokx|9& z>e+KN*XIdJ8i>}~a6e+%?`1xk{gfTDS8z5tPO_RcokY649};-p($|whypu9G>Vd^o z3RG>(U)VrdCeu{c)5{R~(b9|Ct+Djmtz9fm=EnQUU-%H9q{r_EkeeI6W3Doe zB2TkLR`1s@8CVEM9i~Q~1iop#&p`XQ#t43IM~R{g`now@J47pW zS3OHsPU+n@sc^q}iA^P0Q0ydTxsU{U<3(zUvNHJzdGE9|T?a>%n$UuN7djdT^4EpZ z4H3aO+9q=&6;^TY`FAvI4y+$JNaoqs?qnzOt!aUDGGA3_JW-a8Zn*Axcsy$Mb5#}G z79`63jOrZrD;7?zMc$YrU?9K3cyaW3TM*fwkxqlz|7-uA`nub3d(=- zt|yl66l|b4(|n}4DbgIGoGy-^eicBf!;m!A0mD=hs5}9!f>DC52%NN5nPlVH7|#J= zFk96=f4!KmXz83VZFxvo?k`*=v)fv{ISV$4q~8@LV-y=8G%GSU{sCGdZGL@Ts473l zb?4)Kmxqrvye7n^G;LPPjF6!RkZf|QOqgEKEx$oc?Yp)~z)}+MJ zLbst)5GDAgZ+Dv~1?J?nWZ@3lgm<|$u6{>|KEAKrh)>$RS(BVJb_7@fzkh=7b|L|& z>NiM0AVO6Si~GmbQZlE_Xo}DZsG@#YX@6q6 zHp0@>a&y7d@uR6+RP_(GSRMz%`4gjOAsveUWAIALCZ?|O1}LRSFdO4FoR@)(UQ&Dq zY0ZKg3?2^hfI$M%lOhJ5-xd#ZYG*cb_y4`Tdw1TDTC*asOP~kY-ojv?L)@$K>_P;*-g}yvPdn7l#hWhbSwx#*5dcf6Er|eOoP40PC3v zto9E*2iDqYFDhoNgIZdig|g=tm|;H0T3HfX=~V2^gGEh>)_{n)2rG?yS4JsOQNjcy z0FpuSsi*)#N_ziI%3*{S4pdT$0t&Up(S?+@TI6J?XyRDFsI)tc;PWllNA&s^T&;GK zo^DaUl6~)OI|>~7q|wap_;>FsBs^C@u+e}#?sBP#OME2SSRbab@D{-5#8!hwmtsyk zdtoAp^pykT!}ft@3}VJ7bYJ!<=F9m%(n#05Km9(YZCwvdq(ElaHeeh{X#yVN0ni-xM|k)ac@it`PHL3FW+2CBKE z^Pbj5d1)9F>1>PcwGQf2!@;qLKZJz$4Y||~*KNB}B<&?v8J3bKN$53%n@o|G+NM$M zVr{A$A{#7vXnVA>BNoP_k~1H7cmmB-JWY+4aLWaHNZ#_}+0%uqEjA1zTB7!Be0Vfj zmK=O&9c&l^tXC3PrsnkDaNn$m|6nJd_;oS9&cct^<<%&c@am80t!qL{i>GLUTbcUA zI;-_)*V*0Sq{yAm);l((8bD8Rz5jxp{NXUb2~O^BhNlRsIm!*fkw@E!gaLGxE~VSl zx}Pect&ex%g5};c;DJ1z{R(%!`>Oxfj2YA!cT}c}@yLUPJVy+mtUHtdk>S-oL#DgJ zOKC@Z$R6kyD+tdq$}h=vCVuS$a{f)@3qm?G|xEZg)hCp8HeNF__Tec;?SI! zT4NTk4dXNJGH$SnJsGOr{|k)9M3Pbr+)oB6jm`%bA`6fVyio)-1CV&;Pb#~UWUx2# z5rzQP%ED?kn5@QTZPiwpPJOW5@*2zz3e0o{XmUr!pH4a|1=9NT%Y*6dijn$BZU2ZpX3vDaUXMvv6_BeOn$0wiWBXS4*?4;7(F zyTpGTzgXI;M$rFhGVsayV!o6L(lYltvn7eEShoruaSI5*QG@`Q*Cjw$JFVy??0$j-30o8i;!bqfLgenZwU#XdwNC$YXi{TT41!B3qDem6$z7QG-^OfpgGZSlNF*UT|iHev8I}X6Yq8?Xpt|58m&CwN}5z!k{zzRg>0{atgOG$O}!w| zxVZhL#wEQG=VLHea=pe$cQLoqnHyravRzbrFqT(xUIyQQja%OSmMDP#K}gUmXXO-% z1HW37M_Fq!d-<~sE3kDf;atUZ;+Bjzg&NqwpK~;-`!5%&*PTD`z-jMEIQqIze>0?kl(f+Hp5wbRC`Hv%mG<|5}7DMp019*(Ct9JN!l z@pnZUQNXT~jYhYH#KC_n)SMD2ir~<{Z%U zcr}Zw|8&7cto&)~eR6eMZleER6bY?;YIZwI2>AUu-0SRwy9v+k)EI^KG%!f=u_E%D zD*A^3X-94;S*gOuW=W$`3awUE>LGi`-yhOsM|P?gDXa_v`&hM7@cfs^YkdZ-Q{>rK zX3O9wx)Rem>CJ!-{Dfws9}r9h`N@-yuIgNDJm&hAKC~*X(WY5hk&jGzI z(yq&Wmkrpyb-!Sz1jyAB`eMXrTj@uXv*oh_!lZ6AQ<^W38<}B{qK_Nh@`yy3P zp=2UEq2w?|JHv!9hVPj~2vrNHEH|>*NnybqdLG}@rGn$1cznf<8Mry$f~J{b$Otgo z^FA3hPc3vb?)1$+bAg4Xe-{V+94gaGB}Qg@^Zv5#`IrXhN_1fd!R#H7-kQqKj?8S+ zanYE@#Ei%JkIZH?g1=AtiUOO>@HU-$qh45FUpOPY>GDbt41I}7(9VN=&3Ps|KWKfh6dF6lI!P&flcui!btdet>}Y=%ta8< zysOOw^w^OvL?z_=VOlb`(u4wiUy%fM|AOTcomDuRq$8u~eI~QGvVrr7O7vS3!Kr7H zvUN*MCk~y6yrFHrp_OS3g)bx zK;3R>&gY85PgS$3HNRcZ^TkR2*M&uqmfdfiKEKbh+nq;b&4wQSARJiIc||Nh!a~5% zQ2Bbfqdm>X#U||vDDd|&<IwL-+d~?wuyT&38f8mDq1N!# zPybQkUy5evg$90W2k(|KdJNjUdc_DRb?Kfdgb#p+*n5}TWIk~8b^G4Ql9!#953Dgu zU#iCopZchl+zrIJjy}l=<%D`V_bDk!xsdJbfXea*|5qy+(_qr zYMNu)l0c$naOTqIA*(dQ+QeZ-Rn}N~Xobh|OzCSA_i#cl5zC&|IcAWg6{^*&Ry|s) z>}g~#;{d1YPXB3CZ;354pDBvDC2a^niN9%oUHZOMIcHF~YBwD4pwEr?jF&Ldd}$f= zmEWCxSX?JDsE?oDm2KNPgPRL#ylt)(n4G1@HZ%NG@r(FM6D_pLFq<1dqaHtmPiRIK8AZs3;LXKO`11I8Q6s{bRjvb z{L9#``_FN(>WJ5qqM3Z1l3DEUehlqGD#}y=#h_8BTJCo~P59SRTGkfpp~Pm02T+(_ zeFm7A#W)hfm$iv%`+hyCT@^^=`*rOy4a z>Ss1~EtW=5LpU7GsE@MQJG2k~LUWUNGOniUrRL${l6GLWK|WGsrs?+D23z-YCsUgF zZJ-4Q1Lc=sZ<&jNR>;98@9i0I;qKq=V#`p&{fUF_3J1F>qW#0qOBGj7ZGVG0g&pG5 z5vVzqb;0$!7jjB0pR_qoyH0BY;FfJ}Rj*yuwV7Aut2xF^*~^oz)|Thf$%>A#@n84j zvf8eLGrXS)tf7@Jq%K~#2w)ngd2)ol%SK-x7{BbYb_?Uck2Qd*c&o&~3sGDj4p5YQ zo-jf95Gn62lGciKzCVtmTR;9CP`I+=)7PLG4m2E_ArCN+j;V^Vz(#w8&cGoX*!6&G z;cV)R+y6RB9n@+|%FFmid7h7>daTSvFO3yP1}~nPKF((-(;DI1WoV?ECw$$OBf~ z32Wq$<+G$|n~8z2(=;Oj_)j#u%up0+i-aYNDs1C~cb|VmaFUcy`zb#9N`2W%&^*oR zC(EM$8sA(0&PF|qv?2oe=~2ALg>J{5gCCNmKSi<>>Zyrr6mC%4=^{R>OS}l@Ii`hH zt94EQsAU<5ZJKPZEdk!d5VWFtgA830;Z6LAu(rIU5M$~r2ge2-FdL3TyMXPogiiiG zG?*uJ;r&(-_;f>tqkr%cY_$J%CP8hgvpS*V8Eeg706Dq*Vj3)V^R{=rxn+j7?E5;8 z`+L?pX2bL1akPAuFyiRAVNXpLRxNc}nBd*VZd3-N@U zW-Yv7%d(&=QJeS>ptV#xKh9p!Duv3a8@4#v^eS-Q#?0Jvq~?{@xq=XH(5Fx|v3 zwLy-qlE8U{l)_-*W&KB|*V{39kc#I>btv#Bv1UYtmV@vaSmPw3%S_Tz7#vr30a+9$0G7+pw!ik1pephnD(+^h4 z&a)9$JbEa7h>(2y&7~EsB+)S28T#o`f=D@(spsH7ULnmcI`yyz~nx#@DeR>j^qzT|2VdMCJT+Rtf9`Rs7 zVPqnniI$*%G8WtDZD#eU5%Lse^vLkmNc`C?dvwk*PaMx7L@HO(!z{kGQ4rgo$fgu% z2hjkKp=m&|ok9UI=0O{7b~2WQPys2GK{A4`@8)xy!u1X1hani6W!&esZdwNB;Ux3YTzvhZMR-IqD!*@ zba$~3hzYjKBTWvHSkln`ORBMT0^eWdtQHGGR?J(YO{frIv$xzs<>?2u>5 z=i=_=WnQ#VZu)OT8nLC}j8Q398zH^zVGs2^!0E&j=2 zTuMadAL)hlO)(_$sC!#F<$g2>IrSmaz2-!yXu{o0^vkj;8d10+zl4gWV%z42-{CfJ zSt^a21Suy7jTR|q=)d94!(GS~LGFkDsU@8~enf2gFxc;fEyzolb01%j@}jWes4Z|r z#WFl?Mfvieh4fSeeim~BLu69)9V|N|SN_BHarc~W85;vgd%RY32WeFa^`01Q`>7cX zMemZ4?1qEbdN|r9dO<^P&LXtOK_H2Q58Qw0DlQ~?a?YrqAiqC(D;ZE7`^})J)%(rD z{u{Jkrv0a4m49#~yXRIz`%g_qPX)6gw9Ed&t*6y}I>K?xAV7iAh16Em*L@nfBHicf z%ms|wx|mW_vkoHcdcA0LrDvhX3?rG;sPGYW#mtrYj{X zn-)B{BK&dbhYQZ9-Iv785r}AZU(z7!6S2~Na2j&i1dij=JZ+rz^JXt`hZif;SDEoZqgFoKrM$!YV9S3N?+-KUai)4uF}F62)K)5o?H{K(-&$z(5=%$gdOq+tBA{$o#iJy6`39ATA;IAul0~AuiSJ z8$jK`$U!bko7!c9w(f}0K^(l&qd?`?l9RYwU2F_vRP<*JAga}CnTe?n=lqwO(Z3}( z?P4J!T)42wqkgWWw?LP-q=Ry0fb~VnUkf7EDjlF@PxaWOZqJg>=QT>><|9esY9^E} zLaKvHE5@UM{NzCkZa%X%Ft>DE+dcgPq?vO-D1l1lw{>tpXrTe$xyj$Z{$Cr+#djth zC)AySs_`|-$%3`qZ`ra#ulr&f*Zfc1{#2Y0z~Oo9;(T$x%R&!MVOh?)|- z7}emR_%#50ZLz)WW^x-M*0>RxlUb!W;LVTH!UU)d-BZ<@J;79Q!9lh(d)oSKp7m2zrE4 z;I44UAowESLSsmP`CAthz&!K(Evi?fEFL_xW^C<|q`#TM>Rs$ctUY+Hy6!Wox`Ojq zG#m<0r&CnOxFB%o7uvhPc`>;I@AYhfOSwsHfBD!j4&l46JNcz;yPx`XYQnYUV^q_8 zPcr&giD_j`k*{&2ZYN)y;QKnGSUlTlA(I|R?L={uDJdo;I#D}}4Eap$!iTa{*E3pv z?VU29yviSq2KxL-W>g2Rgq+dvm-7P$cIqK8M2Kf*VI1Bqwe&Hi8#|_a24kbQDn_2( zzjN_1zQ6>KP}SSPirhi+cSCqUuTjS=_!uHVd`7}L0ryB56|c7`W0DC!cQMG{uhN`; zbwNL!ZfZ>r-&q|F=lP#3!aT)TB33@Uaso>85w0ZDuXsrs5IgkvL1tl{3?FbVxmW=p zd0d#xHozh-x%TaF#>3VL;`SrZw>Ru&GzW2g-%SXURox|fk~GBpE?NYe9Slzco?0^S z;BG{B+NYQOxW5GU8rm0e4d)Q#`pNctfUFpw+S=WH$}Ry#dzMwqzO*H$ti5ngW}9*> zK|mI$iRzr#6nnL?FPJn&2>NTiO9+H?+Pe5aCIH{l$fxB3F}@)<&)T`!MmY*DY#vMJ{OG&!N>QzQMRP1UFy|1h3@R_JxX zWbI8_Y$`Bs!05lc0u&3e58McJW7kIo_PUy}J}Jb%JGP!vt1T2?-7H+69*}q4nKr`l zBwP*naJ^T5FzH#i*%SiHfCtMn1UWOc>^56dqlc&ug_pG($ba=m;=jmxO2 ze^(<1qt~voGpY>zdq`z}+(iz3wK%McuwR#-%kFRqiXr(o866V@#!83uMcdsYzq_Te zVy3yiPl}s1cw2Gun7>C^7L_yguPAWWTIXT2bmOY@lUYJEuqtivyY07hZZ+$r<{VEQ zJ#Pnr-Ltvu;Bk&^mD%@WMsww+^B?d_oBaxVxpA6SMo{nKIY9)!(1Wx-649A_Vpk=D zB|btzb;Pg)l6KO#-o0vBvccA7%4~e{VaE)r1_cN&mwO~&mOEoU?&E;}8bkGn;mKS| znnN$EKZ=OQZ3Sjd31lhPiCvG7!}%uMh&cOEN|~N3DM)AJ1&SYx|6*ay$ECud#}vyh z=FwfcGIWk!PmL_GUH1Db?N+YvH=sZ3mou8+vmnNN#&Zbmo=)<9cN=@}-L!}=r{jVb+|dn~s7iJLm-!nyY)SUI$OR*=cR`1lt@>FN0) z#^?eUDiVS8tL5uQ9xkx?RA1P_&;6-PyB9jxPilJ?boBa zUX6h}k3p}G6)?;g<=7>IGY@_)XDa^?qK0uEZvn5wHa5)QzpgyLkdn9=EJ_agzK`0Y zfbg{!Piq#e;{*VQPi`ihc!#O~Ot$hkk&Y>y6N>#umaZQ~I?i}OAYP7eG|aIlWQeLN z<`fZK5X*UsDbcDt;$pHW$*NR}(l5sK3k+4FzRg(`=zMt5wV1wDgtizZ2s;2!qphe| ztCYsg^2|!RliNSlI1q-W`?sIsz=i%z98-S2L4dvg63bb9oqEI_jUwTD9LK}a-?vFb zKCpIu}PYSZ{F|y^k3=Ml~$Jbtk-A8>lx43nt9UOhDYW0YYYBYShoVPVxiG~+7%FN z{6Azhs#1nVXmSof=p18fIN{Q4Ez8Txw7pBaiIlym@W3bgu;iB0kYHCifp(JxSD9aiG&%)fku7tZzm%L;Iefdn zcI)a`D{NeAwy5rGPWut)5VfVw7r0UBM@!|kdL6!Cc!3#`oKenL<B4T=OPIeOl8?TEhegq}f-5;(tUpYgxckZa28zrB$XA{I1H z!~(j%RqT&_IN87)4+mjqogfie zSt#r?55pB0dRkWnmE~Hrd+m~8Tn^9irC=DWngmw!%VoMS0(hJP=szMxEF>5!Q?RAE zbfI|-XZW7VhBS!h7q$gP{)p!%gFbZ|7ku$`r>cKul5WOzXU%=<=-0sg`p>Q>yC305 zLf4q=Ly{0;5PT{S^ng<`Xi2o$rCcLKs^IYMGl!`Tu~ojwdBA<>lxr~eV{?EpCD#Q_ zs*xF)tR^pe%?!paD#o4Qti<5=y-K-d|c~@}waT zyxA4U3PM|-YSZ?5x5~ts)jPNgq7RI)Z@)#ki+&OS9ZlO_0rEbe?+4h$DZm0hF_cBL?1g{w=+Wt)?x$Krvliuv_4C{JY*lY$QU-4vgTZr zG{JZOOrKO?AM%;!A+4ihW^R>!9N zf}O{bWNUm@N%sSKhkfx@S!IMZ@5W5~gkXpTRw%Gk=%**0v(uwj$rQBHNbg zzr+VeTm)n*^mhk8&VTb{+LHFnlh^kd$BWeB`L6n0q<=|oUYcMC|1=^{tZ zEkU`AbnbZhy7Q*CM%`QqyR2*Zrs2A}U?RP(dG{(5q&D*~w-twO6Fqs`S5dk)n3EwF z6lUaYGjsnuU_4$X)TR+A2}N|%{%0|v3ma^9upBu4+`i$M$(=PZ80iT+sWphVK~W5A zoqnf?HzAQ;dww5MP^QB!sv>P$SL?Ta)?jAYi(P8Du}LBP3_5L|(_29n8LuGlEKm^{ zSHRIEn%Vt59EavRC5DJsZZZmsgWdZ4y3E0ejeTp-TTbPMN1R|RfNkea)nl&5JtUxm zYYJ#t6LuSfuX(K7Yfh)x<2tfz7fg{^=qBrW=ey9APBBGAuZ0Q=E@6p$J|$~_PShMY z3>mV+Xm=vD$b1F&6rJRZADg?XH1-&@OVq}Zvl|n*N!fG=O|y@1FxWyA*+72pZyOJw!~J0e6!2wgYty1e}J8oO8?&1G46;Ka@9SvE-~) z2PEu++9}x|OY}b*Z73qwqxZ_@*@-8S+US}zH9Mr#*^lv!|ATKwBk8z ziXC!l!vqCx_NB;>=IkFsJO+tuhdZQUNMk4ouaZY)sT7vX;B6ww@xti>i#3^m$eNzm z$I<*+?9_=}*P5+sqC4^{S07epUHbOm1{4pKokw4dZA_2E^xxJ|<4dIuBMLYg2#fCp z77~ws2^JF6dI{Q(7cA?sx4|0;B!RLKB=#HA81+ohdwn(NYwkOAFa8Wi?b_F<0XJ*1 z8PySOLY(a-(~E>(LR0y|1$~!Y}DC})cn5Y z_t_KZojbn&jfa#J43<)aHb7r0>Mn#nXw^bofe&p5Gvb$W%6<_)MRGVUF9OsuQIa1&%{`C8u=BK+8 znbslJGAOQ`Cq~#t{}30oMd4`3OPMz4qe&Q%487`SU(H>&8vmHrVq`ck=OK6rAMz|> za}^o0viQTY*x7d2Jd5b!^A?c2?!oYVu*1P)@7G5F&fp9`^K>{Pz+Ywhyu3f1zmoBg ztP>n@P47NBXo7y+y2>`T#4}@hVM_CJQ{`Ow%N#Qer;qzlc#K!mJr3vZka@k#?m&xg z)f_ezUqWh1IBlkMf?$3){Eem1^w4kC7mpNcB zAc3lTq`N?b>D$yA=0g1`eXWI z_L`7DEj1xZ_cbvzu~aKi~WXGfD(i~+I@L{k2o!+ z!1##?&zV@1JrbC5l2*pZNXz5iQ?fJ9L|{On`)eZ7RC&1{ECWM|3a9-qRXYwBEi(j? z$#=XU=sh~NSrVNIa(37-+{y|OfTT0O4=hQ4=YtygN6pU5m>4u(|6DSh8LVZu)sl0V zHj}MhPEe_ADL?Dft?FC<2={yh@?9oOHRzb6mpmzilNs8)Pu(Jq;Q~4~4i#T^%%c$>P7cRmWr>(arTjlGUS!0K`(mD@Qz0 zNh!<@Cmvb9LpW@kcD*&3D90L1V@M_`^00U~>@FIa=s|fowzsH)6VGdX|11u^Q!cfb z8A;m(poEs?UT99&pA?n;ot$4qra&v?_!&=9qW7U2D)7h5-5bITvfE$4dJL>G?MUKe z^~g~tIL6*jlUhdnq=q#JNb3Y!hZA)U!_@^0bm+6h%&uIdor$FQBcP_C7LOu5+f5Fh zwzns+jt$l7=sJzY$K<+QSkh@+O>7NuL=v%Zh_4p>gm5#2P%ij9AHIb>R~9b%L#PbB z*J-#aX!mXd3mQ&J*r+{$co%Qi=&`7T_=?|7tuPBjiTdQU@vrBB7_%K!qJSUuwg4fq ze=jJYkMfItF&@M1Ui&jxetfRP^9vE(5=?$Wj9T3+CY=mj?$dq0s%Zi1Bju44F00G{ z)wd+S53#|75v?DpJ>%S1#0%M?Usfv~Ma_C>BGY#3bC(A{r4*apJj1Urr~HU1aMKNwWHk9*;yf zy|!5>|4mtijAdu-U{W?98wqnLC9m_tUp*%%OOhin?EC1dfLVj zCE3cb?2plGLK+wCZn~sSdvR1GiHz0ECF6CJV@;RSbik5LAJt=sM%!sPA!TrC_=3n0 zBu8LUt$PeCBl)CCyKfqWA03-T+pPC3r77o zsti*fQkKWebCfTQgq4K6!~IewRDs`&Y2ucczJ4RSlA+0w*>QoPBfFqcI;#cb)%)XF zF?>Bn!;cb+{>-4M9zIUm$W1sn6>BGWbCL;9dEaur*radpf+J?{z_oc^oyIx2nwULP~a=dtUvkdr4O^TucvR0X@ z(@8(L1(LnDJn8sJ*oOUC!q7Mx2wGTvQFt2&)40IT(Ns~g^$Ny3L^UN?$M{-FD2!P_ zKATnCf-$lqO80AvQq5|0QL2Qq~kM8!i?ssor4-dfE_wEsRSZUnId?{>| zqL#W=*#7bM{IDgn?bwnRHOhqT+P3<;7U5-6Q<)1pe~mV59kLnDM)hs{rmA9)oJrdK z9qt+(AL%YB#eop=wh%kH1B_!l!Avse-^e4o!n?a25T|wMC1Rk6hq++5V(3Y07+<5* zE%5a3qz)ukj7%nY0XKLz2RsdEbF$_;FIOIbz=PGm0rO6A?zhePH^O`ryVZ+HQ{PSiV z%7?KD2E(XsUXn+ITyxQxyvmW~1;Iz(>?w;B zH=Og16h3S{$#8w+t?SqrS?xz#`>m10WdZeBXD==uL4y-6vy%(G>m~ zhH2fS(j3;mcH96*3GcQSBmPYjpN01mzvbpc_MS%*sY~tA1q{bQhCLdUtM8UxUGXOb zR_-6N^g&+%_c@jvffu{K&E*SKXNu04h*9QPnFWDGlT#X;PO)`CVGyp!DH0IagKzzz z(?y1i%qc&->I((WGft<|rH^2yH1qMN+lkFCX^dTpYLfw^H2H0g3!Th|B+^CZplQdV zY5VPKC4m{NV~!;{wnt_2G7b@@iQ^{QyE&u$8+y76-2B|}KW%K_UJAAN&{hfNHXDTY zot$>8JkG;1@vJ__;lmG zF?7^5F<}6GR?_djK;wt@6e65rC~paC800<1G1=9l`swkPMGC1-{VS}iN%jZT+Sd0c z1l+wlJYyCQwT13xXmc3F#?j5!MNtC*g^A^QsUl7e-p-bKmI!S$JXLlcs-ZrCo<=cE z>kDW8zsYq@h48ENLTM!9;{`k=@A4LvrA!Vd=gh!Tq+S(Em^=G`ly2jdg^ts9W8`{q zJ)17M8zXY@S|06jb?YU%KJE~WnYldMOl$o^_V(5f-ieBqlcRuw92|rl`2!CM;xs<{ z6b@WGF2<{uR82VL`Y0?%rpj^SQGd8J|260|+$<0VGuVR6e=A&P3U?~$M4^aj{%}BA znmE|!GYn=T0x=X#ht^%A3y)aLPSsZM>dcYw6a(-wsJL&^H@0- zcM-E#Xs}b}c^vsOwAAl11^ga8Vw86>TDVb{)Xw75SB}yQqwUXVEJtz)gB`)lf4x%K zKJp?tNRo{a*yy*rj_KIiLRZu+oI-n^EdTW#)Og{F-c~C$8eD{Ocg0BOF{GBF04RY1 zv*OizLOa{C!Mj(Aw&C^P>4%Tvaf*Jq2osq-;- zy-?p3TvW%<&Zyj$O^nbj&1}D~jm#tTQtm8lxsO20&k8>@QN;3};^9-MH)fsrTvC0m zCk2EBX(v&hy_B)!=p`ckFBPA7vI%XLzxR1M&CZ8aQ%XM`w31xwN~P&|6ZQryLwT8y zvA)2OgQdbnRO==i!O#OZDXFuCpKFeHQst!Zh}9=Do_A6Zzi6xtKSwbKqO`I*1PP+M0@RfNvHndw?u0xDt;LZIlX1d ztu8q`w5A=DP@hnhH(@d>pmjn(v^ZM8fmhzy1`~U!+2>Fh!dS?gU0s4+wQ!EPQi1i4 z{$p{I_u+`*BhI1c%sW31iPj8nla+S~qE$E(s$nl8G!IuAZGMA4b1H1m_<Q9V*Cq zsCu@R!3W2toRO?#MnM@12GNt19W2$q3*4*tXEYB*EyMj3)R`174Y+|K?dN_}kX0``L?L?Y^~e z%|SSI{j87UItaCyi{9oVxXgE@z@uZ9M=s-kzpSt{B+gY%SQVfKwP7eL@5LYSqsu;}4=tGpzPNJh@C}~V$dGP!Ahhfgp zbUCnxnqv-TynZtlWwhLcYkPBf4z|G)_Z_q_mWB>43X@d=H0Vl2oWmcSVzo7^Jzd#H zAEx*ob|p_=7f$cnn4v}0=qUt58r#@Z8DQ2mM)Yesb zEOfNV_W{<$gGrWA-bQE`M~E^dz>iBC|UsP!gjVu>mNlePx?4C3A zZ`2oti*wl1&k5wFXI`V)`SitCK37j8-4v(U zg7;IIyFzSXs?*1a%~@sC#Zeh3UhC2{z703oEdhmNY1S#RQ~LQ?!$sPsVX6ATrZrM? zC~4yK^Mxu{?7vvdD_mVr>x{2`5fCDJt|n_-2Qms z1+#k=iSg`bPj8d!s|@7u$$!(H(UGX;bizGQ)$mlbmrqyuQUz=hT*%;dri zq6N?#_Ze;-Zo=P^IPb!pnFeqEKGBfCJ)9g-aPDA#F@S2=|Dp`rZMK$KRbKToec>{1^d19boS5K^vVm}MESR_2n50wAn1HHLq zjy3>TbU>DD#WD*ls!B_PdW;FRAoVz1LgQnsZmXVjv>hjGm;c2-{wcu;!L@8WK}gt8 zlmJlsgnCP{vEa$o>FLuq#YgKuXvn<0qf*=_+-Q=^79F7*KkZ_221upOxdEGRk8i+B zOl!*~qEIMFh};HS#?Uy;%r5G|Nn$OD?dl#|!!#XoKv?ATjtYdr=kXOw8_nZay2D26 zc#Lui&`bu^_B$3Ub{LWI7WmQyKhH*xu}F+bEbN z#9`; zsHf8#^X16L{CQYgoi3g|$3vbJq{PLovQJZXs%At*@ekfa&rN$Puz-o#{EE?2$0;(^ z&@h>o@FItEsV>=>T&o=EA34eWRLTy`FKCx`*()K|?e$d@6e=axa2Q81bF(^I_%$mv z4)*p5*ePsP$+BF#wr`B9pHSm>PA@Q?N6AJiSf!H!M-ket1y&@);0SxQ{Ug3yqtVo2 zxvj9bM6z8x*gtd)_W-KtE~@DxU38t@SUhXL6}qQ>IZzQsyAGc26hz{*%R~MH9 zU$R1kUxu5LwbWd#IEiDwP4;|Ge`6Pr>I^A1t_cA<4DV06gg_Tj^vK8STTlPV2X0>Mt_>`7T%H^-oYDkH4t z6$D*ro7-CSGWapW{WN+*D(B(1ybY|_Px)kQ=hC;l5KusAG?oPskG50_mfs}t2D5<_ zE+VEeJNjyJ65vVcJSwN9Hay8&*v(tuzZ0%)nMIPtjQ=N?J(?Fh*KF34Bu2u6h*XB# zoaB~2aaB|lHMpLPhRlMaGA6C4PdaW8%*Ss2*9|P$HG*QtG{st9QL9Vj^y_M0UA8Fe?w8m~;nGHxch z7N=aoJT4jC;OwF8B04w@DTx=v2p+^3cxYQpSgk2j%&MS-Ja`0gOBXyigK|Q5ApCo} zr3J;ac*@bM75cS2=gmi>%!}U~7imLt72U<;8=$1WnK_c(?FVRCe#ksS6+L!#rW)5U zRM)SN11YcF4`%3m#qucS1~Zyd(eb!Vh4JH zr86!cqj**xe>c_v#09I}H=L=>!W@4A5KogYTnTl<214fYs=U%41{9c=>OntZYlFR{M?SCAG_ue**CDY zDn6*b&Rn1AHJZB)++Dh6Kl^%xOg+B@=m#zlX*@c7h0k6*b8iGKp9?ytl#MctcDY{P zR!oHVt6!_Ua7+Bv|EI#~G8!>TOS_>nR8G_^N3plAmv{gJ4?zZDAE(Vy=(OGdFFK1t znx?+n#!iUs%tqi(aW8}J#Ae{_b(NK=MNoiDHyX;Eu&^9lWHbEa{T-$>!(%O@9noW;(2il6!oRgb^TXD=ojk+7?}z2+e;VD6u{xRsSft%g zBcD&F7>^e=PR(3gd9r=ewiS*V0Rn>~m@cx&*49=#oF?NX50e~8G2oCx`;3{?Sk%K! zl(UBiY!7Ddy7`9dXIySHNvov;lV63pFsB6cut#?N1YI;y&Q<>57_*0ZM7^~IEc0L3 zXn}u{el}(ywaGt_jYO{Y?->WLzG3+qz#@kDLSL{2Uh}rhjEYwlq)NKZ0u_THpD-7N zqDV6BH*0MrU`YQeAR_miqBp{Vg!}v2>zVM2I8h{7pCbk`BFZaK+|$g>lo%pz1O3%F zxNZK7ddqeicFb}`Ri~T1H95y3#)VeQ&-&}S@?TsoFMh0(9i%UCRMp)#<4}iMLAaa7 z!;1XFd!E{aBOi?qTRRqUFRMnGt}5sIrBmIKze+aPCmB30K+|lK95a)2p$!a$Co{e zkg@oEqMBk)P7Yi9xlwvPuRfk;L?)GN_p@J1t(Z{OU&8&H7*R*{Bp^2>p0r9=V%mi} z*@jKa>zz|naE)b=hh4Gh19s4Hw~XCuNIj#5QooqqhtEX>C57ML_Tb9L(1m&Oc z8%7KX(!%0`be51<%BHkw#i2D6CX3_t1_xs(a$>xF$wa{L>NG=)#cyIaMc!J0RN?DQi`vo2h&08Wk-5SKNDgqo$=thgYK;;Ft8j(V<=cxs~49p+~YD){X_xTPjf40Pf_{%e#=fU~$16NuAi$N|I|Pz|#C z8&bX710y;M-3mr@N!3~SX)vL(YEiZ0L>7{=M`}(YJ96(;e20cm~@i@>ndt zy76jVD-JBtPG7ta1C?Z=MF5Oo){Frc!`1IOKYYb?x*neF2|JS}B>OJAl!1aDszoCBzwQ(%wgy11PZd!zqlq?_30f^$ZeXAiAJ!Ln5ozuHEM3TrbJtm$3 zpCs!#k~KY&Gauy0$Fp!f$cX;TD(8!oWo}t?M2?IKj8Y2;32bbWP;{mF3Uv0eec;eV z(77X(q%N~e**8gYvPPsa<__pyX)zPYyFLpot6ApOt!t4j4UfnFsNRS9m0){Q0<-k7 zF0#!ozmOTL+2;<_pj$6lVKBw{=WweRXKTJdCD;dql#oq1E&a1eL}RCw_R1EUM6dt# z+=x2{Q~0&w7LN})V^@TfBH3zH{nAEou-8)Db9s1!s?-sUrk9Vdh$Juj z0GH7$?YPA6+n4214G15?g5}%HRcp^rqf3bVs_5i+dAOGv^KUuGN9uSD{)(tq!|B>8 zvwC+M>_4Bhue&hwBIXa4V?zUv+`H$@Q_mZ)zPmiPb~pWb+R|3sqHe$BhITFp?rD~l z;T9kT?P=C@86Qth*`5(~>euI6(f2}jAiJ{M-D>yNvpsdI#}xfGVH=`mZY&jH#H|%z z`A>fHQtihs=WT;Nse{7lY`Id2g|!nq3hcwxwB$YUeyNSo`!v`-6mekiu@qJW&N2XW z|Bcbw=@KSONGyuHr}uVZ8W@936LDe%xBJ?s!Hoyj(my7>VHc8!h8oD(hD1%iW%fO( zHh0&o=;eo_krYQEEHPKuKm;Q*E;9A5(|!{QHQ94XJbgi}%qEwaBTbpP1DBjx;zwXm zBn tq)d^;5yEZI4VRQ-*tLLXJIP7Q>s$dN&9LyE;y^Qtz+RZPfy9EWtYq#$?rW>4M~hx&^uvKY(>_o`7FWhyEy@3o;sJ^PIspC6JH*%I3Wje ze$av)r+0T+J!9$I5En2KxIXko#$Aar`5s(*NUhns?}q$1G>Dzs?wwZ>&T}Gk>2{EGvYJ`B88wynX3EG+O zJDvDiL=Ued{^@;5iFDLl@war>|H;0~%qe9XM3L)Vv=;%YvB@5B?^lnWtOXfoXY8^g z8WUk^#6vlvm9madwo<-rib+gcYI#?-D3^9LIoFN}OiHmD1Wu*jV>|;PaWh9~Z@HuLZ`^~vxz6X+r%|gT`Ssixu9ZZrB z3%A-Y7-F~9p)3fxCdsce%T+{G5H+&39yw3HnyoVc55>=N%lvyI9E3}SI7`jVdZ|NA zbaiMG=qN+nsD=cP`yFI2aF+2s#N{Qgobf$FTqC-qU+>AWF!7pGt*46~&dV1SUOCK3 zqO`VMysg$>q@zz@XZrtd z>ipNzx%;$qB84zZzJ>zj6LHoq@+^C?+}7{+hm~a)0IN$#+yho2lJGl@J1tNa zg*P84*I3RfeH0qG7hJ?{$na^#H|i4RasTYuv-PN&1(6qc`aY#}%GhajcbLUiWa=I^ z|ELvA$Wx)0Ck&L{y#}Pk{(ZeoN&SZ+aJIb6l5-p59&#_WxwPJJDm{iO`ccqyB_~P^ zgU%0eqU0ew;>P-f?N6x23Ta>zK#;Sbir>gcsPOLb?eA?cEV71pT1^`JGI>LL?L1SK zIhlf(t-Ebo7JiNa|J*{9R$BwxC+?D8Ycn~2mOhp!RFZ&NuO>iqI5TgA@j?&Q7R{d7 zZ2U;SoF_=0JesHGrG>}J9O?h{6n zBo{H#Kt~V4kQDQqoS5Vd@+5+b)g+9%;5BKOc4Ehtyr`GC<=uCpkly#-ip?VF*FwXL zPfc?V9rN>)i3S)5%iWVcJ3NBB+m$BKUXXX|%BDxmDy7@In@J1i!0a zHN5%cl{sCT`n*FjeJNzI&QTwU>ER=(8GrCQ%dSArZ0{ZsYiWxIQ5cYEa85H~cuA)B z(hx9@i%X^t(j?-Ui%F*U)0oamn9WM;f5&f6y83D*U8VpoK7!id-0$K zlZmmMC=(sVDp155YskSSX|s(P)pKUs$F?^c|EjV4T*XUkEZG~)J%#6d_f(hoYPG|4 zhR#LUH35)LsQ<51S(owYRA$n?jyU>R2P;jIAceoVHpj}%*{m$;c>Yn2q?l}F|5Y}# zyo?mJ{H$0M5`tldtGYx07UImhert@ccV_Ee?#j!zgDV319&Y3%6=yZ8PE-A!gB8Mnt{_PVzkx*FGH8 zr>u|AHeC0o_S*{bsPI#o>sE3D&4nHj6nfW;FwUcSIALdyaT)4C10D zw}wR?Aqu8RV73mY+eWg1CojCGZUC)A*7IyWTk~Z3?;yz%HR~C0oZ)+*x4OkWV`Zt- zoSjy=-TTGsTMDndbXpuycHESsg780)e?DJdow8f*j{feK>Oh$V3FB^AUNpd)lD0`a z;&oOGYQbvFp_^t#==^C;m;qxL)z8`vS?w+_m_Z20ubc7rmAug(`HPosrGCHcj;u4( z75P;r1Rwvf-_k`NfS|(`VKor8Di1l&Qb~0Vq;X5mqorNgEZs4o(=B zMEn*lKS@&M%-rAWf~Nc(+LKz3Cru7IXGN)Ze*H*%E}M{E-Z}|vQ$$&=SiDYF$jFi` z)TBVcdvTtnGUofO5z{C&8%;?TtPb73c!l(!#D&6?20mHwuMc9atfUS+Xw8eUW#d;; z3g`inB<5tm?jL3uJAAyPZ+4X0VUp113tvfL{lwKRFg3io6uJD$m`^!3F(C1kn}ruu zhH~E&UzFu)8P8&L=vWF|Wus5BSZ8QV#lI%wDa)BlE~=!XHLF<=`iw@G6|)}DNLb8% zUgo3Mi!QWKlk-hzc-HJTr%Mw5RW$G>?4r@YFyZZ=W+O)vc8imb!-A`7wn=waZfOqU z)${1I4(P~9UX=`E@|#KCQ(IowYN9JCGHP3r&X@$7vicp%nYO|f)J%slj;%)9GCd~x2Q-RDVeako#grEKT>St9E!;tDRco_GnnG|UWs2FaVe!sXd!{OjrL=<6w zkyG(5rf@iKc$P8}M6GiMe`cf7if^%m7>iuw=izX?lU3O$;==N?3n@0Att#lza3QK2 zLD2!K>Y1n*O(^3n8qPLSmx3blN~nRPwA-hQ~Vor2JqE6%OH|Z)X zpBZamFbDRu%nJpgYYgOx*rm7di!Rgh7Qf+`1hzOj3Cka(t_kOg1BQpt&%sl& zitaFwhyi zvKfKKe@>_<8YkY6@i-VHj^+B&iW^a%Y*nPKU*MT*k!zl7*DkAUeK3QJ99sz~) zEq9?*@#FM8K*33yS{NWZ!i-2`fY^vfWx;5Ref^p$?p&tSD4v{w^)5nY(MPp8IU0p` zMqw45#x#gwOE@0fAIk;r#*HhYQO`yY*k)e2N=g_HP9g^Hk4Ot*Edq_k{qIfQtqRCY z8Z3^KEx=T`lQ~bn&Fd`x=QG*jsf|D>IrsjE&B%1NFECt<8WZj`i2sOBK&bqVsjWrS z(-6bZ9v?$&eLy;V<@V}TP8VJ;7QN+0WvD}9gKEkJWe1;N3(WJS3QArDy~J3 zuU2iPB34QYz3D&u%*Zsh^8 zcqg?`2{KY|5tt)MGSX?boK5~hm1>n2WSB}Q5a1$pD%zzXs47N5rzVXQPgAa>5C-AV z?xHh)(y_G266i)G5=w;!KA(9YeT7< zP{!GK!d^xfP$!N2F0Q{mCdfk>#651ZGDZXu>! zf(xM}|2Er%oJbmerRj0$W7W&h1&R47NlLro)h*;nF~}3#ay6OYDCrJ zY=iqOmaM#uBdrsJJVaQ2Cl>?fcb1>+HY(#yc$eZ~69f9b`H%Ig4N$4bkD%J|xtALE zUxCq*U3gi<+mJjK#r77Jb;SdS)!3f{~PGsjRU~>N(#fEc82ATKYxr&2E zBLXUeyWT>nDI5gF=~H)lPs2QVUrb3Yg{)c$v8hn4EKN50CJYZIaQgSv4yCeFytOlB5$CE0SllG_m&W>5~@r z@=Uvm=G-gGO(9Qt0}+4zicUEtdv^I33^A8_f&>8>QgSlEY(Vm?!sduaNso{$`7KM> z-Ne6W(%P$!WLXlZR*4dfEs}Q&6v+n3q%V-0ca$U>|B;qXNBxj25mzhIE0F#DIZvs~ zJ$9%Y-ar-Olx-RLC28?QZ2S_lxGYYitQf9@ta$^EKENI2E2LB@kbEyE16aO_t^sTnCzys{FM-tyK0uRIdXe` zkmIrR_hQm*1;eiFXwhS(qfrF~!yCH3Q@hi4y+4%_!Q28cWaq;Z>bO`94js=gzYzsV ziY3wFMLPk`3yjn8)cs;2wt}NJ_Hz7@G+FTAwkGP+MeqH2CzAdE*cXO|j^WLP|ICHw z*L*pRRECm5jOYQl_4*Fney?HMKQVcF$f-~tCRDq55LU;a>U=%%(PcN|o-bi*Xye6= zhFR@@VOptMIxnd_AWm&EE>?OgxNhS+^g~*<{sO%1A=n-&cQGn17jdhk9G7uK)1tEz za}!dRzxQ~98xjl2ZId)xiyZgfao>(p)<>rY1+aztop*l2G+*SXEfA_HL0`gZ25O}eMk!V9N};>9x^=wxLSz^ad> zl3LsfPI~muyos1s{lFVR<3vOL@ul-q*`Y0>Fo;FEy9SR%XbP6IY0|)1}wU@sZ0e(RYWT3cK%jo5aQ$};3J>{ zG_Y_DT+;&PW57OcmhY(AY6-Tko6(fyrCr6yg`&< z!741KX%9q!5!!(RR~v(lKF0=z>kBpUI{z>sY< zeE+%7fW?f#O<(?z##kKMoJt3CzjMX3&&jj8v+>pXic={Rt+_qT=BItF(3_?CKK~Nv zGTkN`oM5JUjJZN{Y;}$#FzDZ9=6XzkMrhp3hW&VJ3AK&)__D+R4yA)D{xEvO0tV*=;*tX_O<(M`C|uoVtYxS>WOISrq{Rp{c=|w7`&*> z*7AGVBJ*GC%sZX^at~gV{`~S@rix>IB=HYo0sZ>!gS)Pgk>9Di0pDSS+NOtdpQ3~Y zR=jgq6f3ffq$K4Up0*QqivkZVl}z*BIWmtS;K2`V zKAesnMGuO>cdi;+*}8h+Hx6!4&ui*&abNHFp>ETiGvhG|JD-55A3_>|sZn930zp30 zI2-9WZlrolWg<@aadQzRi|a{c7=_x(N{f9}G&BVmz$YV^m{Nt1`btXtVx*!H%HM^~ zM3jH{_&hu>RmU5A6+4imb(V(+ujmFOXq9zcAKNUL<6&?r*Ia~RAM(ZTBG|J~gkC)! zSl(Gwpa*tZUc!{jydPX&9q5R}1sUEC3Y*xv8m-uz#T#uLH1xPaEhN${ts4K5-!-{{ zCwb)nT^M=Kg@wMT>TKDxYxHy0RK0o_L!bcJJv0^N)YO}q=hvUi-cTo_809Pqa zx@Hlc$+agxhxt5p^nb6a=D~lQ_}uk+W$^|mG*4qKA5z=CpL+<9FS>^8x=08>3irjRfA~qX__|Zclj=AeZ%cl{z66 zCioN^-;DFN((P~=Fg=-mJ6a_9otNSU=`V%!RHo3&DxM+G`$+rqOqmLl>Rfz^3NxW} zItnL*l4yZqlp;EDs-ITupAN#Bm+uW3XI9OS416?BVV48j__;Q3HyY9q2IyWhIvtuG z^H_41U3soG{^H;rm7Nz%m$wTP8vA{nGRCgsq)V0bE=WIvU1%aCQFu$5?uAXg^L-+> zn`y7+<9_ySp9%2e_q=3Eb?k0~{y$v3V{mO<&@~#{wr%soc1~>DcCurh*tU%m+qP}{ z#JqXl_ugAyeLv>twN}-dRl92L(cQJWN6#&G?(>W-@^V>CY;WM7ETa!Cv^92q{8Lg5 z)PnR&;IFgvswb=g_?%TAkI}1L003rRu05+Z?kg8ZUxtrc>hX{aL5iM@^0a7Qw0u4^ zNcb)Cu3YQ;VN*r~U*<2u_dFRo5)&w8o?Z%`AL&Rm@5y7+t~SI;3KWycpVGxGh36}O zv$(ziIo^vUGHg`iuaQPGPyaq#GFo=3jlZ=aQvJyLzkOXV*JXAtEFXv4Dgpj}*;gOg zhGM6P+9>l@QhWzvaA^v>z}x)ubWJ{ z;-Ncb9NoM!)4Q_d0o8FN-8t`#LqRPcB|K#U0!=!@5#0T^dRqf1byS$EIAqcgTE2X6 ziNLZDB?cfrfWzUfq4(Gb=y_{;$NTfxEBs;?w*Im58ptf5vQ>iizoEa~DReqIYG}^` z;m4BQ##&vZJQD(?$4dV`LU9ATI{G`+Eb8zcbf4*Q6cyGl&YBfOLoSOwTnu+pW8pbY z9T%W0JR*~drZr?#>US=XKTDSpIBc?R;X8KM?n?}Q9c@3k0^q;I7M{wtBYn*^SK3T| z!)^47lJfN9^rO(tZ}YmsxBYXEu{L^iI8Lsx%kX9$D@Fdf z_|OE7*V@&L#C1)l8fkKwJUk@bCx29HX@&Erq@&aEz|7ZAL+j|9n9rg z)g*r_Fjd>-0YzQ`9r0KfWx}1VAx=DaMRRuv;w#l9F~~(1Q1fdr!*x$9+GUi|61nZM zrJRc%b3*GBc=*+$JY~Mryll@K+v+BHoK26RQQ+Wbk?$X2jhO$4ii!zE5DvsXs*~D! z9^7A+Q1Cm88&~I0$qC7a9JM;o=@4Cq^Q*F3PM>Bf0f_KNWlHf+^8OizMOi>nBd1_j zb?Hv&C|!Bp#QCYQB`Ox0*y}N1rRkHbhxTn`ks=`(Z2rZbQ*|;IE(={wZCZ*P)huNH>XQzy(~&V6Qe&#a8Wks zRsWQ7lO>vZp2hDAaPtC!jmK6sU0B07{(d6fK%s>A0U}Rm5Uf53p+78)f~6Q~@h7FS@1bU{iX zq7te@Vdz~{AA;Y(fy4d^NCNa^ii%N17MBzv5-CX74`uf7lTFi;P4iSB`?RJzAVNOH z5HHf|iCsM5F+rE77*6H55cktvjL0Ku^qEb3N0JLFplQwPodQTTAzgfTe5qVkjaJN zi@x-+DqS(Z1p#Q{(@w1T)4_XZ$K%+}%PXMVL|?kLIt$v$w^q7lzDB7Hh(N?OM#2h0 zepytJLopFNCD4_UcqSmn!YJRL$K}YCByQ-ZWvP-S3BiiX3=QmD4>`l5P9fCr16v`} z_9IKsSZjjqD9;EAve^&mQcO`Q091c}iVjJx_Tf<#} z$Z@X(H&SUpId_smyJ|c`*%PMts#x(D#e1-zmS)D&LJwP|$IA5DX$r=yIl>H_aYMGz zXwo)M6V*d`^{-LK_<+7YOCqSoh}MlC8|8Y|W)`1LY>i}207w%c1uu#<07CQQg&Ayv zoF3*W!Eek>7;>yuC9@ySR@p2zsdanEA)KGIT?9_Lw0XutE@u_>Aoin7EC}t+q;`x7 zJ7&zrQg#!Kx%SNFy!B)McHm^@dF62FcEI|+tivX+A9o>Q)6^5jq*?oxU8UD<)+Y02 z!oq~W?Y7GQ+sy~ys@?#dU=mh2e9l*VxNs77(M7fSFcP?2wQYV(z#SE73cLo5bjW)N zwn!xiMDo{=25%UZ;-Js5ekz>UqAWHuCN zisqoV?isn&(*FhSTvf{iucBQp#(@M2a>gQM+AxAJzK$1g+Spa(1h+1N6)Yqo3Pt)@(*%OS1a%o6sAv673= zP4Fn~U@`{~ERBU1?v#WH<5|XGX@sRKZ0#Ie;Z>94DuYlVl85)pf!_S>taTKV16&xX z6-WX~$DgB$m;oWJ;}RS_F6wVsBpU;mPvIY*!lERUQ7P`MnR=!29=*i5G>Zl54kOak zcCP`#G?}h%Fz`WRKL6j=`@g#L zh&L!E`JZr{$krH95Z@YfCox}>{N5Ar%I|V<+@G#KA}+=i3T$EW5nVoh9Q0vndV3a| zxBxQN3T~OG1a%J6DZZ5yj?W!H$4SNgTh_;&XtaZk$)Q+n*{7E=FDc5eu?p@Lk2I4@ z+h${cR+V&ned6eqm~sOpclR6Yw4FlV^>u6y2N^+pkm#C8&m`-$X!vVUUPon)Qf)kiF;4z>zo5NSdVq zI0#kMcnHE2%PGE$9vkDxz}py9K%XgULkF|=)LA!65@#0rddL%ixj-I;W0&gTHeBU# zk)MvkI1QI;wahN&UjcQ{@A&{jHovo1^_ekRf@*3W#SbcuN1h-*H`X`urGERR3hPXz zo)wK+cAr~tT393#U|lwJrP|=w z_-+Ozst@>bQZgte(!gqt*zFlW7ekX&-S9DM*Ds2Ghz4`TqyrxPmxgj%c3 zQ08=-NZ^S5`FF6Q%<=RS+|HtTa9f7@lXU@~z|3QWcc3y7Dt7W(lWqo+(`}**(X=RV z+*;rlh|;4}qsU;zHP~i_oE>4!N=DJ8#1m`wDeG1u4E&)KU#KcSfuhm2c7yo+8qJzk z#DOJSqJN$K!an-_KYmh1A!`o+f?RF`#+7smgx8k?x`u^!5`|x+hk(%avvfQV4X*?6?(}>OOs0J$Uc4zN>ByTaG%f{;C?(mpRZ3Q88&AX-Yu!j? zSd6o0H&Qsm@m5~5eo;veR?@|TKi4dYKzyZ*(husp?%>0Uhnl%=w~F&lW5v6Epwp6j zx~T5f>N~=JW_^o$8@%LBLX8n276+M!7yw%r*$X~8tlTG7bA%6A9Znn^uYY0^6dacn zl$IbqBBO%zWruCdYw~X&__bJSlvc__wfRpbN#9qt?%OgpCq6+bqCA!HsYoGbbdfCd zEcjm_=JDdh_@j}B$5~;fJ*U2WmyT|#ut$y+!c-hPodM&Af3CH_F6Eu(8C&1!Th=d8 zgwVSR0Ylp=T$yu#?`GnYa0Ev>Q{mmFkXtkWwsJpVJ&WISZmO8?TZ)b+|1C;^;dXex zx~@b$(kcM#{beelhdU6$HS_5Ba?i^JT~SnM-n}IF#$@5{rU&pnvNk*Qq}PJc^U)%Z zTJq1mZvb|N&X@OLmHt}>lzJvUHE237PN~?%1AkuS81@k$+2SqM)_P+TxPwqOL!0`K zW%Ts?fW00cVW4*9a;&|uL+Tmvrkg|*2Y zre#MbwYCWW@kN^0RflsBvJ(TR0K8P-3}M2#J(tRVyZdT(B1=2tY8h(SK*Ms)K}z?WWa3#GYxdZCTodm$oW<3GKBvf=g6P+>w?~=;`q7M zqLvu2lV0g(c5ur-`rYF86zf>h64Q{a*6R6ilQFQJ!c_QXnDhCMVZnQa`ExNXZDF22 zmKKyRoi+$Djyznbq!M@?8=r5*#GD7wEM%RfXAr6;?CXHoFU%P(YF)pzD0YZ9uxC;!uko^PX4nyO`+QyBi%rTI?itk*sF zskFCRrb$4^7yAPJ26o23qke-6bwAT-I6rd;^!;y`NKVeyqwx|1YwgaK2kLKH^W9Lu z_4qJ6>E&OJ!Ob_Pj;*K;FYM=y7#=K>FXo;7KW*z#zPgO>&dKtXjjzYM%FpoSmxlWM zq=a??a-0GSDKTez_R|Eu?7QEe4cF^75n66d#o9E|MhY4t)CEJHy|N>*dbyMcuHpMu z_!Z38w?@eg3M+QkIoEf+_xT#v-i)9>@#mm2CMsH%Zg(s+L&ug|D1C`co2)Xff=;KM zpqvIpH=(p2Z<(-khpQmIp4^$JzJ+sN`7>r^mL+N0fyz#!v|^b12`PtV2Wo;miyaej zUvSYHMQ?CXxm_a|abfJ@%k{7NzHP2$#djx}>YIz$29NECBet4Nygl+wu$`<0Icf1Ex)KD4GkLlxbq}q!51|qW{j&e2^r+oMDq6jwzlcjc@u)uP zBXU!aJG!|)Kp9zaZ`rX6>+4>>wfmSoZ(dwB?fJgiXpwZ$JmkLWoLP&6vwml1v?z%| zh(MtJk@N>Rg4}|B{Dly3;VjCv+xad&B3>iPBJMFH{D*}xj(LykmN4-n?O$FtT6cs8 z_C&2d2@GL^-QiB*%y|FuPu7HL8C%2rzdXmBtU)#V(nghRjQKv#t^^WZ>8w%jH+uV| z_Rpv-2JVTZ9^&yi^ojC;AhatXgwgpr{poAgNlqtA>?@P0m>QUkJ^>%tb zI?(^}9h9UR#3u}INp5o6Y>rZebp6F27tEeWKS{2Tia4P_b+7I7SWTU+O!<}90mE{a zkO4ngBb(g{mK$xnY@k-xu9}%DR|-xDz{3akq_{3VG1eEei#b99?ZZ74uOUqBJ$VxG zxfbVC(hcH!D(QQY+nNySSc)2lvD+zZYQFi+*sOzsm~V6(Gu2DkW>w}8A|D1Kh@ z;9VU+(p}p1&L^#n3{WtC&vC1*by>H)^KPHJIeUbZRsmslQea%SOSLL3hFbFj9I<#Q zn9rWK3_gnnFtw^MXwpL6V2f_#Em^i`fzI(+S)b%IH>8CB(N}pXaM0~JsTH1Y>DCy$ z>gb45$?#5FF)YaHG$ynEO$Mt~V;X2QkpNE5ZI?Ka5W=5K)zC8jW4UV*Ccv~gBlC38 zggVNqqh+=yUd?no3G|Z^jS&DmS+je8yvo;49Voag$lY#FVYAzDcw1rJ6P8Z%F5nmY zh19PG<$rngd$&7+#(2!Cde@^OI&Lu>Kn$EZAhnee^0r28cp>pdAT_&op#Qu`Noz~) zrbK3Q(Tu}OeI5z%Ouw~a_u5{I8?hon0WXvrJbG60@k2dG+##cu%7D?7WIPZ9Pppi( z=OD#$IEXL?jUx(w1`Xw|v-l9{PfHVIn*6RW;7KkO;Y@hzvS1EZs(zb1CsYHDS(O&( z~(BumW z0Uw7-|D0>emT5_oN|p$3FPmhpF3QCA6G6G+nV);Jazz3AkY*3A-ljSVCUKFKkrBI+_lZNwL=_QariGef zkZSs0yz((0BB1D1DkMQG6r#~1XrdoA<-Y)Gk|gL$Wl7=_H?9v9CWY(LYOz%mjD!v{ zArN48Ns_!5LT?#av-F4HczQ37DwV^Gi>%d+!Q`F+iEc|_z`j%hdUI(E)Kvd7 zNH5kc|9M7B*!ALtb(euAvwDpQ{g?`yVEclVioAZ=@yQP;Je)VVw4g7 zV|AsCd{PT8$r0OeMz;!(GcHNM2)p?mSqKeW(LqL@3P^q0xExS@T8Y&2wMtU^)rPeKUuw9_QAMg)mMKdjc#}4KZJr0K{HUHSeDzI z;JPS#?-u8KD@XG}%67I2dxq+Ij00`nc2y z?~ve?)fO|9mB zZtnp)dw&|=$N9(998rZ8b%F-{M!Znl9M0flh=ghfRYqA2X(*0?cyrOs%Z7f zT&mvNbCFkTyXNhB$pSP2q|RG@0E7bCY@a{I)*zw%(o7}p7tmW7zHxU0Kq$Y+Xz1T_ zM2~E#MU#fXikN$I;{tw$Y9ijop@Pk-OH>tOn*SQkN z)DGf^gC|d=hoWmwJ-6d%Movv~%;*Bu1P{{{?+4IX5dR~z^TfWdyA!JHT7&10en zIz2%eMti>nM%lLjfr?V*<@t)57l|>5x@m=7v0s9%fl&Mgqo@ZTXvq8kW{Lm;F+llw zova!B2Y&XI0z+HmBrIYi>osiv=u>qdWsd4Kem&l$16{6hq=qkc4KdV(MuUQChzJUy z@&cUA^V~}LLA2XQttwo8Srd&5uJ?uqGzGj_rT+j3Qj)$a(8!XhV{VwQ!7W0s`d?6H z)t8Ed-_!fET%+M3{2DUG`Sv!DFXh7l4*Rl>ICTCER*XzIh#(H4im$0ib>Pr|wGzvl zGAGUSH*;zJwpHhZ_gsM8)s()+H|Ux?7SZfUiG`!q?%(&}SY!_mPn8^4gt#_aYdf8J z*jkkNdTzZ{>vg+Xf~(`))%uwWG<6r7XgxjI0@ITsY_Cj)dHj!NlM%ZY79xl1QS_v? z#jOy-PH%Q6xUC|89|BFgkLP{>JiudUOJIOUr1>8hgp1vV{&M@jBf~;omtL$1_gWJ@ zC5w)fZVKZ=OE2EcUvk3-BO7B6X7_A4a)jLJs9ed)IXO8=yE*fAHamBn9aR^@`xG3n zr8BjlXMUZp{(7;^xEl>CPs?J2w!RT|E=p^G!Ymm^JDrbPzq;y?;fogm$S82JVPp6q z4PDN@kh5pmkai%YH=cL1p>?DWv}VCcA1=9kmrqeD-pX z8g-pqI|YG4cR%23^b!?4Uku{mTrvT9@cx%*D>IJ(IS}m_9#9Hx&!b4B8hHt{D44an5wWomRaPMqn(?p=i`#jXj zZ2xPcw}DD~7u}6U#6;^4k4F<`LqSC6C@t~+!uaT>Beq>x!^CZv=^!!X zebzAR1XP$QnAkj5@pRf-5uJ$#fqI8Bk|4VuVP`QK-ega{}if6;JhOfX{f zA2E{Uq$DC_2Vf$zXZu_z2W-syJ!&ZnvCqV5II%4#?~!$WaR!wuDu=L5oWzQ)PJlOa ztU^WNd1tg=zIH|FZGox1SN+|3U#J-%S!%sX{+oc=y~kMgWKkW4&tCc?;xqmh-hXZAzH3TBMBnDOe=UiLpeMHDQa*B*Z8^Mz6tMo3{ zsb%E?a(g+Q_8BSHIlNrb9gYN)&M$1H1x$DZz`FV*lxEj2oa4t%Ew%>r= zqrFy10%cyO9vB$MLk;4%%OJ56o)jl{|vONnpiPETiw?tA}p3THb$?#S0DBcV@SOFTaZ#OeGMfkew63#cbB-Mr^8Kv=t*rppaV6kHtrzKc#@@rPz-Fl}*;*P?a&$6oMLmF~Lhw)XKcn^u@VhQe|l-G>Gx5 zrOv7kLaHR%bEB!-6#<^i@SUQ~L3Ft3&5zi;bA3O8!wh z*Q=0xdmpI7aC|im{PZY>dk*~Y@t>a~sPd&a4^hy-`vWL~K%(SG$s>Zd(Y|@q9Z|`s z(31_arUB(99A1-B047iq(|5C^alz4iVn1+<#=o~*w!G%V%{0$b;-l&{k2kv>&p`+E z9InZ{62Q6O^AP;7Mesgq2lF+9=Biq0KkoN9*YIv$gCQ0>??+-<@oWtYHMvhEQ^ z9WY=0R9x%=dt;u46-8!c5QgwXI)GEK@oHN~&`hO+|LE|E?a(b`lG!?>Zj%**m! zFUS~#Y%zDw*Mzm(lK{f0_fX6CD>@PI}ikXaUBUZ_rppj*#K?Ia6j29()WENp7a zE6V-J^pY3MO34yT{AEV=SiC%$D_>g8xVZi0&qyUf)~m2_(;{$FC1zb}a34L=n8 z<2HU<$1*aQ2mfBGUMuPS;EfkHjb9%6HgtO3&$Qiz!wq2>^5ORrPCaY@Qhw%yVL5ll5F{7St@QjI2qu9hK%G= z{Q?*6Sk(XsckK-#NQ@k-7okP1H?JmK?m78GwwKKU5{8B<2oA04|K`>vVbP2%iP2Z- z1}x$cR@!~*^Ekye5y!|lPkF8aMB0SUjB!juJr9J3am&ORO{X$5AjM5kCey|$G&c0V z?gq69N`TXW>I?1>o|jzh0YpK0gjS0P_0W)17X=d|$dkS9Y`ED-&AehlzD?$Lf{R66 zJ!$n9*k{Fom@O8P6eFJFIlbG!yxR&ID7rO>c_k3dc);6-7h~fK>(~Zg_W6i_8`BmS z)2FAKFK31>AY-Zq(2=dX6L*t1M;8#c$Y5rZ1Ss~{#LhGi>^R%_owyha%ih@2pCZ^tea%Rr#O~059 z`n9N6G(2WHkCtro%TyNA=-efrxfF}q)y^z6Uik|3*rx`6Eih-Rm!Ys|J(iAxT;%Uy zIV#CfiJXW z7(@ve)$OojT~M!bHKaZ!g+D%64#;Ry7~GH9ROy5NF|A4dusPSvf(T)O z%)=yISg$e=DAX@-CMZLofKnc~|E{UZir|QDRW<}cCi2Wugs??3deLFA*e7AJ$Q_12 z#HqO_bN+jvnkQnkgfK)UyqKLu zF%v5D?EZobh0!f6#A8&REtZPZ11<+yQbZ^I{DhKf(gSVT#C^J++Tr|#9SeYchVynG{wJid!|KeBjTpJ8?K3_1o+(U>6|?f{bII)(7-#;h_l2IYUkEl`65v1p9|R?_FJoUF$zr z9r+)PbSwjBAb`SRr4UMh+~`1R(+O;Q-@)gDtQx&KN|v;n)O~Qd1RaeKr=}bQ{umTG z0e%Z~+xqq2;CfSxF@ zGm$sY6n?YB=qk;apG`pN1Q4*vSbFadKvRHI2*Y6NK3=Fq1ML(!xAJsI>G{5^dnFTV zo~o&f5sJ{cy|v0sCnwO#7I}^fK#J*w=>d987*hr|bC(id7Ce9lm)ARok4IJGLcP4q z_UOdzD#owoM`8vfDc$%*d17*ax$WYBQ~2s95S z`HzSY0iuYy`wtsjyzV45qS9BiqvqE@}?2Uzr30*MLCBtV!b1f4Hp_DYqeI0FWvjrnP72; zEEATw&;))5;b4i?TdZuNw7y#IfbttYX(u#xE`BO&9l-VO;o_T7A@CaVSE^4ms^;Ci zoshnLfhx^nK3{4jvEAoavST8eEZewvMUd?VnyeuzFjhIuJ}y8Qyv{ZuklG4Cki|Gj zRt~1b;+BFcZAOwa&p?;~{ZJ`4usjkhFpEVzzDc5wZVqC&$Xm9(mg>}wa?AQ`NcmrB z32unXG!Z5=HHdV}b@M=@6j`vf6dt0P z>qW*04+;$m2G(H_)Bovm{&@GFo&Xdk@OD%#d_} z46H&i#xUq`YT#o0;Fq<(*YuOSsvzj=)hEa=;uF*nOS(Ahum0lyN+{|rr#8Nw3{6hX z2%Rh4nHKoX zCcCt=)TSDi_xjc`Hx+94Kp5=SQGyZxQsoSW%w~2xFmm;mZ^bk7&SV1~!$E*WE=2D! zBH?xFQ*ygK2EUbn(B4;pufIpDdW#-!L(i&EI3?hj=fh!zc~wh;#V)glEoC!|-ZGaX zCkv-TuwEp~yJr93s?#)Kb>OY{(l7!`I=!ABKD^^Rm5oM^I`IScJB*}u)r9~c;gC#% z$ZM-RvM0;E`mx+ZeYV`NCh;c7m${{{hBuIOvha3FhVHX z(EM47;m(DXbyST0=z*P(`!*y-({9zsBzbjcTu-*3M}f- z4t3jLu*eAeW^}iIB`BaIV|xQAEobOUo_c!&eigjYW!%l^#|`8^I~c48Q{jlaV=%<( z$9n4k)7;*BKZ-r7IsAi>@>L2E7K+QX)(&7YXb=MXbTl?-h-Rr`TJwr;F#LJIv<8tM zSjx60-E!d+UQE-I6Rz?0bbsFxtcIhPUNPLX;HHy;*ISN5cstsA007vn+=ZGLSX-WLN#r@9_02Zc69_5it?M<&g)$!EgS)k}{9z7OR_r;$AI z*T#6c5=-o_o)l~UCRIf^(a!i627KX+^UtCpd~!A2a?gD78A|4TkHg-}GB}h^oaMR~ z_D_e;DjMRpxkSb`xd5*Gsu&pwzJd+DrUyF8#y_fKlN(g#UoQAQ#W^BDvtuPYL7*~3 z1bwI^C<5Z)qW2sR;3;#6{ImAB=a8m36j!$e2+d~+wxK2)q7Ak*YZRL3a=9|iQVye` z4Ko+ zxZFUC9OHE_PY7F8`82_jUj5r4N;9bJa)I3e)%Wh&v?mP^(WD# z@qH6#8$Ra%rnB54+_$mk<~p3aH@?|~?WWTd$F}{7{iK9D>Lo|@<;~){ zZD-NNqxQlE=aq8|D(BXkn%u**%L>QL8lRCP4Gb+itc_D&q>*@X587VPM$v zrQf6CatG+DdpVKk?sg;nv?a7zBk7BoQwe-WKBP1=MWDutYWOQ7QKtIs-Y0U}Xl%OR zdujc9audw%r!#=}VJYzYxn--ctK>Mbiud+&(h*6fWumb;}hOa+AI8XUnJlTJW0#z5O{_-?Lvj>DbZF6H>kek?|xQzHMV&?0W za*hJR({QeMil<-T(EK#Yc52S4?6w0_SHyWPhQ=-T)No4AnqFk_vTSVxDKK6UH(Fh1*yA9A(m=FS6f#-a@m4Y z8bHs_$TQv7TBxaWAF6fkL3Ahh^blav;|y{q@)3j~a6IzR-S&Ccp*dnQptJM^`P3|L zz^wiEJ3x0ChVHo14Qlu`~i5~~ls;n|p+Bxms0Paga)ldGf z4mO&`0p6ZFIkB(P;BJ7T0)u*=iaGL3++V%$i+J8;Gtyr{869xr)S=9Svk$)RmViv5 z2XG0ZZ5>|aBiqp}GyK)(%al7+9iN|$LPHC^*?){D zbB@m!)gOLO$4k5@Y5Idv+j&uZqgssgG_%;qYA;*9Kc#5ls%g8rVjcL?40%5lQ$moj zJ~6;C4xIMCv&n+-IN8KxPz8l+;LC!boH^x2eDS3UsT@<0`mpE5|re;_T27# z1DQ(39(ibB=%jfl!($xakMFi3T@p^l4Bth-uf6R(!P$(fS)F;N*CeH{Zi4ND@cUr! z5$N`kib0`Z>=yrPxaOYkZFR~}NK3#U^m82iKXF-}6mYqo>=T48h5%_Q)LO1TSLIRZ zJPSv%>r$cUl~WXn=@p|hq-I0Y#qX1iC+U`<1!wcVF~94x>S^gWRK{{fG^m_ay>iNd z>dRy??|qvt`JfyllpgjT!m;rhe2Qy*N;L%gL<|K4_8SguL+S;nQWss6i*AnG7erd*a~%-zeg89R9lOK8x0(=XzSpQ z2+i&Sh(ik&xkhC$W-H!m){t&gk0tJkJ&DpD$7R{!SZpj8(=ZNQm306|)tZaOc2T3Q zlJr0FmY=H$xef&7p0x;C<}9;lF_sBjhC~M1U$JM*Z{{~SHi*e44|^YaLAZ-z2sn!~ zws<5sE+yQY{}udpRjfZ2JJoi?Z6ZJ|8J`#ipt!5v9@gkNOgZ6uJHoanrl&%cbmVr5 z6aMPDcxehoqd>{q7KK>Mlx~(9=9NEAu#Nh#RTgWI+rN+}&+97(W8+HROf5g`o|F!R z2$_{`o0hrI{Ii>|-)Dvmrv8VQwdmbM(T4e2_IjBxe^nSRz0*d5su?Msf^h>ml3p|w zAjNFrOzxe7L{Hh3(}p!fLBFBH+is7SOevtiAt6@wi(1PrXGthnH8GVw>M+WAPq=-7 z4RN-Ql zX+LTkAKgq(>dsyr*|6f_hHv<^1XQvNFf&6 z&la-TPSUPFPuvujKR>~3Sm&C!4ZrhZNiDCH%}pCDe7+djvSJl8>1L?U_?OO)exANa8t1leN1oC>=>~+ZswQiJYA)9^E^m4=3Qu9tv%4Z#Ot?C8Aa=d zM4g=ce2OY8_~W0B-A#x7;X&sjE8BUsaJz8s*H5CFN}$b^K{C-};PppC!!&aYo`nzT z-Y^*NHpZL*sFyd#bQSpKw2?s`;Nuu>3HKQh2HptaQoLCO+~=qiN-Z!h zwk8Vi0ZA|lED#6(B%J3|<}*t(a@(=pQYmzXWoz&Qmj8ju5BS62KygyxpPK*b_+fqe zWP)=Q1DUZ?oc4lLp4rY>O4baT*&@3D1h|%u_~;KfP1YLCe|P}wqBFR8_Tq#2O(@9t zrGHNOvF%sU7%6gAas2_U%hA@bl~86_I59&b!9S`cEp0mU@4YT559Dp;u85W8$~(v_ zqy(Qq;sd=~s;v|AkDU&5)VWau9AO7tWB8B0|6r^C@euIEZ<~jDq1G6}#V}XZfsbIT zsT>scllsR4BQF9_fU&R#%uK>Bf&=Y%b#l9{i-mjYLK_$IgdY6<7X041ePs73*jpC* zsh0RCygt}!2e`;YT+yxIMrjSk(B*eY4EkBvQjLJ6nWRt7Ft2P%wzJ|-!0Ft?6P`~$ zy>9L9)J{(Ecmz8xcDcOGqlY-Mjo0;a;h1au20RyZK^y>}Nc+l2|KP{ z1}x7zT64B7d6w!K5-@ z8!O?00xN8(L?R-E=7wJ{Bt643Jq#g-^K-I{{vX=a$wD|mQkIu%IFbFo;3N^MK7asv4w1X0{CybGx!q3 zr6Pgw6t`GZ(#|?_G&>JNDB8}tq=`kn z@!)*2pz}O2uAtZAzy;G{aBEOtoncXE_67cfBn-9HUJRI0v4I7a%M~a+BLtMrtYN|h zBIA$%!EQ)ls3AJ}hn+Fxv)|T1#v5jDvN9WkeY032t&x29M_R!THW+_Ynut9rfIDrJ zcIU^Qs}b)=$diz*@qWR2Ki?_#x9^Z1e-j}-KNlbl?cWx??~`w%>T(%#QSpD>r0$oA zgz=9Z$kSQamk~C`cJug>Sp#Z^#?N!KH0A90CI}+uN%v#D|KfZB8U4l|cHLVbz9B#v z`|UUQ9Oc7d)IU<0{LPjWnGXWhqqq?-6!$TJXUmV&inW#DW*sx6ZDXKKrx-OfFzPO~ z8*NgIyEoQJmT#F*DWo}I9yzZb_qXg1D%x`28ZKznSwU*1xm>iy#|vP)B(yp*I*Zdq z@eD|M^SP@_C{9BCE`U)E#kKC&E@Z zZSj|)&P+a|vF=9o&N@DhxLRSRDj&=eo0pK45-_Kcv~8iHm;_Xe6zGuW3hRGC=B5n~}5B7FM-%(w7>9?CAMhLJ6F zWTW^Y)R4c1U#-kHdKN5^oLCs&S{Fzo6`0o2aF(8Cr{y`k=cU3z)}IQdtihmRRuhEA zf}M|A4DF(w;rSnjc{M5(dZP>~sV@&4dPnD!tclCjBOBl271NlcEq|7+IH>({kb&|K z6E3?U;laVZiGGRo*O*NLJP9RUc#99o>strkF{a9%Pi2PX@lF;G+Y$JOZ*-9ZE!f&& zBk^wuH_YxwkdF}^+sDAMaazNT{k)s6dYgZkgCKHBLFV+b(3{oJnk+&?818&^8%c?x zrN5dMu`;sxL)KY1bt)UFexW35ozO)f`*O#Ow?lR=;O6}U5?KZCo7@YjrBq9L+*=&Y z*0DTaWkQp>czuS7t4M8ijhsv@2#iy(Ch4cXAh1Ks>-B~7d)?C?qwho(h*3K|3C?(2rySk7Uy^m7dLX{x9ChUTfTV!CgUDe)h|q4eac zg=t-89;zEm<*hvG;3J)ix95s4=z9rOdfU8LQeH0L&^@jB zEDxDXHn~&)+3qqc@tcW5?le#f6ycoS4e$JK5WV9DwxY}hU)O)f51lpeb0LE@+owFm zLLG3n|X zMHz;5IYGQG&%z9j=;c#Zdiyet^&Erol-#Qa7R#xN!l&ha*e~FV#CC%}KEYe#i6}Ohi*p zr{Ykf_!OKrw4qn2RH#7h5eoiU19;aa=XJ}*B{FNebnR<1e`F6C31^dZU;1!DM(Nng zrxL6&IjnL#V}6Fv!CaW5NJn#p@SiD4KRr-Fv*Ju29mz^Gk3>uE9MTv#~y z?B{TU>?%hZOG2$M4JygCGL!xRt{z^?e;M~bT}EWl2}=CynCSpq!syHb4TBB{i6WQ0 z0YhOt9?~nYQ#L)7BFxDe^|%KyYaR&;mjvB#nH~1b)l=4~`vK(H#L}$Y@%)Z|FO6Y$ z0?Nq**^P0(6tEmu;;pVxM@cuDfRR80-kL4-w9sQ~1z|B5#PU`gY@9BnE`n-W&Fo`$OmBG6_{O9-}`y$kgEZXmsF5oV*KuV`>|KHW2g0k#Yj zPhj)+Kk>wblv+^>RtkjRBvwe;mwfOW$|@x9SjB$F?ZzK@fx@alB`GAY0Qso(B4|de zsx|}I-OyuyepQlat2dIF^wZ%zpB^^**mK^(E8@0vUV806#na1 zG62vjrJrhlY4wcj%?LP!Dx0s8nkSOsoS{TIpW0}g2zF*Yt0R5_fTBFMTL)JrHJE@f z!)q9%pa++)Q|5^+V*`vrWr&(4Ye>H)k-IH$QrPS4%9vwO2~ofA?>7huUQ(F~))cj0 zl+$#9lre%P=^hf;_5)*@D))IU{z}xSD+owXjTpZa0!NEn?IBvDE4D=oTo>TACamPM z?JeUQjxmvAbqt#T%0ccxZK)gYg#9Z}u?NJ*BMH)>k34_3YsVc98EB>XwSvnRXn^i* zbtP~8PHXEkr}$cPAS+R{{q0N!(zzrIq4faaX0|L0!O^Gfm*Xk~5ejTU8e3s;+0qnC z5DKcJbGtI(iGt6@+iG=wlWlJV2W2`+yX0i7ugDUib)S3Iqs2o07a~CCI7RcI-cgnA zsvHEdalot`E>Dx30koB-ZMC09;M)?ck-q`o#KMyEsNt7w+e|l^3*i@xK9hcbS0T;K zL;tn5IJ;s%D!ptkUxbC38)u)gpExbja%>-$jIjMh?z3iFZUervsTqe7vTkD&;uMqB zz+Bm6N4jg_*z-#Z);9E*aqd3G231FvUYxfZ&#F1Cl zq2n4UO=R-r5Afc=Zy0|R+QXXGZwiV*K}(w1RlS-gO;;Wzp@4<^>7RIWJqac_4H{3I zy(jVlK{AbR10s4f+LGf;6niUBJJ7B_r!u)pFLwfEMDm zTb~y6r+%+;{&|J)G^6^==apApbEh6$Ah!!v2 zh~5h8vZH$)69s*&jtp1KQ}KA-PxBys=-&s**e%G-nV4Jc3UBM|lNAG(($xY<($<7x^k#?!|qo=&jP8w-|Zqj+4Lrm|Y&v7`&}R zOTvTrT_lotINp=lhh^`_?jAocZLkGa?)5)}qSma93$ZA@>Th|YMswmv@E?BxQG+&f zGr&}}?IxUOicy6z2ElU3-cW3?nUfigvlzu<=o0of-PS+1GTM$sZQ)VK>)2G zzGA)`TJ5Xt)b8LW;y|@5^gr64znBEB9=0K{#{RcR_W=c zhsBBuUDzxAqPH9L79WXjTXVz%_~m`cgY>ul^3!nguBsm`Xr;x=8QOGtj>|y@0j6gc zmh5o+g+D@wUzNq*pO`uu3BPt&CSAPcp0!$`+P$um{3bP**qULmGaq)`+B9wHG1c4!N*kFC%>k+- z?ETI`sK-!VVw1O%JvD~0Z>k>YM33MObi*H5L*9{Z9*EeQuWu^pAmpu*NtjHx@Q&Gi zrUH1jRyyb7jCa{{5w{v7JL^n5>xpCLd^Tz{q;IdOJhzEXHFXA{d;*GeQIg>npyC!g!4Yd_84<6*c38PUST! z!bscpmTRRV;jj)6=3)5L4_5Rx)dW3UL%l3jN0}2^`XFik5NV;rDW~2&qheKCB|z?s zlLmext$rCcf^FYm!{RT`_mMLGk)N|A2V6Fl18`rkcK-`%QAZFW$!reA4~FL*>qcNj zKAkHvJKPm@R~kGF9#btSs3GDz!eP!0tz)^GKVFB(gpmX9K@$2OuU5!ek`&7d*UaT; znG-(+zJ{Htan^6yR4E~}r;)Xu2v1{cmSIMX_L8*2pA+^L$*)L6{jI^xUP~1c6qOvP z>H&jCvUh%APS}G#Ba*l@F%l;x*BCRrpIIqpDp=J5&^uzoIrwEa;;7v$S)EMjgLw`Alqy1ZlZ8cSROt(y0l zp+kHxqofRsyYLOZ5ArVjZ3}iBG)6wi!2E{`ymcMu>fqF1>r~(*afONi*+(J+X$^pB z`XGazhByobshGt1tTkCu&DICWJYgauC0k>Yt%Dcmezm4a|FZjX7V>~@-XEi+Vrq1l{W*WcjZafDuUK* zETn*>fZXRSf`35#9m;-1@NoPof%9C3A8~!MPvw@5&J|uoU!xky1~%vG!^5ZsY4`~N zQi%eZ1sjP5Dp>xl!73o95$+01cTtCBXa`V<-A1un?3jhJ!^G2U-UijqgjQ4gqoNW4 zqNWC>mYp*01=mp)WCW%g^yOtp*HexHdQB(dYYLVx0@7iDz_?DLn>pPMqUM|&@y+gG z`zs9Mv>LOAdU5V9!%kQ%m4HvcAy%$~TZ7lbbx4gy+{)*3{S(n1s_+fWdS)t%ItKE& zuh~L-W;EEIaYaCUpip^vvI*iI7gNxvc?h~TMQp?MOp8TL?+X$Y|}5cWwNnmVDhCY&V@`FS1Qp=)+j zFxn(Vopm3SI3_|bqaE|$KSDd^Gr&xn_so*p8hj(+>qs?yrR1$0fb7)d?QTt&x#;cz z#XBzoA!v#MI`h>!Cn(gfVPIktKeK8G0e&pwdV&)&)uj-_CLBT%!)9i-$po{Ha0|v0 z0OMlVh2Q{%>YE`1;YP(G1wmpuv=hx3Q!fPqz9Zv$kODR}@)R5I6q!*CyfUBbXsf+a z#gF2%OjanuvLJrF2CX$LnRrZ^w%<6dW!Ju%{kSr}3SpiFHax%m)QOlOb=?Y#)0%D+ zo<1U!U9dZo2hLop#Z&COz;U0vMW`akR}3}^3f6*Xf_m`x$5ln^AkBNhO$J+{xw2oH zOeu@^h|B7Orr8sWF_Bn-Ka$Od>;9#^OSU1#1NJT)jVNgM^m)M{F z*Mvc5-C>;@?E`b^`{b`d&a33o%wLq@@n1`N+)?#!DS4D*e*@9@^Du_*IPMtljNz}z zVlh_yX_O#Ns(w+%lEjd_=FDqjt zgSd$EMXaX}i7B8^g{|9jE<=TslI-kCcWGV-u-jty>nJ;ym(Vu8k9(O-gp^v-R~LK1%vu0=GnxzfgT%1-K$c0X02dSySuU?tDZ0IbiMz2nexAm zSAP<0^q}zv-i_?_hc zg&T+;82-q@?$!$|hqkR-_I>T=e|dW71;E24v$|Z8_ici<)-ZhF#Vu$lzZbxkv7MkR=hi3{J*vvR=1Cd)%;z#kfx-$+2zqg(@P6n zs%Q9-!fo#RY5B8ULN^=Bbdp;n*EVi zHx{>TN(7NStvAD(weyu)L=)WLp&E5}=rGD8QqR3^zQJD97M{u18awYw3ptr^iq}eosE1flz=0LQ*Q- z86Et~8TsulF@&Z}+mEmTpQ}5<8hXGi{~d=uj7n&&OFhZ=^G9?)@Nh}bh4=Pp`=e9y zd7o+jZdvWl?1SfId}Di7Z`E5P@*8!|Q`gg{s}2Q;zD;Qu7fykeMb)$|Q@3_hoz8H6 z`kB^hjLK@$KC@nzua+-+LQE6fLxFtL0+A_K#} z`~FH{vR&M#+}@ok014qb;cZ5rr3w=K`wfJ?c5B;bdv-xmKov^WTq=MR>oLtQGvoAf^26D^o^8(i52r<1fb# zN`=OcH$VFVTMMp%xIZT%uAYBND4To9rU53sylL{lfkwL>n|>G1j18a%|du|lk3-8 zLlIb^A8Vp$Ox;SO*F8EO=;q^mq%TYS4Ia2=uo*szIh3a?C-{a9lpjh2Ft+K|6`IB;p|xpJ%s zd>W`r0QE;uvC55CWdr$yS}dud*X-_AF||`bF+^1%d&|j2MtJNWvXY!s(nq0uXWg;E%;OU`pqd*exdw>gPG4v$ON; zH2iQH7syMfzP39Zx)8|YX7=AfJ#ayVO`klZ$$9Gl^^I$po;#;;pl4-5+Q3<&mPPDZ zmgcb0-D`?~fSO>`v_G#`_Uv1s49*>Qu8!ZfFEC9JO4TBW=_iW0V3tF9hxybEAePsG z0f=q#-7fSIBODsQIT+w39>;2ESR!b4h_`5PBjCeLTXISY3Nd^%;TFsmRjS}q`P^9r zFtwtfPMq<7k!-N%Fz}K3wd1_)3Z*4GRYa1k;2ZtO+P=yJ0_ph~@hFQ$zcFh)nVA_} z8x=JQr8TM!QTzrI<)SwcK1I&ZS!b6vb3HuFon_F@Q1V(lIrvNE3Y)9dHFi@Q11N9x)1NjjwiGyv=} zXBQOyxZ71e9lUkVSW|*4o;yM|wH1&+u7wX9sop5WVDwJQ%kJ5kiqE@U#Wx9UBR3*o z726b6jN!(_B`2L+Q$4k&i1WZu(MS6<2mpz{CWm>{(<8y>z~BrA(A5X43b~!iWty`u z#VpdNOIEIa7bKsEB7F`|F16YJ0yf0C!XIlxTWci*#Q!DH-hQMPRB+D8c~2Z1|9fW% zD_p7C-Z)RBP5aWK84~!TwOh+7&ZY5isoOckbto^IeMLDTwY^<&FJ@aer-tBD&i$-1 zuH@WW!KPSdlzfI0Tu8&JK1{pxjX^wKb~yMH$DuUJFue}Ec~T+V*=bXe0~q!_D>>jT zx+tlGTACg6&f%-8?0K4PeiK}syP#S8CN;HMiy^JN!%G=bm0Bk@0lqd|({y^AR?+8t z?m(zDJ1^M~=RN^TgahrinB3Dc{_k9^l%4qE2evUdni9PNgIGbh1teGrCXUPt$RApa z9t_N!e&2^ZxJG~PuEo@CIv~;(lQC9?+w;3fWsl%mf+Ihr2-V-qMY!PcR>J8W9V#4~ zRGzB{*fv>~i8@d!9IUxI?ePcUyrm2aUxTJHJYPrer(+Cd4iIYRj0I?Yu#AO}Q_i;{ zyq*k;Z#s7H%oU=li2AbSF#bNiIYkyA5o)4~zPjYO-xfiZGJMNGcLDI6CJPYbV|%FM z^3`=^#GO#2Z{{~6Od5pbJ9@x zrsGHN3h`p2gEX&W>25EeqvKqvjxhD1*$+TG?g-3oI8Sc+rGUr^ihKL>!H4nXc1w1L zQJ~4neY`F9rAtuwOUBJypb>DN-jNcs(oFwiwk1r%oD4VNj{-D!9JZJ1IhE2rB!4cY zfq=25fg!yJ54%9xhPha0X_)oy+6O0dLZHOhpn3m&CM9V1yMNq&eBYJr_-wzSDt{Ts zWG?*r{f;*A>3|W5D{|&jhA%I!nhk7AfL&<8%@5) zEI6As!lE5%j{%G&=qvI#(nXj=i<9@kRfKRnk#D}`+DQrg?lO5mdA_r?qzq(fy-jp+ zIgk*@Bq=Tc$P4naZhXx=?AyunDQ|Jj9N2l%2;3{OzP2Woe#MK)*vJZ%ZFPEGc8YS; z-wh(JXpC%{5?anSe|c?7eS7~Tr~r(Mk`vNFd}yj4QU^!d1F_fA6H$OscOL@1Uvnl z1=-4bN`vOQ05NT|4|mLv9919u+Vs)fVB@_7E2-t_;qA}-Rmdo$*pM@54Bib*CP_CWAGSibDM&uTguK}dZ_4>=>8m&1jfrWewQj8ygjC1YE*C;G{y zdHD}cr`=j4gCLZDLh3w4HSZZ$rU2*=%(f< zYQHt}%kSfQS1v}}Lb-Hz4tQXYEYEzQ14C^715e5So*)T;^x64mZuiJ&1rO2NQmcE! zd<;kUzpl(Y#4jfyZ~pJj;{Wi58RiqactBHcM0w)q{?f!*CY4esvELX9Sfn;m@5L85 z!=KnuauqiyFRkD+htful2NFc!$SkkN%RAv~C+SDVSs!>}NFv?+;#-tgp_&HuxOqzK zU0ovCJQ1h>^4?f5))NRDArh1b+ttOF2~`}&cIX!E!<~P9MRnXR`MQzyg;^O5Wei*y zLkn6hXD3wynV-_l`N}E+oFgxqXw%@DCmEg^FGrfd zo*GrEjBt|jdOlS9{C3sD3u%$q?>5?8Ax3WA9f7=ex&ut*Y30FRV_NMs<@!h|PT|!5 z3b@+g=bqNrs&o2D?E4vg#&J4q}IY?zv z*&>G*AE%V~5N=B7r21>xU+Vt>GIEpu02ymb-&1v%xa|J|vIp#02MnlkU^OG~_&(hi z!k^1viR6`*e(P80c%m%+Qj=TrHT8Y>{pKP~6z`teYEg%KVdJOfyv$H@n>lX4p-XNkAoPC7$;UY8NP^u`(;v;y7@9FUT}hZ8|al2b33y_!6T0aDn(W5pz`==o={RQA7pi$a9rH zA>(62$(IrF@C5YdKrTX?DlDZjqHrT=`3RCEiV=qsByzqAZZ)LA|65>2Vy)G^aF`a4 z{pEYk-mqt4TB-$0F|2(o)83J*pt}tGoNvBcfX<3<7&qOVGg>-nI=K*cmxmjI!>FXH?d=+_BtU20=1;Z7mowmv9HYU}pd`x&~O_CpS5}nKT*;Y}jJsXu< zULVYKeCxET--d};VZ?d_*CNN`D#{uybW_8`=7{C{Lh7_?Acr|~pGVK?SO#*HZ`C@w z5)|N_!*V3OA`m{5hOJu{@Qg|BnAx1my1PL*+||(1x2RmGn_Tt|Nd!P4AnBs$BZZin zI!ye%o&fdbA;>CR{T321($XV)sb%?O!_|5Qx18l5zFEtqqt?=tP+t{K&6{{(y$2n% z&rM=42**o;uN_1(hI-H`#$%I-E>JZ@fE2*NaA=29V(=|QxEdjXhX4f;-8h*549g6ymGXwJ(zPqdExE{;6c0BwF=!)@)Y zahPHBh^y#V31t4Sy+r1^!`cW|@E4U3yFIRKMT`Jp;ujOz?&|24{jM*+W2%LSktG?0 z7#h`N!Hd4fO?YO>qKwF$4z_BH`#`h z6M4_u6f{d}`wx63M01}0hL8oIVDhsSJ-)@}s!r>eUjmdc>J!HK)IN`7f>e=5v9RRB z`-JD>E&${O3m-#|D^h4!SL855$~T`5Fh-?j(=~4%Rb-4(56@(|*x*QtyFC;Xt)D$Il$R3$x<)aI%? z1@r9mueP*9mOYYR>$h=ebPB}O2kH9(bfZiZ#z4s&b$XP9Q&4ROGl|Tpi)uT1(bvi1 zdOJp6LzOlFzKVz5+D5>wf5v*7MM+doZefgi8ZsDS>NY9IU$P=(1%(mM zbD-ZIr*=akj7H3y@KR$nSjglt7+v0hS-6vzhP?4C2tLVY{WRG1iVGa&4+lE{-a#Go zEZmU)8rh!&hK0}tUKvfVI6hb@y7ImUpv~Ly$F4D4YUu2=ovx=bpnL1L#eALNtu*ww+8!XaR98=q%<%*uzKU6{pIn;A!inzhXz z7c50)RmF>{po{5TRa(w)F+&Xjzgg?uv3d|Zc^olTzV1}ZZC389%^b+8PdC}jQc#ckF|73DMVHI;y-iQ8psCU*q z`iFP4R!%Pbk59dRG=_MFh}z`=Im58?I~90+#nwf_CaiH2GRo8uwf_Pty&H`Ph(}o+ zjG#Oz*o-peuN(}1S$wuQVsy4P1K@M-dmVOq>2i3A%XvHsqdQu-3Z*8i&MMche^bx* z8WSVXL=Pr5?DNrEi>l7hKYMoaL6G^p~}u%#HsmDo-Kx0$QA2&e8faMoJJ{`!x109uzcgWKa3?XOT4 zW#8{u%d2JiSgUGBIi~4`F;yhup}@Ol9$JEt)gv5UFxb8|lAsz+5W|Bd zD8WD&DKt=!yoHitK-*Ux;tT|N>@N=z=fwsduKR~gO$w}!jiGt%FV>ZMa8gfDQvIK> z7z&SMOObSA?FN2U^eKhP0*lRg^mCLOQ#0sWy>+e9@THUO3Z^ z4*FXAe-MZ=IVR%1j<6uJU|_13#Ga#h!JGw)M?4UeUMuW|07{_$CJhP}cUjgn#(|BA zxeHWRj-C2N&po5An;$EINGn)mAd^8bAnt{zpd`#9AS300a8a=C^n&gnT@G%see-{{ zHMDl=P)XGTp1fT>9z!IrbQE+&t^PH4UHW60Y+~tPl>{clNU%)D3dJWXt;zKcta`1G z8yeJ!TSbJ$0K(nD_1Cb!N(4sL!Xo0{WJGh6 zkgUN{NOKbYKP}h%A58v3$yOd`li#Xy^9;!TMI$li@#$EfN1SQv4mU+?z3_er99IG2 zx?3#LzLO$p$$Sx~+l-zzb+i2Vov+s3{O#53di*~-kg8coh68U?Wocr^ z(8&ZHKtn-FzmtLqnuLPHyd;n~+IVp{TwI}_dJ(%Vpgx&LZgrS(oPB<%JN4OKv@O4_ zwRg640q(9Jlih5UKDb%5&Twf#M9D|(bz(R5ItA!o8{o`Lek4!(1L>5gzU#|+%H29GE_4jngU{UQ&0PqJ3-*bY!y0qR&89xfWjkK$AOLDd2 znhoD2`d#An6WcPmuR5(c;W*fm1Fu2it)I{0PoJ{-V|H!#Q1G4y|9XZj0~7L1n50g% ztvEKtXE-Ob>vgl`xTX5a?sn8SwC=6DZ2s+85!*nfB>}7}I3)q=V((^+D;GyVLxx*f z0O*wA-!%T*d(B+h&C1srT(7O;6?igec*o0hcggt?PyFhw_U>70wnmj-NU0RYH%@Gt zWL>MXa*DmV7xnAT5oh5>tdcAMpt({JT)ZPxk*S&Ib~+N0e%&Y>F>t_d+O*(MVxVt} z>`h>TI=5~`sEUjhP`8U@2j7VldR;pE3j`c#)e`I>mNuX6AB3JjWp{V1ZRBcCpmye0 zJW9LaUPTLQ&s{^4eX$)`P-4sVl&Xw+WBx8M(rfQin{0X_cdYYk=A7?wI9_6N4T>ZC z*Jj1lSME}d`fXl%HQHbpn8bu#>u=JD}edt=hfF zcPae{vjI_DfdPD00hY+B=%|;Mfh+sAOy@7qPnNo%p5b3`7iJh9on8n0# zj@(lJx4E&p;TbiJ;ls}JIsnVhO5LBL+aN>~A;MVn7GIV5w>kr6*_U#D1=@=?%^?V3 zUF0NRax1myyE_w3xI5G#?yPCtBpc^knHZDi;+j-v+DmD2l6%gQAJZ{VcMVx-*P=Sq zG|nOBs$PVI>|lnh^yL8EkVVD6^mwKMIJR7jouxmC22)ZKz-bKD6a=PZ?|7+GOyDg6Qd%0CH0O7dIMcDIJlnHAPegW`tfkv%$~_|oBF91Y6jq`eV~kfyU7o*QBCO0ceQP%$p%lL zh8@Q$(HGHde#`$999Il`cE+Qe5>*1Xv zM~0(GPhv_JEX2YUtU9{ZN|>6*+BP>;EuL9d&YM@Hl6`swc&#d;ExD_oOTD8qvo&66 z+c`d-{SlAS`&|WKtnxT1mW#^@7;BLmX|Wk;i6!V>uo`I%!EI<#8)>=TaaJbPGLp|J zjJq*u4mp;(CS9EGFk0kW*$}S?n3K;VsjuXoI2gKmTm|9_t>>rPX?R8$Hi;5lJQpZ01Nebvk>9gh2&3|+|ISRAm{Hs6 z*sQnTq$t%=32k%Npzu4~To)sn*EYo}Gw-#_-`Fj_j`U5Be9u(e^NpFM>3j~n)uU4C zX~)%*rT8p{T6rVq>>=YndbXXZt@4gvjKFrCBP8B8AI;G_Cw8A4n?r%*FrxbPrL{jE zk8Ebuo7D2c^KtwlhS_qrKAM$HMaEb03w}$j70&h9LiI`Ctn#^*Nstoq1LhB0-YH+yK(jC4Ut8Z z#qT4a<-r(Z-FC~J`Nx zMMat<|1v*c2Tc$oeE3bgb6~uWM|DT~|A|4b^SF@6`i??z!=r)kcB7$zKT%6&Nlr~6 z5(D7#kd5arh~z*-*rp$XqmMF$XJRp4MfyLIO8vG>YHt5r-8nroRiH}bjRy+{)lm|L zgnppJ#YJ(2R$TWUZ7ORPCh=^#w_LDk^L1@a*`eqY9OyfA}52$>!el>hRS*FX5}j2=?}zo_A0BCl7E+C+Mq*4P!fmX}xS z=nld^&nG%QJv%aAs%}G>XXNEZe%(YVjb5i);rvBWA7+v2Je+6kjrP(WXrI_`If6l#$iniG(_K$xDd-;V$3q?BUTozu_> zHe?U5lLQ@>u^72n0+bBp&Ml}6bUeECD_=){N1|ZIEw%_Ai~?miV$eBQRGKj^L0(d@ z7`adoBd|gdkhxNX7GAQGji{_19^>Q)){Hy(uUQ_a)#M9GS@m6^4=4kby3hmv)%Ue7 z{~hwAVE@~-JeCo8vRl(iR5ystj6Xcv>trB#nU|!z`^J4O}(=1|w5A;EP0-V~zqk z1R?ds9+SnTaS%xZn()8qWAQq?V_)>KN17zL4+HKhahsCQOuu5|7n~^$F$0s(*8kj8{KFjpq ztn&5K4)QK>Rsq&l1_YtTa~vu%f=LTXfQ4kXR^?bRiT)Ib@EfO4PX=g*FAq2h!GI5L z3L6M0izx`0I{E?}L{G+I@MnoH550&!h&>gb!|BhATw+K1Q=Be6=j>5MxBgpa1`jSE z#{3~I(N_i>;bNUZMYQM!o+Q|;ttMa`%AYMmcUK7}`Y?AXg2W0RM!xh$3s>jz?5Y$2MU*QK!IKdfq?D6e+lJde`(}1C&+F( z@4_$B;OWDkMWnaY1a<4yWmd_)A1@6UfvCdD-#`% z3zzxra?Ha{Mxl2JK|iJg^ANmr%&AGuxC35J%#?WNxAQ~Y2<1E+k_HlN2OJcD=z%7} zf$>HD?t}tDtd6g1%IvkXVo!9m;!W_fVvNY~r=GlWb4eq>>U*&@{{0(pf5imd&m7>n z#V(52%(qHIH*s1)XWHB_R3mjZ8ur(wtF9Q!Azjc8=Gd zT_NA&gNX(EgOey=TgqraM42i+ z@5xx0sA@+S-Ii5c$~EY&Ir_c9&!T)8wYfO6O#H+pt&^Qa*}cJuKhs9u+9k-H_oQoS z(Zx}i--A`YeBO#yN*VodwAO{+plC}|)JdkiFPwMMDXZ!yw4QQ`xTLFp(Mfoob;AH6 zrE$b+@^+}KwiRaTGlUVq&S+02tKZJ5Z?MqpRNcA4$T*s5b-M>A zo{#?amO_x9&iSO-Wj;MT@*6*%RwpR;<}3|pxC*?&J2om;LuIOEaa1TO{mRC{7v^@? zkiC|Z)#=%HOHGcjJ`T+AkkR*qcGPe28FqQB~?udcv7jdWH4 zX`*58JQ~|@w^qv=;hll&WA{@YR^I*9Q+;|=vXjIE>Qs+m#)x(#pxdrT3Fw#Q=4ES> z61p}Sj&#0rvF1{B zW`)0&R>Js8lJQxd*u?<$k-OkV$U#Z|I;4S{>`VbrC+I zZ@#7-24rtd;E-d6f#AV|0uSR5%S*`*QEyY-+pS-P<;Jpb=Fv2W|Ji&^WoH2utXq6M zS2p?^%fc7S$;VL^OnNuP%+5|c|*1t(7I`>fpD`C5qY^Rd%E z*8l1#Tb4~`t#x&G%PS_9Iy3-v2LmUg`anxNB@coGPD~uq2;t>VkOSXa&3uB6y#hV8 zXrCR{23)t^@#+e5&8DA+Ds()8i|5KP#xu z+4QqfKd4p($di-8-^>r@mDa>Oq?vyq6*mVWS$MdLgFQ&WCy;DF2m}Kjwtphm8Qqbv zelKGch}p~iJo|A~5(%7d;#+u<) z;EnG(KBxt6(MUhyn;r%@3J>-I9Kv6Na!e{iS}fhIyHPV~A3H{A_jp9M+CU>u`L$p( ztXuK=l|&Aj26|{L2^RujF&MJVPS_NufrPv3T#TZJUM9tOtBO~+PcFx37 zBuj(+*P5KgtqfqY)?rPQg}&r+`JH39`sNV&2CAPKN2BP7?O)lz!}*S(%0~={2f{*| zcq16UONvF1a~Q^%Le8)N1@GAJh1 z%Q^V370_cX2Y?R1KS+VQE{y~EUS}oj#~x>dRN{mWhY?Revf@JulBL0+%B3Jrj0S;e zhL2Mk-7jG+ivq$!$ya0{Ea&Z5<3|R2XY&KvMd}vzv@&9D+b^?BciYo`K}t7t>^)J& z(~uDX3zUwebb^-Ed!I3@#S`tQn85^tDi=oC|078HIk6mI`1UI2Xry_{)-BE96jc}Y zZ?`2n@x^6uU4RVYhW^*TC$4tk#>5y}Ab6@F?$5@=P4U*R!7!x~Bs=1ApBylB7>mt( zO}}+MnZ`Z~$?(OSDzazr5NHw*3way7A_ogwPY=j1TW%p0e4DE$(_PJ;E5eO^$ah`F zhfe6IGsC}t(rD^Y3i_XiFe7{_{J+B)vGl#4gAs9YpbQ2=q67K@t!h0(O@7VglOSH= z0q|bBl?#YoL?xKd9c?8lM0C(5W+0%~?!=+f^x~x;#ngN?7X2rg_`R1zTB9{TdoBov zM4+gpElaP)o^t?DEbCZpLH~s$YfK$+DV(TZZC)AB`kg(TDe@79t%+L*Q5i zy`kQ>-U+PIt9`6OXpP7O{TWpm8=cg{k0m2anx41*>J%@(oaB-eV^X9pTOb%)Af1Ha zpLZD;z-0-?9du`?>xJ-U-PeC2Y`#3LTe3H@SkpYlh`Vt&1MiJ??*LsdkUdKsjly1g z-A4}md(*Nkxz{Vt^-Aj7zUgK&6o>v3o&0XI)R-M5Z(zWDXtc}PLE#zuR3)qagAYN! zx78TG)=-K>I=m`O43WIY997O^r$z#()@nldgZ+QldgtiKny7EIW81c^iETTX*mg28 zI<}KZ$C%jm#L2|Q#F^N(Z=Uac@4f$g>#Q!EUaRVyQ@b{*cKvq1KgJlHRN*YbTiT$v zQmj-lT)N>ij*>7!$gHLmaX=&UmK>>ZdSxE8`F2U5tdLAI5In{2i+Y>eFnw8!lffYQ zA;3b(QZuhAvtiXxEqGXq@lIT8$^{)yTC6ssy)PkW zwT>A#a)#3bZP|aO^>cC;`ir^ydK8^ZN_=)`Yk*st)N`{d1ZbP;Lyf zFru|TVnxKA3Ye%)Z-*M*h!wXo{aD|>I(hr%iYo-1a+NtSHdER6vyoXICNb4-8osi= z!mirH@)8}7N3#*&?C;e6-i3IHT3T#t($?j>XGA zTxl9&rtrO7YB?*7qoDY=6xHC~rcW_Mb)?V8EKH3as z^LH%A%CQ&iw}7+kLGqAvQtC)J)8PNfh||&~xzh-48KE|Qhk$M2(s`X{lHNf?!F5ug zVhpa&|Aq_>&L^dXh5yQ2;W}J~AsvB-b!OmfCc}_lZLkLYfB%wb%}nxBUlrHd4{K=t zC=n#X%WO+fKpm>*V0uqjB^ z-4cZ+nJASGT0BdKFa*rTPJZH}^#n*xs?> znADgSHoxw5BjfjD{M#4>$?Fda!WqO~(Iq>fHGD!5MW9^CMa4>U+=96?7^1)BHX4OL zRQTMxUv^vNK$GHDk>!xQQOP#ChXI<-<`{Yp&@x;wbLx5WAD>g~N89f>1K0t&&R)y* z2}|#w$(=`_xxqEMmgPe1S*ntPN8dub)lOq!USrCKBAIF0>~xglG>5RKm%S?LF;aB_ zcPa){4N$mt6aU=vhOUksjJ)L!>9UmwGpVWYmqij;jR$-3r@C)-J0uv2*#neGREZQX zS7+TjITqht(Y|t~c)wAW0KNPN#eAwPWBuJ-meOcVeK^NV>JI=yzcvaJ_g_b)FGEbD zjTg?|V+%9&7P~`!g81Vie{@>0TZwig>3S>G1kilIER7Y@Ko?m@Vd{gAe0p#QdlBgz zYCbOvC)?LcDZP97YX5KRu*M%k69ao+^_^ea|2jzY8@gS;bw6K@ZV>JKt>vC6&Dy$T z=D6$*kNZnDi6gQ~{0&y_%Doc;EU^UuPU=7fChAQnEID-9vSih&KT zGj_%)wPfuZcJ5XaM3Wb%(g+x!`}d8o3zG28YjFGYx@ZYg2JJ$kF8tgKZpIA+Xj!`k z<{Mv$m|z>T*ue&O)q_Mdm!j5^&^aWZiGlgZ77^O}3nqCv6HtHZ4Bh6la0j-6*s2US z=2*i|A^)bF3S>cxF0(2;Sixt7WBF8Ot^hY z-7t2GGWO5MK}GG@D-nX^9`_)zfa;f82?=nZur{}O%P_E8Ey1QBZwOQk6mTANWFRTv zpnB>nK@zFsKn09bb0OX2KGBMYq*BiL7*N@Q z&o%mpHfQ{y$&X{wbW2sg<0uLom`=LJmM%RuN3a;1BS?tx85TNw{uSc&=nZ~W(DSMq z$lbAHaeeDG9C>1nuJ46LIAcZ_*y^>TIfawvBs9ysm&-VOM(249y&Fc%QF8vAp0>?) z2&#*3%d&q{p}eihn8_XfF|526Hk+uKa_cPYmDsZENeo+=<$ExrA5%fGCOi1;1h^c}@1%^}=>lL}K*Nn`0kH;s}_i}iQWd0fyH=bBXg z=btn${dLxQMzV*$*96=#zxsR7Cn7UF`Yk)Po8HehMh5x$`8+4f9$dD@IX8L5m35H1 zUiqzll~vUI=sYj6o`8zC2cEo?jXykf|NkoRplvZ{GFx+Ml%Gscx}NiIr~g z=R)xv$(l8^sJGd&<^R=I8m1s=eWsM!+H(50dLy7G&D$!;>~OItN84R-9*fF?OYJ{f zJ#*8Jt~!l+VqWR*`~_F1tzNpc{DF;n%%b|w5>{oJjM7D$7ClAHbz;Gs(#j^iO!|p= zgUgVTO(5o@C<|BV!w*TP@_vCX%L?M+HJb)YO<20c7ep zSgF)wp8gwy)M2w&zLkLc>ha={)#Xh&m);4d1JiV7y=Sy}js=GTW$27_H+%ohXFII) z4~xKmzRI7(w%5-+NVmchpFmed0=3n5gGzwq9iL5F#)#8kz?IdHZvm}GV$%>iLW~6a z=n1NB5$5)uU!k=pF68NL+3KIxY@Mv;=>zkLNpaI=yrx9+?DW(0kk^Z*Yh*k0KlFUW2TVNK)ITV=w-o>}g zy*GSMfmHxLb?PWwCR+i*fQ*np@qK;IuENwDH;gaFd~Ejf(c?<{d4}v^_j2hYM+G+n zs~DSHnZ!O-g*ybU`3v^oyJR@1HRM%P*!A;#3;8lrSKZ-Zb?p7UYo@iZ^d}R|MbOf` z*r;cdS_BvzgxVZfJMeQ7E|8?x$nI(&N%9!9R!Gu@I0{_=x2Jv97Hdkj9{4}jb|`9@ zOubWlE697}T#+shB0bT9a5HQ{ki~2oA*rBlI?!M0F3bEiR=j(CNjOkBUwZx{HkpPAU$ z(f1aXN|qy$`cFs){mT4jNxVAKR~({dU#ESjFieFoAg=j0y5Kxkg1paef0@?nKl+Jk zX!^I89;9mN0I>P%h4bycV`u$20CS-Q_X@mv&Q{j^c8f|@tqVXw4UCy7Qw25(`X zk`keIB)xIGr?$1iSo*^y*Pb5TYxY-t%{k^j`_xIcxr^k_YhB2}2k4FxS`K))PxhQB zAi#^3YV05}EQp^#Z)~&7JOU}B#o_V=9966%TG<+o*wKZ=3x1?X02)+JA3_2Y!G)xPY*M0-^D=!3#+m#qy!q; zMnsBLzf!&SM4xm@p17t1bsNv;zc;p>Kp3trku7EhIg~0=)`G#x20h^TVrd7py`Po} z=?Kyy9GuOu~QJfgis|rTrQkC^T$HIxa0~^91E?YSfTta- z{L{zXN|LPzZGSCj-5ek`3#+2HoQN7>BjeAkadwIwu0$n5`0a;F3{*-jBLJuf=ufg^C z+_*_qZSi|}NpDBTPXCm>iI0KBgT4Kvd$J4as$hO&CJu-cTAsM|=`I5f{H#9CYk7(! z;M@t}aYBB)Ju$!pq|MmrEu;7WQ4!?S6(V~l-x_Cpp)H{xqjScC?K*|vtcoOoczC1} zTON9mZ(pu1NaVD7kb(B7V5^X*V5E9jWO~PgUsy{gw)BAJB*Kj&@pWGM>7?Q^C+aq~f zVGQXfNmD7yG}8uy=dkT`!mB_cVdq}CNB|)!IRGXUc8nNXEGr+Kd}JFAT@rx&-Nv;M zBxJ}cOV9StrIUGc7QxGJ{t}2BOcc|qnc4Ta%8y{qy|dEqi9SHxI-uMGM)jQFOYzPi zZ5D{5aR`)>*VfevD4;juU5vJ%M)b_*z5ci1Z$+X<&!87Tq?b8o{Ug<}wYZ9a%{E-A z+Te64vm0(1c+#c4u(f#|W@=7r`K#zI(P)PI@cpLRGv0E}sE#phKjF>d+3?RY3Y&vv zYpCvq)IS0ADK7P?X0@qi^(lj*Z22hSO~tR@InY7)Z)It=y4qB+A87O8vVZ@9I%bC( z-bm`KHSTZ*v68-ZDSVVWPA*4ad1=RGx;bk_JHABrgO2WEbb3NL6NOE29!Gf%dTCu#X;Z*_(&$XGYO@ZTlG9Lpr?QG}W(_mOz3Z zm!);q1R6~CLXt~V&U$YiMa)V^!NAgoO(7d*_bBouRL+~;Zp%aSW)FdSLa)40dNN-f zg~Y4|rSscL6IYjwrCJ5KJ)8^ zietA$udWT{9`7;UX>`T#n_|y=#hq^zo)Mgq@40s4It!O&TgrWqF!5dq_`p{Urg4Kk zXx@uM#1-LNihX84c0( z`)~Io9wysyS8!TUWU9I~g&*69n~B|AhZm#?+`Ubs^aMU6>h#r)X{MXOQ4AKQhUQy> zLipZGy^(AL8V3!T8`AdsoWMJ-2jq_S{F$Mp_}v)GVX4yib5x}1ROaO~K?{dBQs7Cd zV8SQye)l#b!{Y1@!E~3=kK8T}B0(Vtj+>ra?W^@7?^>PKi_O<JDgNOY;!OY znaHa{-bF^3-WEkZ7X>1JJH4~{oI(FR)lP8JWq8}fsN`j8i^mibB8j2&JxFNourRFM z@g<8;Yb(J~49R=ZnX@zz*V&qI?c5-b6;z^}*L9UPVRTiOrp#fGl@#`!f$X9C+9PcW zYXIFp)z$~y9tz&BXZZ^}2uNWU!kcDs-X@u||7@*%(3V8m0}E8i(XJbjp3LOPr__IT zi4+0D-ddc5p|0qlRk8=Bcal{)3T=T4jB4}{2AJWpmYu-w<`WO^DoA=|Gk)Qp=pv|p zx{1aea&=(Ez4x(c2mUtXO+}wn!9jk%?lQ2e15W-8G}w=6x^uwq?fu$)XNv?3D)6Cc z^nf5gs56Ql9)JwJu5+mA>tZ8(w-?s-P))Tbx(tC2L^1)Vx-k#w!)F*mDg-LZHF6B@ zf4(!*nINyiS(gDmJV}>9au22=)As_&(>MK5wxpi>;|RWXVvxyV1d05S|3L_eWQov! z`FzL@2*X=CJi|fH=qwgfAo1O5!6e*!%bm#s8tIn=fK=d(LV-FKT$FUIouv}?7q%T% zp#k$ph4OdD2S0dvY$-cU&N0zB>$u!+L+}x;X2U>mNf!<%Ql8nr%90{2CayI=xui`BSQ4>ER z(D)SzVX6W_3V&|Y3^UkmOnWWRO-x+!HKzyWkP?tH6fy;4tELBaQWcs4I0=QNgd!Bl zK?PHxkqG=2q(KfiNe$O0LUX^cR0iZ|f`Boc`M2ET-zVtW3o07xjv8jM@>eOZfGWMV=us%& zk;oI9IFPEopnWPuA+0fFsKAZ6Y>r0I>Q@8&AdIU|=8~YRx_tdOpTN0my5vt@7^-Wu z<*P(i_9_xZR`Lse5vkdvGVN4R7c@rKz$ijGTC0PYd**oca!bDP=t)WdroMbr8bu)) zJ;!fnbIF%wz^AC&VS88TffkM#JZlKfF!_3m?vzMBI(?OEU?lFrMZxMuH8H^IzMhmn zuK_@SQhVTqc47YzgEJ8yMG3!YSuvnC8`wJw*J&)K5Ht8Y6LyGNtdo}!tyAW)za5FW z*3Mjl4$bW!X5H7JRfKOaXsHPnH&FnCrWACrWkLzSH_sb#KvqgPh=L6o7v=OW6W^mG zv1$h_IwU;$0VKx;O$c-sG{UXIU z-+83nao%R0Zwpijtxl=>05cE$>Q=Ovsm!3FqhPb~F;lk%*qU;(;S6i9)%`ng@@s(k z$9pYN!Rqk-cYwd8gaZlDvd*Ph1E(sOiH>Jhq_OrC=IFn$m+t=p&9FJ@#Io1a0Q63t1>lQ z2^?5b%>;Mv>F6AJ*c|?0^qA_+LXTZmp?>f?O3sl{-IFP+mV1Bk9M1^5(`CiVPJ;H) zFLPO|T&jDb3{T)A_NXS0W+VHGtLbcaigrASsi7HF$5;o&Bjsx+Y+Sh6-40zKp6D+3 zU`hkjW|sjsU2_QKA2KJea{L=ruUC!{{EAmB67U=KKV{b%V}t_yO3bEgnr&dKngV}D z%-fv;fywXHTlCyY$UV%xv2>v%GML8T9fBPe3F{n0$N^0VmIC7CfTjRmg$WoL)(Hs9 z2ju@YcvJxQEj6jxyDnyu`H44Qz`T{ZBy8>t ze)p;HGNK~;sH29=B|uoA`Z)Vss1#yth53^3F)N%7?5*h#=2ivdswV`i{y;xh$~?2< z0-@`Q!MUce^AS-+?vz3OaihlDkMoxZy!yXQnjukrTlA7=d%vcjj1K|=Cl(KBUoE%B zaHQL&qo1UHx$j2Gmg&>fqqOAJCo}My#C2VCyzUn=?2X=2QGf4ByTq55Zv9TlQV$#G zNCuv-7nyI5maj;f@KseN*>GfS7B_8E03iQpJ=saNv^?|ehF&OQ##=l2QDL`IVi^L^ zu5anb)UhtJHu`bL3$jVS;8{~GZ3oqJLX!h`z^!4wrWSnNPY#JhWyrwrQYvtf0d*X( z`~pt>!^m5~+a$dFz6yC6e9ouJ;;cO%5l8Hrn(M0?k&wA1S&@*L8F_!za$ILm2|Mui5xZ7zY6*lke+K`UM+R?(;#ZX_tZ`a%90b&#*Fd5&$*&M%e8Cgf5yrB^cdL zeMr*cpX{FAMRy|e3=~ge%MnIk`C0}#bAW{e4FfgQh552d5tV`h5FbT3T!rG{(oHX- zyDf)Zsj3DB?EMfd7pwkLeUK`{K2R)Bl?+@K4xg1?0uZZ@^E7(lO0rAaRQ4jG`UgEZQ}BRE)^1*?=-XLNVW zq53@AtG+U!4rT4`Z&&)CC_!q`Nub*8qsX)D_=Z8iUY=RWG886nV1d)EeEUgFz?`(N za0ap1TFwLH-HZ7Bl;N3>vdG4JWs|#>J$L#W0P_kAmGBa$-!aVn1NmqbZI-D)G(7jC zhKqIkW`jJPRYFAwSz>QaF8bdmDDN9I9T43dpff5kDKsv$;&DqQf&>m((pPFpAGL5& zvYp$#;os&zJs%9nc8(AQDB+UQLW4W^=a5}w9)#uv7gfrjDANp(H^uS*UgF)p{T*V{ zTBy_qcJSj2a)VKikesY@Cr?)=eja=LDB$amjlES)uMf^L{me37`X^y?Z4b+l=aug{-@Ky)jkK0Yk&rOc z2-Rfp*YVC=W`bEgudANLJbgL;uTyw0~q$!()1HC5Q zW8&8M5EHj(2H7I2;ZZ=<%^#QQPB@aMN}L^kBvcg!=n271HvW(c!{G0%VxGTS@(R)Z=W@26n72zrO9drugf& zng7CsV&4lj!Lk*>_Kg9Ray$+DXs7JACj@F3s zMMutRiDqCv0cl&gv5R+AUB4r{=~7UrBdLkhmY~nnKaF&q)2>HDsIH*7ElCd)M1w!6 zzpCoME9VCE!=u{ST}I|K;A$TY=Zx7eD^?&*s&m3Vg4aV#9DzUnk-P1BX$Tk!MDGHu ztxFLT?6OYH<47Kq4U$ibLuh`@$5k}4#2 z=F9baeNcqk9t7H3eQ(b3N}P7az589FhyzUtO<4-j@a#|Bi*n_O|F$gS*0cWcrd~am zIKs+!8J?rfc7|(X)W&`GE7?TnQov-HhSi=!IEP?bCa5?a*YpCtA9`;??p0=(4 zwrAH~JV{nwcF2Z~4YZYvz{M#zk`i}vGSg-o@dW@*TMD%QE&XRvK6fBQBZo(BFgwlL z2wRHFC|gs9@Q$aY35kFk71mR;uWBDxCcSf?j3~(~&QWZiH!D1vF!2*XyftC3 znCIVXD1xW*#>>yVCpQr10>jcuY_$C$8!<3>4ESW{twx0wICh*6m093c&FemAh-n^)DVsT_80*aO2%EJzNK z8B`#w2&*R^lr;K;bt2hAIvTPvWj8X*P(XdNfcADen zk_&H6MUq&~$e;n5Se#s8GPU#;5o-*#asj3Q!KX)=;B&dBGk$R*f%+_8kQpK?6`?jI zMVrlE^aPHOj~X7(Hb#rtjv8`<06*|V03C>=00U^$K;}~(c-NzbSjOnw?Kj3~?Z%a! z0mNv-Pf5Dv=Cog{xW8qk0wk%*I;6X2dk!k!N->qOb$Qb1;!pH3ATw+xCs$d%X#o?G z;Gk7k!qT2DI1T$cRpHkGcqn`AXlD|O)p4Ed3h%D98x@S!>(HJj+3T^c?0gy7GPT9r z{k$tEt0foko_#`f-vOg!W>!S;0{=1W{pxL@M53=a%UyrN^jPYsH;k=&0hD{S`J>PD z&a(4SgXqy8c4(WE%v{yl=lvXif#2#hSCb~SK_@Jxb!FBzZwt+3&Ly>4+7(@HZg}UA zj%3s|39kui0*ic)hcC;*JhD)VOO7V2pcX1(DK7Hx$a%r&%|HZ_Y6r;XA z`M+~-69W8qn*DyuTm*!uoB6ICpLSKeW1(LMFw#kM#C`HkQGfG6&O6f&D)`N`-=*x=t`@A@FQ^0WpP zHnqpqaJ4f=d>&%}O2Z@4%$nlJ=CIZmJLWe#Sol^A4!Hs7Q-q2kpO_(^s!|{XeD;?T`0og;u+ZE(iBjP zM6MQwJ6^>{QKYqh$WF`WzAaYVr!3k}CEs1QIY+{Nn)Aq8F^d^d22n-{#{BkGA&}(X zCFfIp(m_D``*W#o6j`4Q>je^jt?BpdtDUX77`gDF^6E6iwTYmdQ@L#lo|d84tM0VF znuMNYOBe+3_O$(%JZmcEvubnsJWN2UgKNFy?_~wEWVs6XON(UXwh=p_dR`g{I@IS$ zF89fYSEQOW@z82FMqOEOmz92|byiN=F z%I}!MrwJX^H6wM-zvnNyts&c8_*BaDu$NA1dHf7wJ}%*E_&CcPx^&wApt!a&47hY1 zrb*l)yzhMsI_Ywx$#0az`S}C=pD%Qs7kv+@8hVk6c2Z|Yyq%Xq$;{OeFYfbq1(B6P z2SQ`6S+)=pE-;u)KIE1e+-+h%gLFWP3MH8Nm^kzcRj(q}y2v?X9gnFbfN=xrBMqvmFqxCEha0iv|IIFa>hu=s zkV_DIoHkSCWCf~k*dJRx(C_}a5Zg4+abS^8vC+l*O3qXC8g4-zq5o?3M3*wfYUNdw z1_7Jsf=ntx-f;*GPWkJr7Fh$NwT^fNvlxM~*DVDi3csG@LJIyv@CF;2zYbHO-^PLZ zhp^&jLMwCjHiPqL?z_sCd*t3Y<)Wb~8v4B|mlh|H^}r3e^gcuNFB6l~?FgA(^7kup zB!rombChStWcYj>Fz}fe0NBwGatPp#Tm;}#52PI_fMh4f?V|E8nUG90E|Q9;qnKb* zNJ9bc$9Q$RpHZfa;S_TB7b|H}kokihBghz?wQy89k@@!>GIpH%x7f-UH6eyfnMaE^ zoKS!!!mu?WDlxy|CTl+8!055)xNqL@)%dd!iM;+gwB9r00y~dsaS7a)7)FFXN8q_y za;Xb@fO`CQ+7J0(fmEHCeWn}WnC}nv9Vqe&9vJulB?5kqkZVqL#IZ6%I+rSZepi?zEz4z<9T@ehN+4@B@cr8^Id9RUG{t@Kqd< zKDTL$VWH97oPW$fnb;do>O&}?=b?VNcgxjz5lG1JyX5|hG0>F zfu@kKB5WSGkomY^;3~22;-cP2h|>{Pw#JaMhjx1z?EOSEq6}{~#(oQ$am)Hj0=HF6 z*M0|Q4k5tqZ%pbe7OBTmv|ATdVLXKNJLcpl^GlJ!9!C4*0%0N_Du*Am<}mr$Yb_QC zI3-doQ-Rs!BRagqNf=AD*nEbXk_5sE}-Swo=B!_DJ4o$=nNQtMdU?40g}qu!x`H z?_CZK0Y|!Ycb~=GAGZhAcf)?8HOG$?@-=D33m#!x)qg+b_zfQ1{ly$=5IWj{bxnU9 zmE9o^`&Ki-@!E$wP>dQ5mjgaNdOopTxr3(tn27!R=Ja=l>GjEcJ8+TI=7%)Uux!$O zF-<9{Pi1z4D5GtrlPfqB{$@lraN_STB|X$o$V1S5^0_ulsi=nEh>Z2*sdh|R7ex-d zoyN|)?;RVv{%fZj<)d(6Csrs1x;W;*-L{XmyQ|3qbcmHp2AW`$m+(;1rs^2Hv5-EWBG*M|hf=&eJsw`o#B_8iElPNDeyZmoCy#E)*tGDM?lFlEuZL0eXo5@rgpFM1s9- zm*Fd9mV+G3Ez>lfwqO25{X-1;OAjW!v8<8OapniOImpOVf<(%dEf@)4gu|wQ)9>YG zBBmm)e56@h*?>0yu(U5h-DsVqwK5tr&iMN#lAfYRSq}@9uh}xtR!pqQ0v7QVGCV91 zRYfJFy^tzeExyrT3R|yuaGKSkQFDiENgfTMnS+P+z7SIli)E%jtYT*Z zdB~fG>JYKEfrZzQr4$)Otrdn2Yb9OS8O37PY)Yv0W!2Svd*HP5Hl}ekm_2h~^#48h zxsja3gYOSwk%eXgl8J+Ut-O6)Mk(@=5DvH%W*q6EvEx7Tmo4yZ*4zlLX{} zRB$dZtp7=hml{l;FYpiye@=m-rZELVEYKlC7Tqdz+8LzN#hPz71~wLHEG~Tcfu)r5 zWK@PQG0n*$hxVZVbvdy8 z4(#=ctJF4s_I^R4w7c4X$2XYU)EU_4MiN39G~Qvd5zY3M+C`7XCx$GGM7!s=8L8NX zJf<}@KU2zzh9eY+!^)}!8f%~~TrOaRsvBZ(%{i{DmQbf;4} z)FtIDb2D@&Qz{%9{&ZV%Nyn7&Dp`y$TtSHro4wrYsFEJRiVh!FAwZ?Nos1)3u_uuC z2Kv@Ikg%dgsihY8Ni}z0%o)!lWHKYqx$D0-y_6x8SK^0~(ZoxzS)wP#5E8(o%gHPm zr^}Jb1}4OZ;P(IQ4^a*WBMqORBAq80ao`mVn`_nwR=yY1CvSe9QpH@^)5w0^sR3b;3# zwMgDAu83Fxa4a%D>eSu;RNkHJfR%gjNww@$qahPV z^2Wi>T9$Vf`uWS~_Je>G=~hIBB;5jlCpwwll8GleaalRZ=l;a(Iez=?K(iAMoJ?9E zoN>RY{7ox;qBHcSK2B6VXmrN&!EGws5H%h!>I@73NF1|ml6GA+O;(S`}Mwld{(a+3Ml>1c3u^K^1$t8;dD2Jv+A1VjiP zJh>%fXLgAvI@7k7CR21fup=dXQvowFsz@$dZb^-G+qxgvPFpyWXE~o>rI$l?! ztbjpQF=+D+acHTLUZmJWFi_AoIE8s2q|}I7A#M1j9MlZOYfX_`ofObBStrFHy7I=b z^mo!Y6DkCS`Hx{b&*5#5OrTIc3)`IwwUz0-D=rxX^jC|B@VLFOI;LL<9&I4n4W&r1 z#SG7QzAm|PUm@cMizp(E6#sZobBcwlft=-!65&Jx&Zt9u`9j* zzU8}i559h-q!bEt;p-;yi$M_SM?k+oojXzZ;RaiPpDK_Iiw`|c$qZe2s4<%;0Wya! z8ay?w*UBYl$*83k-Yh;8dZYS*G#s&T)ahMd2a7857nL-yreJ|IvfFUO(_C)4VQ_{k zl>pLA3j7FPuG((-yjmB+4vbyl2du0a*3E$Fwsg|XfHn(o+3VIA<1Ei@13b~v6-na? z5iFcJPQpF7{ydT+j1GR8gi3q&+84ZkGpeWE$Sa$+Pfn*QWxX4{29pIL-;g)Z(I1FM z_nK(Vmlz~Bq>!PyPL>t4ewRAC&Kwff`WThu_Q6`DTyjHpy}DKVZXoB8Hos(;DzHZG zcNYVrOo{`%NG(0zrWl#Ne*JjN9#QK=9hn9}fv0x>AX(ir2w{y+z)`OP^ILhrzV3?$ z+_0*VN=Qa5;)WjaE~Ne`zOLQwawTvK@o%H>%@z$C}B%jlond_>(ln%=#Wanbt|U_I$MdY6N`GX_Y;pZnv`hD|SM0L+r0+M5p+4 zBnYasCqe(l`T377i*ywO`lqhuEW;4+{q^*R?>_tY>NlcMiGYsPP!~uKm$%I&GRjtx z(()`z5sF{UeK^0GMG@mSS4pA4g2zQ?^e6#rwB&4F$f22qgU6WFOG~^){fNrP3)x~V zHw-|RcEQgwcYTKz1I*lvtrnenE=D&Nwm%MK?`c0AOM~fHMy|eb*gB|dw;NOk6dUPQ zT$*d^VPKw_sgQc?rtRWa6lyURGk9m;3S^qp-D=oRx)0APHpB99d9Tk4gjZ*V+t&TS zvDd6lRm@tc82_D6ZM)czQNuUC;(cdJJnjnQ%rW>@_#(hD$ywpC{Zrt;hIsym`#|%G zMdQ@T>ggn-Ar(8I(cSIOyHd1d{F)OMs06NH|F`7aM59*qB)vsR`&7|K?;g6>YD zJQ!bd_B+DYoLyg#YvuN6*3sq0t%53zfp{=|8!YyM2JJ*qsK#bM>PHX%0V_cVCUfEH zN2B#h4~rs#Ot<@J1^}o7#kh&b$arm-5Zumm(E8Bf2>Q`r=xvztaldd&Xt6{RY@g6d{=b;lA+5v)9}3el-E{ z)gm+$;y*P;wyy*c^9~2`A5bmUVkSlpdJ)}bAHo4i0{^xtt)!(Rab@t#hRHr<4XZ57 ziM>n2BD&5;;+#@ZxDe%)>J?4+C7y(wppjNzx?FzE%4dxWV*OglF??wzaQqrlg#6dI zOAbIn=j{qo?LNivq%TECQL1Iz&}20>R`0zU#ms*=D7y1#GGwll1t{^?g(L!oY9x&> zac>4~Qh=s$DN1c$dUs>PAUesRt!qrEh}RER1Rixn3WOBG{3SQqWdZ^8$!Z~h%~e2O zS<+XTyh5g>WZn+;Uvdkcq(1v!<&(RUG6XQ~0XzctY_{i8S@j!*m!w7Q4rbo{xt~Qw z8T9wwrduko+{BbX>`u(0u3(A;=R$uAeckj+%5@oFwEDH+F4D%bNqYF<+(zM$-_b=> zerG9B`QgCdoF9*fnx*e;Qe4wTA4|v1P?@eq?3F4B(-YO5r6!i_EzA9YZZVZPi~=RCf## z0M1C$?7{xgqbuiYV87jDqj>f$COVG)^ykdP9QQ3%iV$bd-DHAbw-~pDUyufdhdumO zo!^c;GQJk@E<7wdSp$h7H5)yC3vRRP87evR8B?J=%>JS87^8`EKkN)4t>O8;^s%d} z5u(MbFmlh8%OIU7FcgQ<3^u8$Q^73VrqC9HF{O>5Dp!3m83T98*c&Y;@`f#X%s2SF zR1ufqve6alBVLo9xH_)~&ElsQ5#!P^T=np7?%yJyA-f4SaJ0BK7%Nv}+ndxM3)Kw( zCL<6C7ziRI#nm=~^22s)~hjD7C@$zn4KkO3tN^090dR5 z;CkAiw(wbf&d!PzHHzoKW^b24CJpKSVud?%pr6aGa`MSI#fEi?I-|pkCyYOfTtBWJ z$L4@rUemz%5Ab+LKQDjf6>#St>JVT&e1QN$A`w75GATfs1`d93`-ob(I8YRmXncn~ za&h1N>WJad_wpJcoxfdbq&uTCoFRBQ1wuR--Pg!t`>*kF>ENbNlq?#Y>>vco?n`pV z%2SNSG^Kv=79>?yVJfP?*_^s5i(0^A>j&f1K)fIsD=#Af?5Y!a^~N(4#*<*vH}dBn zx}8HlP!gL9qJTe2_-ST z&oh#dF|+xk6NbWc_v<`=rwq<2QKJ`a&WHnURS=cFVzu6|?&ljSGpB)P)5=8C_eI6^ z4F)U&oU!s4(bjKn$J(23nU^p#&hv~)J8X{WGtLB)Y0mjNLQ7&0F`~T|wSnNIId4q?Udh-* zVa}l{QCyC6tyXX)LCrb)E$-qN@SA~qN#kw$PdR6zNwzyYjs(qW`$bNTkd?9y|Fq#5 z&bXXXa7g(tZf{qYXQfpQA{b05*yX^6En%KHm4Feerw7vztHGN!FhJO{O3mZtThV7N)+_ZXE=qhGspa zYs&ct`@v_vrEEELkK*tEFBD3doIjd*@`g)SHcPLfZn;F=bvU=)27Hn89wLe~uO^L% z(VgBV50=)5a1^=zj^aql+G5+#k49)JD?XTNicbUmwNi@~WDjYHziW2cKfwV%*hCEi zVjP~P=Snr}Vjj4+4~|{3s?bKc30PKvh%w+v%91y1;+Zu>a0G~pco4_Bk^ zn4A~)0z-PO0hTDha0Z5B(#z1qy9sB2Vej8+jlPe3mYbL1Fa_uT6Hl2wC23K09!p63 zi2qPu2er6WZD{=5Js@ngP-*kYpziX0y?(eoSG;aHIoRC@u`TZ?u{}AQ&dc~wS@5L> zPaxnySsHuBBJ-Xjuk6x8(!z`tOYxfAPl+OvB5>9o0PmartF5ucEVwfv}=5s`|!VzOr*f`}pF@c_%@2>=Y;e z8h2V9Grk_}`feHbQ>Vs|HGU_3A2>$=U6eu9h|iHtd4$|bubWSiP-6$~@1@zOIS?2z zspZhZ@3P?6>Um@>zuwpUuCQJM2H@&!CHZx!Pf!&(2jm)=cZXZe!p|`(QJ)YWh;c(g zI8T9Fy<1<*2#@iYzO;&nk!lLq=lQO1HF#BuE+Ns)qhsvzgf}~$_y17!4$zf6LEms} z+qS*2?PQ~kZQD1tZ95y=wz09Tjj{1}|Ihcl?>X6KCjty* z2CJ|^SlQx#kw}~m=(31!uNaI$k1~gnUD&y`;zf8rc%@sdx6WABtNy;sezfSlz2X^c z&>NjcKv+(n8?uxGEX1KX2>!V3Z_p9^;b^GmRa9y2ou%f8-v2yr3Cl$qVYBkAH1XB5 z*=}pkF`My;kmBx22{l%UVDf((2qtDs+MB=`%h0E@m6u>buQp4M&~_&sO%4%NH%<7( zaaZ2^Hk(?DI!vSQ^|ar=`D{Muluv@>d@p@S8hgQ3$W^(Bap29If*-u;J}P1n0YvzT{+?VqoTFu4}W zo6dUvV2I{!H0hyI!VtO3#EMhVS`La0H_(l21c9iaEnNfZhr@W#&P{zQTShe>6k}_Q z7Vr=Ma|(eJ03N7B76KW=I_oU0-aE#WoTIGDJmA9uwNxncW32OR+sB0vR=-#{L>I3} zHZDsQb_756LXHw4trYFxZ?EB>!|HwAzXDD=-jT?w20H-G9p8uvFu%SGMJIXF1Gw0} zeGad8lVc5hCLwvM3UL+MiADbCAKOQJuOV@AI;XzU0F&+r6Jy?BYLgU!*r6NKX0)#_ zs)4nCAIHyIEW4AdceFM?Il4b=fv9}pwmwFs2BeGa87E*I6}h3{6-;3LQ0p zi;9Q3e5+8^chyKr!eU)MH1|H>f0J(C$Why)k@1$dse?OcE8Zo7JG)L_*n>LRABS&h z6q}+e01iw-Ohz5?UWk2>i3}%KQ74w#qMK-oEJRDY#4I!CM>p6BNT&Ufa{-+!r9)KB z^lWGxhe{o!$felE>;(xLsD;ca0?erO4eg8CDaaJXy{Pd%Q=7OeKaeb6`o1snwN^GQ zW{~x;|M)nKe!UZg|2nx(+%F&LnpnEJzC{s&1K7-Oq}}eRI)hUzQke-ht(N3OPOjN7xC{Z*swgl*@L_@>y7v;*yI|%N z4-C~t&+i0;=jR?m!g4!s`nIp8$qa@2OgJDCuMCCP;W4NY%Q(c4U^VkXkSi)joiWGL z0L&eY@fLQI7il8E!S>I)~k$$hD@uUmw5NnZPt|G2UbFaPo>@Q9@aa2 ze+M~n*si&uZs4!oa*&|It6T`(MtmPka_7oRn^q~M-82*~(j4gDzq=JjpbKGPFTjYS zDtRUsqNB8h(xN@ZwR_Le!78UDvPJp^0va)5f5u|D3uC%M0_H9EMHHlv zey>;-Vu9tFwqvW-e_I;i!$^@wY%4SAjKJdSl`5y?R2zKz`98-@PLBZy^S95Y2au$P zSLoc1FwfH3)VBULWlPXpA|rmf1^m?!jnvp3D29rs$Y5a>qOBLD$jqSO%D6W407yWK zhzIh6vocgt$j4&F-zVj76yj}hxSGmivC4%OYwFe!S&gVOamy6rusSw^MHf*-jtT}V z5`R7d_fd(7{e@vt%(n1jVv{b%>!4d;!?4jhP1UgtmEG0(G)*yR%8ZK#1pm-WSj(i~ zcA}pK$(I2Cs1RNkg8+0cZPuUN2rx;ay;A&hc*W^VpBD-bRnW8b0)7WMsRj>qhraci zt4@l1%!i7B*)61F%C7W;hf-H{m;pnz9BXhoiHb%0+p(X1NCMrCpoeq+2e%;?U zBo`o?$WTnPYLRFlOo8qAChbl-C_j9pVz;fYo>}U35b^rZ`0f~91ZjS3ahRm}vTUtr z-48UWn@m7YXvDrV6Oux=J#*dZF}lt_tV**A zn-;Y$fSm7=t+u@Na4@xI1R@Ru2xN|IHGbc&$|ol3Yg z7kdCBU9ZL%(Cs__bAUr6=vbW}WnsZ5sh09`6!vGCbY=kT_vCDzNg2*%(U#1{e_Jbd z;gc+JMQ57`BfIvh7)$5>0Ll4)Gi2^JtRmdZf#db{zFGS@=DHn&uK_AU-ZIY=RZzb# zXCM0vAvjj@?*dc{{>bZJBpK9g^UXC{6wniq%oO~&!{WSWry)tZj#)T|67n|hkV>PL z0~a5EN^Jxd$I}7fWp*k#AY(_>?2ALl#}Q0V9Q$ZtfnTv{rS*QC4M=EAJ@COOX5%d7@(PA2A@7!N82 z=5RIg4%Y-W!!TNXL{kGxmDdbT(X+_jzaFy&YdA6!ER|ZUOQL886qds%-b=ZVE%8^{ zCOBwYGKI4t0nO{e+2GAjfvuqPQ1c_8X9o!B)}D-^n=AztQ{DDSuzJxTRnUwPn}pk3 zR4d+3>}i`)fTBZyKBqSds=1-z$n3I@vFQ-szWe0dCl=xNoLlkf2?#&Z*uv3zSvXo} z;60A2fkiGg&C(x-1saks(ZAeq3eL9nymbaEJM*v00H|h-%Xxn#vpT4PoxfA=iJSDw zeJ_lqj4l0wt&8Ttt<80<(MW6Mb&u40uLvov<;c$}n-cBu8%#mHB7lnKb;Ep-5g}uL zobmj?%6n?IUEv<*=8;^4ZFcm;}# zB->0G07f5-#Ksum*r45cbi}I0vdV8lrTbBK0*Lg8KG0w^>rqr?Alewegi9Rcvg@3& zpWC-bswSy}LJ4^`5U{hILLz@BnOmNpEXJStgY)T-LLfS5gyG{Ano0~*C1F+NS@f~) zx7T`LOZJqF3+PnF#Y_6Ug#1@Su9wEK5;XWoxv79o6|=>_1XMon zq>{o&d6@tK(`k-^+xAsM?~bBvgeTQY^6~0CS#0|Ur0E&5*xN4h>mm}1cWb(`859Np z*+cB|80X8X>zz<@8<}(S8@MeESqP^YB;=`1RvJ`lq_ z&IKAejd~`xYAgNPhwt8NkO$pGS2Gb_xcr5h|+mB^<CcKi2c0h zfAev2pi;^dnOJ*i3X!>g`LxRTcMLH(*f#-aI<2}G;MzR0y1T`SkL|#rY5Rz_BG5ct zO$X@anY}JrtZKIP_|LKVq&e?jO*(6xVsGCC9Y@`kdY+;P(wZk(56xNTMPJdcjS<)kJ_Vxg5|Hxc)w=)Vr zUMocy-$MS#^X5msJ5e#VmCwp`fzn{{5idi~puctAf%rA+12n0U#OP z38mhF$_=BA?kcat(pUf&jR#p>yC&J6I4&5)xKwyGzNlRu#<^ObZCB#n#ZICz)H2}n zry~b`ed0wy_aQUFenvc5b5^P5IfBLvbo4^=Gh8LV!=}$#s;V0EqdI4sUsGZM zlbh+&C?h3262D$gRX@*;O^z%q3+!Gdg~9EzYVa(VZ2t&v`qu-Vyc#b!=36yI3j$kL zXI7sxqQds{$st~{?*#kOPKU_MlZu?$#Fi28JT95K_@cWim&MTQ5dlh0(#*?R`futk z4_G}2F@xg%zq{do2k+@}3Si9}b$Hf-$@;^xLUXm#`0lk{wcn}u+Zb`xiqw({0&ip!zxf2x?hT4YQEu7c zEHfC&FkpS@z9p0QwL7v}+2t=-u+zU5_;d@4@5x$SLuPAUuznS}jZ@~f)3Dd#1nPTa zJSV7cXVx0Yx~U9xUeuNtqf0q3#%OL@Wa@SEnO!Q6Q^%YYvQ?+9R3;YhtHyn`$Bvenb(Ed*5K#!% z%8&6vLx+zUIG93PC~tP$*632q9cJ9Vp(hpx$oGJLzjb6OH~;tg{6B9`uD!`*fS{wg z>@N65*pnT202A;C-gg$@KvC=pWjjo?QimyBm(HDbruLb4xylm&dDl7?^!qOdh(mmC zC>6Y(=dv3Eedj(FjAOqIOM{&&XPz5lC)7EKS+-Cv47AIlk_T_w8gtGynrmXLkEdp} zJj<%J8@l02v0`byDuiF$xCE$MZM!HWtmM(omG62eR3kq(90}GQKN?oQg2~>bqyIEY zsXL&FjUYE>QP1E|4rHodKHkicwF`ht!PT?|S1W+85XJ@;7l7#rLv{whJp#XD1kvNK z&V;iy`=I@y6zer=I(i_wou5^NAVZ{8*Qz>SrxZGO zb6za=EJ+%N1-nT^DpuR&ww%S_$`>+h!%lt&ey@9we9}d9Rhn#ea>oG|be8z$-Q5Vf zX`E?S52JIP6?*b9g%#{~j985oMXj|%avDtZ2( zQegPSuYcEVJ1vfYx5y}PL1B@OM>VpqWzPkm+a(~|&HDF zIWt*eek6xg9P;)mo&fQwpEB_>*i+nPCn_Be$0jq;nIg)i01&~{k9$1eMwl`a>IGj|zWPb5}8NGP8d!I3d>cOXR;X)HpN5Iw=Sw;XoBlAXsuFM8YO)=Hp8 z1!JNF$0haGWrKwrTgdq))3Ey z9hT$yH?8us0j`UsJ^~Jl=^ku`YZN#1quwbF#AT1uooAyh6?v>0obVZgB2mRZJ}0iu z%eYMxxynn=j(o{53Ml3>GW_UIuH-AQq*c+B7a8{xg81(;RI7$9p%dncY?-+_x!GDv3YKm<^I24s?yVHih$dz~a>N~d;)l+=UL{B5ja z^#w_s9gvZs6r2Lvuai_sjT+ERkHQae$*XxBAE+1xE-TkSzABE(=$9VFrx5^f(>bN? zS0Zpo19JJz)?mUZ#mp?BdbgD0a=k2}(2OkU#MoJ;@g@t|k!Si}5$w!7;q>MCTvJGS zKkP9@43z`A9vo+@!dymQekF)ZGl0_i_X~a84_M%ei=W%wYpCgQc(Fe5;q)D5SQSE{ zmO+aL6QLk_3v---E)@LV3vP&_0a8{JM5I6(FPM2V;IZa_YeZK&^MOwI{a~G&OMMcI zY1djGP}=V@2`-(eB8|Ri6%L&a?f^vz__LM;4FqVYq!5|qT_L1{|}L+Iuu{fy97`2ib?2UMf6y%H9L{m9;H zg+SQAY)uB^FCcnP*;FY}C(OjpkH|ZGq?^Tes8MSeoHSBHt*`(i+!cJRHcbaDz*$t4 zL-h{^*TChrKloU5w@-FYu7zN_yC*Fi8af=(QbqFRN`bu*MIfe>i5b5$1{6xd52Q-S ziLdf-z@uVK6aU=(39pm$wRlK4|8?Rs)3z(OM-E9VdU$ZLy^5^)iwDlSAU1#z7D)tc z@*gRw)B!a{^DzlaE^jb=Rp1W;MF7+*O@=9InS3jXFo79K7-ac${evTRw0uC+odxq~ zVodbI)nAsw6QQrBh{gO#_&mT0>JCj=WBRnpt3LC!bBBQ22fVgIQ+e~5WB%j{t4qEx zbHCbf-!N~men90KFV!{4mK5Q)C=*5Op!yE_mPLUppAp_N2r0^%aBsmQA4y@4yDrQt*}o-z%CNgqKXJ3r*)!HZTz<<+-H6br4Yk_*>|e+1S@_yDAmVuZ{M5Rl82R zwr%JDp6kQFrp;_YC$$vwfwD|$NlE}?H(OeZaKj8#N<&VNhBf#Z*^o^smxTwMAcMKU z@bUajgc;}FO+;B$0&4ro9D^v9M!nen0{GM<)q+^mAuZlRNW}37R_LdEmMNoZtkwnc zhUc(vb7K39@xhpJpLU1<>t`2AliEu(DIi%rLdTMyoGnG)KD?Lb{pgHEjDcomf$rJ7 zN7gkCat=XKoL6wuo5@}*+6ex+FD{G&+!!6seh+@_qDE)Uwql0Sc5#`T!E(ip6AAu} zwv{(le-@G1!#O3Q8yxI7uJX~YKi!2c4!dcAWS@YO1Q~7CDWw;YKfibJ6a;cW1ps#6 zn3?d_E}K8J-oebG{0}T$P-$HC$ct+&$IUFhW*G{{;TIXOL+;W{UX8P_O4Bw#4*!CT z>ddatw16tcBEbDOaE_P{F<8fHMxbLao*%I%PxC_N;(Em#QTbX`azS7>9!oA3-q2q(N7Z=Ax3C-TjG!{dJ>} zHU;V^l)Vh|G(LPgjpCZWWJ?2-nqV=kHX(_PtA8?kf|AutQ-A18pAKi6beJ-89o9^? z2MKeKc2RNO54T&=@6g>bq9k)+MbHkn)9r2-IFmAW_#Yr*!vDm5h(L)1lu7j6DZ!+E zRyKo^>IdhMOJgln3O&D$Pe~O+A3^^zcl#<@JkcXP|4j7mXV2-axouuJa;`1HR*|s? z^{ApL<>(x``Ug^xJ6cMLBpSD((+y2!nX5sB?rB_fpCg@R;gkHHUg^(EX3R5-wsHS} z69tQ{SXkZw@EFs2q@b(^^chZHjYk@jjY6<0TU1108+CUWtjm}*5aXCUSC>0kT|r;> zJ~5hoz`v;EjY9rx*zU!H4m&N5lN-qB5K?q^xyJ6H6imbwTGcukLrwp3g(BkjX@XpcQ^%{MVAYK>jVvVdz&1%~ zl&z0wTkOGV?NUKQ8Hmky=O>K3_5H)*BuT-0FZ0JuH^A{Ybz6e$e%PPqgSlnt zzHZr6BHmISH?OMV@5xO9vRg{I`qNXeRsSmuEaGBPULJ*v+Gy{tm|==l9hi#t%HnR4 ziv(b!MH;=M55iA%GTGo4fF;bZ{TRpjTDG8Bg-em8KtW6XnWSj%?0>pak;Io^fmNYg zRZM5Nv9*@U#d0rE#Ni#0&Hu)7kW?mZ$dkR%$EYT#H6tt%mku~KMBEr>W~VV(zY0^< z_cO{d2oN@@L>=8{!&&E1hBe;P2x7^qHTAib(@rcOEDHsIclyg z4I}lM-cp~f)OsX+J=ibJP`08*z=)21==`KLgd|!VB=2?OezxjO$^RIa;5TwebxLW< zVWoeQ^iLbu%m+m2CGkLBkGxoYRPv*bo+$lnw4|6kQ@xOqQzgW-xi}h|Y7F8F@%Avn zuxPQ0>fx(sf~&HI)M7FXvB_g_OE5lNheEk)aMWLpS+%(TgSr~L_*K8@;Hhfl71_v` zqXw6}4wq}b9U}z?6T23srtn0rZ$Mu@iS~Y)Eg=yR<^Uk9*vSe0v3>=Qx%Dr~c-nve z!KPdupTEn*k>@|L4HlFGobE9_Qm31{ClgWJinHWcSdKjOjZVD*VzR)*_^M zzXlVX6+{4}o`R_tARHH=$lBwOq2d^Q?+QtUWH>W%38;T{q}A-PqroJE^a{?(;W0j4 z1B>!&b9}U|!4D+=w?u%%9%6F0UHBCrn+9-rfB%Eo;VHGOmxM5&;dHQ>-$kSG9rLF_ zE8$4L>M{kxaZ&YjL;VW=z?6ZuavavQW-4GxNIl*7n7UsE0aKxIi9htM#>1&O~&7kgpS!0Y(& zOnYuBD|MyP2m`AN=-imf<}Vbzw99PRU?kw}zKQjKTbGpMXu}XaCIgBbJeKo9Z9s3t zE68W=rhHSm*72(6tlw7J`9I;mY}gfgCtxj8x&`i;@XJgtfg5H_%3aft*6AH${S~04 z9=ZjOaquZSPT`2m6l)Zf!j&tup5)?zr%3lpTE}`$c(&%*F0hHW^7*Gv3S$e-W3{IE zJGb{usmzRsqnoNThH;oiP>T(QjDXwZ^y(Qu6?};FGYH7Ul0*}y$4gr9mPVe{7`e}= zZmvnx-6v-86WC?KnF&7DEwhU;nSCntFeq5la3hN;xaKKr@bKAi<9VdK9Gvf2RfV*+ zaaof}lWWuC$Fx!-IB^Yxr<^65)2#kT7+Jaf35m-P%-}(Tx>`%ZEg8ZzQNVjbo^G>Z zhG2WV?RUp6#4Eyom;ZzlUSFytE;Ag!UWNZFXva;UeK{&}8*~UdEq(?c@JOEefXPR4 zR^acLj=#0p7o22kyX6u2)9S!yFaRz)<|Ta2jZ8y$3R-%|U*MVpof7vDu;@gj%sYGe zXVVRtM(q$Z)SACQITm2S)!iZH)THqfvy|x`!u-?QIgz>n%y8m27Ec)-99T2ITOzd< z{J2D3$VtGif*{+BCUr&O5uTE=CUxVEKS!nqtn{>M7U&)|pj7`X}(lqEh7OPDr1bDr-(sa)tOqW>zsZ zfL=Ov42RXT0$BD_D7oG+F;_s=NwaDy?QLo|0??$0ln=(iWeL25Bgv6zoQ^;#E5}Fvc!84C9 z?4>n?X`cTkwK4MNgJJ%6M!O^3!|?CPJ)yJy2i`mS8+{MNdyL+aJfJV*uS$v#XVZAq zqm$5(PpMM4jj!fsW!qhQzsGKBS>KMt0hQ3_`h}pkxs&!Tc5mlP*BBPIdo<$o+A>9P&uF4G|QEG*X_l;bI3VYGhYut5H&6s@k4Wk|Auy321 zw~mINwvYPBd|>I5nQ_j+skUy1X31Vh6E;8d;Kn7Y#XsJNL+go3>RDm*@;vTOjbRl? z188Z2a!e=v$k_&Dk6)icApif`l1^R_1@bg#S$&x1@OaD&fN8 zcZD;;hFZ-sogmp5yX4Kj{_^qnUqLD}HJ*N2A9E(KWi{#P@nPCM>=zgkuqd3K7C3#a z2=LKZImz4Gu$T$?8TK>HzJ4zSdzzM*!QblCNWpP>a>H*Ju&9aEI$&BbyPv(=J>?>ccS?Sf=o@1__mKJh0k5=qK9nxScqD$Xg#^!a!Ylxhy#Y>Z`81Vi zK*zIC)>+Md9$FCav*5SJsIpoSqB^qK6>*|?_ANK|f%_FF;K?4~&pmlJ4G@q<`gxq;1{)0Ns?`rFULYq%Ee;A$QW5%(C6kK4=YhmM3)_O3z z-WjvCl667v00uHWfS?zMSm3|V*=L}4M`rBKA%5&h$&0Odm=&(lHswxFmae!tSjl6K!e@qQNL^WU+En=oxF^jJ;8*yDP{{7QF z-yjy2<(>}?f^&tne+g%U!*#wgma20%&6A9O#TJ~xDeyN89ImZ`ZNznZd0Zjj>vmP_ z@X99vuzkc@rnL{3>9SqC?`8q}c5<}7>V9y0^aky*vbe&K2kCKk&T`h>^T$^)JOq)n z`ptqZ9lEXew!HmLiWF?JjKPiEbvUG?@O&anmEJDZ1ZHOb)_{-pQ5P+YF%83h3z-hUVKPEQdsHFxy1gdal!thK?FGQef!43)WyK%HRO-v;at+V4MEsNOkiOw@P|NVH z@?Mtx))TR=*?KqZ%?UyDcRCAg4E*_LJ!%YgVY}u7^~$mIcv|R?y0l~4_C?G4&J&V5 zU=Bp^DACQq$EQYZSD6?*sNygn9Wh3{f2lV&35bs{ojH>hXXB#j-+pX*KsP`}yE$-t zW@4HFH`xdinKxq~4r9gEE4BOK@HXh|?>CZ-B(|o1SxF(Kk_opIN8anMoKdE2r0oj& zE6up+Ak-=|dM!?aM*e4UbMd@k6&FDdATYsM)M&#$eFn%m3>8-rtlsZ4aVuGE9BOq_ zB28gnw82*yJg%AXte6ly*c>t-Vx&E|SHQw(qaH{S=Lobz^uPiW+;`FUWkaj$tWfvG|U)XVR(8I=sE^6vO^l5<0Bfb)eTiY=rf zy+(CFe?i%{O11Lp_|R8kg+}3n3`NW9xfL1)lWP$iHX0q4R+yPQuE_8dgtN>qs;dl? zC8duY)6+2~+<2 z_Y7$ga$k2jE-6sS`^#HYTO~xVgPXt_#pgYWs1W>F)q)H8As zdn^#u%+~`3)*;N#_E)^iwtu&iTlNgA$s~bjy2E?sTTalGLEB1+5chd&*Jq$me(~&i z%iyVNyiSjOwMUYtBA>6~yXicUt546c3-7)QZ?HdL{u+RUK6f5AcmAZvyPdr6bimW| z*Cj6e@wegu&!?uzyj>gLgo$JKryw|Q^84qo3zW{Y6>_`|_27!0v!xEk=TEo)rs7N`xC35)Kj^U=2(@YuS4H?QlOA!I?W(7=nyIr2+ za5ePG!#;rKTB|PA@prD{?_|f{*^a-{9e?LLUUBcQk?gOr>}w6SKcbJ8-e_W(*0irj z3-`LaIk}h4L>`{Kh-Y6i+iZJ=^P}pVZX;)L+*{>vu`GTT2;EKQq}n&-!9PHbEO?$g z&7o-DB52KO6Xfm&>7OKc{6yKfdr?S{62B8DCK=eo5}V0AXdYo zl^wpn87aL&;+F^UY2fzc#DdSDa)~s{4<~FEB_rJ8Tb9fDX=F5sbl6TeWK)Fkr|Fq!RYVf z@_?YPNv6_r*5aW$8<$PnYc>djkI8;yXSpRVU%(pV&ogb#9C+40$@^N&&GgxBWO|xx zA@2=&A^Z;!DJS0bD1MFeV^lj$hFL6DCJ&q4#JGJR+Iuwq>33HTHNe}sPD#JQA{zy8 z80k0Hc*F2A5*@qzq?2c%lNDdq!qzq_dNIEeO_==|%Js6(D5le{r-io!fECTl5ED{!xf*(zoKJQ0$ugHB0&O=sx%`@5w`szUnZ|Ufyln zn*)t!5-D|0kPl$aZ`O;GWrS6-F!sNps;AvC++>xBk^} zVU@%KLjbB&*_g)8M#ktbzZMoaETT-eab9mVXSrgM>djsdDn7G~%n*8T*31;(@JD|M zduAM^!!va+Mb5u-6-#5)&EGIBS=awwb{Jk3xs$9FFOp#i2?ZG;;vYvReP$em1O;8X z>xyUEVjW>9Uy0zlX5@N0t*Sg?dYui45VAIiSEBs(?e_UF0w%o%oMd-p=CqVeF#IBz z@A8GZ>;{B9X3k?E0+s(owx<6AH1eZTvm=xr|2H%-al7C}d5N)Z* z(|{U96A-yPYJI1$z_DSm_8aXT%5A2Q#UZY)hiIpF3R&2<+b8Ho72sRDuHFlw+B5dH z_8u%e*`GJ+h4B?N0dj}>5lWVv&{JW$$S!}K))JG}eZZ8G9@Mk?Xy5Drnpeh{$_x7l zA(i&%)otgdHr0xj_Vak7p3YYmOXKo={oJY^j|4 zH&$CsXtnzFC5j~XAPpfWXLo*c+0q`}udUnN5U;_5ZY)AmB`a()=XCN!41= z@t@7N%dhg!7Ojnp6BgzJ54RJuIn=!IU(_Ba^duYfdk0JMJ`fMQ04?4*UtnHES6+(< z*1dsBl0oWY@q?+hO~lC@y>-~%%^%TUSzd82J_>?*! z$NP+86S_|+;oRJ;_0gS;A@DtC37Dq zu0c5^35b@tVeCvUjL>StUBCnjpi$Zxq?AUt5aHHCO@e*U$o{&ozz=R5C#qiLje;lL z7`Vi7)5%9q7vx%#LqsK|_8AC@hR_1{0rkf)WA^IY5A4we@+P4+u-E1=cicFdnEbpQ zD-di6PtIAUp3`QnKn7BL=f8F8r->y{$YrT#tyECdAvlu9i-$ZF-z7n^e~ar$>8lqzU`x@r`ZDd=u`TNIQuXk=P66fuC993_*t zNKBF}S;`Po912L1Ks8gxg$sXyfvB}UxhkBjpv%@=z=7l9$`R?Qv0(j2Zg)+ZqhLm6 zupr8uCL)At0!Ad{CKJW>aHC*ADq`|~p41|VX8;AMGG~x>@Y-dekyap+AkOwG5f)Jp z2Ga7#oPH&2a|nPEMEK7#1T6gxJ}^=w^DpKVQ2j^N2jwV;fk^cbqq8W0#n~5jzjF$C z7e{zlyDkHJCnNr3+EPplcBs(rPmi@Lj>0!8P%<`^U{MjFfvt##sNnq$BWc5y|0kOSY#nP%g2PqMtWUay8tk@rc8Ndyd5H;LgM@^kl>vc2`UFQP zO#(S%2P!q0^WC;vKzW<@ml*$pRGk8pVTT3qk2=MR^o>3|Yo*-K}e_o8R(-{Mr%CcYJx`g=E5cjgo0V+mar%)B+^nQyvWl;?Y8f zi7vwgg`weev01yCCBtT-VJKBWfh!j^(xNsKQ)ZwRh=Yh_b_wfQ^8csG*<4Kx5Y?_x z?=QU<8T;RCd!a>aC~Q?Y^gU5C7g8E?Sr+o0IQT-*Rz*YUnNX70|N7`qRH$a%S+RK& zI-47L#TE{&1Oo?fpFrYRfItAFT8t(iu|+WMWxW;C*eL~@O`niOvS({cw8rcTF^ z1Tqc)LdFSE%1fN`A_)uQ`g#q=2jU8X7y}37V8T~Tt=CKstkX|&&E`7BIWv?P6%bF7 z<6m7#92o~f#@EQUgs{HNw3JV23SD78q(#O}^<}r5;KpDe8Yu%r$~a4nIez^nvuay* zB~gLX5iA9lP8-|3tnVpkxq{Zehv+pWbbW1EVccbqPL6^ds*ukKOP1xPi!)~`TL}%=`UX$m zi-(c`++2=kTfjeP_V5{bb4t)%a)rpl7p!z_-cDEb#;BceQK-ZB_ZMw88$aM=gl@SW zsH}Yl?Rn~cw`h8u5S{B!{(y1C0!eh)HB3`Akd$SjHh2jNN@=$kDN5mROA1?fNW536 znqk?)QLn>AA)`8?g%5yX4NQc?rL`p)riG^g{BB~D|3UaCOHygGONUpwT(T*$GEO)G z19>qDvLMW}KLY-aH?-4~tWkkJ|d zpgl0ZTpVDQ`o!SlpH9uBE0j(x8|g_Rt8R7sJvE)q|+831D#aDlnbfra>snF$u<^!sA5&QREOT2cj?$ z3K+_3jJnsGPAtmIebEx{Zp<&$*Zw{KPMLkAe4u@x5wBk$Q?|T(POXIP0%^AZmonu4 zbH|6z+mf1;UrlY?wvbz#;q$hn*J8UVcXeYEE2XL zqs$FFRMRQ|5GbsX6FMTxw2XgxPj00r+ZIxk)8y|S-znep=|;X@#_FTKCtZ5*J->Rx zFukxJCqJ=AJM=yV z;&Mvbj7n^!94JiIbSY9&<-%d+M1@@L&Iq{gC_Mlq3XAuJAYLr)6KK>Y1T18`ND&B_ z0f7>H?J_|+HJ#pQ*=l-oU&}g;GW=o%-NXqzR0RjKp8@A0ez=v>$S|Zp-r{o+sqBRF zKo5}a?cDB#7T^MghvGlwRP;h)2Z!jeh*Aat1PM9 z&EHkUOrDC1*3bvW;)wCSxmZmtHMZXfrVA!?tYF{(WLWpMO;o6}2v1 zGftRx3+Z&NG5qish9xx;t78a^rJhFn0X<)xU#(`IqVfXb(`SZe(gLDNhp^dt=iw_9 z;@c59(dFB)^{0Vkm1>-UGz3;aAo#H*G>#M@42m%U0U0d_Sq!-35k7Qe2LSjuOM-9t zLk?xYNb$fG@=upP65FW>{lUw;SpNIaR9usxA*YJxyL zzvwed5>fbc|0z80;3ip9Tuui{nPU#EgD$S0!1OkV<9u(fT{hTYVLR_%di_W z>>}Kw!~cZ9L*yt1+G`o^Q6JD=FZ?m=dMmQ+vFC1o1Fk1l)4!k5M$E`pZ6}nSV@=P; znt~_I?H^Lqx#9`v$+^OP-if1pV}$U`c0$KQz(Ty zJv5;UFloW0CiezD1)uMi`f9B0Pn(Ox(Z%jCNV)9tPZO)IyFdMl^&G2Oc0-Gb(w9K( z9wycw`aGV>D-~5ur+-i-G`wb}LANJCI6G15PH<{$t{FRu&enq<*mkP60przpf~Ews z_ErtWE1_LdW?+EyIfnYSdXsGTfBuUe0)YAN^{UW3bf%Atp}KGMcUyLZ>J>*iG$kxh ztv`aZl7vVL1d2y)k?oq(4nEHWv>;WU(CP(%Se zM}6g$jDs9!A4{KfZ-tQ?M*{>1IUh6b0Usm^X;^R8=J|<7$Z7BWFjpH)A)qk0_j1#_ z!#P{qD?gcvbwKTy+zd$qs5Fkiv9=~p`WxpmpkD+&mgyioIlVt;0|j2 z&sCYlBY+K_pf=mJXc2C#AbXcEfx8I3gD1k*0ijs%_bGmWHgl)Lo0I<+TslZ_|5M`l z;5Bl}%XIK-TT6<-{zmh2I||aO0L)T^!BD(cD*=iQXk*4s_VTvN5*+`&Ia+0G=Ybz~ z&}ejtpL=TKOVMze7ef-l&Ll#ryaG5SR& zoaZ~GkgfY~o z;HQJf38|%{`Z)`)m4P71rUcU;7eZsj_dyBJG-^c<0i-kE7Qk^9ilDQJggMFrK$)v6 zoxTL34<8-OL)|O7wRqZUi1ZCHkwd!+gucJa-+uWm!MZb0K1JinA%Qv4F468hiTNLU z4&QWa5}sl5B0qJ5tK9AWQs*J7 zT{I{f1zbdc5V7J0@DQ*(r0WW7o&WA}gkmH1T@rPcKEUW7R7`TA!MYBTL4*v-+OD7_ zQJ|gcOjkJeuKSgx{-N+E%C&mmK%KU{V%@2!`IHRZC=U#3>w`%{DK;3}z2WN6Xl|r* zCNE46I~~u$)qEO*9#%*6A_69ni2 z0O06xj`#>N$PG4EoE4xR)$lmZ%OH{r%HT;-kdDelcpsHX`AF3D*7FZY_G8~th`Z+? zZ58l1cCJ9CdC*2lAkzsWWg&6M74aI^6&@CBJELBIf(ayx@d_N*ln`n$7*zN0eIGx$ z2%IG69Zd-=S8fRjtUO3UP6-H3gCsz#tP(iryO!h6RZL`(HDykUAE^-f2}l8`6oegI znh``m?K7F2|8BVwI&dSPL!Lu5X?EgP$xH)xwV<$EbD&M~3Fnli1?zm);a>WsC;1o& zhMNh-P4mF}Pv!SuB=$S=q>}?*Bxf_$N&vMMWDt}RO_F{%wU#dU*;GJc5Fk%@u@nSp z@@nM~3Q)avUisR1=!-v;jgU)^Sv^uFxd}hCx^Z)5zcw}g1?QwnL4_2Wph{%{29zKL7tv|cX)99Pf5{pwN!>e(t^RczxN>&$|Gb8 z0z-kGYFNPh|7iLK=t`O<&>P#fZQC|Cwl}tu8z&pvwr$%RXJc)gY;3=L|9kJ8d*^ib zRCS@NtEbOQR~c=$6ML!xphEpfXZ4hkW4cbCnJ{<<#2PbDLRexDAA=i(Fm&uBKp z0%8QBCVG>geL5|ZB z3a9wgji_9koP?+GGiZ4;`$b2bbbzoUVtvCRPs9g$f8fpQ!X;y>VC^vs2EJ%$Z1&@T zpD8F{K(K#wh7yI87Xs)=+#o~Vfb!H?)>{v)iXx9#NwVoe`5h|Dk2D>I{FDt1lqM}T|1kY)D%~u^0ISr!I@}%^;>HTDNvaoE zz5LeQQR-0b}gw53}+C5Fu%ITNYh~S2RiX}0#A9{7FGDOxC%X6jM?7? zj&oXOyrnKGUmkfQE!Col1Y(xS4cwMVRq~tt?5H{#OSB#SSUI5tK)2NbqU|z8r7Ho5 z(JQHj!5QJU?Xo)J)~{$)G8fx^cf&J6`}1c{5Bx4f7`^30j5%570)lB}{Ku-Lmt2Rm;aQ}XuE+T#seU$^5~E*Bbg*A334|YpH}szGg8EnR&JpGa)!< zRlCId8en`p-S;q4lo3>li~1ve>=o%`b9zIImR+^7pk9wNCoYoq*kQ{YotYXFGynyD8H^FWV{nHsJe!exFEAu(&t%bE_YSmT0|mKLqHZqd}H z3ZcV?S`VKLE}+oHB}O|!*yoTfWbPNd9$i0?He~>wVp`;1UYDIWZ^iQ%I9wm{`p_4U zXf31GOv5{>Lbq>KH&Gk=^G-8)BT}l2>P5d2JQ=Q~+F$5_rkC&FU|CEG1L5w#up9b| z(}`~SLAm3#lbHKNkJ{R21D6FqyAjKLu^!lxl|Xf~ zyWH+%x8skMtUAM!*?nGy;66H<-urNb(zDBUThN zT{5@BC0DB@I*rDi_d@_oHigEcY8lC1AAQE7z8ShPX=KEW!o{pxb<41#YZBWCpl5|KlEDaD!pNxhzWtX^7HZr$@ z{7qX+rh-%ERYNtR^uLZ1*|-vRhzLnB_&&by>E&b2>))#MF4@N$toJE;5dWxCAcK`{#y((si16;*RsQLkpIFfES^T&7x zg5LsqvH-OW|Fr)wU`IHH3PwR#9Y>8JO@b;UDT%1B2O%r@B^jJ<41)hpUH*uv!@GS^ z`>iIW{>t+R%iw}?b>GR_}w4bv-Fh`FWr<)o}hXae_muLgPY{*LpXqhBcX$OA?5_>r? z;#F7o4ZrFopC~lNZbcBobp;l{t|E}seoLrd!g!SzE@va6(=XE1oc$*&M(0e^p|`+p zMcq6He#CQFlP*Vw@&uv(0J3zA`1A(=s`PyA@Tew$I@VlTd`BaWV+IS!cGIony$uv? z94Mu9H_)o4STs?mC2>joKI|M1p6^lV)&*8$LrD%_JE%qQeHC&3o-osN>UGDPdIgI4 z@yqW~kC|ua9|{9*~8x#vMVOw!C2iUy_SqGVy{}u zTaYZ<1Dy+c@9VK%of_SOY6Rs3ZQvVF(eIz*Ks;g$DWWC-3YFvR?ICO<1U8`(RTxTt zX+Q%UKsv9XbzH&A$qODztPg@Ojh<|$BO0zK5rNX)?4lxMc_;y@gQ_2vl2&9Q9ljdB z`t7lFhr=FHX^max9#ToASe?+d9}bCQ2fg7|(bKIn6-a>)`6Pqtjd>IgrXD~pc!PK2 zQOk?MyklLz6*mu`btGWO6qz07_g4SExKBB{4u7R_!@gvH*1DH);Ep>nQmVEFqNpyM zAI-Vw<6-?;Hd+|HHwJ#J3-eNf`1YG`(;EC9k!Cw}O}zTmH}=D@$9$Qoe?E3xz3(zv z!2@!(%QA6+XxZv>rpO37n+Pbd92(xO2#c+-Fz#ppV2|xlbON_=F{du0jReXja}EKT zrPpUX>j}Yx*U>Z4g@=%nv>DNPJUo(d=vWqL+032CsM$DMi6`M@7RcGA!~cT-W;k7S-D9J=0z`al z%j9u!?Z!q4B{oQ8GHt_EW&l?BA2~iPJ;N+`QTcN>-E(YeO?Sal2x4l<^0p4)LPOli zE~@=jwR`LFmZZ!;Ol~xndXTvQE59{A%N7Zbb1!35@(E+IENtF)?MBP!^69AmiRKc& zxnL%}V4q}s%>lrD@F@pU}9;zY6h1` zC#nWfF$O?+X!K&)lyNp_WP7wq;u~Jj@e1nGmBoCj zt#8RkN6_#ZM0O@sNitqXFxVCZwzlYSipch*Oyx{~A&)-bdD=!v)-!svJHnGBZ`EaKLn;lL<4%m@X3#8b6Gh$#>b@(>~h##Q1Z_nEEw&t%+Ix9 z4iDRt=z=R1B#HuYAhaN=n7Shf@(m@d$CqS1ffg%Ssxi$D@lV$|2?wZ}PImojb)X6>Dr_+VcbSn$X)6XwDHpra5nzSI8Mc2U5L|FJC36zc|8$6<|IEZJ$gB)tw7{&xpl4vQ z1J6GYR)~62D=vxn%Z!f^5Fr|=7FubQlArZfu=o?ni*wy`mG&BKI|EVKIX_lRh=c*+ z{UE5L3Lvg^M0LS8p9)OS+qvV#0{a5uPqM%@!A^%{i32F4&N$f77F7G?u_54uL(DC1 zD;AX)vOGVBoR>q!Vy8)KKza5k?g11~)?9j=Bn%P5jeh&6B)J>SN4G~TLsUpy!*F@=EsK=yaD zqJbN~UDRpYio*+mN%XgkV_=&NN_SzJXR=O|(KHr1vmy~^px5fcKSnu&hHJW`zQ^`8zXIlLdu zoPXqRTrOtFm(s;ytyOB?2hz} zCPNx?(7BWajh&qS9-jtLbY1NJcF9sH1DZGnN=87n<%bP8Q|JHi47_WfF@bN{TP*ms zwBQ!AJg2Noit5NdStzqINvWh~gU`AEQsO0w-=P~HyW5DbXH|_|OH{rK*aA>w5!tIMlgJ(GCyj%W=$Bsj5TsvxoJA~v^6=R?Kq

i6l8 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%0A^4ZVBT%YFNdR#MBUyWZFnp0s*yL~It?#4=Lt=2_ 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 BXpaB@ diff --git a/lib/pfcp/support/cache/tlv-group-list.py b/lib/pfcp/support/cache/tlv-group-list.py index c1fee51590..fb8b7d5fbf 100644 --- a/lib/pfcp/support/cache/tlv-group-list.py +++ b/lib/pfcp/support/cache/tlv-group-list.py @@ -327,7 +327,13 @@ group_list["Created L2TP Session"] = { "index" : "379", "type" : "279", "ies" : ies } ies = [] ies.append({ "ie_type" : "Multicast Transport Information", "ie_value" : "Multicast Transport Information", "presence" : "C", "tlv_more" : "0", "comment" : "This IE shall be present to include a low layer source specific multicast address information (i.e. multicast destination address and related source IP address) and a GTP-U Common Tunnel EndPoint Identifier (C-TEID) if the CP function has requested to allocate such information for multicast transport over N3mb and/or N19mb."}) -group_list["MBS Session N4 Information"] = { "index" : "403", "type" : "303", "ies" : ies } +group_list["MBS Session N4mb Information"] = { "index" : "403", "type" : "303", "ies" : ies } +ies = [] +ies.append({ "ie_type" : "MBS Session Identifier", "ie_value" : "MBS Session Identifier", "presence" : "M", "tlv_more" : "0", "comment" : ""}) +ies.append({ "ie_type" : "Area Session ID", "ie_value" : "Area Session ID", "presence" : "C", "tlv_more" : "0", "comment" : "This IE shall be present for a location dependent MBS service. When present, it shall contain the Area Session ID, which together with the MBS Session Identifier, uniquely identify the service area part of the content data of the MBS service. "}) +ies.append({ "ie_type" : "F-TEID", "ie_value" : "N19mb DL Tunnel ID", "presence" : "C", "tlv_more" : "0", "comment" : "This IE shall be present when the SMF has requested the UPF to allocate a Local F-TEID in the PDI or in the Create Traffic Endpoint IE. (NOTE1)"}) +ies.append({ "ie_type" : "MBSN4Resp-Flags", "ie_value" : "MBSN4Resp-Flags", "presence" : "C", "tlv_more" : "0", "comment" : "This IE shall be included if at least one of the flags is set to 1. NOTE2.- NN19DT (New N19mb Downlink Tunnel): the UPF shall set this flag if it has allocated a new N19mb DL TEID for the MBS session;- JMTI (Joined N19mb Multicast Tree Indication): the UPF shall set this flag if it has joined the multicast tree from the MB-UPF;- N19DTR (N19mb Downlink Tunnel Removal): the UPF shall set this flag if it is about to remove the N19mb DL Tunnel for receiving the MBS session data. "}) +group_list["MBS Session N4 Information"] = { "index" : "411", "type" : "311", "ies" : ies } ies = [] ies.append({ "ie_type" : "PDR ID", "ie_value" : "PDR ID", "presence" : "M", "tlv_more" : "0", "comment" : ""}) ies.append({ "ie_type" : "F-TEID", "ie_value" : "Local F-TEID", "presence" : "C", "tlv_more" : "0", "comment" : "If the UP function allocates the F-TEID, this IE shall be present and shall contain the local F-TEID to be used for this PDR."}) From d7b896affb7948e8ab12a026b6139b93dec701d5 Mon Sep 17 00:00:00 2001 From: Gaber Stare <gaber.stare@kontron.si> Date: Thu, 18 Jan 2024 06:41:20 +0100 Subject: [PATCH 002/323] [SMF] Build URR at bearer modification --- src/smf/n4-build.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/smf/n4-build.c b/src/smf/n4-build.c index 675d9cdfc2..df2efb8645 100644 --- a/src/smf/n4-build.c +++ b/src/smf/n4-build.c @@ -326,12 +326,15 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_to_modify_list( int num_of_remove_pdr = 0; int num_of_remove_far = 0; int num_of_remove_qer = 0; + int num_of_remove_urr = 0; int num_of_create_pdr = 0; int num_of_create_far = 0; int num_of_create_qer = 0; + int num_of_create_urr = 0; int num_of_update_pdr = 0; int num_of_update_far = 0; int num_of_update_qer = 0; + int num_of_update_urr = 0; uint64_t modify_flags = 0; @@ -413,6 +416,17 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_to_modify_list( num_of_remove_qer++; } + /* Remove URR */ + if (qos_flow->urr) { + ogs_pfcp_tlv_remove_urr_t *message = + &req->remove_urr[num_of_remove_urr]; + + message->presence = 1; + message->urr_id.presence = 1; + message->urr_id.u32 = qos_flow->urr->id; + num_of_remove_urr++; + } + } else { if (modify_flags & OGS_PFCP_MODIFY_CREATE) { @@ -457,6 +471,14 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_to_modify_list( num_of_create_qer, qos_flow->qer); num_of_create_qer++; } + + /* Create URR */ + if (qos_flow->urr) { + ogs_pfcp_build_create_urr( + &req->create_urr[num_of_create_urr], + num_of_create_urr, qos_flow->urr); + num_of_create_urr++; + } } if (modify_flags & (OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD| @@ -476,6 +498,12 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_to_modify_list( num_of_update_pdr, qos_flow->ul_pdr); num_of_update_pdr++; } + if (qos_flow->urr) { + ogs_pfcp_build_update_urr( + &req->update_urr[num_of_update_urr], + num_of_update_urr, qos_flow->urr, modify_flags); + num_of_update_urr++; + } } if (modify_flags & OGS_PFCP_MODIFY_ACTIVATE) { /* Update FAR - Only DL */ From b94173ab41985d3c0c4c125aefa65c385a5fa0f5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 21 Jan 2024 11:55:46 +0900 Subject: [PATCH 003/323] [AMF/MME] Fixed M-TMSI pool release (#2307) M-TMSI pool release was incorrectly modified and has now been corrected. --- lib/core/ogs-pool.h | 6 ++++++ src/amf/context.c | 7 ++++++- src/mme/mme-context.c | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index b6398192aa..eb435cffc0 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -157,6 +157,12 @@ typedef uint32_t ogs_pool_id_t; (pool)->array[j] = temp; \ } \ } while (0) +#define ogs_pool_assert_if_has_duplicate(pool) do { \ + int i, j; \ + for (i = 0; i < (pool)->size; i++) \ + for (j = i+1; j < (pool)->size; j++) \ + ogs_assert(((pool)->array[i]) != ((pool)->array[j])); \ +} while (0) #ifdef __cplusplus } diff --git a/src/amf/context.c b/src/amf/context.c index 0b736c027e..6b8244bf80 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -62,8 +62,12 @@ void amf_context_init(void) ogs_pool_init(&amf_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&ran_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&amf_sess_pool, ogs_app()->pool.sess); + /* Increase size of TMSI pool (#1827) */ ogs_pool_init(&m_tmsi_pool, ogs_global_conf()->max.ue*2); ogs_pool_random_id_generate(&m_tmsi_pool); +#if 0 /* For debugging : Verify whether there are duplicates of M_TMSI. */ + ogs_pool_assert_if_has_duplicate(&m_tmsi_pool); +#endif ogs_list_init(&self.gnb_list); ogs_list_init(&self.amf_ue_list); @@ -2487,7 +2491,8 @@ int amf_m_tmsi_free(amf_m_tmsi_t *m_tmsi) ogs_assert(m_tmsi); /* Restore M-TMSI by Issue #2307 */ - *m_tmsi &= 0x003fffff; + *m_tmsi &= 0x3fffffff; + *m_tmsi = ((*m_tmsi & 0xffff) | ((*m_tmsi & 0x3f000000) >> 8)); ogs_pool_free(&m_tmsi_pool, m_tmsi); return OGS_OK; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 9be948d7f7..57ecc854fb 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -118,8 +118,12 @@ void mme_context_init(void) ogs_pool_init(&sgw_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&mme_sess_pool, ogs_app()->pool.sess); ogs_pool_init(&mme_bearer_pool, ogs_app()->pool.bearer); + /* Increase size of TMSI pool (#1827) */ ogs_pool_init(&m_tmsi_pool, ogs_global_conf()->max.ue*2); ogs_pool_random_id_generate(&m_tmsi_pool); +#if 0 /* For debugging : Verify whether there are duplicates of M_TMSI. */ + ogs_pool_assert_if_has_duplicate(&m_tmsi_pool); +#endif self.enb_addr_hash = ogs_hash_make(); ogs_assert(self.enb_addr_hash); @@ -4652,7 +4656,8 @@ int mme_m_tmsi_free(mme_m_tmsi_t *m_tmsi) ogs_assert(m_tmsi); /* Restore M-TMSI by Issue #2307 */ - *m_tmsi &= 0x003fffff; + *m_tmsi &= 0x3fffffff; + *m_tmsi = ((*m_tmsi & 0xffff) | ((*m_tmsi & 0x3f000000) >> 8)); ogs_pool_free(&m_tmsi_pool, m_tmsi); return OGS_OK; From 2583fd3c08435df123a662c40ddb4dc1914b50f2 Mon Sep 17 00:00:00 2001 From: jmasterfunk84 <48972964+jmasterfunk84@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:08:47 -0600 Subject: [PATCH 004/323] Introduce ability for multiple SDM_Subscriptions --- src/udm/context.c | 92 +++++++++++++++++++++++++++++++++++++++++- src/udm/context.h | 18 ++++++++- src/udm/nudm-handler.c | 39 ++++++++++++------ 3 files changed, 134 insertions(+), 15 deletions(-) diff --git a/src/udm/context.c b/src/udm/context.c index 4a2b73161b..7f20796247 100644 --- a/src/udm/context.c +++ b/src/udm/context.c @@ -25,9 +25,12 @@ int __udm_log_domain; static OGS_POOL(udm_ue_pool, udm_ue_t); static OGS_POOL(udm_sess_pool, udm_sess_t); +static OGS_POOL(udm_sdm_subscription_pool, udm_sdm_subscription_t); static int context_initialized = 0; +static int max_num_of_udm_sdm_subscriptions = 0; + void udm_context_init(void) { ogs_assert(context_initialized == 0); @@ -39,6 +42,10 @@ void udm_context_init(void) ogs_pool_init(&udm_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&udm_sess_pool, ogs_app()->pool.sess); +#define MAX_NUM_OF_UDM_SDM_SUBSCRIPTIONS_PER_UE 4 + max_num_of_udm_sdm_subscriptions = ogs_global_conf()->max.ue * + MAX_NUM_OF_UDM_SDM_SUBSCRIPTIONS_PER_UE; + ogs_pool_init(&udm_sdm_subscription_pool, max_num_of_udm_sdm_subscriptions); ogs_list_init(&self.udm_ue_list); self.suci_hash = ogs_hash_make(); @@ -46,6 +53,10 @@ void udm_context_init(void) self.supi_hash = ogs_hash_make(); ogs_assert(self.supi_hash); + ogs_list_init(&self.sdm_subscription_list); + self.sdm_subscription_id_hash = ogs_hash_make(); + ogs_assert(self.sdm_subscription_id_hash); + context_initialized = 1; } @@ -59,9 +70,12 @@ void udm_context_final(void) ogs_hash_destroy(self.suci_hash); ogs_assert(self.supi_hash); ogs_hash_destroy(self.supi_hash); + ogs_assert(self.sdm_subscription_id_hash); + ogs_hash_destroy(self.sdm_subscription_id_hash); ogs_pool_final(&udm_ue_pool); ogs_pool_final(&udm_sess_pool); + ogs_pool_final(&udm_sdm_subscription_pool); context_initialized = 0; } @@ -200,6 +214,7 @@ void udm_ue_remove(udm_ue_t *udm_ue) ogs_sbi_object_free(&udm_ue->sbi); udm_sess_remove_all(udm_ue); + udm_sdm_subscription_remove_all(udm_ue); OpenAPI_auth_event_free(udm_ue->auth_event); OpenAPI_amf3_gpp_access_registration_free( @@ -224,8 +239,6 @@ void udm_ue_remove(udm_ue_t *udm_ue) ogs_free(udm_ue->amf_instance_id); if (udm_ue->dereg_callback_uri) ogs_free(udm_ue->dereg_callback_uri); - if (udm_ue->data_change_callback_uri) - ogs_free(udm_ue->data_change_callback_uri); ogs_pool_free(&udm_ue_pool, udm_ue); } @@ -349,6 +362,81 @@ udm_sess_t *udm_sess_cycle(udm_sess_t *sess) return ogs_pool_cycle(&udm_sess_pool, sess); } +udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue) +{ + udm_sdm_subscription_t *sdm_subscription = NULL; + + char id[OGS_UUID_FORMATTED_LENGTH + 1]; + ogs_uuid_t uuid; + + ogs_assert(udm_ue); + + ogs_uuid_get(&uuid); + ogs_uuid_format(id, &uuid); + + ogs_pool_alloc(&udm_sdm_subscription_pool, &sdm_subscription); + if (!sdm_subscription) { + ogs_error("Maximum number of SDM Subscriptions [%d] reached", + max_num_of_udm_sdm_subscriptions); + return NULL; + } + memset(sdm_subscription, 0, sizeof *sdm_subscription); + + sdm_subscription->id = ogs_strdup(id); + if (!sdm_subscription->id) { + ogs_error("No memory for sdm_subscription->id [%s]", udm_ue->suci); + ogs_pool_free(&udm_sdm_subscription_pool, sdm_subscription); + return NULL; + } + + sdm_subscription->udm_ue = udm_ue; + + ogs_hash_set(self.sdm_subscription_id_hash, sdm_subscription->id, + strlen(sdm_subscription->id), sdm_subscription); + + ogs_list_add(&udm_ue->sdm_subscription_list, sdm_subscription); + + return sdm_subscription; +} + +void udm_sdm_subscription_remove(udm_sdm_subscription_t *sdm_subscription) +{ + ogs_assert(sdm_subscription); + ogs_assert(sdm_subscription->udm_ue); + + ogs_list_remove(&sdm_subscription->udm_ue->sdm_subscription_list, + sdm_subscription); + + ogs_assert(sdm_subscription->id); + ogs_hash_set(self.sdm_subscription_id_hash, sdm_subscription->id, + strlen(sdm_subscription->id), NULL); + ogs_free(sdm_subscription->id); + + if (sdm_subscription->data_change_callback_uri) + ogs_free(sdm_subscription->data_change_callback_uri); + + ogs_pool_free(&udm_sdm_subscription_pool, sdm_subscription); +} + +void udm_sdm_subscription_remove_all(udm_ue_t *udm_ue) +{ + udm_sdm_subscription_t *sdm_subscription = NULL, + *next_sdm_subscription = NULL; + + ogs_assert(udm_ue); + + ogs_list_for_each_safe(&udm_ue->sdm_subscription_list, + next_sdm_subscription, sdm_subscription) + udm_sdm_subscription_remove(sdm_subscription); +} + +udm_sdm_subscription_t *udm_sdm_subscription_find_by_id(char *id) +{ + ogs_assert(id); + return (udm_sdm_subscription_t *)ogs_hash_get(self.sdm_subscription_id_hash, + id, strlen(id)); +} + int get_ue_load(void) { return (((ogs_pool_size(&udm_ue_pool) - diff --git a/src/udm/context.h b/src/udm/context.h index 9a3cebdb82..791b5d1f21 100644 --- a/src/udm/context.h +++ b/src/udm/context.h @@ -37,8 +37,10 @@ extern int __udm_log_domain; typedef struct udm_context_s { ogs_list_t udm_ue_list; + ogs_list_t sdm_subscription_list; ogs_hash_t *suci_hash; ogs_hash_t *supi_hash; + ogs_hash_t *sdm_subscription_id_hash; } udm_context_t; @@ -58,7 +60,6 @@ struct udm_ue_s { char *amf_instance_id; char *dereg_callback_uri; - char *data_change_callback_uri; uint8_t k[OGS_KEY_LEN]; uint8_t opc[OGS_KEY_LEN]; @@ -72,6 +73,7 @@ struct udm_ue_s { OpenAPI_rat_type_e rat_type; ogs_list_t sess_list; + ogs_list_t sdm_subscription_list; }; struct udm_sess_s { @@ -88,6 +90,15 @@ struct udm_sess_s { udm_ue_t *udm_ue; }; +typedef struct udm_sdm_subscription_s { + ogs_lnode_t lnode; + + char *id; + char *data_change_callback_uri; + + udm_ue_t *udm_ue; +} udm_sdm_subscription_t; + void udm_context_init(void); void udm_context_final(void); udm_context_t *udm_self(void); @@ -110,6 +121,11 @@ udm_sess_t *udm_sess_find_by_psi(udm_ue_t *udm_ue, uint8_t psi); udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue); udm_sess_t *udm_sess_cycle(udm_sess_t *sess); +udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue); +void udm_sdm_subscription_remove(udm_sdm_subscription_t *subscription); +void udm_sdm_subscription_remove_all(udm_ue_t *udm_ue); +udm_sdm_subscription_t *udm_sdm_subscription_find_by_id(char *id); + int get_ue_load(void); #ifdef __cplusplus diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 8ac8268588..63b180db8c 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -601,6 +601,8 @@ bool udm_nudm_sdm_handle_subscription_create( OpenAPI_sdm_subscription_t *SDMSubscription = NULL; + udm_sdm_subscription_t *sdm_subscription = NULL; + ogs_assert(udm_ue); ogs_assert(stream); ogs_assert(recvmsg); @@ -639,11 +641,11 @@ bool udm_nudm_sdm_handle_subscription_create( return false; } - if (udm_ue->data_change_callback_uri) - ogs_free(udm_ue->data_change_callback_uri); - udm_ue->data_change_callback_uri = - ogs_strdup(SDMSubscription->callback_reference); + sdm_subscription = udm_sdm_subscription_add(udm_ue); + ogs_assert(sdm_subscription); + sdm_subscription->data_change_callback_uri = + ogs_strdup(SDMSubscription->callback_reference); server = ogs_sbi_server_from_stream(stream); ogs_assert(server); @@ -654,8 +656,7 @@ bool udm_nudm_sdm_handle_subscription_create( header.resource.component[0] = udm_ue->supi; header.resource.component[1] = (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; - /* TODO: subscription id */ - header.resource.component[2] = udm_ue->ctx_id; + header.resource.component[2] = sdm_subscription->id; memset(&sendmsg, 0, sizeof(sendmsg)); sendmsg.http.location = ogs_sbi_server_uri(server, &header); @@ -678,19 +679,33 @@ bool udm_nudm_sdm_handle_subscription_delete( { ogs_sbi_message_t sendmsg; ogs_sbi_response_t *response = NULL; - ogs_sbi_server_t *server = NULL; + udm_sdm_subscription_t *sdm_subscription; ogs_assert(udm_ue); ogs_assert(stream); ogs_assert(recvmsg); - if (udm_ue->data_change_callback_uri) { - ogs_free(udm_ue->data_change_callback_uri); - udm_ue->data_change_callback_uri = NULL; + if (!recvmsg->h.resource.component[2]) { + ogs_error("[%s] No subscriptionID", udm_ue->supi); + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "No subscriptionID", udm_ue->supi)); + return false; } + sdm_subscription = udm_sdm_subscription_find_by_id( + recvmsg->h.resource.component[2]); - server = ogs_sbi_server_from_stream(stream); - ogs_assert(server); + if (sdm_subscription) { + udm_sdm_subscription_remove(sdm_subscription); + } else { + ogs_error("Subscription to be deleted does not exist [%s]", + recvmsg->h.resource.component[2]); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, + recvmsg, "Subscription Not found", recvmsg->h.method)); + return false; + } memset(&sendmsg, 0, sizeof(sendmsg)); response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); From e650b66305a5349f093babae130221443146215e Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 11 Jan 2024 09:31:16 +0100 Subject: [PATCH 005/323] fix mismatch of parameters between prototype and declaration --- lib/gtp/v2/path.h | 2 +- lib/sbi/nnrf-handler.c | 2 +- src/hss/hss-s6a-path.c | 8 ++++---- src/scp/sbi-path.c | 2 +- src/sepp/sbi-path.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/gtp/v2/path.h b/lib/gtp/v2/path.h index 332fcaf252..7b3aa6ddaf 100644 --- a/lib/gtp/v2/path.h +++ b/lib/gtp/v2/path.h @@ -32,7 +32,7 @@ typedef struct ogs_gtp_xact_s ogs_gtp_xact_t; int ogs_gtp2_send_user_plane( ogs_gtp_node_t *gnode, - ogs_gtp2_header_desc_t *hdesc, + ogs_gtp2_header_desc_t *header_desc, ogs_pkbuf_t *pkbuf); ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb); diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 57f7dedbc9..36f2b69754 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -24,7 +24,7 @@ static void handle_nf_service( static void handle_smf_info( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_smf_info_t *SmfInfo); static void handle_scp_info( - ogs_sbi_nf_instance_t *nf_instance, OpenAPI_scp_info_t *SeppInfo); + ogs_sbi_nf_instance_t *nf_instance, OpenAPI_scp_info_t *ScpInfo); static void handle_sepp_info( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_sepp_info_t *SeppInfo); diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index d004a534f3..3dc1ca3a03 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -1329,7 +1329,7 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) /* HSS Sends Insert Subscriber Data Request to MME */ /* arguments: flags, subscriber data, imsi */ -int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdatamask) +int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) { int ret; @@ -1360,7 +1360,7 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdatamask) * Subscriber-Status is SERVICE_GRANTED, since then the field has no * meaning and won't be sent through the wire, so nothing really changes * from the PoV of the peer. */ - if (subdatamask == OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING && + if (subdata_mask == OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING && subscription_data.subscriber_status == OGS_SUBSCRIBER_STATUS_SERVICE_GRANTED) { ogs_debug(" [%s] Skip sending IDR: Only Operator-Determined-Barring changed while" " Subscriber-Status is SERVICE_GRANTED.", imsi_bcd); @@ -1447,9 +1447,9 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdatamask) /* Set the Subscription Data */ ret = fd_msg_avp_new(ogs_diam_s6a_subscription_data, 0, &avp); ogs_assert(ret == 0); - if (subdatamask) { + if (subdata_mask) { ret = hss_s6a_avp_add_subscription_data(&subscription_data, - avp, subdatamask); + avp, subdata_mask); if (ret != OGS_OK) { ogs_error(" [%s] Could not build Subscription-Data.", imsi_bcd); diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index e0e8ef162e..cca4fb4a47 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -38,7 +38,7 @@ static bool send_request( static void copy_request( ogs_sbi_request_t *target, ogs_sbi_request_t *source, - bool include_discovery); + bool do_not_remove_custom_header); int scp_sbi_open(void) { diff --git a/src/sepp/sbi-path.c b/src/sepp/sbi-path.c index 6c0b5c8a2e..187e42a44a 100644 --- a/src/sepp/sbi-path.c +++ b/src/sepp/sbi-path.c @@ -25,7 +25,7 @@ static int response_handler( static void copy_request( ogs_sbi_request_t *target, ogs_sbi_request_t *source, - bool include_discovery); + bool do_not_remove_custom_header); int sepp_sbi_open(void) { From a3afc4764cc18f5a49c6e3503fd327c75df11f34 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 11 Jan 2024 12:33:37 +0100 Subject: [PATCH 006/323] memset input/output structure inside the function Instead of checking if caller memset'ted the structure to zero, memset it inside the function regardless. There is no added benefit of a memset() + memcmp() to check if caller cleared the structure used for outputing data from the database. --- lib/dbi/ims.c | 14 ++------------ lib/dbi/subscription.c | 7 +------ src/pcf/context.c | 6 +----- src/pcrf/pcrf-context.c | 6 +----- 4 files changed, 5 insertions(+), 28 deletions(-) diff --git a/lib/dbi/ims.c b/lib/dbi/ims.c index bdff0425ce..927f2ce917 100644 --- a/lib/dbi/ims.c +++ b/lib/dbi/ims.c @@ -32,15 +32,10 @@ int ogs_dbi_msisdn_data( const char *utf8 = NULL; uint32_t length = 0; - ogs_msisdn_data_t zero_data; - ogs_assert(msisdn_data); ogs_assert(imsi_or_msisdn_bcd); - memset(&zero_data, 0, sizeof(zero_data)); - - /* msisdn_data should be initialized to zero */ - ogs_assert(memcmp(msisdn_data, &zero_data, sizeof(zero_data)) == 0); + memset(msisdn_data, 0, sizeof(*msisdn_data)); query = BCON_NEW("$or", "[", @@ -132,15 +127,10 @@ int ogs_dbi_ims_data(char *supi, ogs_ims_data_t *ims_data) char *supi_type = NULL; char *supi_id = NULL; - ogs_ims_data_t zero_data; - ogs_assert(ims_data); ogs_assert(supi); - memset(&zero_data, 0, sizeof(zero_data)); - - /* ims_data should be initialized to zero */ - ogs_assert(memcmp(ims_data, &zero_data, sizeof(zero_data)) == 0); + memset(ims_data, 0, sizeof(*ims_data)); supi_type = ogs_id_get_type(supi); ogs_assert(supi_type); diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index 94cf16c82f..e37bf66759 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -315,15 +315,10 @@ int ogs_dbi_subscription_data(char *supi, char *supi_type = NULL; char *supi_id = NULL; - ogs_subscription_data_t zero_data; - ogs_assert(subscription_data); ogs_assert(supi); - memset(&zero_data, 0, sizeof(zero_data)); - - /* subscription_data should be initialized to zero */ - ogs_assert(memcmp(subscription_data, &zero_data, sizeof(zero_data)) == 0); + memset(subscription_data, 0, sizeof(*subscription_data)); supi_type = ogs_id_get_type(supi); ogs_assert(supi_type); diff --git a/src/pcf/context.c b/src/pcf/context.c index d6de447e52..924eb464ed 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -798,7 +798,6 @@ int pcf_db_qos_data(char *supi, ogs_session_data_t *session_data) { int rv; - ogs_session_data_t zero_data; ogs_app_policy_conf_t *policy_conf = NULL; @@ -807,10 +806,7 @@ int pcf_db_qos_data(char *supi, ogs_assert(dnn); ogs_assert(session_data); - memset(&zero_data, 0, sizeof(zero_data)); - - /* session_data should be initialized to zero */ - ogs_assert(memcmp(session_data, &zero_data, sizeof(zero_data)) == 0); + memset(session_data, 0, sizeof(*session_data)); if (plmn_id) policy_conf = ogs_app_policy_conf_find_by_plmn_id(plmn_id); diff --git a/src/pcrf/pcrf-context.c b/src/pcrf/pcrf-context.c index bb0edeafd6..4f30b28f4c 100644 --- a/src/pcrf/pcrf-context.c +++ b/src/pcrf/pcrf-context.c @@ -348,7 +348,6 @@ int pcrf_db_qos_data( { int rv, i; char *supi = NULL; - ogs_session_data_t zero_data; ogs_app_policy_conf_t *policy_conf = NULL; ogs_app_slice_conf_t *slice_conf = NULL; @@ -359,10 +358,7 @@ int pcrf_db_qos_data( ogs_thread_mutex_lock(&self.db_lock); - memset(&zero_data, 0, sizeof(zero_data)); - - /* session_data should be initialized to zero */ - ogs_assert(memcmp(session_data, &zero_data, sizeof(zero_data)) == 0); + memset(session_data, 0, sizeof(*session_data)); supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd); ogs_assert(supi); From dcdfc970cefa00958f3712d3f81893253d5aa5ee Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 11 Jan 2024 12:46:43 +0100 Subject: [PATCH 007/323] initialize variables before using them --- lib/pfcp/context.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 3a44ff35ae..cdd0d3511f 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -748,6 +748,9 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) const char *high[OGS_MAX_NUM_OF_SUBNET_RANGE]; int i, num = 0; + memset(low, 0, sizeof(low)); + memset(high, 0, sizeof(high)); + if (ogs_yaml_iter_type(&subnet_array) == YAML_MAPPING_NODE) { memcpy(&subnet_iter, &subnet_array, From 29ea85ca4cb81eccd6d184a2714f76111a2c356b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 24 Jan 2024 15:49:53 +0100 Subject: [PATCH 008/323] cosmetic: pcrf/pcrf-gx-path.c: Fix trailing whitespace --- src/pcrf/pcrf-gx-path.c | 56 ++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index 22360d9247..b8dd719e00 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -55,8 +55,8 @@ static OGS_POOL(rx_sess_state_pool, struct rx_sess_state); static ogs_thread_mutex_t sess_state_mutex; static struct session_handler *pcrf_gx_reg = NULL; -static struct disp_hdl *hdl_gx_fb = NULL; -static struct disp_hdl *hdl_gx_ccr = NULL; +static struct disp_hdl *hdl_gx_fb = NULL; +static struct disp_hdl *hdl_gx_ccr = NULL; static void pcrf_gx_raa_cb(void *data, struct msg **msg); @@ -169,7 +169,7 @@ static struct rx_sess_state *find_rx_state(struct sess_state *gx, os0_t sid) ogs_assert(gx); ogs_assert(sid); - + ogs_list_for_each(&gx->rx_list, rx_sess_data) { if (!strcmp((char *)rx_sess_data->sid, (char *)sid)) return rx_sess_data; @@ -199,13 +199,13 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) ogs_free(sess_data->sid); remove_rx_state_all(sess_data); - + ogs_thread_mutex_lock(&sess_state_mutex); ogs_pool_free(&sess_state_pool, sess_data); ogs_thread_mutex_unlock(&sess_state_mutex); } -static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp, +static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { /* This CB should never be called */ @@ -214,7 +214,7 @@ static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp, return ENOTSUP; } -static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, +static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { int rv; @@ -486,7 +486,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); ogs_assert(ret == 0); } - + if (gx_message.session_data.session.ambr.downlink) { ret = fd_msg_avp_new( ogs_diam_gx_apn_aggregate_max_bitrate_dl, 0, &avpch1); @@ -779,7 +779,7 @@ int pcrf_gx_send_rar( rx_message->result_code = OGS_DIAM_INVALID_AVP_VALUE; goto out; } - + for (j = 0; j < gx_message.session_data.num_of_pcc_rule; j++) { if (gx_message.session_data.pcc_rule[j].qos.index == qos_index) { @@ -814,7 +814,7 @@ int pcrf_gx_send_rar( ogs_error("CHECK WEBUI : No PCC Rule in DB [QoS Index:%d]", qos_index); ogs_error("Please add PCC Rule using WEBUI"); - rx_message->result_code = + rx_message->result_code = OGS_DIAM_RX_DIAMETER_REQUESTED_SERVICE_NOT_AUTHORIZED; goto out; } @@ -827,7 +827,7 @@ int pcrf_gx_send_rar( } if (!pcc_rule) { - pcc_rule = + pcc_rule = &rx_sess_data->pcc_rule[rx_sess_data->num_of_pcc_rule]; /* Device PCC Rule Info from DB Profile */ @@ -871,7 +871,7 @@ int pcrf_gx_send_rar( rv = ogs_pcc_rule_install_flow_from_media( pcc_rule, media_component); if (rv != OGS_OK) { - rx_message->result_code = + rx_message->result_code = OGS_DIAM_RX_DIAMETER_FILTER_RESTRICTIONS; ogs_error("install_flow() failed"); goto out; @@ -995,16 +995,16 @@ int pcrf_gx_send_rar( ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts); ogs_assert(ret == 0); - - /* Keep a pointer to the session data for debug purpose, + + /* Keep a pointer to the session data for debug purpose, * in real life we would not need it */ svg = sess_data; - + /* Store this value in the session */ ret = fd_sess_state_store(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data == NULL); - + /* Send the request */ ret = fd_msg_send(&req, pcrf_gx_raa_cb, svg); ogs_assert(ret == 0); @@ -1043,7 +1043,7 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) unsigned long dur; int error = 0; int new; - + uint32_t result_code; ogs_debug("[PCRF] Re-Auth-Answer"); @@ -1055,7 +1055,7 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); ogs_assert(ret == 0); ogs_assert(new == 0); - + ret = fd_sess_state_retrieve(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data); @@ -1116,11 +1116,11 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) /* Free the message */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + + dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); if (ogs_diam_logger_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * + ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * ogs_diam_logger_self()->stats.nb_recv + dur) / (ogs_diam_logger_self()->stats.nb_recv + 1); /* Min, max */ @@ -1135,18 +1135,18 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) } if (error) ogs_diam_logger_self()->stats.nb_errs++; - else + else ogs_diam_logger_self()->stats.nb_recv++; ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); - + /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec - sess_data->ts.tv_sec), (long)(ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); else - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec + 1 - sess_data->ts.tv_sec), (long)(1000000000 + ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); @@ -1157,7 +1157,7 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) ret = fd_msg_free(*msg); ogs_assert(ret == 0); *msg = NULL; - + return; } @@ -1202,7 +1202,7 @@ void pcrf_gx_final(void) int ret; ret = fd_sess_handler_destroy(&pcrf_gx_reg, NULL); - ogs_assert(ret == 0); + ogs_assert(ret == 0); if (hdl_gx_fb) (void) fd_disp_unregister(&hdl_gx_fb, NULL); @@ -1242,7 +1242,7 @@ static int encode_pcc_rule_definition( ret = fd_msg_avp_new(ogs_diam_gx_flow_information, 0, &avpch2); ogs_assert(ret == 0); - ret = fd_msg_avp_new(ogs_diam_gx_flow_direction, 0, &avpch3); + ret = fd_msg_avp_new(ogs_diam_gx_flow_direction, 0, &avpch3); ogs_assert(ret == 0); val.i32 = flow->direction; ret = fd_msg_avp_setvalue(avpch3, &val); @@ -1250,7 +1250,7 @@ static int encode_pcc_rule_definition( ret = fd_msg_avp_add(avpch2, MSG_BRW_LAST_CHILD, avpch3); ogs_assert(ret == 0); - ret = fd_msg_avp_new(ogs_diam_gx_flow_description, 0, &avpch3); + ret = fd_msg_avp_new(ogs_diam_gx_flow_description, 0, &avpch3); ogs_assert(ret == 0); val.os.data = (uint8_t *)flow->description; val.os.len = strlen(flow->description); @@ -1373,6 +1373,6 @@ static int encode_pcc_rule_definition( ret = fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avpch1); ogs_assert(ret == 0); - + return OGS_OK; } From 64598fab2e778bebe34e391105b034a493fcc16f Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 24 Jan 2024 15:50:32 +0100 Subject: [PATCH 009/323] Document Gx interface spec references --- lib/diameter/gx/message.c | 2 +- lib/diameter/gx/message.h | 2 +- lib/diameter/gx/ogs-diameter-gx.h | 2 +- src/pcrf/pcrf-gx-path.c | 2 +- src/smf/gx-handler.c | 2 +- src/smf/gx-handler.h | 2 +- src/smf/gx-path.c | 4 +++- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/diameter/gx/message.c b/lib/diameter/gx/message.c index c333d74973..99d072958c 100644 --- a/lib/diameter/gx/message.c +++ b/lib/diameter/gx/message.c @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. diff --git a/lib/diameter/gx/message.h b/lib/diameter/gx/message.h index ab4db94e65..cba5dc2b48 100644 --- a/lib/diameter/gx/message.h +++ b/lib/diameter/gx/message.h @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. diff --git a/lib/diameter/gx/ogs-diameter-gx.h b/lib/diameter/gx/ogs-diameter-gx.h index c7009df836..0f6fc49826 100644 --- a/lib/diameter/gx/ogs-diameter-gx.h +++ b/lib/diameter/gx/ogs-diameter-gx.h @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index b8dd719e00..0074d5c669 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. diff --git a/src/smf/gx-handler.c b/src/smf/gx-handler.c index 3b4177bd25..6e1a6193b1 100644 --- a/src/smf/gx-handler.c +++ b/src/smf/gx-handler.c @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/src/smf/gx-handler.h b/src/smf/gx-handler.h index 38066c37d0..50c1bfea95 100644 --- a/src/smf/gx-handler.h +++ b/src/smf/gx-handler.h @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index d26e0b1e1c..9e64d99e5a 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -1,4 +1,4 @@ -/* +/* Gx Interface, 3GPP TS 29.212 section 4 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. @@ -87,6 +87,7 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) ogs_thread_mutex_unlock(&sess_state_mutex); } +/* 3GPP TS 29.212 5.6.2 Credit-Control-Request */ void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, uint32_t cc_request_type) { @@ -701,6 +702,7 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); } +/* 3GPP TS 29.212 5b.6.5 Credit-Control-Answer */ static void smf_gx_cca_cb(void *data, struct msg **msg) { int rv; From 609c234f0ba5ed95b5901b1891b180428948a67d Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 24 Jan 2024 15:56:09 +0100 Subject: [PATCH 010/323] Document Gy interface spec reference --- lib/diameter/gy/message.c | 2 +- lib/diameter/gy/message.h | 2 +- lib/diameter/gy/ogs-diameter-gy.h | 2 +- src/smf/gy-handler.c | 2 +- src/smf/gy-handler.h | 2 +- src/smf/gy-path.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/diameter/gy/message.c b/lib/diameter/gy/message.c index 9b50c77cf7..4d282d397b 100644 --- a/lib/diameter/gy/message.c +++ b/lib/diameter/gy/message.c @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/lib/diameter/gy/message.h b/lib/diameter/gy/message.h index 6b06d54948..5d402e0420 100644 --- a/lib/diameter/gy/message.h +++ b/lib/diameter/gy/message.h @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/lib/diameter/gy/ogs-diameter-gy.h b/lib/diameter/gy/ogs-diameter-gy.h index aba664cd67..28dc20505c 100644 --- a/lib/diameter/gy/ogs-diameter-gy.h +++ b/lib/diameter/gy/ogs-diameter-gy.h @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index f5d4019f69..d3480e2044 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/src/smf/gy-handler.h b/src/smf/gy-handler.h index 360cee6430..87983b9c3e 100644 --- a/src/smf/gy-handler.h +++ b/src/smf/gy-handler.h @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 8bbb6f4630..7f09b889ed 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -1,4 +1,4 @@ -/* +/* Gy Interface, 3GPP TS 32.299 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * From 38868918330a83fad59292bfcea53801ee6137f5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 25 Jan 2024 23:25:47 +0900 Subject: [PATCH 011/323] [MME] Crash due to a race condition A race condition can occur in the following situations. In conclusion, we can use this situation to determine whether or not the UE Context has been removed and avoiding a crash. For example, suppose a UE Context is removed in the followings. 1. Attach Request 2. Authentication-Information-Request 3. Authentication-Information-Answer 4. Authentication Request 5. Authentication Response(MAC Failed) 6. Authentication Reject 7. UEContextReleaseCommand 8. UEContextReleaseComplete The MME then sends a Purge-UE-request to the HSS and deletes the UE context as soon as it receives a Purge-UE-Answer. Suppose an Attach Request is received from the same UE between Purge-UE-Request/Answer, then the MME and HSS start the Authentication-Information-Request/Answer process. This can lead to the following situations. 1. Purge-UE-Request 2. Attach Request 3. Authentication-Information-Request 4. Purge-UE-Answer 5. [UE Context Removed] 6. Authentication-Information-Answer Since the UE Context has already been deleted when the Authentication-Information-Answer is received, it cannot be processed properly. Therefore, mme_ue_cycle() is used to check whether the UE Context has been deleted and decide whether to process or ignore the Authentication-Information-Answer as shown below. --- lib/core/ogs-timer.c | 1 - src/mme/mme-sm.c | 51 ++++++++++++++++++++++++++++++++++++++++++-- src/mme/s1ap-build.c | 23 +++++++++++++++++++- 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/lib/core/ogs-timer.c b/lib/core/ogs-timer.c index 90c01c9db7..cc14a7675a 100644 --- a/lib/core/ogs-timer.c +++ b/lib/core/ogs-timer.c @@ -146,7 +146,6 @@ void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line) manager = timer->manager; ogs_assert(manager); timer = ogs_timer_cycle(manager, timer); - ogs_assert(timer); if (!timer) { ogs_fatal("ogs_timer_stop() failed in %s", file_line); ogs_assert_if_reached(); diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 039d53b97b..ea006cc24e 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -407,8 +407,53 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_S6A_MESSAGE: - mme_ue = e->mme_ue; - ogs_assert(mme_ue); + /* + * A race condition can occur in the following situations. + * In conclusion, we can use this situation to determine + * whether or not the UE Context has been removed and avoiding a crash. + * + * For example, suppose a UE Context is removed in the followings. + * + * 1. Attach Request + * 2. Authentication-Information-Request + * 3. Authentication-Information-Answer + * 4. Authentication Request + * 5. Authentication Response(MAC Failed) + * 6. Authentication Reject + * 7. UEContextReleaseCommand + * 8. UEContextReleaseComplete + * + * The MME then sends a Purge-UE-request to the HSS and deletes + * the UE context as soon as it receives a Purge-UE-Answer. + * + * Suppose an Attach Request is received from the same UE + * between Purge-UE-Request/Answer, then the MME and HSS start + * the Authentication-Information-Request/Answer process. + * + * This can lead to the following situations. + * + * 1. Purge-UE-Request + * 2. Attach Request + * 3. Authentication-Information-Request + * 4. Purge-UE-Answer + * 5. [UE Context Removed] + * 6. Authentication-Information-Answer + * + * Since the UE Context has already been deleted + * when the Authentication-Information-Answer is received, + * it cannot be processed properly. + * + * Therefore, mme_ue_cycle() is used to check + * whether the UE Context has been deleted and + * decide whether to process or + * ignore the Authentication-Information-Answer as shown below. + */ + mme_ue = mme_ue_cycle(e->mme_ue); + if (!mme_ue) { + ogs_error("UE(mme-ue) context has already been removed"); + goto cleanup; + } + s6a_message = e->s6a_message; ogs_assert(s6a_message); @@ -473,6 +518,8 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_error("Invalid Type[%d]", s6a_message->cmd_code); break; } + +cleanup: ogs_subscription_data_free(&s6a_message->idr_message.subscription_data); ogs_subscription_data_free(&s6a_message->ula_message.subscription_data); ogs_free(s6a_message); diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 3c336968e6..d4dde8eaa1 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -574,7 +574,28 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( emmbuf = NULL; } - ogs_assert(E_RABToBeSetupListCtxtSUReq->list.count); + if (!E_RABToBeSetupListCtxtSUReq->list.count) { + ogs_error(" IMSI[%s] NAS-EPS Type[%d] " + "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + mme_ue->imsi_bcd, mme_ue->nas_eps.type, + enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + ogs_list_for_each(&mme_ue->sess_list, sess) { + ogs_error(" APN[%s]", + sess->session ? sess->session->name : "Unknown"); + ogs_list_for_each(&sess->bearer_list, bearer) { + if (OGS_FSM_CHECK(&bearer->sm, esm_state_inactive)) + ogs_error(" IN-ACTIVE"); + else if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) + ogs_error(" ACTIVE"); + else + ogs_error(" OTHER STATE"); + + ogs_error(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]", + bearer->ebi, bearer->qos.index, bearer->sgw_s1u_teid); + } + } + return NULL; + } ie = CALLOC(1, sizeof(S1AP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); From a5feccf4c80151dc24f50bd04b42696339d46b6b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 26 Jan 2024 16:43:48 +0100 Subject: [PATCH 012/323] [SMF] Fix fixed-0 IPCP identifier in PCO ack --- src/smf/context.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/smf/context.c b/src/smf/context.c index c38f63f425..9847660087 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -2865,6 +2865,7 @@ int smf_pco_build(uint8_t *pco_buf, uint8_t *buffer, int length) ogs_assert(num_of_ipcp <= OGS_PCO_MAX_NUM_OF_IPCP); pco_ipcp[num_of_ipcp].code = 2; /* Code : Configuration Ack */ + pco_ipcp[num_of_ipcp].identifier = ipcp->identifier; /* ID: Needs to match request */ out_len = 4; /* Primary DNS Server IP Address */ From d95c82b21c0a195f9918da82ccb4bc7af3f45126 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 26 Jan 2024 18:35:36 +0100 Subject: [PATCH 013/323] [SMF,MME] Gn: Set Delivery order QoS field to No Before this patch, it was set as 0, which is Reserved in Network to MS direction. --- lib/gtp/v1/types.h | 6 ++++++ src/mme/mme-gn-build.c | 7 +++++++ src/smf/gn-build.c | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/lib/gtp/v1/types.h b/lib/gtp/v1/types.h index 157f81102a..6dcb378503 100644 --- a/lib/gtp/v1/types.h +++ b/lib/gtp/v1/types.h @@ -218,6 +218,12 @@ typedef struct ogs_gtp1_gsn_addr_s { #define OGS_GTP1_APN_RESTRICTION_PRIVATE_1 3 #define OGS_GTP1_APN_RESTRICTION_PRIVATE_2 4 +/* Table 10.5.156/3GPP TS 24.008 Quality of service */ +/* Delivery order, octet 6 (see also 3GPP TS 23.107) */ +#define OGS_GTP1_DELIVERY_ORDER_SUBSCRIBED 0 +#define OGS_GTP1_DELIVERY_ORDER_YES 1 +#define OGS_GTP1_DELIVERY_ORDER_NO 2 + /* TS 29.060 7.7.34 Quality of Service (QoS) Profile */ #define OGS_GTP1_QOS_PROFILE_MAX_LEN 255 /* TS 24.008 10.5.6.5 Quality of service */ diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 3882e0365e..b674174b4c 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -62,6 +62,13 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p qos_pdec->qos_profile.arp = session->qos.arp.priority_level; + /* 3GPP TS 23.107 "Delivery order should be set to 'no' for PDP Type = + * 'IPv4' or 'IPv6'. The SGSN shall ensure that the appropriate value is set." + * 3GPP TS 23.401 D.3.5 2b NOTE4: The GTP and PDCP sequence numbers are not + * relevant as the network does not configure usage of "delivery order + * required" [...] as described in clause "compatibility issues" (4.8.1) */ + qos_pdec->qos_profile.data.delivery_order = OGS_GTP1_DELIVERY_ORDER_NO; + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (session->qos.index) { /* QCI */ diff --git a/src/smf/gn-build.c b/src/smf/gn-build.c index d05b4e1776..6f1e14575c 100644 --- a/src/smf/gn-build.c +++ b/src/smf/gn-build.c @@ -32,6 +32,13 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p qos_pdec->qos_profile.arp = sess->session.qos.arp.priority_level; + /* 3GPP TS 23.107 "Delivery order should be set to 'no' for PDP Type = + * 'IPv4' or 'IPv6'. The SGSN shall ensure that the appropriate value is set." + * 3GPP TS 23.401 D.3.5 2b NOTE4: The GTP and PDCP sequence numbers are not + * relevant as the network does not configure usage of "delivery order + * required" [...] as described in clause "compatibility issues" (4.8.1) */ + qos_pdec->qos_profile.data.delivery_order = OGS_GTP1_DELIVERY_ORDER_NO; + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (sess->session.qos.index) { /* QCI */ From a613be8c4c0473edb243e2bf9b9300dd9a4e4da7 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 26 Jan 2024 19:03:27 +0100 Subject: [PATCH 014/323] [SMF,MME] Gn: Set Delivery of erroneous SDUs QoS field to No Before this patch, it was set as 0, which is Reserved in Network to MS direction. --- lib/gtp/v1/types.h | 6 ++++++ src/mme/mme-gn-build.c | 2 ++ src/smf/gn-build.c | 2 ++ 3 files changed, 10 insertions(+) diff --git a/lib/gtp/v1/types.h b/lib/gtp/v1/types.h index 6dcb378503..ee9f0076e8 100644 --- a/lib/gtp/v1/types.h +++ b/lib/gtp/v1/types.h @@ -224,6 +224,12 @@ typedef struct ogs_gtp1_gsn_addr_s { #define OGS_GTP1_DELIVERY_ORDER_YES 1 #define OGS_GTP1_DELIVERY_ORDER_NO 2 +/* Delivery of erroneous SDUs, octet 6 (see also 3GPP TS 23.107) */ +#define OGS_GTP1_DELIVERY_ERR_SDU_SUBSCRIBED 0 +#define OGS_GTP1_DELIVERY_ERR_SDU_NO_DETECT 1 +#define OGS_GTP1_DELIVERY_ERR_SDU_YES 2 +#define OGS_GTP1_DELIVERY_ERR_SDU_NO 3 + /* TS 29.060 7.7.34 Quality of Service (QoS) Profile */ #define OGS_GTP1_QOS_PROFILE_MAX_LEN 255 /* TS 24.008 10.5.6.5 Quality of service */ diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index b674174b4c..0b3395203f 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -69,6 +69,8 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p * required" [...] as described in clause "compatibility issues" (4.8.1) */ qos_pdec->qos_profile.data.delivery_order = OGS_GTP1_DELIVERY_ORDER_NO; + qos_pdec->qos_profile.data.delivery_erroneous_sdu = OGS_GTP1_DELIVERY_ERR_SDU_NO; + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (session->qos.index) { /* QCI */ diff --git a/src/smf/gn-build.c b/src/smf/gn-build.c index 6f1e14575c..0813f55240 100644 --- a/src/smf/gn-build.c +++ b/src/smf/gn-build.c @@ -39,6 +39,8 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p * required" [...] as described in clause "compatibility issues" (4.8.1) */ qos_pdec->qos_profile.data.delivery_order = OGS_GTP1_DELIVERY_ORDER_NO; + qos_pdec->qos_profile.data.delivery_erroneous_sdu = OGS_GTP1_DELIVERY_ERR_SDU_NO; + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (sess->session.qos.index) { /* QCI */ From 88a77f7bc538e68f2c8fb5ab2c516be891c856c4 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 26 Jan 2024 19:06:34 +0100 Subject: [PATCH 015/323] [SMF,MME] Gn: Set Maximum SDU Size QoS field to 1500 Before this patch, it was set as 0, which is Reserved in Network to MS direction. --- src/mme/mme-gn-build.c | 3 +++ src/smf/gn-build.c | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 0b3395203f..1b35a10ed8 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -71,6 +71,9 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p qos_pdec->qos_profile.data.delivery_erroneous_sdu = OGS_GTP1_DELIVERY_ERR_SDU_NO; + /* Maximum SDU Size: Encode it as 1500, the maximum for IP 3GPP TS 23.107 Table 4, Note 4) */ + qos_pdec->qos_profile.data.max_sdu_size = 0x96; + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (session->qos.index) { /* QCI */ diff --git a/src/smf/gn-build.c b/src/smf/gn-build.c index 0813f55240..ee073c2a6d 100644 --- a/src/smf/gn-build.c +++ b/src/smf/gn-build.c @@ -41,6 +41,14 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p qos_pdec->qos_profile.data.delivery_erroneous_sdu = OGS_GTP1_DELIVERY_ERR_SDU_NO; + /* Maximum SDU Size: If value is set to a valid value, reuse it: */ + if (sess->gtp.v1.qos_pdec.qos_profile.data.max_sdu_size >= 0x01 && + sess->gtp.v1.qos_pdec.qos_profile.data.max_sdu_size <= 0x99) { + qos_pdec->qos_profile.data.max_sdu_size = sess->gtp.v1.qos_pdec.qos_profile.data.max_sdu_size; + } else { /* Encode it as 1500, the maximum for IP 3GPP TS 23.107 Table 4, Note 4) */ + qos_pdec->qos_profile.data.max_sdu_size = 0x96; + } + /* 3GPP TS 23.401 Annex E table Table E.3 */ /* Also take into account table 7 in 3GPP TS 23.107 9.1.2.2 */ switch (sess->session.qos.index) { /* QCI */ From 93110d011ea34c5b5d43f956ae7ec6808b3ba0ad Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 30 Jan 2024 22:37:48 +0900 Subject: [PATCH 016/323] [GTP-U] Fixed ogs_pfcp_find_gtpu_resource()(#2923) As mentioned in the sgwu.yaml configuration file, it is possible to configure multiple addresses with different source_interface values for the gtpu interface. Following the this section, I defined two addresses, one with source_interface set to 0 and another with source_interface set to 1. My expectation was to see different addresses for the two PDRs in the Session Establishment Response message during session establishment. However, both addresses were the same, and it was the address I had set for source_interface = 0. When I looked into the code, I found the reason for the issue. In the lib/pfcp/context.c file, on line 1185, the function that determines the address is called as follows: ... } else { ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &ogs_gtp_self()->gtpu_resource_list, pdr->dnn, OGS_PFCP_INTERFACE_ACCESS); if (resource) { ... In the last parameter of this function, a constant value, OGS_PFCP_INTERFACE_ACCESS, is used. This causes every PDR with any source_interface to be considered as "access," and the value 0 is used for its interface. I replaced the value with pdr->src_if, and the bug was resolved. --- lib/pfcp/context.c | 2 +- src/sgwc/context.c | 2 +- src/smf/binding.c | 2 +- src/smf/context.c | 2 +- src/smf/gx-handler.c | 2 +- src/smf/npcf-handler.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index cdd0d3511f..401204ecea 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -1184,7 +1184,7 @@ void ogs_pfcp_object_teid_hash_set( ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &ogs_gtp_self()->gtpu_resource_list, - pdr->dnn, OGS_PFCP_INTERFACE_ACCESS); + pdr->dnn, pdr->src_if); if (resource) { ogs_assert( (resource->info.v4 && pdr->f_teid.ipv4) || diff --git a/src/sgwc/context.c b/src/sgwc/context.c index ebd8dc6dfc..26187529c2 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -716,7 +716,7 @@ sgwc_tunnel_t *sgwc_tunnel_add( ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &sess->pfcp_node->gtpu_resource_list, - sess->session.name, OGS_PFCP_INTERFACE_ACCESS); + sess->session.name, pdr->src_if); if (resource) { ogs_user_plane_ip_resource_info_to_sockaddr(&resource->info, &tunnel->local_addr, &tunnel->local_addr6); diff --git a/src/smf/binding.c b/src/smf/binding.c index 2402195826..3484bc64e9 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -190,7 +190,7 @@ void smf_bearer_binding(smf_sess_t *sess) ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &sess->pfcp_node->gtpu_resource_list, - sess->session.name, OGS_PFCP_INTERFACE_ACCESS); + sess->session.name, ul_pdr->src_if); if (resource) { ogs_user_plane_ip_resource_info_to_sockaddr( &resource->info, diff --git a/src/smf/context.c b/src/smf/context.c index 9847660087..c87df3a38e 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -2116,7 +2116,7 @@ void smf_sess_create_indirect_data_forwarding(smf_sess_t *sess) resource = ogs_pfcp_find_gtpu_resource( &sess->pfcp_node->gtpu_resource_list, - sess->session.name, OGS_PFCP_INTERFACE_ACCESS); + sess->session.name, pdr->src_if); if (resource) { ogs_user_plane_ip_resource_info_to_sockaddr(&resource->info, diff --git a/src/smf/gx-handler.c b/src/smf/gx-handler.c index 6e1a6193b1..e40bab7316 100644 --- a/src/smf/gx-handler.c +++ b/src/smf/gx-handler.c @@ -196,7 +196,7 @@ uint32_t smf_gx_handle_cca_initial_request( ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &sess->pfcp_node->gtpu_resource_list, - sess->session.name, OGS_PFCP_INTERFACE_ACCESS); + sess->session.name, ul_pdr->src_if); if (resource) { ogs_user_plane_ip_resource_info_to_sockaddr(&resource->info, &bearer->pgw_s5u_addr, &bearer->pgw_s5u_addr6); diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 3d2d3f46de..ff52427978 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -590,7 +590,7 @@ bool smf_npcf_smpolicycontrol_handle_create( ogs_gtpu_resource_t *resource = NULL; resource = ogs_pfcp_find_gtpu_resource( &sess->pfcp_node->gtpu_resource_list, - sess->session.name, OGS_PFCP_INTERFACE_ACCESS); + sess->session.name, ul_pdr->src_if); if (resource) { ogs_user_plane_ip_resource_info_to_sockaddr(&resource->info, &sess->upf_n3_addr, &sess->upf_n3_addr6); From 3f0979dab2b4c825c1f363dbb9847675b986a90c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 2 Feb 2024 21:15:52 +0900 Subject: [PATCH 017/323] [MME] Fixes crash in building s1ap message Because a race condition can occur between S6A Diameter and S1AP message, the following error handling code has been added. 1. InitialUEMessage + Attach Request + PDN Connectivity request 2. Authentication-Information-Request/Authentication-Information-Answer 3. Authentication Request/Response 4. Security-mode command/complete 5. Update-Location-Request/Update-Location-Answer 6. Detach request/accept In the ULR/ULA process in step 6, the PDN Connectivity request is pushed to the queue as an ESM_MESSAGE because the NAS-Type is still an Attach Request. See the code below in 'mme-s6a-handler.c' for where the queue is pushed. if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { rv = nas_eps_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; } } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { r = nas_eps_send_tau_accept(mme_ue, S1AP_ProcedureCode_id_InitialContextSetup); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type); return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; } If you perform step 7 Detach request/accept here, the NAS-Type becomes Detach Request and the EMM state changes to emm_state_de_registered(). Since the PDN, which is an ESM message that was previously queued, should not be processed in de_registered, the message is ignored through error handling below. Otherwise, MME will crash because there is no active bearer in the initial_context_setup_request build process. See the code below in 's1ap-build.c' for where the crash occurs. ogs_list_for_each(&mme_ue->sess_list, sess) { ogs_list_for_each(&sess->bearer_list, bearer) { ... if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_inactive)) { ogs_warn("No active EPS bearer [%d]", bearer->ebi); ogs_warn(" IMSI[%s] NAS-EPS Type[%d] " "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", mme_ue->imsi_bcd, mme_ue->nas_eps.type, enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); continue; } ... } } --- lib/core/ogs-epoll.c | 6 +- src/mme/mme-context.c | 1 + src/mme/mme-context.h | 14 ++++- src/mme/mme-path.c | 1 + src/mme/mme-s11-handler.c | 1 + src/mme/mme-s6a-handler.c | 3 + src/mme/mme-sm.c | 114 ++++++++++++++++++++++++++++++++++++++ src/mme/s1ap-build.c | 5 +- src/mme/s1ap-handler.c | 1 + 9 files changed, 139 insertions(+), 7 deletions(-) diff --git a/lib/core/ogs-epoll.c b/lib/core/ogs-epoll.c index 2b3399fefb..cc9569a68e 100644 --- a/lib/core/ogs-epoll.c +++ b/lib/core/ogs-epoll.c @@ -74,7 +74,11 @@ static void epoll_init(ogs_pollset_t *pollset) ogs_assert(context->map_hash); context->epfd = epoll_create(pollset->capacity); - ogs_assert(context->epfd >= 0); + if (context->epfd < 0) { + ogs_log_message(OGS_LOG_FATAL, ogs_errno, "epoll_create() failed"); + ogs_assert_if_reached(); + return; + } ogs_notify_init(pollset); } diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 57ecc854fb..7e059d913e 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -3764,6 +3764,7 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) ogs_assert(mme_ue->sgw_ue); mme_ue->sgw_ue->sgw_s11_teid = old_mme_ue->sgw_ue->sgw_s11_teid; + MME_UE_CHECK(OGS_LOG_WARN, old_mme_ue); mme_ue_remove(old_mme_ue); } } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 5e5671dd2e..566c573829 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -146,6 +146,15 @@ typedef struct mme_context_s { /* Generator for unique identification */ uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */ +#define MME_UE_CHECK(level, __mME) \ + do { \ + ogs_log_message(level, 0, "IMSI [%s] NAS-EPS Type[%d]", \ + (__mME) ? (__mME)->imsi_bcd : "No MME_UE", \ + (__mME) ? (__mME)->nas_eps.type : 0); \ + ogs_log_message(level, 0, "mme_ue[%p:%p]", \ + (__mME), mme_ue_cycle((__mME))); \ + } while(0) + #define MME_UE_LIST_CHECK \ if (ogs_log_get_domain_level(OGS_LOG_DOMAIN) >= OGS_LOG_TRACE) { \ mme_ue_t *mme_ue = NULL; \ @@ -154,8 +163,9 @@ typedef struct mme_context_s { mme_sess_t *sess = NULL; \ mme_bearer_t *bearer = NULL; \ ogs_list_for_each(&mme_self()->mme_ue_list, mme_ue) { \ - ogs_trace("MME_UE(%p) [%s] MME_S11_TEID[%d]", \ - mme_ue, mme_ue->imsi_bcd, mme_ue->mme_s11_teid); \ + ogs_trace("MME_UE(%p:%p) [%s] MME_S11_TEID[%d]", \ + mme_ue, mme_ue_cycle(mme_ue), \ + mme_ue->imsi_bcd, mme_ue->mme_s11_teid); \ if (mme_ue->sgw_ue) { \ sgw_ue = mme_ue->sgw_ue; \ ogs_trace("SGW_UE(%p) MME_UE(%p) SGW_S11_TEID[%d]", \ diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index c076fd2129..420ec8b67d 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -86,6 +86,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) if (mme_ue->location_updated_but_not_canceled_yet == true) { mme_s6a_send_pur(mme_ue); } else { + MME_UE_CHECK(OGS_LOG_WARN, mme_ue); mme_ue_remove(mme_ue); } } diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index c4945d8ace..306056eda6 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -707,6 +707,7 @@ void mme_s11_handle_delete_session_response( if (mme_ue->location_updated_but_not_canceled_yet == true) { mme_s6a_send_pur(mme_ue); } else { + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); } } else { diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index 780f9c0159..2c138091b0 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -143,6 +143,7 @@ uint8_t mme_s6a_handle_pua( if (s6a_message->result_code != ER_DIAMETER_SUCCESS) { ogs_error("Purge UE failed for IMSI[%s] [%d]", mme_ue->imsi_bcd, s6a_message->result_code); + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return OGS_ERROR; } @@ -150,6 +151,7 @@ uint8_t mme_s6a_handle_pua( if (pua_message->pua_flags & OGS_DIAM_S6A_PUA_FLAGS_FREEZE_MTMSI) ogs_debug("Freeze M-TMSI requested but not implemented."); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); return OGS_OK; @@ -224,6 +226,7 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) */ if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { ogs_warn("UE has already been de-registered"); + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return; } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index ea006cc24e..637e92e3d4 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -255,6 +255,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) mme_ue = mme_ue_find_by_message(&nas_message); if (!mme_ue) { mme_ue = mme_ue_add(enb_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (mme_ue == NULL) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_misc, @@ -319,6 +320,17 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) } ogs_assert(mme_ue); + if (!OGS_FSM_STATE(&mme_ue->sm)) { + ogs_fatal("MESSAGE[%d]", nas_message.emm.h.message_type); + ogs_fatal("ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + enb_ue ? enb_ue->enb_ue_s1ap_id : 0, + enb_ue ? enb_ue->mme_ue_s1ap_id : 0); + ogs_fatal("context [%p:%p]", enb_ue, mme_ue); + ogs_fatal("cycle [%p:%p]", + enb_ue_cycle(enb_ue), mme_ue_cycle(mme_ue)); + ogs_fatal("IMSI [%s]", mme_ue ? mme_ue->imsi_bcd : "No MME_UE"); + ogs_assert_if_reached(); + } ogs_assert(OGS_FSM_STATE(&mme_ue->sm)); e->mme_ue = mme_ue; @@ -351,6 +363,103 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; } +#define ESM_MESSAGE_CHECK \ + do { \ + ogs_error("emm_state_exception"); \ + ogs_error("nas_type:%d, create_action:%d", \ + e->nas_type, e->create_action); \ + ogs_error("esm.message[EBI:%d,PTI:%d,TYPE:%d]", \ + nas_message.esm.h.eps_bearer_identity, \ + nas_message.esm.h.procedure_transaction_identity, \ + nas_message.esm.h.message_type); \ + } while(0) + + /* + * Because a race condition can occur between S6A Diameter and S1AP message, + * the following error handling code has been added. + * + * 1. InitialUEMessage + Attach Request + PDN Connectivity request + * 2. Authentication-Information-Request/Authentication-Information-Answer + * 3. Authentication Request/Response + * 4. Security-mode command/complete + * 5. Update-Location-Request/Update-Location-Answer + * 6. Detach request/accept + * + * In the ULR/ULA process in step 6, the PDN Connectivity request is + * pushed to the queue as an ESM_MESSAGE because the NAS-Type is still + * an Attach Request. + * + * See the code below in 'mme-s6a-handler.c' for where the queue is pushed. + * + * if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + * rv = nas_eps_send_emm_to_esm(mme_ue, + * &mme_ue->pdn_connectivity_request); + * if (rv != OGS_OK) { + * ogs_error("nas_eps_send_emm_to_esm() failed"); + * return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; + * } + * } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + * r = nas_eps_send_tau_accept(mme_ue, + * S1AP_ProcedureCode_id_InitialContextSetup); + * ogs_expect(r == OGS_OK); + * ogs_assert(r != OGS_ERROR); + * } else { + * ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type); + * return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; + * } + * + * If you perform step 7 Detach request/accept here, + * the NAS-Type becomes Detach Request and the EMM state changes + * to emm_state_de_registered(). + * + * Since the PDN, which is an ESM message that was previously queued, + * should not be processed in de_registered, the message is ignored + * through error handling below. + * + * Otherwise, MME will crash because there is no active bearer + * in the initial_context_setup_request build process. + * + * See the code below in 's1ap-build.c' for where the crash occurs. + * ogs_list_for_each(&mme_ue->sess_list, sess) { + * ogs_list_for_each(&sess->bearer_list, bearer) { + * ... + * if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + * } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_inactive)) { + * ogs_warn("No active EPS bearer [%d]", bearer->ebi); + * ogs_warn(" IMSI[%s] NAS-EPS Type[%d] " + * "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + * mme_ue->imsi_bcd, mme_ue->nas_eps.type, + * enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + * continue; + * } + * ... + * } + * } + */ + if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { + ESM_MESSAGE_CHECK; + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + ogs_pkbuf_free(pkbuf); + break; + } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_authentication)) { + ESM_MESSAGE_CHECK; + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + ogs_pkbuf_free(pkbuf); + break; + } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_security_mode)) { + ESM_MESSAGE_CHECK; + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + ogs_pkbuf_free(pkbuf); + break; + } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup)) { + } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { + } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) { + ESM_MESSAGE_CHECK; + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + ogs_pkbuf_free(pkbuf); + break; + } + bearer = mme_bearer_find_or_add_by_message( mme_ue, &nas_message, e->create_action); if (!bearer) { @@ -459,6 +568,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) switch (s6a_message->cmd_code) { case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION: + ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION"); emm_cause = mme_s6a_handle_aia(mme_ue, s6a_message); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", @@ -481,6 +591,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) } break; case OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION: + ogs_debug("OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION"); emm_cause = mme_s6a_handle_ula(mme_ue, s6a_message); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", @@ -505,13 +616,16 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) mme_ue->location_updated_but_not_canceled_yet = true; break; case OGS_DIAM_S6A_CMD_CODE_PURGE_UE: + ogs_debug("OGS_DIAM_S6A_CMD_CODE_PURGE_UE"); mme_s6a_handle_pua(mme_ue, s6a_message); break; case OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION: + ogs_debug("OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION"); mme_ue->location_updated_but_not_canceled_yet = false; mme_s6a_handle_clr(mme_ue, s6a_message); break; case OGS_DIAM_S6A_CMD_CODE_INSERT_SUBSCRIBER_DATA: + ogs_debug("OGS_DIAM_S6A_CMD_CODE_INSERT_SUBSCRIBER_DATA"); mme_s6a_handle_idr(mme_ue, s6a_message); break; default: diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index d4dde8eaa1..245d70a08c 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -575,10 +575,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( } if (!E_RABToBeSetupListCtxtSUReq->list.count) { - ogs_error(" IMSI[%s] NAS-EPS Type[%d] " - "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", - mme_ue->imsi_bcd, mme_ue->nas_eps.type, - enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_list_for_each(&mme_ue->sess_list, sess) { ogs_error(" APN[%s]", sess->session ? sess->session->name : "Unknown"); diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 2c0b58f934..367f241b5e 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1949,6 +1949,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) if (mme_ue->location_updated_but_not_canceled_yet == true) { mme_s6a_send_pur(mme_ue); } else { + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); } break; From 47419be650e57160a2e94575a1e316655c0af508 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Feb 2024 09:41:12 +0900 Subject: [PATCH 018/323] [AMF/SMF] Resolved the Issue of Session Release Based on the Order of N1/N2 Messages (#2917) There is an issue with SESSION RELEASE not working properly depending on the PDU session release complete order in the PDUSessionResourceReleaseResponse. If the AMF receives PDUSessionResourceReleaseResponse followed by PDU session release complete, it works correctly. However, if it receives PDU session release complete followed by PDUSessionResourceReleaseResponse, it does not work correctly and sends an Error Indication to the UE/gNB. To fix this issue, we added pdu_session_release_complete_received and pdu_session_resource_release_response_received to the content so that CLEAR_SM_CONTEXT_REF() is executed when both are received. --- src/amf/amf-sm.c | 7 +- src/amf/context.h | 3 +- src/amf/gmm-handler.c | 23 ++- src/amf/ngap-handler.c | 5 + src/amf/nsmf-handler.c | 19 +- src/smf/gsm-sm.c | 63 ++++--- tests/registration/dereg-test.c | 299 ++++++++++++++++++++++++++++++++ 7 files changed, 390 insertions(+), 29 deletions(-) diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index c0e6ab0695..75b5747ff0 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -488,10 +488,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_info("[%s:%d] Release SM context [%d]", amf_ue->supi, sess->psi, sbi_message.res_status); } else { - ogs_error("[%s] HTTP response error [%d]", - amf_ue->supi, sbi_message.res_status); + ogs_error("[%s:%d] HTTP response error [%d]", + amf_ue->supi, sess->psi, sbi_message.res_status); } - amf_nsmf_pdusession_handle_release_sm_context(sess, state); break; @@ -518,6 +517,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) * So, if CreateSMContext is failed, * we'll clear SM_CONTEXT_REF. */ + ogs_error("[%s:%d] create_sm_context failed() [%d]", + amf_ue->supi, sess->psi, sbi_message.res_status); AMF_SESS_CLEAR(sess); } END diff --git a/src/amf/context.h b/src/amf/context.h index f10262887e..884be010ca 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -509,6 +509,8 @@ typedef struct amf_sess_s { /* SMF sends the RESPONSE * of [POST] /nsmf-pdusession/v1/sm-contexts */ char *sm_context_ref; + bool pdu_session_release_complete_received; + bool pdu_session_resource_release_response_received; /* SMF sends the REQUEST * of [POST] /namf-comm/v1/ue-contexts/{supi}/n1-n2-messages */ @@ -818,7 +820,6 @@ amf_sess_t *amf_sess_add(amf_ue_t *amf_ue, uint8_t psi); sbi_object = &(__sESS)->sbi; \ ogs_assert(sbi_object); \ \ - ogs_error("AMF_SESS_CLEAR"); \ if (ogs_list_count(&sbi_object->xact_list)) { \ ogs_error("SBI running [%d]", \ ogs_list_count(&sbi_object->xact_list)); \ diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index a6720c171d..46110e3bbf 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1099,6 +1099,23 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, if (!sess) { sess = amf_sess_add(amf_ue, *pdu_session_id); ogs_assert(sess); + } else { + /* + * These are variables that should be initialized + * when a PDU session establishment message is received + * for an existing session. + * + * It should be noted that XXX_recieved, which is initialized now, + * has a different initialization location than XXX_gsm_type. + * + * XXX_received is initialized in the ESTABLISHMENT phase, + * but XXX_gsm_type is initialized in the RELEASE phase + * when a PDU session release command with a Reactivation Request + * and a PDU session release complete are sent simultaneously. + */ + sess->pdu_session_resource_release_response_received = false; + sess->pdu_session_release_complete_received = false; + } } else { sess = amf_sess_find_by_psi(amf_ue, *pdu_session_id); @@ -1386,8 +1403,10 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, } break; case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE: - /* Prevent to invoke SMF for this session */ - CLEAR_SM_CONTEXT_REF(sess); + sess->pdu_session_release_complete_received = true; + if (sess->pdu_session_resource_release_response_received == + true) + CLEAR_SM_CONTEXT_REF(sess); break; default: break; diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 300bbac5f6..0c6f0ef75f 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -2514,7 +2514,12 @@ void ngap_handle_pdu_session_resource_release_response( ogs_assert(r != OGS_ERROR); ogs_pkbuf_free(param.n2smbuf); + + sess->pdu_session_resource_release_response_received = true; + if (sess->pdu_session_release_complete_received == true) + CLEAR_SM_CONTEXT_REF(sess); } + } void ngap_handle_uplink_ran_configuration_transfer( diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 8a1bd0717d..f011b7e9e0 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -1056,8 +1056,21 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) ogs_error("[%s:%d] Do not remove Session due to Reactivation-requested", amf_ue->supi, sess->psi); - /* Initialize the context instead of using amf_sess_remove() */ - + /* + * Issue #2917 + * + * These are variables that need to be initialized + * when a PDU session release command with a Reactivation Request + * and a PDU session release complete are sent at the same time. + * + * It is important to note that XXX_gsm_type, which is initialized now, + * has a different initialization location than + * pdu_session_release_complete_received/ + * pdu_session_resource_release_response_received + * + * XXX_received is initialized in the ESTABLISHMENT phase, + * but XXX_gsm_type must be initialized in the RELEASE phase. + */ sess->old_gsm_type = 0; sess->current_gsm_type = 0; @@ -1068,7 +1081,7 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) } else { ogs_info("[%s:%d] Release SM Context [state:%d]", amf_ue->supi, sess->psi, state); - amf_sess_remove(sess); + AMF_SESS_CLEAR(sess); } if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) { diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 2ae170203d..be10244b94 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -284,8 +284,6 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - sess = e->sess; - ogs_assert(sess); stream = e->h.sbi.data; ogs_assert(stream); smf_ue = sess->smf_ue; @@ -436,8 +434,6 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - sess = e->sess; - ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -850,8 +846,6 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - sess = e->sess; - ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -1002,8 +996,6 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - sess = e->sess; - ogs_assert(sess); stream = e->h.sbi.data; ogs_assert(stream); smf_ue = sess->smf_ue; @@ -1069,8 +1061,6 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - sess = e->sess; - ogs_assert(sess); stream = e->h.sbi.data; ogs_assert(stream); smf_ue = sess->smf_ue; @@ -1364,8 +1354,6 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - sess = e->sess; - ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -1588,8 +1576,6 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - sess = e->sess; - ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -1638,8 +1624,6 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - sess = e->sess; - ogs_assert(sess); stream = e->h.sbi.data; ogs_assert(stream); smf_ue = sess->smf_ue; @@ -1713,8 +1697,6 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - sess = e->sess; - ogs_assert(sess); stream = e->h.sbi.data; ogs_assert(stream); smf_ue = sess->smf_ue; @@ -1794,8 +1776,6 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - sess = e->sess; - ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -1874,11 +1854,19 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) { + smf_sess_t *sess = NULL; + + ogs_sbi_stream_t *stream = NULL; + ogs_sbi_message_t *sbi_message = NULL; + ogs_assert(s); ogs_assert(e); smf_sm_debug(e); + sess = e->sess; + ogs_assert(sess); + switch (e->h.id) { case OGS_FSM_ENTRY_SIG: break; @@ -1886,6 +1874,41 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) case OGS_FSM_EXIT_SIG: break; + case OGS_EVENT_SBI_SERVER: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + stream = e->h.sbi.data; + ogs_assert(stream); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_RELEASE) + ogs_assert(true == ogs_sbi_send_response( + stream, OGS_SBI_HTTP_STATUS_TOO_MANY_REQUESTS)); + break; + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, + "Invalid resource name [%s]", + sbi_message->h.resource.component[2])); + OGS_FSM_TRAN(s, smf_gsm_state_exception); + END + break; + + DEFAULT + ogs_error("Invalid API name [%s]", sbi_message->h.service.name); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, + "Invalid API name", sbi_message->h.service.name)); + OGS_FSM_TRAN(s, smf_gsm_state_exception); + END + break; + default: ogs_error("Unknown event %s", smf_event_get_name(e)); break; diff --git a/tests/registration/dereg-test.c b/tests/registration/dereg-test.c index bddd07ec6e..a12ec8474a 100644 --- a/tests/registration/dereg-test.c +++ b/tests/registration/dereg-test.c @@ -1584,6 +1584,304 @@ static void test5_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test6_issues2917_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 26); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Registration request */ + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.s1_ue_network_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 1; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue->ngap_procedure_code); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(100); + + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + abts_suite *test_dereg(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -1593,6 +1891,7 @@ abts_suite *test_dereg(abts_suite *suite) abts_run_test(suite, test3_func, NULL); abts_run_test(suite, test4_func, NULL); abts_run_test(suite, test5_func, NULL); + abts_run_test(suite, test6_issues2917_func, NULL); return suite; } From be12610fb65d81205c5f1115ad64e7be088d906b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Feb 2024 10:14:38 +0900 Subject: [PATCH 019/323] [AMF/MME] No STATE Change for the EMM/GMM-STATUS --- src/amf/gmm-sm.c | 8 +--- src/mme/emm-sm.c | 16 ++----- tests/attach/emm-status-test.c | 64 ++++++++++++++++++++++++++-- tests/registration/gmm-status-test.c | 61 +++++++++++++++++--------- 4 files changed, 109 insertions(+), 40 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 3386a33f84..a1d3668b8e 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1398,9 +1398,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_5GMM_STATUS: - ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->suci, - nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); + ogs_warn("[%s] 5GMM STATUS : Cause[%d]", + amf_ue->suci, nas_message->gmm.gmm_status.gmm_cause); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -1648,7 +1647,6 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->suci, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -1954,7 +1952,6 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -2315,7 +2312,6 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 27b59681a1..29e737e945 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -814,9 +814,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: @@ -1037,9 +1035,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); @@ -1251,9 +1247,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); @@ -1503,9 +1497,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); diff --git a/tests/attach/emm-status-test.c b/tests/attach/emm-status-test.c index e0efc4bdc7..51b6b80e0d 100644 --- a/tests/attach/emm-status-test.c +++ b/tests/attach/emm-status-test.c @@ -35,6 +35,9 @@ static void test1_func(abts_case *tc, void *data) test_sess_t *sess = NULL; test_bearer_t *bearer = NULL; + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + bson_t *doc = NULL; /* Setup Test UE & Session Context */ @@ -53,7 +56,7 @@ static void test1_func(abts_case *tc, void *data) ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.ksi = 0; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -88,7 +91,9 @@ static void test1_func(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); /* Send Attach Request */ - sess->pdn_connectivity_param.pco = 1; + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; esmbuf = testesm_build_pdn_connectivity_request(sess, false); @@ -101,9 +106,10 @@ static void test1_func(abts_case *tc, void *data) test_ue->attach_request_param.tmsi_status = 1; test_ue->attach_request_param.mobile_station_classmark_2 = 1; test_ue->attach_request_param.ue_usage_setting = 1; - emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); ABTS_PTR_NOTNULL(tc, emmbuf); + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); sendbuf = test_s1ap_build_initial_ue_message( test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -137,6 +143,20 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.epco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Initial Context Setup Request + * Attach Accept + * Activate Default Bearer Context Request */ @@ -153,6 +173,44 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive UE Context Release Command */ recvbuf = testenb_s1ap_read(s1ap); ABTS_PTR_NOTNULL(tc, recvbuf); diff --git a/tests/registration/gmm-status-test.c b/tests/registration/gmm-status-test.c index 86abfbd962..dfffcc5552 100644 --- a/tests/registration/gmm-status-test.c +++ b/tests/registration/gmm-status-test.c @@ -73,7 +73,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, gtpu); /* Send NG-Setup Reqeust */ - sendbuf = testngap_build_ng_setup_request(0x4000, 28); + sendbuf = testngap_build_ng_setup_request(0x4000, 22); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -89,6 +89,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); /* Send Registration request */ + test_ue->registration_request_param.guti = 1; gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -106,6 +107,19 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Authentication request */ recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); @@ -132,6 +146,15 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send GMM Status */ + gmmbuf = testgmm_build_gmm_status(test_ue, + OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive InitialContextSetupRequest + * Registration accept */ recvbuf = testgnb_ngap_read(ngap); @@ -141,6 +164,12 @@ static void test1_func(abts_case *tc, void *data) NGAP_ProcedureCode_id_InitialContextSetup, test_ue->ngap_procedure_code); + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send InitialContextSetupResponse */ sendbuf = testngap_build_initial_context_setup_response(test_ue, false); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -167,7 +196,7 @@ static void test1_func(abts_case *tc, void *data) sess->ul_nas_transport_param.request_type = OGS_NAS_5GS_REQUEST_TYPE_INITIAL; sess->ul_nas_transport_param.dnn = 1; - sess->ul_nas_transport_param.s_nssai = 1; + sess->ul_nas_transport_param.s_nssai = 0; sess->pdu_session_establishment_param.ssc_mode = 1; sess->pdu_session_establishment_param.epco = 1; @@ -192,24 +221,16 @@ static void test1_func(abts_case *tc, void *data) NGAP_ProcedureCode_id_PDUSessionResourceSetup, test_ue->ngap_procedure_code); - /* - * Related to issue #536. When running with VirtualBox 1 Core, - * AMF sends namf-callback response very late. In SMF, - * the Session context has already been removed, so an assertion occurs. - * - * It seems to be related to the response part of MHD. We will check - * if the same situation occurs after upgrading to nghttp2. - * - * If this issue still occurs on nghttp2, - * I will remove the assertion from SMF. - */ - ogs_msleep(100); + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); - /* Send GMM Status */ - gmmbuf = testgmm_build_gmm_status(test_ue, - OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE); - ABTS_PTR_NOTNULL(tc, gmmbuf); - sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -228,6 +249,8 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + ogs_msleep(300); + /********** Remove Subscriber in Database */ ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); From d1d3ec6fcbada437bb28d4ab47398e41880d7dde Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Feb 2024 10:37:36 +0900 Subject: [PATCH 020/323] [SEC] Several vulnerabilities have been resolved. 1. Reachable assertion in ogs_nas_5gmm_decode Location: lib/nas/5gs/decoder.c:4445 ```c int ogs_nas_5gmm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf) { int size = 0; int decoded = 0; ogs_assert(pkbuf); ogs_assert(pkbuf->data); ogs_assert(pkbuf->len); ``` When a NAS payload is received over `src/amf/context.c:1675`NGAP that has no data, the ogs_assert(pkbuf->len) assertion will be triggered. 2.Reachable assertion in ogs_nas_emm_decode ``` int ogs_nas_emm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf) { int size = 0; int decoded = 0; ogs_assert(pkbuf); ogs_assert(pkbuf->data); ogs_assert(pkbuf->len); ``` Nearly identical to (1), but for LTE. 3. Reachable assertion in nas_eps_send_emm_to_esm ``` int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue, ogs_nas_esm_message_container_t *esm_message_container) { int rv; ogs_pkbuf_t *esmbuf = NULL; if (!mme_ue_cycle(mme_ue)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } ogs_assert(esm_message_container); ogs_assert(esm_message_container->length); ``` The ESM message payload may be 0-length, as the length is determined by a field in the NAS payload (which can be chosen arbitrarily by an attacker). This leads to the length assertion above being triggered. 5. Reachable assertion and incorrect hash calculation in ogs_kdf_hash_mme ``` void ogs_kdf_hash_mme(const uint8_t *message, uint8_t message_len, uint8_t *hash_mme) { uint8_t key[32]; uint8_t output[OGS_SHA256_DIGEST_SIZE]; ogs_assert(message); ogs_assert(message_len); ogs_assert(hash_mme); memset(key, 0, 32); ogs_hmac_sha256(key, 32, message, message_len, output, OGS_SHA256_DIGEST_SIZE); memcpy(hash_mme, output+24, OGS_HASH_MME_LEN); } ``` When handling NAS attach requests or TAU requests, the ogs_kdf_hash_mme function is passed the NAS payload. However, the length field is represented as an unsigned 8-bit integer, which the passed length of the packet may overflow. This leads to the passed value being truncated. When the passed value is a multiple of 256, the above assertion (ogs_assert(message_len)) is triggered. Otherwise, the hash is computed on only the first n bits of the message (where n = actual_message_len % 256). --- lib/crypt/ogs-kdf.c | 3 ++- lib/crypt/ogs-kdf.h | 3 ++- lib/nas/5gs/decoder.c | 12 +++++------- lib/nas/5gs/encoder.c | 2 +- lib/nas/5gs/ies.c | 2 +- lib/nas/5gs/ies.h | 2 +- lib/nas/5gs/message.h | 2 +- lib/nas/5gs/support/nas-message.py | 10 ++++------ lib/nas/eps/decoder.c | 12 +++++------- lib/nas/eps/encoder.c | 2 +- lib/nas/eps/ies.c | 2 +- lib/nas/eps/ies.h | 2 +- lib/nas/eps/message.h | 2 +- lib/nas/eps/support/nas-message.py | 10 ++++------ src/mme/nas-path.c | 9 ++++++--- 15 files changed, 36 insertions(+), 39 deletions(-) diff --git a/lib/crypt/ogs-kdf.c b/lib/crypt/ogs-kdf.c index 17ee7c7e3d..fd670cb103 100644 --- a/lib/crypt/ogs-kdf.c +++ b/lib/crypt/ogs-kdf.c @@ -463,7 +463,8 @@ void ogs_kdf_ck_ik_idle_mobility( * TS33.401 Annex I Hash Functions * Use the KDF given in TS33.220 */ -void ogs_kdf_hash_mme(const uint8_t *message, uint8_t message_len, uint8_t *hash_mme) +void ogs_kdf_hash_mme( + const uint8_t *message, uint32_t message_len, uint8_t *hash_mme) { uint8_t key[32]; uint8_t output[OGS_SHA256_DIGEST_SIZE]; diff --git a/lib/crypt/ogs-kdf.h b/lib/crypt/ogs-kdf.h index 8bc2605823..b87c3ae26a 100644 --- a/lib/crypt/ogs-kdf.h +++ b/lib/crypt/ogs-kdf.h @@ -121,7 +121,8 @@ void ogs_kdf_ck_ik_idle_mobility( * TS33.401 Annex I Hash Functions * Use the KDF given in TS33.220 */ -void ogs_kdf_hash_mme(const uint8_t *message, uint8_t message_len, uint8_t *hash_mme); +void ogs_kdf_hash_mme( + const uint8_t *message, uint32_t message_len, uint8_t *hash_mme); /* * TS33.102 diff --git a/lib/nas/5gs/decoder.c b/lib/nas/5gs/decoder.c index c03e529eca..096dd5d73a 100644 --- a/lib/nas/5gs/decoder.c +++ b/lib/nas/5gs/decoder.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-04 20:50:00.889117 by acetcom + * Created on: 2024-01-21 18:47:47.827076 by acetcom * from 24501-h90.docx ******************************************************************************/ @@ -4449,15 +4449,14 @@ int ogs_nas_5gmm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf) ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_5gs_message_t)); size = sizeof(ogs_nas_5gmm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_5gs_message_t)); memcpy(&message->gmm.h, pkbuf->data - size, size); decoded += size; @@ -4710,15 +4709,14 @@ int ogs_nas_5gsm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf) ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_5gs_message_t)); size = sizeof(ogs_nas_5gsm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_5gs_message_t)); memcpy(&message->gsm.h, pkbuf->data - size, size); decoded += size; diff --git a/lib/nas/5gs/encoder.c b/lib/nas/5gs/encoder.c index 000ca71367..4383c35924 100644 --- a/lib/nas/5gs/encoder.c +++ b/lib/nas/5gs/encoder.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-04 20:50:00.898995 by acetcom + * Created on: 2024-01-21 18:47:47.837341 by acetcom * from 24501-h90.docx ******************************************************************************/ diff --git a/lib/nas/5gs/ies.c b/lib/nas/5gs/ies.c index ce04d556f7..79d78117e2 100644 --- a/lib/nas/5gs/ies.c +++ b/lib/nas/5gs/ies.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-04 20:50:00.874596 by acetcom + * Created on: 2024-01-21 18:47:47.812038 by acetcom * from 24501-h90.docx ******************************************************************************/ diff --git a/lib/nas/5gs/ies.h b/lib/nas/5gs/ies.h index 9073223a90..08f87555d9 100644 --- a/lib/nas/5gs/ies.h +++ b/lib/nas/5gs/ies.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-04 20:50:00.872007 by acetcom + * Created on: 2024-01-21 18:47:47.809393 by acetcom * from 24501-h90.docx ******************************************************************************/ diff --git a/lib/nas/5gs/message.h b/lib/nas/5gs/message.h index fe4607d5e5..ae3932b6a7 100644 --- a/lib/nas/5gs/message.h +++ b/lib/nas/5gs/message.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-04 20:50:00.882958 by acetcom + * Created on: 2024-01-21 18:47:47.820801 by acetcom * from 24501-h90.docx ******************************************************************************/ diff --git a/lib/nas/5gs/support/nas-message.py b/lib/nas/5gs/support/nas-message.py index c0ea0d9dc4..cc279fa9b4 100644 --- a/lib/nas/5gs/support/nas-message.py +++ b/lib/nas/5gs/support/nas-message.py @@ -732,15 +732,14 @@ def write_cells_to_file(name, cells): ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_5gs_message_t)); size = sizeof(ogs_nas_5gmm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_5gs_message_t)); memcpy(&message->gmm.h, pkbuf->data - size, size); decoded += size; @@ -779,15 +778,14 @@ def write_cells_to_file(name, cells): ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_5gs_message_t)); size = sizeof(ogs_nas_5gsm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_5gs_message_t)); memcpy(&message->gsm.h, pkbuf->data - size, size); decoded += size; diff --git a/lib/nas/eps/decoder.c b/lib/nas/eps/decoder.c index 4cd4bf1d09..f455ff2a0c 100644 --- a/lib/nas/eps/decoder.c +++ b/lib/nas/eps/decoder.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-02 22:57:51.860294 by acetcom + * Created on: 2024-01-21 18:50:03.417367 by acetcom * from 24301-h90.docx ******************************************************************************/ @@ -4691,15 +4691,14 @@ int ogs_nas_emm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf) ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_eps_message_t)); size = sizeof(ogs_nas_emm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_eps_message_t)); memcpy(&message->emm.h, pkbuf->data - size, size); decoded += size; @@ -4975,15 +4974,14 @@ int ogs_nas_esm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf) ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_eps_message_t)); size = sizeof(ogs_nas_esm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_eps_message_t)); memcpy(&message->esm.h, pkbuf->data - size, size); decoded += size; diff --git a/lib/nas/eps/encoder.c b/lib/nas/eps/encoder.c index ed39e82d6b..2fdefcd646 100644 --- a/lib/nas/eps/encoder.c +++ b/lib/nas/eps/encoder.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-02 22:57:51.871237 by acetcom + * Created on: 2024-01-21 18:50:03.428897 by acetcom * from 24301-h90.docx ******************************************************************************/ diff --git a/lib/nas/eps/ies.c b/lib/nas/eps/ies.c index f36fc71b10..8144341b80 100644 --- a/lib/nas/eps/ies.c +++ b/lib/nas/eps/ies.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-02 22:57:51.846548 by acetcom + * Created on: 2024-01-21 18:50:03.402793 by acetcom * from 24301-h90.docx ******************************************************************************/ diff --git a/lib/nas/eps/ies.h b/lib/nas/eps/ies.h index 5235f3a8d0..4e4b797ec5 100644 --- a/lib/nas/eps/ies.h +++ b/lib/nas/eps/ies.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-02 22:57:51.844510 by acetcom + * Created on: 2024-01-21 18:50:03.400537 by acetcom * from 24301-h90.docx ******************************************************************************/ diff --git a/lib/nas/eps/message.h b/lib/nas/eps/message.h index 058f3b9975..424f174d17 100644 --- a/lib/nas/eps/message.h +++ b/lib/nas/eps/message.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-03-02 22:57:51.852650 by acetcom + * Created on: 2024-01-21 18:50:03.409367 by acetcom * from 24301-h90.docx ******************************************************************************/ diff --git a/lib/nas/eps/support/nas-message.py b/lib/nas/eps/support/nas-message.py index 421238888d..1bfd6efaa3 100644 --- a/lib/nas/eps/support/nas-message.py +++ b/lib/nas/eps/support/nas-message.py @@ -747,15 +747,14 @@ def write_cells_to_file(name, cells): ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_eps_message_t)); size = sizeof(ogs_nas_emm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_eps_message_t)); memcpy(&message->emm.h, pkbuf->data - size, size); decoded += size; @@ -806,15 +805,14 @@ def write_cells_to_file(name, cells): ogs_assert(pkbuf); ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_eps_message_t)); size = sizeof(ogs_nas_esm_header_t); if (ogs_pkbuf_pull(pkbuf, size) == NULL) { ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size); return OGS_ERROR; } + + memset(message, 0, sizeof(ogs_nas_eps_message_t)); memcpy(&message->esm.h, pkbuf->data - size, size); decoded += size; diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index 36836e0e4f..c31e41f1c2 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -50,14 +50,17 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue, int rv; ogs_pkbuf_t *esmbuf = NULL; + ogs_assert(esm_message_container); + if (!esm_message_container->length) { + ogs_error("Invalid ESM Message Container"); + return OGS_ERROR; + } + if (!mme_ue_cycle(mme_ue)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - ogs_assert(esm_message_container); - ogs_assert(esm_message_container->length); - /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. * When calculating AES_CMAC, we need to use the headroom of the packet. */ esmbuf = ogs_pkbuf_alloc(NULL, From 7e8f145973f95f548e5a2404d68dcce63beee85a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Feb 2024 16:18:26 +0900 Subject: [PATCH 021/323] Rollback Pull Request (#1911) Problems with Purge-UE-Request/Answer can occur in the following situations 1. Attach Request 2. Authentication request 3. Authentication reject 4. UEContextReleaseCommand 5. UEContextReleaseComplete 6. Purge-UE-Request 7. Attach Request 8. Purge-UE-Answer 9. (UE Context Remove) To resolve this issue, we have changed to delete the UE-Context via mme_ue_remove() immediately upon receiving UEContextReleaseComplete() without calling mme_s6a_send_pur(). --- src/mme/mme-context.h | 2 - src/mme/mme-path.c | 8 +--- src/mme/mme-s11-handler.c | 8 +--- src/mme/mme-sm.c | 3 -- src/mme/s1ap-handler.c | 12 ++---- tests/attach/auth-test.c | 81 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 25 deletions(-) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 566c573829..11606364d9 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -474,8 +474,6 @@ struct mme_ue_s { int security_context_available; int mac_failed; - bool location_updated_but_not_canceled_yet; - /* Security Context */ ogs_nas_ue_network_capability_t ue_network_capability; ogs_nas_ms_network_capability_t ms_network_capability; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 420ec8b67d..5e84400ce2 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -83,12 +83,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_WARN, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_WARN, mme_ue); + mme_ue_remove(mme_ue); } } break; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 306056eda6..7e50f2df55 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -704,12 +704,8 @@ void mme_s11_handle_delete_session_response( } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { if (ECM_IDLE(mme_ue)) { - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + mme_ue_remove(mme_ue); } else { ogs_assert(mme_ue->enb_ue); r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 637e92e3d4..c954008bf2 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -612,8 +612,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - - mme_ue->location_updated_but_not_canceled_yet = true; break; case OGS_DIAM_S6A_CMD_CODE_PURGE_UE: ogs_debug("OGS_DIAM_S6A_CMD_CODE_PURGE_UE"); @@ -621,7 +619,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION"); - mme_ue->location_updated_but_not_canceled_yet = false; mme_s6a_handle_clr(mme_ue, s6a_message); break; case OGS_DIAM_S6A_CMD_CODE_INSERT_SUBSCRIBER_DATA: diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 367f241b5e..c5cc7ef085 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1846,11 +1846,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) return; } - mme_ue = enb_ue->mme_ue; - ogs_info("UE Context Release [Action:%d]", enb_ue->ue_ctx_rel_action); ogs_info(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + + mme_ue = mme_ue_cycle(enb_ue->mme_ue); if (mme_ue) { ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); @@ -1946,12 +1946,8 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) return; } - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + mme_ue_remove(mme_ue); break; case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE: ogs_debug(" Action: S1 handover complete"); diff --git a/tests/attach/auth-test.c b/tests/attach/auth-test.c index 04b4225e2f..9ba162d5dd 100644 --- a/tests/attach/auth-test.c +++ b/tests/attach/auth-test.c @@ -410,6 +410,87 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* + * --- Immediately Re-attach Test --- + * + * Problems with Purge-UE-Request/Answer can occur + * in the following situations + * + * 1. Attach Request + * 2. Authentication request + * 3. Authentication reject + * 4. UEContextReleaseCommand + * 5. UEContextReleaseComplete + * 6. Purge-UE-Request + * 7. Attach Request + * 8. Purge-UE-Answer + * 9. (UE Context Remove) + * + * To resolve this issue, we have changed to delete the UE-Context + * via mme_ue_remove() immediately upon receiving UEContextReleaseComplete() + * without calling mme_s6a_send_pur(). + * + * The test below was created to indicate that mme_s6a_send_pur() + * should be added in the future to take this into account. + */ + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.additional_update_type = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication failure - MAC failure */ + emmbuf = testemm_build_authentication_failure( + test_ue, OGS_NAS_EMM_CAUSE_MAC_FAILURE, 0); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication reject */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + ogs_msleep(300); /********** Remove Subscriber in Database */ From 8762425fbc417117b1fae06f7a7ecc1c8b7ebf49 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Feb 2024 16:59:47 +0900 Subject: [PATCH 022/323] [AMF] Fixed sm_context_ref failed (#2603, #2917) --- src/amf/ngap-handler.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 0c6f0ef75f..8237e72f1d 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -3819,6 +3819,16 @@ void ngap_handle_handover_cancel( Cause->present, (int)Cause->choice.radioNetwork); ogs_list_for_each(&amf_ue->sess_list, sess) { + if (!SESSION_CONTEXT_IN_SMF(sess)) { + ogs_error("Session Context is not in SMF [%d]", sess->psi); + r = ngap_send_error_indication2(source_ue, + NGAP_Cause_PR_radioNetwork, + NGAP_CauseRadioNetwork_handover_cancelled); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; + } + memset(&param, 0, sizeof(param)); param.hoState = OpenAPI_ho_state_CANCELLED; param.ngApCause.group = Cause->present; @@ -4118,6 +4128,16 @@ void ngap_handle_handover_notification( ogs_assert(r != OGS_ERROR); ogs_list_for_each(&amf_ue->sess_list, sess) { + if (!SESSION_CONTEXT_IN_SMF(sess)) { + ogs_error("Session Context is not in SMF [%d]", sess->psi); + r = ngap_send_error_indication2(source_ue, + NGAP_Cause_PR_radioNetwork, + NGAP_CauseRadioNetwork_partial_handover); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; + } + memset(&param, 0, sizeof(param)); param.hoState = OpenAPI_ho_state_COMPLETED; From 82398811db22c254fad8e9098026a1fb12262cd6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Feb 2024 09:28:50 +0900 Subject: [PATCH 023/323] [UPF] Report after Session was Deleted (#2936) The UPF is sending Session Report Request after the Session was Deleted, when the Gy interface is active. UPF is sending PFCP session report request after the session has been deleted when the Gy interface is active. This is because some of the timers related to the report are not deleted when the session is deleted. We have fixed it to delete all the timers in the session when the SESSION is deleted. --- lib/sbi/nnrf-build.c | 16 ++++++++++------ src/upf/context.c | 8 ++++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index 0259a1deca..fd0953e1b0 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -242,12 +242,6 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( return NULL; } - if (service_map == true) { - NFProfile->nf_service_list = NFServiceList; - } else { - NFProfile->nf_services = NFServiceList; - } - ogs_list_for_each(&nf_instance->nf_service_list, nf_service) { OpenAPI_nf_service_t *NFService = NULL; @@ -290,6 +284,16 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( } } + if (NFServiceList->count) { + if (service_map == true) { + NFProfile->nf_service_list = NFServiceList; + } else { + NFProfile->nf_services = NFServiceList; + } + } + else + OpenAPI_list_free(NFServiceList); + InfoList = OpenAPI_list_create(); ogs_assert(InfoList); diff --git a/src/upf/context.c b/src/upf/context.c index a061a49e45..3ae2ed72a1 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -857,12 +857,16 @@ static void upf_sess_urr_acc_remove_all(upf_sess_t *sess) unsigned int i; for (i = 0; i < OGS_ARRAY_SIZE(sess->urr_acc); i++) { if (sess->urr_acc[i].t_time_threshold) { + ogs_timer_delete(sess->urr_acc[i].t_time_threshold); + sess->urr_acc[i].t_time_threshold = NULL; + } + if (sess->urr_acc[i].t_validity_time) { ogs_timer_delete(sess->urr_acc[i].t_validity_time); sess->urr_acc[i].t_validity_time = NULL; + } + if (sess->urr_acc[i].t_time_quota) { ogs_timer_delete(sess->urr_acc[i].t_time_quota); sess->urr_acc[i].t_time_quota = NULL; - ogs_timer_delete(sess->urr_acc[i].t_time_threshold); - sess->urr_acc[i].t_time_threshold = NULL; } } } From 290df460effde9a5f17ba7f0d62290be2f4d2b8c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 5 Feb 2024 06:29:36 +0900 Subject: [PATCH 024/323] Added UPF performance test with NextEPC --- docs/_pages/docs.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index aa4f34394e..876fc3c719 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -18,9 +18,9 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - [Dockerized VoLTE Setup](tutorial/03-VoLTE-dockerized) - [Roaming](tutorial/05-roaming) -- Inside Source Code - - [UPF Code Explanation](https://medium.com/@aditya.koranga/open5gs-upf-code-explanation-with-flow-c-79c50f253dd1) - - [SMF Code Explanation](https://medium.com/@aditya.koranga/open5gs-smf-code-explanation-with-flow-charts-a3b3cd38c991) +- In the lab + - [A Demonstration of 30 Gbps Load Testing for Accelerated UPF with Open5gs](https://nextepc.com/technology) + - [Measurement of UPF Performance](https://github.com/s5uishida/simple_measurement_of_upf_performance) - Troubleshooting - [Simple Issues](troubleshoot/01-simple-issues) @@ -38,6 +38,10 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - Hardware Specific Notes - [eNodeBs/gNodeBs tested on Open5GS](hardware/01-genodebs) +- Inside Source Code + - [UPF Code Explanation](https://medium.com/@aditya.koranga/open5gs-upf-code-explanation-with-flow-c-79c50f253dd1) + - [SMF Code Explanation](https://medium.com/@aditya.koranga/open5gs-smf-code-explanation-with-flow-charts-a3b3cd38c991) + - @infinitydon - [Open5GS on Amazon Elastic Kubernetes Service](https://aws.amazon.com/blogs/opensource/open-source-mobile-core-network-implementation-on-amazon-elastic-kubernetes-service/) - [Kubernetes Open5GS Deployment](https://dev.to/infinitydon/virtual-4g-simulation-using-kubernetes-and-gns3-3b7k?fbclid=IwAR1p99h13a-mCfejanbBQe0H0-jp5grXkn5mWf1WrTHf47UtegB2-UHGGZQ) @@ -69,7 +73,6 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - [VPP-UPF with DPDK](https://github.com/s5uishida/open5gs_5gc_ueransim_vpp_upf_dpdk_sample_config) - [UERANSIM with eUPF(eBPF/XDP UPF)](https://github.com/s5uishida/open5gs_5gc_ueransim_eupf_sample_config) - [srsRAN with eUPF(eBPF/XDP UPF)](https://github.com/s5uishida/open5gs_epc_srsran_eupf_sample_config) - - [Measurement of UPF Performance](https://github.com/s5uishida/simple_measurement_of_upf_performance) - @gradiant helm charts - [Open5GS EPC and SRS LTE in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-srslte.html) From 94bd68aa7b6053d3f8085162d290af8777ae5528 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 8 Feb 2024 18:46:45 +0900 Subject: [PATCH 025/323] [MME] Follow-up on #2916 When there is no MME-UE Context, going to cleanup without setting s6a_message could cause a segmentation fault. We fixed the problem by moving the location of setting s6a_message to before cleanup. --- src/mme/mme-sm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index c954008bf2..b01d911744 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -516,6 +516,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_S6A_MESSAGE: + s6a_message = e->s6a_message; + ogs_assert(s6a_message); + /* * A race condition can occur in the following situations. * In conclusion, we can use this situation to determine @@ -563,9 +566,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) goto cleanup; } - s6a_message = e->s6a_message; - ogs_assert(s6a_message); - switch (s6a_message->cmd_code) { case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION"); From 843c4950ac93117c0495a7e5bba07c7daa86e090 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 12 Feb 2024 13:55:11 +0900 Subject: [PATCH 026/323] [ASN1C] Fixed asn1c library on 32bit (#2934) APER encoding fails when using the asn_uint642INTEGER function on a 32-bit machine as shown below. ```C asn_uint642INTEGER(AMF_UE_NGAP_ID, 0xffffffff); ... aper_encode_to_buffer(...) ``` INTEGER APER encode/decode functions seem to be operating internally with long variables instead of intmax_t. That is probably the reason of the failure. @v0-e fixed this issues in the mouse07410/asn1c pull request. https://github.com/mouse07410/asn1c/pull/176 https://github.com/mouse07410/asn1c/pull/177 --- docker/debian/bookworm | 1 + docker/i386/debian | 1 + docker/i386/ubuntu | 1 + docker/ubuntu/lunar | 1 + docker/ubuntu/noble | 1 + .../troubleshoot/02-now-in-github-issues.md | 56 ++++ lib/asn1c/common/ANY.c | 3 + lib/asn1c/common/ANY.h | 2 + lib/asn1c/common/BIT_STRING.c | 37 +++ lib/asn1c/common/BIT_STRING.h | 2 + lib/asn1c/common/ENUMERATED.c | 92 ++++++ lib/asn1c/common/ENUMERATED.h | 67 +++++ lib/asn1c/common/ENUMERATED_aper.c | 43 +++ lib/asn1c/common/GraphicString.c | 3 + lib/asn1c/common/GraphicString.h | 2 + lib/asn1c/common/INTEGER.c | 67 +++++ lib/asn1c/common/INTEGER.h | 4 + lib/asn1c/common/INTEGER_aper.c | 46 +-- lib/asn1c/common/NULL.c | 15 + lib/asn1c/common/NULL.h | 2 + lib/asn1c/common/NativeEnumerated.c | 3 + lib/asn1c/common/NativeEnumerated.h | 3 + lib/asn1c/common/NativeEnumerated_aper.c | 6 +- lib/asn1c/common/NativeInteger.c | 30 ++ lib/asn1c/common/NativeInteger.h | 2 + lib/asn1c/common/NativeInteger_rfill.c | 6 +- lib/asn1c/common/OBJECT_IDENTIFIER.c | 3 + lib/asn1c/common/OBJECT_IDENTIFIER.h | 2 + lib/asn1c/common/OCTET_STRING.c | 40 +++ lib/asn1c/common/OCTET_STRING.h | 3 + lib/asn1c/common/OCTET_STRING_aper.c | 1 - lib/asn1c/common/OPEN_TYPE.c | 3 + lib/asn1c/common/OPEN_TYPE.h | 13 +- lib/asn1c/common/OPEN_TYPE_aper.c | 5 +- lib/asn1c/common/ObjectDescriptor.c | 3 + lib/asn1c/common/ObjectDescriptor.h | 1 + lib/asn1c/common/PrintableString.c | 3 + lib/asn1c/common/PrintableString.h | 2 + lib/asn1c/common/UTF8String.c | 3 + lib/asn1c/common/UTF8String.h | 2 + lib/asn1c/common/VisibleString.c | 3 + lib/asn1c/common/VisibleString.h | 2 + lib/asn1c/common/aper_support.c | 281 +++++++++++++----- lib/asn1c/common/aper_support.h | 14 +- lib/asn1c/common/asn_application.c | 20 +- lib/asn1c/common/asn_application.h | 6 + lib/asn1c/common/asn_codecs_prim.h | 26 ++ lib/asn1c/common/asn_config.h | 1 + lib/asn1c/common/asn_internal.c | 4 +- lib/asn1c/common/asn_random_fill.c | 1 + lib/asn1c/common/constr_CHOICE.c | 61 +++- lib/asn1c/common/constr_CHOICE.h | 2 + lib/asn1c/common/constr_CHOICE_aper.c | 10 +- lib/asn1c/common/constr_SEQUENCE.c | 58 +++- lib/asn1c/common/constr_SEQUENCE.h | 2 + lib/asn1c/common/constr_SEQUENCE_OF.c | 3 + lib/asn1c/common/constr_SEQUENCE_OF.h | 2 + lib/asn1c/common/constr_SET_OF.c | 58 ++++ lib/asn1c/common/constr_SET_OF.h | 2 + lib/asn1c/common/constr_SET_OF_aper.c | 11 +- lib/asn1c/common/constr_TYPE.c | 20 ++ lib/asn1c/common/constr_TYPE.h | 25 ++ lib/asn1c/common/meson.build | 20 +- .../ngap/NGAP_AMF-TNLAssociationSetupItem.c | 2 +- .../ngap/NGAP_AMF-TNLAssociationSetupItem.h | 2 +- .../ngap/NGAP_AMF-TNLAssociationSetupList.c | 2 +- .../ngap/NGAP_AMF-TNLAssociationSetupList.h | 2 +- .../ngap/NGAP_AMF-TNLAssociationToAddItem.c | 2 +- .../ngap/NGAP_AMF-TNLAssociationToAddItem.h | 2 +- .../ngap/NGAP_AMF-TNLAssociationToAddList.c | 2 +- .../ngap/NGAP_AMF-TNLAssociationToAddList.h | 2 +- .../NGAP_AMF-TNLAssociationToRemoveItem.c | 2 +- .../NGAP_AMF-TNLAssociationToRemoveItem.h | 2 +- .../NGAP_AMF-TNLAssociationToRemoveList.c | 2 +- .../NGAP_AMF-TNLAssociationToRemoveList.h | 2 +- .../NGAP_AMF-TNLAssociationToUpdateItem.c | 2 +- .../NGAP_AMF-TNLAssociationToUpdateItem.h | 2 +- .../NGAP_AMF-TNLAssociationToUpdateList.c | 2 +- .../NGAP_AMF-TNLAssociationToUpdateList.h | 2 +- lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.c | 2 +- lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.h | 3 +- .../ngap/NGAP_AMFCPRelocationIndication.c | 2 +- .../ngap/NGAP_AMFCPRelocationIndication.h | 2 +- lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.c | 2 +- lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.h | 2 +- .../NGAP_AMFConfigurationUpdateAcknowledge.c | 2 +- .../NGAP_AMFConfigurationUpdateAcknowledge.h | 2 +- .../ngap/NGAP_AMFConfigurationUpdateFailure.c | 2 +- .../ngap/NGAP_AMFConfigurationUpdateFailure.h | 2 +- lib/asn1c/ngap/NGAP_AMFName.c | 2 +- lib/asn1c/ngap/NGAP_AMFName.h | 3 +- lib/asn1c/ngap/NGAP_AMFNameUTF8String.c | 2 +- lib/asn1c/ngap/NGAP_AMFNameUTF8String.h | 3 +- lib/asn1c/ngap/NGAP_AMFNameVisibleString.c | 2 +- lib/asn1c/ngap/NGAP_AMFNameVisibleString.h | 3 +- lib/asn1c/ngap/NGAP_AMFPagingTarget.c | 2 +- lib/asn1c/ngap/NGAP_AMFPagingTarget.h | 2 +- lib/asn1c/ngap/NGAP_AMFPointer.c | 2 +- lib/asn1c/ngap/NGAP_AMFPointer.h | 3 +- lib/asn1c/ngap/NGAP_AMFRegionID.c | 2 +- lib/asn1c/ngap/NGAP_AMFRegionID.h | 3 +- lib/asn1c/ngap/NGAP_AMFSetID.c | 2 +- lib/asn1c/ngap/NGAP_AMFSetID.h | 3 +- lib/asn1c/ngap/NGAP_AMFStatusIndication.c | 2 +- lib/asn1c/ngap/NGAP_AMFStatusIndication.h | 2 +- lib/asn1c/ngap/NGAP_ActivatedCellList.c | 2 +- lib/asn1c/ngap/NGAP_ActivatedCellList.h | 2 +- ...AP_AdditionalDLUPTNLInformationForHOItem.c | 2 +- ...AP_AdditionalDLUPTNLInformationForHOItem.h | 2 +- ...AP_AdditionalDLUPTNLInformationForHOList.c | 2 +- ...AP_AdditionalDLUPTNLInformationForHOList.h | 2 +- .../ngap/NGAP_AdditionalQosFlowInformation.c | 2 +- .../ngap/NGAP_AdditionalQosFlowInformation.h | 3 +- .../NGAP_AllocationAndRetentionPriority.c | 2 +- .../NGAP_AllocationAndRetentionPriority.h | 2 +- .../ngap/NGAP_Allowed-CAG-List-per-PLMN.c | 2 +- .../ngap/NGAP_Allowed-CAG-List-per-PLMN.h | 2 +- lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.c | 2 +- lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.h | 2 +- lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.c | 2 +- lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.h | 2 +- lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.c | 2 +- lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.h | 2 +- lib/asn1c/ngap/NGAP_AllowedNSSAI.c | 2 +- lib/asn1c/ngap/NGAP_AllowedNSSAI.h | 2 +- lib/asn1c/ngap/NGAP_AllowedTACs.c | 2 +- lib/asn1c/ngap/NGAP_AllowedTACs.h | 2 +- .../ngap/NGAP_AlternativeQoSParaSetIndex.c | 2 +- .../ngap/NGAP_AlternativeQoSParaSetIndex.h | 3 +- .../ngap/NGAP_AlternativeQoSParaSetItem.c | 2 +- .../ngap/NGAP_AlternativeQoSParaSetItem.h | 2 +- .../ngap/NGAP_AlternativeQoSParaSetList.c | 2 +- .../ngap/NGAP_AlternativeQoSParaSetList.h | 2 +- .../NGAP_AlternativeQoSParaSetNotifyIndex.c | 2 +- .../NGAP_AlternativeQoSParaSetNotifyIndex.h | 3 +- lib/asn1c/ngap/NGAP_AreaOfInterest.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterest.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestCellList.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestCellList.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestItem.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestItem.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestList.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestList.h | 2 +- .../ngap/NGAP_AreaOfInterestRANNodeItem.c | 2 +- .../ngap/NGAP_AreaOfInterestRANNodeItem.h | 2 +- .../ngap/NGAP_AreaOfInterestRANNodeList.c | 2 +- .../ngap/NGAP_AreaOfInterestRANNodeList.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.h | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.c | 2 +- lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.h | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.c | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.h | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.c | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.h | 2 +- .../ngap/NGAP_AreaScopeOfNeighCellsItem.c | 2 +- .../ngap/NGAP_AreaScopeOfNeighCellsItem.h | 2 +- .../ngap/NGAP_AreaScopeOfNeighCellsList.c | 2 +- .../ngap/NGAP_AreaScopeOfNeighCellsList.h | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfQMC.c | 2 +- lib/asn1c/ngap/NGAP_AreaScopeOfQMC.h | 2 +- lib/asn1c/ngap/NGAP_AssistanceDataForPaging.c | 2 +- lib/asn1c/ngap/NGAP_AssistanceDataForPaging.h | 2 +- .../NGAP_AssistanceDataForRecommendedCells.c | 2 +- .../NGAP_AssistanceDataForRecommendedCells.h | 2 +- ...GAP_AssociatedMBSQosFlowSetupRequestItem.c | 2 +- ...GAP_AssociatedMBSQosFlowSetupRequestItem.h | 2 +- ...GAP_AssociatedMBSQosFlowSetupRequestList.c | 2 +- ...GAP_AssociatedMBSQosFlowSetupRequestList.h | 2 +- ...ciatedMBSQosFlowSetuporModifyRequestItem.c | 2 +- ...ciatedMBSQosFlowSetuporModifyRequestItem.h | 2 +- ...ciatedMBSQosFlowSetuporModifyRequestList.c | 2 +- ...ciatedMBSQosFlowSetuporModifyRequestList.h | 2 +- lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.c | 2 +- lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.h | 2 +- lib/asn1c/ngap/NGAP_AssociatedQosFlowList.c | 2 +- lib/asn1c/ngap/NGAP_AssociatedQosFlowList.h | 2 +- lib/asn1c/ngap/NGAP_AuthenticatedIndication.c | 2 +- lib/asn1c/ngap/NGAP_AuthenticatedIndication.h | 3 +- .../ngap/NGAP_AvailableRANVisibleQoEMetrics.c | 2 +- .../ngap/NGAP_AvailableRANVisibleQoEMetrics.h | 2 +- lib/asn1c/ngap/NGAP_AveragingWindow.c | 2 +- lib/asn1c/ngap/NGAP_AveragingWindow.h | 3 +- ...NGAP_BeamMeasurementsReportConfiguration.c | 2 +- ...NGAP_BeamMeasurementsReportConfiguration.h | 2 +- .../NGAP_BeamMeasurementsReportQuantity.c | 2 +- .../NGAP_BeamMeasurementsReportQuantity.h | 2 +- lib/asn1c/ngap/NGAP_BitRate.c | 2 +- lib/asn1c/ngap/NGAP_BitRate.h | 3 +- lib/asn1c/ngap/NGAP_BluetoothMeasConfig.c | 2 +- lib/asn1c/ngap/NGAP_BluetoothMeasConfig.h | 3 +- .../ngap/NGAP_BluetoothMeasConfigNameItem.c | 2 +- .../ngap/NGAP_BluetoothMeasConfigNameItem.h | 2 +- .../ngap/NGAP_BluetoothMeasConfigNameList.c | 2 +- .../ngap/NGAP_BluetoothMeasConfigNameList.h | 2 +- .../NGAP_BluetoothMeasurementConfiguration.c | 2 +- .../NGAP_BluetoothMeasurementConfiguration.h | 2 +- lib/asn1c/ngap/NGAP_BluetoothName.c | 2 +- lib/asn1c/ngap/NGAP_BluetoothName.h | 3 +- .../ngap/NGAP_BroadcastCancelledAreaList.c | 2 +- .../ngap/NGAP_BroadcastCancelledAreaList.h | 2 +- .../ngap/NGAP_BroadcastCompletedAreaList.c | 2 +- .../ngap/NGAP_BroadcastCompletedAreaList.h | 2 +- lib/asn1c/ngap/NGAP_BroadcastPLMNItem.c | 2 +- lib/asn1c/ngap/NGAP_BroadcastPLMNItem.h | 2 +- lib/asn1c/ngap/NGAP_BroadcastPLMNList.c | 2 +- lib/asn1c/ngap/NGAP_BroadcastPLMNList.h | 2 +- ...NGAP_BroadcastSessionModificationFailure.c | 2 +- ...NGAP_BroadcastSessionModificationFailure.h | 2 +- ...NGAP_BroadcastSessionModificationRequest.c | 2 +- ...NGAP_BroadcastSessionModificationRequest.h | 2 +- ...GAP_BroadcastSessionModificationResponse.c | 2 +- ...GAP_BroadcastSessionModificationResponse.h | 2 +- .../NGAP_BroadcastSessionReleaseRequest.c | 2 +- .../NGAP_BroadcastSessionReleaseRequest.h | 2 +- .../NGAP_BroadcastSessionReleaseRequired.c | 2 +- .../NGAP_BroadcastSessionReleaseRequired.h | 2 +- .../NGAP_BroadcastSessionReleaseResponse.c | 2 +- .../NGAP_BroadcastSessionReleaseResponse.h | 2 +- .../ngap/NGAP_BroadcastSessionSetupFailure.c | 2 +- .../ngap/NGAP_BroadcastSessionSetupFailure.h | 2 +- .../ngap/NGAP_BroadcastSessionSetupRequest.c | 2 +- .../ngap/NGAP_BroadcastSessionSetupRequest.h | 2 +- .../ngap/NGAP_BroadcastSessionSetupResponse.c | 2 +- .../ngap/NGAP_BroadcastSessionSetupResponse.h | 2 +- lib/asn1c/ngap/NGAP_BurstArrivalTime.c | 2 +- lib/asn1c/ngap/NGAP_BurstArrivalTime.h | 3 +- lib/asn1c/ngap/NGAP_CAG-ID.c | 2 +- lib/asn1c/ngap/NGAP_CAG-ID.h | 3 +- .../ngap/NGAP_CEmodeBSupport-Indicator.c | 2 +- .../ngap/NGAP_CEmodeBSupport-Indicator.h | 3 +- lib/asn1c/ngap/NGAP_CEmodeBrestricted.c | 2 +- lib/asn1c/ngap/NGAP_CEmodeBrestricted.h | 3 +- lib/asn1c/ngap/NGAP_CNAssistedRANTuning.c | 2 +- lib/asn1c/ngap/NGAP_CNAssistedRANTuning.h | 2 +- .../NGAP_CNTypeRestrictionsForEquivalent.c | 2 +- .../NGAP_CNTypeRestrictionsForEquivalent.h | 2 +- ...NGAP_CNTypeRestrictionsForEquivalentItem.c | 2 +- ...NGAP_CNTypeRestrictionsForEquivalentItem.h | 2 +- .../ngap/NGAP_CNTypeRestrictionsForServing.c | 2 +- .../ngap/NGAP_CNTypeRestrictionsForServing.h | 3 +- lib/asn1c/ngap/NGAP_CNsubgroupID.c | 2 +- lib/asn1c/ngap/NGAP_CNsubgroupID.h | 3 +- lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.c | 2 +- lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.h | 2 +- lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.c | 2 +- lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.h | 2 +- .../ngap/NGAP_CPTransportLayerInformation.c | 2 +- .../ngap/NGAP_CPTransportLayerInformation.h | 2 +- .../ngap/NGAP_CancelAllWarningMessages.c | 2 +- .../ngap/NGAP_CancelAllWarningMessages.h | 3 +- .../NGAP_CancelledCellsInEAI-EUTRA-Item.c | 2 +- .../NGAP_CancelledCellsInEAI-EUTRA-Item.h | 2 +- .../ngap/NGAP_CancelledCellsInEAI-EUTRA.c | 2 +- .../ngap/NGAP_CancelledCellsInEAI-EUTRA.h | 2 +- .../ngap/NGAP_CancelledCellsInEAI-NR-Item.c | 2 +- .../ngap/NGAP_CancelledCellsInEAI-NR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.c | 2 +- lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.h | 2 +- .../NGAP_CancelledCellsInTAI-EUTRA-Item.c | 2 +- .../NGAP_CancelledCellsInTAI-EUTRA-Item.h | 2 +- .../ngap/NGAP_CancelledCellsInTAI-EUTRA.c | 2 +- .../ngap/NGAP_CancelledCellsInTAI-EUTRA.h | 2 +- .../ngap/NGAP_CancelledCellsInTAI-NR-Item.c | 2 +- .../ngap/NGAP_CancelledCellsInTAI-NR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.c | 2 +- lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.h | 2 +- lib/asn1c/ngap/NGAP_CandidateCell.c | 2 +- lib/asn1c/ngap/NGAP_CandidateCell.h | 2 +- lib/asn1c/ngap/NGAP_CandidateCellID.c | 2 +- lib/asn1c/ngap/NGAP_CandidateCellID.h | 2 +- lib/asn1c/ngap/NGAP_CandidateCellItem.c | 2 +- lib/asn1c/ngap/NGAP_CandidateCellItem.h | 2 +- lib/asn1c/ngap/NGAP_CandidateCellList.c | 2 +- lib/asn1c/ngap/NGAP_CandidateCellList.h | 2 +- lib/asn1c/ngap/NGAP_CandidatePCI.c | 2 +- lib/asn1c/ngap/NGAP_CandidatePCI.h | 2 +- lib/asn1c/ngap/NGAP_Cause.c | 2 +- lib/asn1c/ngap/NGAP_Cause.h | 2 +- lib/asn1c/ngap/NGAP_CauseMisc.c | 2 +- lib/asn1c/ngap/NGAP_CauseMisc.h | 3 +- lib/asn1c/ngap/NGAP_CauseNas.c | 2 +- lib/asn1c/ngap/NGAP_CauseNas.h | 3 +- lib/asn1c/ngap/NGAP_CauseProtocol.c | 2 +- lib/asn1c/ngap/NGAP_CauseProtocol.h | 3 +- lib/asn1c/ngap/NGAP_CauseRadioNetwork.c | 2 +- lib/asn1c/ngap/NGAP_CauseRadioNetwork.h | 3 +- lib/asn1c/ngap/NGAP_CauseTransport.c | 2 +- lib/asn1c/ngap/NGAP_CauseTransport.h | 3 +- lib/asn1c/ngap/NGAP_Cell-CAGInformation.c | 2 +- lib/asn1c/ngap/NGAP_Cell-CAGInformation.h | 2 +- lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.c | 2 +- lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.h | 2 +- lib/asn1c/ngap/NGAP_CellBasedMDT-NR.c | 2 +- lib/asn1c/ngap/NGAP_CellBasedMDT-NR.h | 2 +- lib/asn1c/ngap/NGAP_CellBasedQMC.c | 2 +- lib/asn1c/ngap/NGAP_CellBasedQMC.h | 2 +- lib/asn1c/ngap/NGAP_CellCAGList.c | 2 +- lib/asn1c/ngap/NGAP_CellCAGList.h | 2 +- .../ngap/NGAP_CellIDBroadcastEUTRA-Item.c | 2 +- .../ngap/NGAP_CellIDBroadcastEUTRA-Item.h | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.c | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.h | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.c | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastNR.c | 2 +- lib/asn1c/ngap/NGAP_CellIDBroadcastNR.h | 2 +- .../ngap/NGAP_CellIDCancelledEUTRA-Item.c | 2 +- .../ngap/NGAP_CellIDCancelledEUTRA-Item.h | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.c | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.h | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.c | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledNR.c | 2 +- lib/asn1c/ngap/NGAP_CellIDCancelledNR.h | 2 +- lib/asn1c/ngap/NGAP_CellIDListForRestart.c | 2 +- lib/asn1c/ngap/NGAP_CellIDListForRestart.h | 2 +- lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.c | 2 +- lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.h | 2 +- lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.c | 2 +- lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.h | 2 +- lib/asn1c/ngap/NGAP_CellIdListforQMC.c | 2 +- lib/asn1c/ngap/NGAP_CellIdListforQMC.h | 2 +- lib/asn1c/ngap/NGAP_CellSize.c | 2 +- lib/asn1c/ngap/NGAP_CellSize.h | 3 +- lib/asn1c/ngap/NGAP_CellTrafficTrace.c | 2 +- lib/asn1c/ngap/NGAP_CellTrafficTrace.h | 2 +- lib/asn1c/ngap/NGAP_CellType.c | 2 +- lib/asn1c/ngap/NGAP_CellType.h | 2 +- lib/asn1c/ngap/NGAP_CellsToActivateList.c | 2 +- lib/asn1c/ngap/NGAP_CellsToActivateList.h | 2 +- lib/asn1c/ngap/NGAP_CommonNetworkInstance.c | 2 +- lib/asn1c/ngap/NGAP_CommonNetworkInstance.h | 3 +- .../NGAP_CompletedCellsInEAI-EUTRA-Item.c | 2 +- .../NGAP_CompletedCellsInEAI-EUTRA-Item.h | 2 +- .../ngap/NGAP_CompletedCellsInEAI-EUTRA.c | 2 +- .../ngap/NGAP_CompletedCellsInEAI-EUTRA.h | 2 +- .../ngap/NGAP_CompletedCellsInEAI-NR-Item.c | 2 +- .../ngap/NGAP_CompletedCellsInEAI-NR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.c | 2 +- lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.h | 2 +- .../NGAP_CompletedCellsInTAI-EUTRA-Item.c | 2 +- .../NGAP_CompletedCellsInTAI-EUTRA-Item.h | 2 +- .../ngap/NGAP_CompletedCellsInTAI-EUTRA.c | 2 +- .../ngap/NGAP_CompletedCellsInTAI-EUTRA.h | 2 +- .../ngap/NGAP_CompletedCellsInTAI-NR-Item.c | 2 +- .../ngap/NGAP_CompletedCellsInTAI-NR-Item.h | 2 +- lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.c | 2 +- lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.h | 2 +- .../ngap/NGAP_CompositeAvailableCapacity.c | 2 +- .../ngap/NGAP_CompositeAvailableCapacity.h | 2 +- .../ngap/NGAP_ConcurrentWarningMessageInd.c | 2 +- .../ngap/NGAP_ConcurrentWarningMessageInd.h | 3 +- ...NGAP_ConfidentialityProtectionIndication.c | 2 +- ...NGAP_ConfidentialityProtectionIndication.h | 3 +- .../NGAP_ConfidentialityProtectionResult.c | 2 +- .../NGAP_ConfidentialityProtectionResult.h | 3 +- lib/asn1c/ngap/NGAP_ConfiguredNSSAI.c | 2 +- lib/asn1c/ngap/NGAP_ConfiguredNSSAI.h | 3 +- lib/asn1c/ngap/NGAP_ConfiguredTACIndication.c | 2 +- lib/asn1c/ngap/NGAP_ConfiguredTACIndication.h | 3 +- .../NGAP_ConnectionEstablishmentIndication.c | 2 +- .../NGAP_ConnectionEstablishmentIndication.h | 2 +- ...eNetworkAssistanceInformationForInactive.c | 2 +- ...eNetworkAssistanceInformationForInactive.h | 2 +- .../ngap/NGAP_CoverageEnhancementLevel.c | 2 +- .../ngap/NGAP_CoverageEnhancementLevel.h | 3 +- lib/asn1c/ngap/NGAP_Criticality.c | 2 +- lib/asn1c/ngap/NGAP_Criticality.h | 3 +- .../NGAP_CriticalityDiagnostics-IE-Item.c | 2 +- .../NGAP_CriticalityDiagnostics-IE-Item.h | 2 +- .../NGAP_CriticalityDiagnostics-IE-List.c | 2 +- .../NGAP_CriticalityDiagnostics-IE-List.h | 2 +- lib/asn1c/ngap/NGAP_CriticalityDiagnostics.c | 2 +- lib/asn1c/ngap/NGAP_CriticalityDiagnostics.h | 2 +- lib/asn1c/ngap/NGAP_DAPSRequestInfo.c | 2 +- lib/asn1c/ngap/NGAP_DAPSRequestInfo.h | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfo.c | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfo.h | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.c | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.h | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfoList.c | 2 +- lib/asn1c/ngap/NGAP_DAPSResponseInfoList.h | 2 +- .../ngap/NGAP_DL-CP-SecurityInformation.c | 2 +- .../ngap/NGAP_DL-CP-SecurityInformation.h | 2 +- lib/asn1c/ngap/NGAP_DL-NAS-MAC.c | 2 +- lib/asn1c/ngap/NGAP_DL-NAS-MAC.h | 3 +- .../ngap/NGAP_DL-NGU-TNLInformationReused.c | 2 +- .../ngap/NGAP_DL-NGU-TNLInformationReused.h | 3 +- lib/asn1c/ngap/NGAP_DLForwarding.c | 2 +- lib/asn1c/ngap/NGAP_DLForwarding.h | 3 +- lib/asn1c/ngap/NGAP_DRB-ID.c | 2 +- lib/asn1c/ngap/NGAP_DRB-ID.h | 3 +- lib/asn1c/ngap/NGAP_DRBStatusDL.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusDL.h | 2 +- lib/asn1c/ngap/NGAP_DRBStatusDL12.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusDL12.h | 2 +- lib/asn1c/ngap/NGAP_DRBStatusDL18.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusDL18.h | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL.h | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL12.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL12.h | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL18.c | 2 +- lib/asn1c/ngap/NGAP_DRBStatusUL18.h | 2 +- ...AP_DRBsSubjectToEarlyStatusTransfer-Item.c | 2 +- ...AP_DRBsSubjectToEarlyStatusTransfer-Item.h | 2 +- ...AP_DRBsSubjectToEarlyStatusTransfer-List.c | 2 +- ...AP_DRBsSubjectToEarlyStatusTransfer-List.h | 2 +- .../NGAP_DRBsSubjectToStatusTransferItem.c | 2 +- .../NGAP_DRBsSubjectToStatusTransferItem.h | 2 +- .../NGAP_DRBsSubjectToStatusTransferList.c | 2 +- .../NGAP_DRBsSubjectToStatusTransferList.h | 2 +- .../ngap/NGAP_DRBsToQosFlowsMappingItem.c | 2 +- .../ngap/NGAP_DRBsToQosFlowsMappingItem.h | 2 +- .../ngap/NGAP_DRBsToQosFlowsMappingList.c | 2 +- .../ngap/NGAP_DRBsToQosFlowsMappingList.h | 2 +- lib/asn1c/ngap/NGAP_DataCodingScheme.c | 2 +- lib/asn1c/ngap/NGAP_DataCodingScheme.h | 3 +- lib/asn1c/ngap/NGAP_DataForwardingAccepted.c | 2 +- lib/asn1c/ngap/NGAP_DataForwardingAccepted.h | 3 +- .../ngap/NGAP_DataForwardingNotPossible.c | 2 +- .../ngap/NGAP_DataForwardingNotPossible.h | 3 +- .../ngap/NGAP_DataForwardingResponseDRBItem.c | 2 +- .../ngap/NGAP_DataForwardingResponseDRBItem.h | 2 +- .../ngap/NGAP_DataForwardingResponseDRBList.c | 2 +- .../ngap/NGAP_DataForwardingResponseDRBList.h | 2 +- .../NGAP_DataForwardingResponseERABList.c | 2 +- .../NGAP_DataForwardingResponseERABList.h | 2 +- .../NGAP_DataForwardingResponseERABListItem.c | 2 +- .../NGAP_DataForwardingResponseERABListItem.h | 2 +- lib/asn1c/ngap/NGAP_DeactivateTrace.c | 2 +- lib/asn1c/ngap/NGAP_DeactivateTrace.h | 2 +- lib/asn1c/ngap/NGAP_DelayCritical.c | 2 +- lib/asn1c/ngap/NGAP_DelayCritical.h | 3 +- .../NGAP_DirectForwardingPathAvailability.c | 2 +- .../NGAP_DirectForwardingPathAvailability.h | 3 +- .../ngap/NGAP_DistributionReleaseRequest.c | 2 +- .../ngap/NGAP_DistributionReleaseRequest.h | 2 +- .../ngap/NGAP_DistributionReleaseResponse.c | 2 +- .../ngap/NGAP_DistributionReleaseResponse.h | 2 +- .../ngap/NGAP_DistributionSetupFailure.c | 2 +- .../ngap/NGAP_DistributionSetupFailure.h | 2 +- .../ngap/NGAP_DistributionSetupRequest.c | 2 +- .../ngap/NGAP_DistributionSetupRequest.h | 2 +- .../ngap/NGAP_DistributionSetupResponse.c | 2 +- .../ngap/NGAP_DistributionSetupResponse.h | 2 +- lib/asn1c/ngap/NGAP_DownlinkNASTransport.c | 2 +- lib/asn1c/ngap/NGAP_DownlinkNASTransport.h | 2 +- ...AP_DownlinkNonUEAssociatedNRPPaTransport.c | 2 +- ...AP_DownlinkNonUEAssociatedNRPPaTransport.h | 2 +- .../NGAP_DownlinkRANConfigurationTransfer.c | 2 +- .../NGAP_DownlinkRANConfigurationTransfer.h | 2 +- .../NGAP_DownlinkRANEarlyStatusTransfer.c | 2 +- .../NGAP_DownlinkRANEarlyStatusTransfer.h | 2 +- .../ngap/NGAP_DownlinkRANStatusTransfer.c | 2 +- .../ngap/NGAP_DownlinkRANStatusTransfer.h | 2 +- .../NGAP_DownlinkRIMInformationTransfer.c | 2 +- .../NGAP_DownlinkRIMInformationTransfer.h | 2 +- .../NGAP_DownlinkUEAssociatedNRPPaTransport.c | 2 +- .../NGAP_DownlinkUEAssociatedNRPPaTransport.h | 2 +- lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.c | 2 +- lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.h | 2 +- lib/asn1c/ngap/NGAP_E-RAB-ID.c | 2 +- lib/asn1c/ngap/NGAP_E-RAB-ID.h | 3 +- lib/asn1c/ngap/NGAP_E-RABInformationItem.c | 2 +- lib/asn1c/ngap/NGAP_E-RABInformationItem.h | 2 +- lib/asn1c/ngap/NGAP_E-RABInformationList.c | 2 +- lib/asn1c/ngap/NGAP_E-RABInformationList.h | 2 +- lib/asn1c/ngap/NGAP_EDT-Session.c | 2 +- lib/asn1c/ngap/NGAP_EDT-Session.h | 3 +- .../ngap/NGAP_EN-DCSONConfigurationTransfer.c | 2 +- .../ngap/NGAP_EN-DCSONConfigurationTransfer.h | 3 +- lib/asn1c/ngap/NGAP_ENB-ID.c | 2 +- lib/asn1c/ngap/NGAP_ENB-ID.h | 2 +- lib/asn1c/ngap/NGAP_EPS-TAC.c | 2 +- lib/asn1c/ngap/NGAP_EPS-TAC.h | 3 +- lib/asn1c/ngap/NGAP_EPS-TAI.c | 2 +- lib/asn1c/ngap/NGAP_EPS-TAI.h | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGI.c | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGI.h | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGIList.c | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGIList.h | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.c | 2 +- lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.h | 2 +- .../ngap/NGAP_EUTRA-Paging-Time-Window.c | 2 +- .../ngap/NGAP_EUTRA-Paging-Time-Window.h | 3 +- lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.c | 2 +- lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.h | 3 +- .../ngap/NGAP_EUTRA-PagingeDRXInformation.c | 2 +- .../ngap/NGAP_EUTRA-PagingeDRXInformation.h | 2 +- lib/asn1c/ngap/NGAP_EUTRACellIdentity.c | 2 +- lib/asn1c/ngap/NGAP_EUTRACellIdentity.h | 3 +- lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.c | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.h | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.c | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.h | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.c | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.h | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.c | 2 +- lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.h | 2 +- ...P_EUTRAN-CompositeAvailableCapacityGroup.c | 2 +- ...P_EUTRAN-CompositeAvailableCapacityGroup.h | 2 +- .../ngap/NGAP_EUTRAN-NumberOfActiveUEs.c | 2 +- .../ngap/NGAP_EUTRAN-NumberOfActiveUEs.h | 3 +- .../ngap/NGAP_EUTRAN-RadioResourceStatus.c | 2 +- .../ngap/NGAP_EUTRAN-RadioResourceStatus.h | 2 +- .../ngap/NGAP_EUTRAN-ReportingStatusIEs.c | 2 +- .../ngap/NGAP_EUTRAN-ReportingStatusIEs.h | 2 +- .../ngap/NGAP_EUTRAN-ReportingSystemIEs.c | 2 +- .../ngap/NGAP_EUTRAN-ReportingSystemIEs.h | 2 +- .../ngap/NGAP_EUTRAencryptionAlgorithms.c | 2 +- .../ngap/NGAP_EUTRAencryptionAlgorithms.h | 3 +- .../NGAP_EUTRAintegrityProtectionAlgorithms.c | 2 +- .../NGAP_EUTRAintegrityProtectionAlgorithms.h | 3 +- lib/asn1c/ngap/NGAP_EXTERNAL.c | 2 +- lib/asn1c/ngap/NGAP_EXTERNAL.h | 2 +- lib/asn1c/ngap/NGAP_EarlyMeasurement.c | 2 +- lib/asn1c/ngap/NGAP_EarlyMeasurement.h | 3 +- ...EarlyStatusTransfer-TransparentContainer.c | 2 +- ...EarlyStatusTransfer-TransparentContainer.h | 2 +- lib/asn1c/ngap/NGAP_EmergencyAreaID.c | 2 +- lib/asn1c/ngap/NGAP_EmergencyAreaID.h | 3 +- .../NGAP_EmergencyAreaIDBroadcastEUTRA-Item.c | 2 +- .../NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h | 2 +- .../ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.c | 2 +- .../ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.h | 2 +- .../NGAP_EmergencyAreaIDBroadcastNR-Item.c | 2 +- .../NGAP_EmergencyAreaIDBroadcastNR-Item.h | 2 +- .../ngap/NGAP_EmergencyAreaIDBroadcastNR.c | 2 +- .../ngap/NGAP_EmergencyAreaIDBroadcastNR.h | 2 +- .../NGAP_EmergencyAreaIDCancelledEUTRA-Item.c | 2 +- .../NGAP_EmergencyAreaIDCancelledEUTRA-Item.h | 2 +- .../ngap/NGAP_EmergencyAreaIDCancelledEUTRA.c | 2 +- .../ngap/NGAP_EmergencyAreaIDCancelledEUTRA.h | 2 +- .../NGAP_EmergencyAreaIDCancelledNR-Item.c | 2 +- .../NGAP_EmergencyAreaIDCancelledNR-Item.h | 2 +- .../ngap/NGAP_EmergencyAreaIDCancelledNR.c | 2 +- .../ngap/NGAP_EmergencyAreaIDCancelledNR.h | 2 +- lib/asn1c/ngap/NGAP_EmergencyAreaIDList.c | 2 +- lib/asn1c/ngap/NGAP_EmergencyAreaIDList.h | 2 +- .../ngap/NGAP_EmergencyAreaIDListForRestart.c | 2 +- .../ngap/NGAP_EmergencyAreaIDListForRestart.h | 2 +- .../ngap/NGAP_EmergencyFallbackIndicator.c | 2 +- .../ngap/NGAP_EmergencyFallbackIndicator.h | 2 +- .../NGAP_EmergencyFallbackRequestIndicator.c | 2 +- .../NGAP_EmergencyFallbackRequestIndicator.h | 3 +- .../ngap/NGAP_EmergencyServiceTargetCN.c | 2 +- .../ngap/NGAP_EmergencyServiceTargetCN.h | 3 +- lib/asn1c/ngap/NGAP_EndIndication.c | 2 +- lib/asn1c/ngap/NGAP_EndIndication.h | 3 +- .../ngap/NGAP_EndpointIPAddressAndPort.c | 2 +- .../ngap/NGAP_EndpointIPAddressAndPort.h | 2 +- .../ngap/NGAP_Enhanced-CoverageRestriction.c | 2 +- .../ngap/NGAP_Enhanced-CoverageRestriction.h | 3 +- lib/asn1c/ngap/NGAP_EquivalentPLMNs.c | 2 +- lib/asn1c/ngap/NGAP_EquivalentPLMNs.h | 2 +- lib/asn1c/ngap/NGAP_ErrorIndication.c | 2 +- lib/asn1c/ngap/NGAP_ErrorIndication.h | 2 +- lib/asn1c/ngap/NGAP_EventBasedReportingIEs.c | 2 +- lib/asn1c/ngap/NGAP_EventBasedReportingIEs.h | 2 +- lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.c | 2 +- lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.h | 2 +- lib/asn1c/ngap/NGAP_EventTrigger.c | 2 +- lib/asn1c/ngap/NGAP_EventTrigger.h | 2 +- lib/asn1c/ngap/NGAP_EventType.c | 2 +- lib/asn1c/ngap/NGAP_EventType.h | 3 +- ..._ExcessPacketDelayThresholdConfiguration.c | 2 +- ..._ExcessPacketDelayThresholdConfiguration.h | 2 +- .../NGAP_ExcessPacketDelayThresholdItem.c | 2 +- .../NGAP_ExcessPacketDelayThresholdItem.h | 2 +- .../NGAP_ExcessPacketDelayThresholdValue.c | 2 +- .../NGAP_ExcessPacketDelayThresholdValue.h | 3 +- lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.c | 2 +- lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.h | 3 +- lib/asn1c/ngap/NGAP_ExpectedHOInterval.c | 2 +- lib/asn1c/ngap/NGAP_ExpectedHOInterval.h | 3 +- lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.c | 2 +- lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.h | 3 +- .../ngap/NGAP_ExpectedUEActivityBehaviour.c | 2 +- .../ngap/NGAP_ExpectedUEActivityBehaviour.h | 2 +- lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.c | 2 +- lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.h | 2 +- lib/asn1c/ngap/NGAP_ExpectedUEMobility.c | 2 +- lib/asn1c/ngap/NGAP_ExpectedUEMobility.h | 3 +- .../ngap/NGAP_ExpectedUEMovingTrajectory.c | 2 +- .../ngap/NGAP_ExpectedUEMovingTrajectory.h | 2 +- .../NGAP_ExpectedUEMovingTrajectoryItem.c | 2 +- .../NGAP_ExpectedUEMovingTrajectoryItem.h | 2 +- lib/asn1c/ngap/NGAP_Extended-AMFName.c | 2 +- lib/asn1c/ngap/NGAP_Extended-AMFName.h | 2 +- lib/asn1c/ngap/NGAP_Extended-ConnectedTime.c | 2 +- lib/asn1c/ngap/NGAP_Extended-ConnectedTime.h | 3 +- lib/asn1c/ngap/NGAP_Extended-RANNodeName.c | 2 +- lib/asn1c/ngap/NGAP_Extended-RANNodeName.h | 2 +- .../ngap/NGAP_ExtendedPacketDelayBudget.c | 2 +- .../ngap/NGAP_ExtendedPacketDelayBudget.h | 3 +- .../NGAP_ExtendedRATRestrictionInformation.c | 2 +- .../NGAP_ExtendedRATRestrictionInformation.h | 2 +- lib/asn1c/ngap/NGAP_ExtendedRNC-ID.c | 2 +- lib/asn1c/ngap/NGAP_ExtendedRNC-ID.h | 3 +- .../ngap/NGAP_ExtendedReportIntervalMDT.c | 2 +- .../ngap/NGAP_ExtendedReportIntervalMDT.h | 3 +- .../ngap/NGAP_ExtendedSliceSupportList.c | 2 +- .../ngap/NGAP_ExtendedSliceSupportList.h | 2 +- .../ngap/NGAP_ExtendedUEIdentityIndexValue.c | 2 +- .../ngap/NGAP_ExtendedUEIdentityIndexValue.h | 3 +- lib/asn1c/ngap/NGAP_FailureIndication.c | 2 +- lib/asn1c/ngap/NGAP_FailureIndication.h | 2 +- lib/asn1c/ngap/NGAP_FirstDLCount.c | 2 +- lib/asn1c/ngap/NGAP_FirstDLCount.h | 2 +- lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.c | 2 +- lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.h | 2 +- .../ngap/NGAP_FiveG-ProSePC5QoSParameters.c | 2 +- .../ngap/NGAP_FiveG-ProSePC5QoSParameters.h | 2 +- lib/asn1c/ngap/NGAP_FiveG-S-TMSI.c | 2 +- lib/asn1c/ngap/NGAP_FiveG-S-TMSI.h | 2 +- lib/asn1c/ngap/NGAP_FiveG-TMSI.c | 2 +- lib/asn1c/ngap/NGAP_FiveG-TMSI.h | 3 +- .../ngap/NGAP_FiveGProSeDirectCommunication.c | 2 +- .../ngap/NGAP_FiveGProSeDirectCommunication.h | 3 +- .../ngap/NGAP_FiveGProSeDirectDiscovery.c | 2 +- .../ngap/NGAP_FiveGProSeDirectDiscovery.h | 3 +- .../ngap/NGAP_FiveGProSeLayer2RemoteUE.c | 2 +- .../ngap/NGAP_FiveGProSeLayer2RemoteUE.h | 3 +- .../NGAP_FiveGProSeLayer2UEtoNetworkRelay.c | 2 +- .../NGAP_FiveGProSeLayer2UEtoNetworkRelay.h | 3 +- .../NGAP_FiveGProSeLayer3UEtoNetworkRelay.c | 2 +- .../NGAP_FiveGProSeLayer3UEtoNetworkRelay.h | 3 +- .../ngap/NGAP_FiveGProSePC5FlowBitRates.c | 2 +- .../ngap/NGAP_FiveGProSePC5FlowBitRates.h | 2 +- .../ngap/NGAP_FiveGProSePC5QoSFlowItem.c | 2 +- .../ngap/NGAP_FiveGProSePC5QoSFlowItem.h | 2 +- .../ngap/NGAP_FiveGProSePC5QoSFlowList.c | 2 +- .../ngap/NGAP_FiveGProSePC5QoSFlowList.h | 2 +- lib/asn1c/ngap/NGAP_FiveQI.c | 2 +- lib/asn1c/ngap/NGAP_FiveQI.h | 3 +- .../ngap/NGAP_ForbiddenAreaInformation-Item.c | 2 +- .../ngap/NGAP_ForbiddenAreaInformation-Item.h | 2 +- .../ngap/NGAP_ForbiddenAreaInformation.c | 2 +- .../ngap/NGAP_ForbiddenAreaInformation.h | 2 +- lib/asn1c/ngap/NGAP_ForbiddenTACs.c | 2 +- lib/asn1c/ngap/NGAP_ForbiddenTACs.h | 2 +- lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.c | 2 +- lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.h | 2 +- lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.c | 2 +- lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.h | 2 +- lib/asn1c/ngap/NGAP_GBR-QosInformation.c | 2 +- lib/asn1c/ngap/NGAP_GBR-QosInformation.h | 2 +- lib/asn1c/ngap/NGAP_GNB-ID.c | 2 +- lib/asn1c/ngap/NGAP_GNB-ID.h | 2 +- lib/asn1c/ngap/NGAP_GNBSetID.c | 2 +- lib/asn1c/ngap/NGAP_GNBSetID.h | 3 +- lib/asn1c/ngap/NGAP_GTP-TEID.c | 2 +- lib/asn1c/ngap/NGAP_GTP-TEID.h | 3 +- lib/asn1c/ngap/NGAP_GTPTunnel.c | 2 +- lib/asn1c/ngap/NGAP_GTPTunnel.h | 2 +- lib/asn1c/ngap/NGAP_GUAMI.c | 2 +- lib/asn1c/ngap/NGAP_GUAMI.h | 2 +- lib/asn1c/ngap/NGAP_GUAMIType.c | 2 +- lib/asn1c/ngap/NGAP_GUAMIType.h | 3 +- lib/asn1c/ngap/NGAP_GlobalCable-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalCable-ID.h | 3 +- lib/asn1c/ngap/NGAP_GlobalENB-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalENB-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalGNB-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalGNB-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalLine-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalLine-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalLineIdentity.c | 2 +- lib/asn1c/ngap/NGAP_GlobalLineIdentity.h | 3 +- lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalNgENB-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalNgENB-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalRANNodeID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalRANNodeID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalTNGF-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalTNGF-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalTWIF-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalTWIF-ID.h | 2 +- lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.c | 2 +- lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.h | 2 +- lib/asn1c/ngap/NGAP_HFCNode-ID.c | 2 +- lib/asn1c/ngap/NGAP_HFCNode-ID.h | 3 +- lib/asn1c/ngap/NGAP_HOReport.c | 2 +- lib/asn1c/ngap/NGAP_HOReport.h | 2 +- lib/asn1c/ngap/NGAP_HandoverCancel.c | 2 +- lib/asn1c/ngap/NGAP_HandoverCancel.h | 2 +- .../ngap/NGAP_HandoverCancelAcknowledge.c | 2 +- .../ngap/NGAP_HandoverCancelAcknowledge.h | 2 +- lib/asn1c/ngap/NGAP_HandoverCommand.c | 2 +- lib/asn1c/ngap/NGAP_HandoverCommand.h | 2 +- lib/asn1c/ngap/NGAP_HandoverCommandTransfer.c | 2 +- lib/asn1c/ngap/NGAP_HandoverCommandTransfer.h | 2 +- lib/asn1c/ngap/NGAP_HandoverFailure.c | 2 +- lib/asn1c/ngap/NGAP_HandoverFailure.h | 2 +- lib/asn1c/ngap/NGAP_HandoverFlag.c | 2 +- lib/asn1c/ngap/NGAP_HandoverFlag.h | 3 +- lib/asn1c/ngap/NGAP_HandoverNotify.c | 2 +- lib/asn1c/ngap/NGAP_HandoverNotify.h | 2 +- .../ngap/NGAP_HandoverPreparationFailure.c | 2 +- .../ngap/NGAP_HandoverPreparationFailure.h | 2 +- ..._HandoverPreparationUnsuccessfulTransfer.c | 2 +- ..._HandoverPreparationUnsuccessfulTransfer.h | 2 +- lib/asn1c/ngap/NGAP_HandoverRequest.c | 2 +- lib/asn1c/ngap/NGAP_HandoverRequest.h | 2 +- .../ngap/NGAP_HandoverRequestAcknowledge.c | 2 +- .../ngap/NGAP_HandoverRequestAcknowledge.h | 2 +- .../NGAP_HandoverRequestAcknowledgeTransfer.c | 2 +- .../NGAP_HandoverRequestAcknowledgeTransfer.h | 2 +- lib/asn1c/ngap/NGAP_HandoverRequired.c | 2 +- lib/asn1c/ngap/NGAP_HandoverRequired.h | 2 +- .../ngap/NGAP_HandoverRequiredTransfer.c | 2 +- .../ngap/NGAP_HandoverRequiredTransfer.h | 2 +- ...erResourceAllocationUnsuccessfulTransfer.c | 2 +- ...erResourceAllocationUnsuccessfulTransfer.h | 2 +- lib/asn1c/ngap/NGAP_HandoverSuccess.c | 2 +- lib/asn1c/ngap/NGAP_HandoverSuccess.h | 2 +- lib/asn1c/ngap/NGAP_HandoverType.c | 2 +- lib/asn1c/ngap/NGAP_HandoverType.h | 3 +- lib/asn1c/ngap/NGAP_Hysteresis.c | 2 +- lib/asn1c/ngap/NGAP_Hysteresis.h | 3 +- lib/asn1c/ngap/NGAP_IAB-Authorized.c | 2 +- lib/asn1c/ngap/NGAP_IAB-Authorized.h | 3 +- lib/asn1c/ngap/NGAP_IAB-Supported.c | 2 +- lib/asn1c/ngap/NGAP_IAB-Supported.h | 3 +- lib/asn1c/ngap/NGAP_IABNodeIndication.c | 2 +- lib/asn1c/ngap/NGAP_IABNodeIndication.h | 3 +- .../ngap/NGAP_IMSVoiceSupportIndicator.c | 2 +- .../ngap/NGAP_IMSVoiceSupportIndicator.h | 3 +- lib/asn1c/ngap/NGAP_ImmediateMDTNr.c | 2 +- lib/asn1c/ngap/NGAP_ImmediateMDTNr.h | 2 +- .../NGAP_IncludeBeamMeasurementsIndication.c | 2 +- .../NGAP_IncludeBeamMeasurementsIndication.h | 3 +- lib/asn1c/ngap/NGAP_IndexToRFSP.c | 2 +- lib/asn1c/ngap/NGAP_IndexToRFSP.h | 3 +- ...foOnRecommendedCellsAndRANNodesForPaging.c | 2 +- ...foOnRecommendedCellsAndRANNodesForPaging.h | 2 +- .../ngap/NGAP_InitialContextSetupFailure.c | 2 +- .../ngap/NGAP_InitialContextSetupFailure.h | 2 +- .../ngap/NGAP_InitialContextSetupRequest.c | 2 +- .../ngap/NGAP_InitialContextSetupRequest.h | 2 +- .../ngap/NGAP_InitialContextSetupResponse.c | 2 +- .../ngap/NGAP_InitialContextSetupResponse.h | 2 +- lib/asn1c/ngap/NGAP_InitialUEMessage.c | 2 +- lib/asn1c/ngap/NGAP_InitialUEMessage.h | 2 +- lib/asn1c/ngap/NGAP_InitiatingMessage.c | 2 +- lib/asn1c/ngap/NGAP_InitiatingMessage.h | 2 +- .../ngap/NGAP_IntegrityProtectionIndication.c | 2 +- .../ngap/NGAP_IntegrityProtectionIndication.h | 3 +- .../ngap/NGAP_IntegrityProtectionResult.c | 2 +- .../ngap/NGAP_IntegrityProtectionResult.h | 3 +- .../NGAP_IntendedNumberOfPagingAttempts.c | 2 +- .../NGAP_IntendedNumberOfPagingAttempts.h | 3 +- .../ngap/NGAP_InterSystemFailureIndication.c | 2 +- .../ngap/NGAP_InterSystemFailureIndication.h | 2 +- lib/asn1c/ngap/NGAP_InterSystemHOReport.c | 2 +- lib/asn1c/ngap/NGAP_InterSystemHOReport.h | 2 +- .../ngap/NGAP_InterSystemHandoverReportType.c | 2 +- .../ngap/NGAP_InterSystemHandoverReportType.h | 2 +- lib/asn1c/ngap/NGAP_InterfacesToTrace.c | 2 +- lib/asn1c/ngap/NGAP_InterfacesToTrace.h | 3 +- .../NGAP_IntersystemCellActivationReply.c | 2 +- .../NGAP_IntersystemCellActivationReply.h | 2 +- .../NGAP_IntersystemCellActivationRequest.c | 2 +- .../NGAP_IntersystemCellActivationRequest.h | 2 +- .../NGAP_IntersystemCellStateIndication.c | 2 +- .../NGAP_IntersystemCellStateIndication.h | 2 +- .../NGAP_IntersystemResourceStatusReply.c | 2 +- .../NGAP_IntersystemResourceStatusReply.h | 2 +- .../NGAP_IntersystemResourceStatusReport.c | 2 +- .../NGAP_IntersystemResourceStatusReport.h | 2 +- .../NGAP_IntersystemResourceStatusRequest.c | 2 +- .../NGAP_IntersystemResourceStatusRequest.h | 2 +- .../ngap/NGAP_IntersystemResourceThreshold.c | 2 +- .../ngap/NGAP_IntersystemResourceThreshold.h | 3 +- ...NGAP_IntersystemSONConfigurationTransfer.c | 2 +- ...NGAP_IntersystemSONConfigurationTransfer.h | 2 +- .../ngap/NGAP_IntersystemSONInformation.c | 2 +- .../ngap/NGAP_IntersystemSONInformation.h | 2 +- .../NGAP_IntersystemSONInformationReply.c | 2 +- .../NGAP_IntersystemSONInformationReply.h | 2 +- .../NGAP_IntersystemSONInformationReport.c | 2 +- .../NGAP_IntersystemSONInformationReport.h | 2 +- .../NGAP_IntersystemSONInformationRequest.c | 2 +- .../NGAP_IntersystemSONInformationRequest.h | 2 +- .../ngap/NGAP_IntersystemSONNGRANnodeID.c | 2 +- .../ngap/NGAP_IntersystemSONNGRANnodeID.h | 2 +- .../ngap/NGAP_IntersystemSONTransferType.c | 2 +- .../ngap/NGAP_IntersystemSONTransferType.h | 2 +- lib/asn1c/ngap/NGAP_IntersystemSONeNBID.c | 2 +- lib/asn1c/ngap/NGAP_IntersystemSONeNBID.h | 2 +- .../ngap/NGAP_IntersystemUnnecessaryHO.c | 2 +- .../ngap/NGAP_IntersystemUnnecessaryHO.h | 2 +- lib/asn1c/ngap/NGAP_LAC.c | 2 +- lib/asn1c/ngap/NGAP_LAC.h | 3 +- lib/asn1c/ngap/NGAP_LAI.c | 2 +- lib/asn1c/ngap/NGAP_LAI.h | 2 +- lib/asn1c/ngap/NGAP_LTEM-Indication.c | 2 +- lib/asn1c/ngap/NGAP_LTEM-Indication.h | 3 +- lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.c | 2 +- lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.h | 3 +- ...GAP_LTEUESidelinkAggregateMaximumBitrate.c | 2 +- ...GAP_LTEUESidelinkAggregateMaximumBitrate.h | 2 +- .../ngap/NGAP_LTEV2XServicesAuthorized.c | 2 +- .../ngap/NGAP_LTEV2XServicesAuthorized.h | 2 +- .../ngap/NGAP_LastVisitedCellInformation.c | 2 +- .../ngap/NGAP_LastVisitedCellInformation.h | 2 +- lib/asn1c/ngap/NGAP_LastVisitedCellItem.c | 2 +- lib/asn1c/ngap/NGAP_LastVisitedCellItem.h | 2 +- .../NGAP_LastVisitedEUTRANCellInformation.c | 2 +- .../NGAP_LastVisitedEUTRANCellInformation.h | 3 +- .../NGAP_LastVisitedGERANCellInformation.c | 2 +- .../NGAP_LastVisitedGERANCellInformation.h | 3 +- .../NGAP_LastVisitedNGRANCellInformation.c | 2 +- .../NGAP_LastVisitedNGRANCellInformation.h | 2 +- .../ngap/NGAP_LastVisitedPSCellInformation.c | 2 +- .../ngap/NGAP_LastVisitedPSCellInformation.h | 2 +- lib/asn1c/ngap/NGAP_LastVisitedPSCellList.c | 2 +- lib/asn1c/ngap/NGAP_LastVisitedPSCellList.h | 2 +- .../NGAP_LastVisitedUTRANCellInformation.c | 2 +- .../NGAP_LastVisitedUTRANCellInformation.h | 3 +- lib/asn1c/ngap/NGAP_LineType.c | 2 +- lib/asn1c/ngap/NGAP_LineType.h | 3 +- lib/asn1c/ngap/NGAP_Links-to-log.c | 2 +- lib/asn1c/ngap/NGAP_Links-to-log.h | 3 +- lib/asn1c/ngap/NGAP_LocationReport.c | 2 +- lib/asn1c/ngap/NGAP_LocationReport.h | 2 +- .../NGAP_LocationReportingAdditionalInfo.c | 2 +- .../NGAP_LocationReportingAdditionalInfo.h | 3 +- .../ngap/NGAP_LocationReportingControl.c | 2 +- .../ngap/NGAP_LocationReportingControl.h | 2 +- .../NGAP_LocationReportingFailureIndication.c | 2 +- .../NGAP_LocationReportingFailureIndication.h | 2 +- .../ngap/NGAP_LocationReportingReferenceID.c | 2 +- .../ngap/NGAP_LocationReportingReferenceID.h | 3 +- .../ngap/NGAP_LocationReportingRequestType.c | 2 +- .../ngap/NGAP_LocationReportingRequestType.h | 2 +- lib/asn1c/ngap/NGAP_LoggedMDTNr.c | 2 +- lib/asn1c/ngap/NGAP_LoggedMDTNr.h | 2 +- lib/asn1c/ngap/NGAP_LoggedMDTTrigger.c | 2 +- lib/asn1c/ngap/NGAP_LoggedMDTTrigger.h | 2 +- lib/asn1c/ngap/NGAP_LoggingDuration.c | 2 +- lib/asn1c/ngap/NGAP_LoggingDuration.h | 3 +- lib/asn1c/ngap/NGAP_LoggingInterval.c | 2 +- lib/asn1c/ngap/NGAP_LoggingInterval.h | 3 +- lib/asn1c/ngap/NGAP_M1Configuration.c | 2 +- lib/asn1c/ngap/NGAP_M1Configuration.h | 2 +- lib/asn1c/ngap/NGAP_M1PeriodicReporting.c | 2 +- lib/asn1c/ngap/NGAP_M1PeriodicReporting.h | 2 +- lib/asn1c/ngap/NGAP_M1ReportingTrigger.c | 2 +- lib/asn1c/ngap/NGAP_M1ReportingTrigger.h | 3 +- lib/asn1c/ngap/NGAP_M1ThresholdEventA2.c | 2 +- lib/asn1c/ngap/NGAP_M1ThresholdEventA2.h | 2 +- lib/asn1c/ngap/NGAP_M1ThresholdType.c | 2 +- lib/asn1c/ngap/NGAP_M1ThresholdType.h | 2 +- lib/asn1c/ngap/NGAP_M4Configuration.c | 2 +- lib/asn1c/ngap/NGAP_M4Configuration.h | 2 +- lib/asn1c/ngap/NGAP_M4ReportAmountMDT.c | 2 +- lib/asn1c/ngap/NGAP_M4ReportAmountMDT.h | 3 +- lib/asn1c/ngap/NGAP_M4period.c | 2 +- lib/asn1c/ngap/NGAP_M4period.h | 3 +- lib/asn1c/ngap/NGAP_M5Configuration.c | 2 +- lib/asn1c/ngap/NGAP_M5Configuration.h | 2 +- lib/asn1c/ngap/NGAP_M5ReportAmountMDT.c | 2 +- lib/asn1c/ngap/NGAP_M5ReportAmountMDT.h | 3 +- lib/asn1c/ngap/NGAP_M5period.c | 2 +- lib/asn1c/ngap/NGAP_M5period.h | 3 +- lib/asn1c/ngap/NGAP_M6Configuration.c | 2 +- lib/asn1c/ngap/NGAP_M6Configuration.h | 2 +- lib/asn1c/ngap/NGAP_M6ReportAmountMDT.c | 2 +- lib/asn1c/ngap/NGAP_M6ReportAmountMDT.h | 3 +- lib/asn1c/ngap/NGAP_M6report-Interval.c | 2 +- lib/asn1c/ngap/NGAP_M6report-Interval.h | 3 +- lib/asn1c/ngap/NGAP_M7Configuration.c | 2 +- lib/asn1c/ngap/NGAP_M7Configuration.h | 2 +- lib/asn1c/ngap/NGAP_M7ReportAmountMDT.c | 2 +- lib/asn1c/ngap/NGAP_M7ReportAmountMDT.h | 3 +- lib/asn1c/ngap/NGAP_M7period.c | 2 +- lib/asn1c/ngap/NGAP_M7period.h | 3 +- ...iveSessionInformation-SourcetoTargetItem.c | 2 +- ...iveSessionInformation-SourcetoTargetItem.h | 2 +- ...iveSessionInformation-SourcetoTargetList.c | 2 +- ...iveSessionInformation-SourcetoTargetList.h | 2 +- ...iveSessionInformation-TargettoSourceItem.c | 2 +- ...iveSessionInformation-TargettoSourceItem.h | 2 +- ...iveSessionInformation-TargettoSourceList.c | 2 +- ...iveSessionInformation-TargettoSourceList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-AreaSessionID.c | 2 +- lib/asn1c/ngap/NGAP_MBS-AreaSessionID.h | 3 +- lib/asn1c/ngap/NGAP_MBS-AreaTAIList.c | 2 +- lib/asn1c/ngap/NGAP_MBS-AreaTAIList.h | 2 +- .../NGAP_MBS-DataForwardingResponseMRBItem.c | 2 +- .../NGAP_MBS-DataForwardingResponseMRBItem.h | 2 +- .../NGAP_MBS-DataForwardingResponseMRBList.c | 2 +- .../NGAP_MBS-DataForwardingResponseMRBList.h | 2 +- ...P_MBS-DistributionReleaseRequestTransfer.c | 2 +- ...P_MBS-DistributionReleaseRequestTransfer.h | 2 +- ...GAP_MBS-DistributionSetupRequestTransfer.c | 2 +- ...GAP_MBS-DistributionSetupRequestTransfer.h | 2 +- ...AP_MBS-DistributionSetupResponseTransfer.c | 2 +- ...AP_MBS-DistributionSetupResponseTransfer.h | 2 +- ...BS-DistributionSetupUnsuccessfulTransfer.c | 2 +- ...BS-DistributionSetupUnsuccessfulTransfer.h | 2 +- ..._MBS-MappingandDataForwardingRequestItem.c | 2 +- ..._MBS-MappingandDataForwardingRequestItem.h | 2 +- ..._MBS-MappingandDataForwardingRequestList.c | 2 +- ..._MBS-MappingandDataForwardingRequestList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-QoSFlowList.c | 2 +- lib/asn1c/ngap/NGAP_MBS-QoSFlowList.h | 2 +- .../ngap/NGAP_MBS-QoSFlowsToBeSetupItem.c | 2 +- .../ngap/NGAP_MBS-QoSFlowsToBeSetupItem.h | 2 +- .../ngap/NGAP_MBS-QoSFlowsToBeSetupList.c | 2 +- .../ngap/NGAP_MBS-QoSFlowsToBeSetupList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceArea.c | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceArea.h | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.c | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.h | 2 +- .../ngap/NGAP_MBS-ServiceAreaInformation.c | 2 +- .../ngap/NGAP_MBS-ServiceAreaInformation.h | 2 +- .../NGAP_MBS-ServiceAreaInformationItem.c | 2 +- .../NGAP_MBS-ServiceAreaInformationItem.h | 2 +- .../NGAP_MBS-ServiceAreaInformationList.c | 2 +- .../NGAP_MBS-ServiceAreaInformationList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.c | 2 +- lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionFSAID.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionFSAID.h | 3 +- lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionID.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionID.h | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.h | 2 +- .../ngap/NGAP_MBS-SessionTNLInfo5GCItem.c | 2 +- .../ngap/NGAP_MBS-SessionTNLInfo5GCItem.h | 2 +- .../ngap/NGAP_MBS-SessionTNLInfo5GCList.c | 2 +- .../ngap/NGAP_MBS-SessionTNLInfo5GCList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.h | 2 +- .../ngap/NGAP_MBS-SessionTNLInfoNGRANItem.c | 2 +- .../ngap/NGAP_MBS-SessionTNLInfoNGRANItem.h | 2 +- .../ngap/NGAP_MBS-SessionTNLInfoNGRANList.c | 2 +- .../ngap/NGAP_MBS-SessionTNLInfoNGRANList.h | 2 +- lib/asn1c/ngap/NGAP_MBS-SupportIndicator.c | 2 +- lib/asn1c/ngap/NGAP_MBS-SupportIndicator.h | 3 +- .../ngap/NGAP_MBSSessionFailedtoSetupItem.c | 2 +- .../ngap/NGAP_MBSSessionFailedtoSetupItem.h | 2 +- .../ngap/NGAP_MBSSessionFailedtoSetupList.c | 2 +- .../ngap/NGAP_MBSSessionFailedtoSetupList.h | 2 +- .../NGAP_MBSSessionReleaseResponseTransfer.c | 2 +- .../NGAP_MBSSessionReleaseResponseTransfer.h | 2 +- ...NGAP_MBSSessionSetupOrModFailureTransfer.c | 2 +- ...NGAP_MBSSessionSetupOrModFailureTransfer.h | 2 +- ...NGAP_MBSSessionSetupOrModRequestTransfer.c | 2 +- ...NGAP_MBSSessionSetupOrModRequestTransfer.h | 2 +- ...GAP_MBSSessionSetupOrModResponseTransfer.c | 2 +- ...GAP_MBSSessionSetupOrModResponseTransfer.h | 2 +- .../ngap/NGAP_MBSSessionSetupRequestItem.c | 2 +- .../ngap/NGAP_MBSSessionSetupRequestItem.h | 2 +- .../ngap/NGAP_MBSSessionSetupRequestList.c | 2 +- .../ngap/NGAP_MBSSessionSetupRequestList.h | 2 +- .../ngap/NGAP_MBSSessionSetupResponseItem.c | 2 +- .../ngap/NGAP_MBSSessionSetupResponseItem.h | 2 +- .../ngap/NGAP_MBSSessionSetupResponseList.c | 2 +- .../ngap/NGAP_MBSSessionSetupResponseList.h | 2 +- .../NGAP_MBSSessionSetuporModifyRequestItem.c | 2 +- .../NGAP_MBSSessionSetuporModifyRequestItem.h | 2 +- .../NGAP_MBSSessionSetuporModifyRequestList.c | 2 +- .../NGAP_MBSSessionSetuporModifyRequestList.h | 2 +- lib/asn1c/ngap/NGAP_MBSSessionStatus.c | 2 +- lib/asn1c/ngap/NGAP_MBSSessionStatus.h | 3 +- lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.c | 2 +- lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.h | 2 +- lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.c | 2 +- lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.h | 2 +- lib/asn1c/ngap/NGAP_MDT-Activation.c | 2 +- lib/asn1c/ngap/NGAP_MDT-Activation.h | 3 +- lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.c | 2 +- lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.h | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.c | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.h | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration-NR.c | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration-NR.h | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration.c | 2 +- lib/asn1c/ngap/NGAP_MDT-Configuration.h | 2 +- lib/asn1c/ngap/NGAP_MDT-Location-Info.c | 2 +- lib/asn1c/ngap/NGAP_MDT-Location-Info.h | 2 +- .../ngap/NGAP_MDT-Location-Information.c | 2 +- .../ngap/NGAP_MDT-Location-Information.h | 3 +- lib/asn1c/ngap/NGAP_MDTModeEutra.c | 2 +- lib/asn1c/ngap/NGAP_MDTModeEutra.h | 3 +- lib/asn1c/ngap/NGAP_MDTModeNr.c | 2 +- lib/asn1c/ngap/NGAP_MDTModeNr.h | 2 +- lib/asn1c/ngap/NGAP_MDTPLMNList.c | 2 +- lib/asn1c/ngap/NGAP_MDTPLMNList.h | 2 +- lib/asn1c/ngap/NGAP_MDTPLMNModificationList.c | 2 +- lib/asn1c/ngap/NGAP_MDTPLMNModificationList.h | 2 +- lib/asn1c/ngap/NGAP_MICOModeIndication.c | 2 +- lib/asn1c/ngap/NGAP_MICOModeIndication.h | 3 +- lib/asn1c/ngap/NGAP_MRB-ID.c | 2 +- lib/asn1c/ngap/NGAP_MRB-ID.h | 3 +- lib/asn1c/ngap/NGAP_MRB-ProgressInformation.c | 2 +- lib/asn1c/ngap/NGAP_MRB-ProgressInformation.h | 2 +- lib/asn1c/ngap/NGAP_MaskedIMEISV.c | 2 +- lib/asn1c/ngap/NGAP_MaskedIMEISV.h | 3 +- .../ngap/NGAP_MaxNrofRS-IndexesToReport.c | 2 +- .../ngap/NGAP_MaxNrofRS-IndexesToReport.h | 3 +- lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.c | 2 +- lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.h | 3 +- .../NGAP_MaximumIntegrityProtectedDataRate.c | 2 +- .../NGAP_MaximumIntegrityProtectedDataRate.h | 3 +- .../NGAP_MeasurementThresholdL1LoggedMDT.c | 2 +- .../NGAP_MeasurementThresholdL1LoggedMDT.h | 2 +- lib/asn1c/ngap/NGAP_MeasurementsToActivate.c | 2 +- lib/asn1c/ngap/NGAP_MeasurementsToActivate.h | 3 +- lib/asn1c/ngap/NGAP_MessageIdentifier.c | 2 +- lib/asn1c/ngap/NGAP_MessageIdentifier.h | 3 +- lib/asn1c/ngap/NGAP_MicoAllPLMN.c | 2 +- lib/asn1c/ngap/NGAP_MicoAllPLMN.h | 3 +- lib/asn1c/ngap/NGAP_MobilityInformation.c | 2 +- lib/asn1c/ngap/NGAP_MobilityInformation.h | 3 +- lib/asn1c/ngap/NGAP_MobilityRestrictionList.c | 2 +- lib/asn1c/ngap/NGAP_MobilityRestrictionList.h | 2 +- lib/asn1c/ngap/NGAP_MulticastGroupPaging.c | 2 +- lib/asn1c/ngap/NGAP_MulticastGroupPaging.h | 2 +- .../ngap/NGAP_MulticastGroupPagingArea.c | 2 +- .../ngap/NGAP_MulticastGroupPagingArea.h | 2 +- .../ngap/NGAP_MulticastGroupPagingAreaItem.c | 2 +- .../ngap/NGAP_MulticastGroupPagingAreaItem.h | 2 +- .../ngap/NGAP_MulticastGroupPagingAreaList.c | 2 +- .../ngap/NGAP_MulticastGroupPagingAreaList.h | 2 +- .../NGAP_MulticastSessionActivationFailure.c | 2 +- .../NGAP_MulticastSessionActivationFailure.h | 2 +- .../NGAP_MulticastSessionActivationRequest.c | 2 +- .../NGAP_MulticastSessionActivationRequest.h | 2 +- ...ulticastSessionActivationRequestTransfer.c | 2 +- ...ulticastSessionActivationRequestTransfer.h | 2 +- .../NGAP_MulticastSessionActivationResponse.c | 2 +- .../NGAP_MulticastSessionActivationResponse.h | 2 +- ...NGAP_MulticastSessionDeactivationRequest.c | 2 +- ...NGAP_MulticastSessionDeactivationRequest.h | 2 +- ...ticastSessionDeactivationRequestTransfer.c | 2 +- ...ticastSessionDeactivationRequestTransfer.h | 2 +- ...GAP_MulticastSessionDeactivationResponse.c | 2 +- ...GAP_MulticastSessionDeactivationResponse.h | 2 +- .../ngap/NGAP_MulticastSessionUpdateFailure.c | 2 +- .../ngap/NGAP_MulticastSessionUpdateFailure.h | 2 +- .../ngap/NGAP_MulticastSessionUpdateRequest.c | 2 +- .../ngap/NGAP_MulticastSessionUpdateRequest.h | 2 +- ...AP_MulticastSessionUpdateRequestTransfer.c | 2 +- ...AP_MulticastSessionUpdateRequestTransfer.h | 2 +- .../NGAP_MulticastSessionUpdateResponse.c | 2 +- .../NGAP_MulticastSessionUpdateResponse.h | 2 +- lib/asn1c/ngap/NGAP_N3IWF-ID.c | 2 +- lib/asn1c/ngap/NGAP_N3IWF-ID.h | 2 +- lib/asn1c/ngap/NGAP_NAS-PDU.c | 2 +- lib/asn1c/ngap/NGAP_NAS-PDU.h | 3 +- .../ngap/NGAP_NASNonDeliveryIndication.c | 2 +- .../ngap/NGAP_NASNonDeliveryIndication.h | 2 +- .../NGAP_NASSecurityParametersFromNGRAN.c | 2 +- .../NGAP_NASSecurityParametersFromNGRAN.h | 3 +- lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.c | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.h | 3 +- .../ngap/NGAP_NB-IoT-Paging-TimeWindow.c | 2 +- .../ngap/NGAP_NB-IoT-Paging-TimeWindow.h | 3 +- lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.c | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.h | 3 +- lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.c | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.h | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.c | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.h | 3 +- lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.c | 2 +- lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.h | 3 +- lib/asn1c/ngap/NGAP_NGAP-PDU.c | 2 +- lib/asn1c/ngap/NGAP_NGAP-PDU.h | 2 +- ...NGAP_NGAPIESupportInformationRequestItem.c | 2 +- ...NGAP_NGAPIESupportInformationRequestItem.h | 2 +- ...NGAP_NGAPIESupportInformationRequestList.c | 2 +- ...NGAP_NGAPIESupportInformationRequestList.h | 2 +- ...GAP_NGAPIESupportInformationResponseItem.c | 2 +- ...GAP_NGAPIESupportInformationResponseItem.h | 2 +- ...GAP_NGAPIESupportInformationResponseList.c | 2 +- ...GAP_NGAPIESupportInformationResponseList.h | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CGI.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CGI.h | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.h | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellReportList.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellReportList.h | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.h | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.h | 2 +- .../ngap/NGAP_NGRAN-NoofRRCConnections.c | 2 +- .../ngap/NGAP_NGRAN-NoofRRCConnections.h | 3 +- lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.c | 2 +- lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.h | 3 +- .../ngap/NGAP_NGRAN-RadioResourceStatus.c | 2 +- .../ngap/NGAP_NGRAN-RadioResourceStatus.h | 2 +- .../ngap/NGAP_NGRAN-ReportingStatusIEs.c | 2 +- .../ngap/NGAP_NGRAN-ReportingStatusIEs.h | 2 +- .../ngap/NGAP_NGRAN-ReportingSystemIEs.c | 2 +- .../ngap/NGAP_NGRAN-ReportingSystemIEs.h | 2 +- .../NGAP_NGRAN-TNLAssociationToRemoveItem.c | 2 +- .../NGAP_NGRAN-TNLAssociationToRemoveItem.h | 2 +- .../NGAP_NGRAN-TNLAssociationToRemoveList.c | 2 +- .../NGAP_NGRAN-TNLAssociationToRemoveList.h | 2 +- lib/asn1c/ngap/NGAP_NGRANTraceID.c | 2 +- lib/asn1c/ngap/NGAP_NGRANTraceID.h | 3 +- lib/asn1c/ngap/NGAP_NGReset.c | 2 +- lib/asn1c/ngap/NGAP_NGReset.h | 2 +- lib/asn1c/ngap/NGAP_NGResetAcknowledge.c | 2 +- lib/asn1c/ngap/NGAP_NGResetAcknowledge.h | 2 +- lib/asn1c/ngap/NGAP_NGSetupFailure.c | 2 +- lib/asn1c/ngap/NGAP_NGSetupFailure.h | 2 +- lib/asn1c/ngap/NGAP_NGSetupRequest.c | 2 +- lib/asn1c/ngap/NGAP_NGSetupRequest.h | 2 +- lib/asn1c/ngap/NGAP_NGSetupResponse.c | 2 +- lib/asn1c/ngap/NGAP_NGSetupResponse.h | 2 +- lib/asn1c/ngap/NGAP_NID.c | 2 +- lib/asn1c/ngap/NGAP_NID.h | 3 +- lib/asn1c/ngap/NGAP_NPN-AccessInformation.c | 2 +- lib/asn1c/ngap/NGAP_NPN-AccessInformation.h | 2 +- lib/asn1c/ngap/NGAP_NPN-MobilityInformation.c | 2 +- lib/asn1c/ngap/NGAP_NPN-MobilityInformation.h | 2 +- .../NGAP_NPN-PagingAssistanceInformation.c | 2 +- .../NGAP_NPN-PagingAssistanceInformation.h | 2 +- lib/asn1c/ngap/NGAP_NPN-Support.c | 2 +- lib/asn1c/ngap/NGAP_NPN-Support.h | 2 +- lib/asn1c/ngap/NGAP_NR-CGI.c | 2 +- lib/asn1c/ngap/NGAP_NR-CGI.h | 2 +- lib/asn1c/ngap/NGAP_NR-CGIList.c | 2 +- lib/asn1c/ngap/NGAP_NR-CGIList.h | 2 +- lib/asn1c/ngap/NGAP_NR-CGIListForWarning.c | 2 +- lib/asn1c/ngap/NGAP_NR-CGIListForWarning.h | 2 +- lib/asn1c/ngap/NGAP_NR-PCI.c | 2 +- lib/asn1c/ngap/NGAP_NR-PCI.h | 3 +- lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.c | 2 +- lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.h | 3 +- lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.c | 2 +- lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.h | 3 +- .../ngap/NGAP_NR-PagingeDRXInformation.c | 2 +- .../ngap/NGAP_NR-PagingeDRXInformation.h | 2 +- lib/asn1c/ngap/NGAP_NRARFCN.c | 2 +- lib/asn1c/ngap/NGAP_NRARFCN.h | 3 +- lib/asn1c/ngap/NGAP_NRCellIdentity.c | 2 +- lib/asn1c/ngap/NGAP_NRCellIdentity.h | 3 +- lib/asn1c/ngap/NGAP_NRFrequencyBand-List.c | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyBand-List.h | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyBand.c | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyBand.h | 3 +- lib/asn1c/ngap/NGAP_NRFrequencyBandItem.c | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyBandItem.h | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyInfo.c | 2 +- lib/asn1c/ngap/NGAP_NRFrequencyInfo.h | 2 +- lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.c | 2 +- lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.h | 3 +- lib/asn1c/ngap/NGAP_NRNTNTAIInformation.c | 2 +- lib/asn1c/ngap/NGAP_NRNTNTAIInformation.h | 2 +- lib/asn1c/ngap/NGAP_NRPPa-PDU.c | 2 +- lib/asn1c/ngap/NGAP_NRPPa-PDU.h | 3 +- lib/asn1c/ngap/NGAP_NRUERLFReportContainer.c | 2 +- lib/asn1c/ngap/NGAP_NRUERLFReportContainer.h | 3 +- ...NGAP_NRUESidelinkAggregateMaximumBitrate.c | 2 +- ...NGAP_NRUESidelinkAggregateMaximumBitrate.h | 2 +- lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.c | 2 +- lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.h | 2 +- lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.c | 2 +- lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.h | 3 +- .../NGAP_NRintegrityProtectionAlgorithms.c | 2 +- .../NGAP_NRintegrityProtectionAlgorithms.h | 3 +- lib/asn1c/ngap/NGAP_NSAG-ID.c | 2 +- lib/asn1c/ngap/NGAP_NSAG-ID.h | 3 +- lib/asn1c/ngap/NGAP_NetworkInstance.c | 2 +- lib/asn1c/ngap/NGAP_NetworkInstance.h | 3 +- lib/asn1c/ngap/NGAP_NewSecurityContextInd.c | 2 +- lib/asn1c/ngap/NGAP_NewSecurityContextInd.h | 3 +- lib/asn1c/ngap/NGAP_NextHopChainingCount.c | 2 +- lib/asn1c/ngap/NGAP_NextHopChainingCount.h | 3 +- lib/asn1c/ngap/NGAP_NextPagingAreaScope.c | 2 +- lib/asn1c/ngap/NGAP_NextPagingAreaScope.h | 3 +- lib/asn1c/ngap/NGAP_NgENB-ID.c | 2 +- lib/asn1c/ngap/NGAP_NgENB-ID.h | 2 +- lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.c | 2 +- lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.h | 2 +- lib/asn1c/ngap/NGAP_NotAllowedTACs.c | 2 +- lib/asn1c/ngap/NGAP_NotAllowedTACs.h | 2 +- lib/asn1c/ngap/NGAP_NotificationCause.c | 2 +- lib/asn1c/ngap/NGAP_NotificationCause.h | 3 +- lib/asn1c/ngap/NGAP_NotificationCell-Item.c | 2 +- lib/asn1c/ngap/NGAP_NotificationCell-Item.h | 2 +- lib/asn1c/ngap/NGAP_NotificationCellList.c | 2 +- lib/asn1c/ngap/NGAP_NotificationCellList.h | 2 +- lib/asn1c/ngap/NGAP_NotificationControl.c | 2 +- lib/asn1c/ngap/NGAP_NotificationControl.h | 3 +- lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.c | 2 +- lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.h | 3 +- lib/asn1c/ngap/NGAP_NumberOfBroadcasts.c | 2 +- lib/asn1c/ngap/NGAP_NumberOfBroadcasts.h | 3 +- .../ngap/NGAP_NumberOfBroadcastsRequested.c | 2 +- .../ngap/NGAP_NumberOfBroadcastsRequested.h | 3 +- .../NGAP_NumberOfMeasurementReportingLevels.c | 2 +- .../NGAP_NumberOfMeasurementReportingLevels.h | 3 +- lib/asn1c/ngap/NGAP_OnboardingSupport.c | 2 +- lib/asn1c/ngap/NGAP_OnboardingSupport.h | 3 +- lib/asn1c/ngap/NGAP_OverloadAction.c | 2 +- lib/asn1c/ngap/NGAP_OverloadAction.h | 3 +- lib/asn1c/ngap/NGAP_OverloadResponse.c | 2 +- lib/asn1c/ngap/NGAP_OverloadResponse.h | 2 +- lib/asn1c/ngap/NGAP_OverloadStart.c | 2 +- lib/asn1c/ngap/NGAP_OverloadStart.h | 2 +- lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.c | 2 +- lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.h | 2 +- lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.c | 2 +- lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.h | 2 +- lib/asn1c/ngap/NGAP_OverloadStop.c | 2 +- lib/asn1c/ngap/NGAP_OverloadStop.h | 2 +- lib/asn1c/ngap/NGAP_PC5FlowBitRates.c | 2 +- lib/asn1c/ngap/NGAP_PC5FlowBitRates.h | 2 +- lib/asn1c/ngap/NGAP_PC5QoSFlowItem.c | 2 +- lib/asn1c/ngap/NGAP_PC5QoSFlowItem.h | 2 +- lib/asn1c/ngap/NGAP_PC5QoSFlowList.c | 2 +- lib/asn1c/ngap/NGAP_PC5QoSFlowList.h | 2 +- lib/asn1c/ngap/NGAP_PC5QoSParameters.c | 2 +- lib/asn1c/ngap/NGAP_PC5QoSParameters.h | 2 +- lib/asn1c/ngap/NGAP_PCIListForMDT.c | 2 +- lib/asn1c/ngap/NGAP_PCIListForMDT.h | 2 +- .../NGAP_PDUSessionAggregateMaximumBitRate.c | 2 +- .../NGAP_PDUSessionAggregateMaximumBitRate.h | 2 +- lib/asn1c/ngap/NGAP_PDUSessionID.c | 2 +- lib/asn1c/ngap/NGAP_PDUSessionID.h | 3 +- lib/asn1c/ngap/NGAP_PDUSessionPairID.c | 2 +- lib/asn1c/ngap/NGAP_PDUSessionPairID.h | 3 +- .../NGAP_PDUSessionResourceAdmittedItem.c | 2 +- .../NGAP_PDUSessionResourceAdmittedItem.h | 2 +- .../NGAP_PDUSessionResourceAdmittedList.c | 2 +- .../NGAP_PDUSessionResourceAdmittedList.h | 2 +- ...USessionResourceFailedToModifyItemModCfm.c | 2 +- ...USessionResourceFailedToModifyItemModCfm.h | 2 +- ...USessionResourceFailedToModifyItemModRes.c | 2 +- ...USessionResourceFailedToModifyItemModRes.h | 2 +- ...USessionResourceFailedToModifyListModCfm.c | 2 +- ...USessionResourceFailedToModifyListModCfm.h | 2 +- ...USessionResourceFailedToModifyListModRes.c | 2 +- ...USessionResourceFailedToModifyListModRes.h | 2 +- ...USessionResourceFailedToResumeItemRESReq.c | 2 +- ...USessionResourceFailedToResumeItemRESReq.h | 2 +- ...USessionResourceFailedToResumeItemRESRes.c | 2 +- ...USessionResourceFailedToResumeItemRESRes.h | 2 +- ...USessionResourceFailedToResumeListRESReq.c | 2 +- ...USessionResourceFailedToResumeListRESReq.h | 2 +- ...USessionResourceFailedToResumeListRESRes.c | 2 +- ...USessionResourceFailedToResumeListRESRes.h | 2 +- ...USessionResourceFailedToSetupItemCxtFail.c | 2 +- ...USessionResourceFailedToSetupItemCxtFail.h | 2 +- ...DUSessionResourceFailedToSetupItemCxtRes.c | 2 +- ...DUSessionResourceFailedToSetupItemCxtRes.h | 2 +- ...PDUSessionResourceFailedToSetupItemHOAck.c | 2 +- ...PDUSessionResourceFailedToSetupItemHOAck.h | 2 +- ...PDUSessionResourceFailedToSetupItemPSReq.c | 2 +- ...PDUSessionResourceFailedToSetupItemPSReq.h | 2 +- ...PDUSessionResourceFailedToSetupItemSURes.c | 2 +- ...PDUSessionResourceFailedToSetupItemSURes.h | 2 +- ...USessionResourceFailedToSetupListCxtFail.c | 2 +- ...USessionResourceFailedToSetupListCxtFail.h | 2 +- ...DUSessionResourceFailedToSetupListCxtRes.c | 2 +- ...DUSessionResourceFailedToSetupListCxtRes.h | 2 +- ...PDUSessionResourceFailedToSetupListHOAck.c | 2 +- ...PDUSessionResourceFailedToSetupListHOAck.h | 2 +- ...PDUSessionResourceFailedToSetupListPSReq.c | 2 +- ...PDUSessionResourceFailedToSetupListPSReq.h | 2 +- ...PDUSessionResourceFailedToSetupListSURes.c | 2 +- ...PDUSessionResourceFailedToSetupListSURes.h | 2 +- .../NGAP_PDUSessionResourceHandoverItem.c | 2 +- .../NGAP_PDUSessionResourceHandoverItem.h | 2 +- .../NGAP_PDUSessionResourceHandoverList.c | 2 +- .../NGAP_PDUSessionResourceHandoverList.h | 2 +- .../NGAP_PDUSessionResourceInformationItem.c | 2 +- .../NGAP_PDUSessionResourceInformationItem.h | 2 +- .../NGAP_PDUSessionResourceInformationList.c | 2 +- .../NGAP_PDUSessionResourceInformationList.h | 2 +- .../NGAP_PDUSessionResourceItemCxtRelCpl.c | 2 +- .../NGAP_PDUSessionResourceItemCxtRelCpl.h | 2 +- .../NGAP_PDUSessionResourceItemCxtRelReq.c | 2 +- .../NGAP_PDUSessionResourceItemCxtRelReq.h | 2 +- .../ngap/NGAP_PDUSessionResourceItemHORqd.c | 2 +- .../ngap/NGAP_PDUSessionResourceItemHORqd.h | 2 +- .../NGAP_PDUSessionResourceListCxtRelCpl.c | 2 +- .../NGAP_PDUSessionResourceListCxtRelCpl.h | 2 +- .../NGAP_PDUSessionResourceListCxtRelReq.c | 2 +- .../NGAP_PDUSessionResourceListCxtRelReq.h | 2 +- .../ngap/NGAP_PDUSessionResourceListHORqd.c | 2 +- .../ngap/NGAP_PDUSessionResourceListHORqd.h | 2 +- .../NGAP_PDUSessionResourceModifyConfirm.c | 2 +- .../NGAP_PDUSessionResourceModifyConfirm.h | 2 +- ..._PDUSessionResourceModifyConfirmTransfer.c | 2 +- ..._PDUSessionResourceModifyConfirmTransfer.h | 2 +- .../NGAP_PDUSessionResourceModifyIndication.c | 2 +- .../NGAP_PDUSessionResourceModifyIndication.h | 2 +- ...USessionResourceModifyIndicationTransfer.c | 2 +- ...USessionResourceModifyIndicationTransfer.h | 2 +- ...urceModifyIndicationUnsuccessfulTransfer.c | 2 +- ...urceModifyIndicationUnsuccessfulTransfer.h | 2 +- .../NGAP_PDUSessionResourceModifyItemModCfm.c | 2 +- .../NGAP_PDUSessionResourceModifyItemModCfm.h | 2 +- .../NGAP_PDUSessionResourceModifyItemModInd.c | 2 +- .../NGAP_PDUSessionResourceModifyItemModInd.h | 2 +- .../NGAP_PDUSessionResourceModifyItemModReq.c | 2 +- .../NGAP_PDUSessionResourceModifyItemModReq.h | 2 +- .../NGAP_PDUSessionResourceModifyItemModRes.c | 2 +- .../NGAP_PDUSessionResourceModifyItemModRes.h | 2 +- .../NGAP_PDUSessionResourceModifyListModCfm.c | 2 +- .../NGAP_PDUSessionResourceModifyListModCfm.h | 2 +- .../NGAP_PDUSessionResourceModifyListModInd.c | 2 +- .../NGAP_PDUSessionResourceModifyListModInd.h | 2 +- .../NGAP_PDUSessionResourceModifyListModReq.c | 2 +- .../NGAP_PDUSessionResourceModifyListModReq.h | 2 +- .../NGAP_PDUSessionResourceModifyListModRes.c | 2 +- .../NGAP_PDUSessionResourceModifyListModRes.h | 2 +- .../NGAP_PDUSessionResourceModifyRequest.c | 2 +- .../NGAP_PDUSessionResourceModifyRequest.h | 2 +- ..._PDUSessionResourceModifyRequestTransfer.c | 2 +- ..._PDUSessionResourceModifyRequestTransfer.h | 2 +- .../NGAP_PDUSessionResourceModifyResponse.c | 2 +- .../NGAP_PDUSessionResourceModifyResponse.h | 2 +- ...PDUSessionResourceModifyResponseTransfer.c | 2 +- ...PDUSessionResourceModifyResponseTransfer.h | 2 +- ...essionResourceModifyUnsuccessfulTransfer.c | 2 +- ...essionResourceModifyUnsuccessfulTransfer.h | 2 +- .../ngap/NGAP_PDUSessionResourceNotify.c | 2 +- .../ngap/NGAP_PDUSessionResourceNotify.h | 2 +- .../ngap/NGAP_PDUSessionResourceNotifyItem.c | 2 +- .../ngap/NGAP_PDUSessionResourceNotifyItem.h | 2 +- .../ngap/NGAP_PDUSessionResourceNotifyList.c | 2 +- .../ngap/NGAP_PDUSessionResourceNotifyList.h | 2 +- ...PDUSessionResourceNotifyReleasedTransfer.c | 2 +- ...PDUSessionResourceNotifyReleasedTransfer.h | 2 +- .../NGAP_PDUSessionResourceNotifyTransfer.c | 2 +- .../NGAP_PDUSessionResourceNotifyTransfer.h | 2 +- .../NGAP_PDUSessionResourceReleaseCommand.c | 2 +- .../NGAP_PDUSessionResourceReleaseCommand.h | 2 +- ...PDUSessionResourceReleaseCommandTransfer.c | 2 +- ...PDUSessionResourceReleaseCommandTransfer.h | 2 +- .../NGAP_PDUSessionResourceReleaseResponse.c | 2 +- .../NGAP_PDUSessionResourceReleaseResponse.h | 2 +- ...DUSessionResourceReleaseResponseTransfer.c | 2 +- ...DUSessionResourceReleaseResponseTransfer.h | 2 +- .../NGAP_PDUSessionResourceReleasedItemNot.c | 2 +- .../NGAP_PDUSessionResourceReleasedItemNot.h | 2 +- ...NGAP_PDUSessionResourceReleasedItemPSAck.c | 2 +- ...NGAP_PDUSessionResourceReleasedItemPSAck.h | 2 +- ...GAP_PDUSessionResourceReleasedItemPSFail.c | 2 +- ...GAP_PDUSessionResourceReleasedItemPSFail.h | 2 +- ...GAP_PDUSessionResourceReleasedItemRelRes.c | 2 +- ...GAP_PDUSessionResourceReleasedItemRelRes.h | 2 +- .../NGAP_PDUSessionResourceReleasedListNot.c | 2 +- .../NGAP_PDUSessionResourceReleasedListNot.h | 2 +- ...NGAP_PDUSessionResourceReleasedListPSAck.c | 2 +- ...NGAP_PDUSessionResourceReleasedListPSAck.h | 2 +- ...GAP_PDUSessionResourceReleasedListPSFail.c | 2 +- ...GAP_PDUSessionResourceReleasedListPSFail.h | 2 +- ...GAP_PDUSessionResourceReleasedListRelRes.c | 2 +- ...GAP_PDUSessionResourceReleasedListRelRes.h | 2 +- .../NGAP_PDUSessionResourceResumeItemRESReq.c | 2 +- .../NGAP_PDUSessionResourceResumeItemRESReq.h | 2 +- .../NGAP_PDUSessionResourceResumeItemRESRes.c | 2 +- .../NGAP_PDUSessionResourceResumeItemRESRes.h | 2 +- .../NGAP_PDUSessionResourceResumeListRESReq.c | 2 +- .../NGAP_PDUSessionResourceResumeListRESReq.h | 2 +- .../NGAP_PDUSessionResourceResumeListRESRes.c | 2 +- .../NGAP_PDUSessionResourceResumeListRESRes.h | 2 +- ..._PDUSessionResourceSecondaryRATUsageItem.c | 2 +- ..._PDUSessionResourceSecondaryRATUsageItem.h | 2 +- ..._PDUSessionResourceSecondaryRATUsageList.c | 2 +- ..._PDUSessionResourceSecondaryRATUsageList.h | 2 +- .../NGAP_PDUSessionResourceSetupItemCxtReq.c | 2 +- .../NGAP_PDUSessionResourceSetupItemCxtReq.h | 2 +- .../NGAP_PDUSessionResourceSetupItemCxtRes.c | 2 +- .../NGAP_PDUSessionResourceSetupItemCxtRes.h | 2 +- .../NGAP_PDUSessionResourceSetupItemHOReq.c | 2 +- .../NGAP_PDUSessionResourceSetupItemHOReq.h | 2 +- .../NGAP_PDUSessionResourceSetupItemSUReq.c | 2 +- .../NGAP_PDUSessionResourceSetupItemSUReq.h | 2 +- .../NGAP_PDUSessionResourceSetupItemSURes.c | 2 +- .../NGAP_PDUSessionResourceSetupItemSURes.h | 2 +- .../NGAP_PDUSessionResourceSetupListCxtReq.c | 2 +- .../NGAP_PDUSessionResourceSetupListCxtReq.h | 2 +- .../NGAP_PDUSessionResourceSetupListCxtRes.c | 2 +- .../NGAP_PDUSessionResourceSetupListCxtRes.h | 2 +- .../NGAP_PDUSessionResourceSetupListHOReq.c | 2 +- .../NGAP_PDUSessionResourceSetupListHOReq.h | 2 +- .../NGAP_PDUSessionResourceSetupListSUReq.c | 2 +- .../NGAP_PDUSessionResourceSetupListSUReq.h | 2 +- .../NGAP_PDUSessionResourceSetupListSURes.c | 2 +- .../NGAP_PDUSessionResourceSetupListSURes.h | 2 +- .../NGAP_PDUSessionResourceSetupRequest.c | 2 +- .../NGAP_PDUSessionResourceSetupRequest.h | 2 +- ...P_PDUSessionResourceSetupRequestTransfer.c | 2 +- ...P_PDUSessionResourceSetupRequestTransfer.h | 2 +- .../NGAP_PDUSessionResourceSetupResponse.c | 2 +- .../NGAP_PDUSessionResourceSetupResponse.h | 2 +- ..._PDUSessionResourceSetupResponseTransfer.c | 2 +- ..._PDUSessionResourceSetupResponseTransfer.h | 2 +- ...SessionResourceSetupUnsuccessfulTransfer.c | 2 +- ...SessionResourceSetupUnsuccessfulTransfer.h | 2 +- ...NGAP_PDUSessionResourceSuspendItemSUSReq.c | 2 +- ...NGAP_PDUSessionResourceSuspendItemSUSReq.h | 2 +- ...NGAP_PDUSessionResourceSuspendListSUSReq.c | 2 +- ...NGAP_PDUSessionResourceSuspendListSUSReq.h | 2 +- .../NGAP_PDUSessionResourceSwitchedItem.c | 2 +- .../NGAP_PDUSessionResourceSwitchedItem.h | 2 +- .../NGAP_PDUSessionResourceSwitchedList.c | 2 +- .../NGAP_PDUSessionResourceSwitchedList.h | 2 +- ...GAP_PDUSessionResourceToBeSwitchedDLItem.c | 2 +- ...GAP_PDUSessionResourceToBeSwitchedDLItem.h | 2 +- ...GAP_PDUSessionResourceToBeSwitchedDLList.c | 2 +- ...GAP_PDUSessionResourceToBeSwitchedDLList.h | 2 +- ...GAP_PDUSessionResourceToReleaseItemHOCmd.c | 2 +- ...GAP_PDUSessionResourceToReleaseItemHOCmd.h | 2 +- ...AP_PDUSessionResourceToReleaseItemRelCmd.c | 2 +- ...AP_PDUSessionResourceToReleaseItemRelCmd.h | 2 +- ...GAP_PDUSessionResourceToReleaseListHOCmd.c | 2 +- ...GAP_PDUSessionResourceToReleaseListHOCmd.h | 2 +- ...AP_PDUSessionResourceToReleaseListRelCmd.c | 2 +- ...AP_PDUSessionResourceToReleaseListRelCmd.h | 2 +- lib/asn1c/ngap/NGAP_PDUSessionType.c | 2 +- lib/asn1c/ngap/NGAP_PDUSessionType.h | 3 +- lib/asn1c/ngap/NGAP_PDUSessionUsageReport.c | 2 +- lib/asn1c/ngap/NGAP_PDUSessionUsageReport.h | 2 +- .../ngap/NGAP_PEIPSassistanceInformation.c | 2 +- .../ngap/NGAP_PEIPSassistanceInformation.h | 2 +- lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.c | 2 +- lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.h | 2 +- lib/asn1c/ngap/NGAP_PLMNIdentity.c | 2 +- lib/asn1c/ngap/NGAP_PLMNIdentity.h | 3 +- lib/asn1c/ngap/NGAP_PLMNListforQMC.c | 2 +- lib/asn1c/ngap/NGAP_PLMNListforQMC.h | 2 +- lib/asn1c/ngap/NGAP_PLMNSupportItem.c | 2 +- lib/asn1c/ngap/NGAP_PLMNSupportItem.h | 2 +- lib/asn1c/ngap/NGAP_PLMNSupportList.c | 2 +- lib/asn1c/ngap/NGAP_PLMNSupportList.h | 2 +- .../ngap/NGAP_PNI-NPN-MobilityInformation.c | 2 +- .../ngap/NGAP_PNI-NPN-MobilityInformation.h | 2 +- lib/asn1c/ngap/NGAP_PWSCancelRequest.c | 2 +- lib/asn1c/ngap/NGAP_PWSCancelRequest.h | 2 +- lib/asn1c/ngap/NGAP_PWSCancelResponse.c | 2 +- lib/asn1c/ngap/NGAP_PWSCancelResponse.h | 2 +- lib/asn1c/ngap/NGAP_PWSFailedCellIDList.c | 2 +- lib/asn1c/ngap/NGAP_PWSFailedCellIDList.h | 2 +- lib/asn1c/ngap/NGAP_PWSFailureIndication.c | 2 +- lib/asn1c/ngap/NGAP_PWSFailureIndication.h | 2 +- lib/asn1c/ngap/NGAP_PWSRestartIndication.c | 2 +- lib/asn1c/ngap/NGAP_PWSRestartIndication.h | 2 +- lib/asn1c/ngap/NGAP_PacketDelayBudget.c | 2 +- lib/asn1c/ngap/NGAP_PacketDelayBudget.h | 3 +- lib/asn1c/ngap/NGAP_PacketErrorRate.c | 2 +- lib/asn1c/ngap/NGAP_PacketErrorRate.h | 2 +- lib/asn1c/ngap/NGAP_PacketLossRate.c | 2 +- lib/asn1c/ngap/NGAP_PacketLossRate.h | 3 +- lib/asn1c/ngap/NGAP_Paging.c | 2 +- lib/asn1c/ngap/NGAP_Paging.h | 2 +- .../ngap/NGAP_PagingAssisDataforCEcapabUE.c | 2 +- .../ngap/NGAP_PagingAssisDataforCEcapabUE.h | 2 +- lib/asn1c/ngap/NGAP_PagingAttemptCount.c | 2 +- lib/asn1c/ngap/NGAP_PagingAttemptCount.h | 3 +- .../ngap/NGAP_PagingAttemptInformation.c | 2 +- .../ngap/NGAP_PagingAttemptInformation.h | 2 +- lib/asn1c/ngap/NGAP_PagingCause.c | 2 +- lib/asn1c/ngap/NGAP_PagingCause.h | 3 +- ...GAP_PagingCauseIndicationForVoiceService.c | 2 +- ...GAP_PagingCauseIndicationForVoiceService.h | 3 +- lib/asn1c/ngap/NGAP_PagingDRX.c | 2 +- lib/asn1c/ngap/NGAP_PagingDRX.h | 3 +- lib/asn1c/ngap/NGAP_PagingOrigin.c | 2 +- lib/asn1c/ngap/NGAP_PagingOrigin.h | 3 +- lib/asn1c/ngap/NGAP_PagingPriority.c | 2 +- lib/asn1c/ngap/NGAP_PagingPriority.h | 3 +- .../ngap/NGAP_PagingProbabilityInformation.c | 2 +- .../ngap/NGAP_PagingProbabilityInformation.h | 3 +- lib/asn1c/ngap/NGAP_PathSwitchRequest.c | 2 +- lib/asn1c/ngap/NGAP_PathSwitchRequest.h | 2 +- .../ngap/NGAP_PathSwitchRequestAcknowledge.c | 2 +- .../ngap/NGAP_PathSwitchRequestAcknowledge.h | 2 +- ...GAP_PathSwitchRequestAcknowledgeTransfer.c | 2 +- ...GAP_PathSwitchRequestAcknowledgeTransfer.h | 2 +- .../ngap/NGAP_PathSwitchRequestFailure.c | 2 +- .../ngap/NGAP_PathSwitchRequestFailure.h | 2 +- ...GAP_PathSwitchRequestSetupFailedTransfer.c | 2 +- ...GAP_PathSwitchRequestSetupFailedTransfer.h | 2 +- .../ngap/NGAP_PathSwitchRequestTransfer.c | 2 +- .../ngap/NGAP_PathSwitchRequestTransfer.h | 2 +- ...AP_PathSwitchRequestUnsuccessfulTransfer.c | 2 +- ...AP_PathSwitchRequestUnsuccessfulTransfer.h | 2 +- lib/asn1c/ngap/NGAP_PedestrianUE.c | 2 +- lib/asn1c/ngap/NGAP_PedestrianUE.h | 3 +- .../NGAP_PeriodicRegistrationUpdateTimer.c | 2 +- .../NGAP_PeriodicRegistrationUpdateTimer.h | 3 +- lib/asn1c/ngap/NGAP_PeriodicReportingIEs.c | 2 +- lib/asn1c/ngap/NGAP_PeriodicReportingIEs.h | 2 +- lib/asn1c/ngap/NGAP_Periodicity.c | 2 +- lib/asn1c/ngap/NGAP_Periodicity.h | 3 +- lib/asn1c/ngap/NGAP_PortNumber.c | 2 +- lib/asn1c/ngap/NGAP_PortNumber.h | 3 +- lib/asn1c/ngap/NGAP_Pre-emptionCapability.c | 2 +- lib/asn1c/ngap/NGAP_Pre-emptionCapability.h | 3 +- .../ngap/NGAP_Pre-emptionVulnerability.c | 2 +- .../ngap/NGAP_Pre-emptionVulnerability.h | 3 +- lib/asn1c/ngap/NGAP_Presence.c | 2 +- lib/asn1c/ngap/NGAP_Presence.h | 3 +- lib/asn1c/ngap/NGAP_PriorityLevelARP.c | 2 +- lib/asn1c/ngap/NGAP_PriorityLevelARP.h | 3 +- lib/asn1c/ngap/NGAP_PriorityLevelQos.c | 2 +- lib/asn1c/ngap/NGAP_PriorityLevelQos.h | 3 +- lib/asn1c/ngap/NGAP_PrivacyIndicator.c | 2 +- lib/asn1c/ngap/NGAP_PrivacyIndicator.h | 3 +- lib/asn1c/ngap/NGAP_PrivateIE-Container.c | 2 +- lib/asn1c/ngap/NGAP_PrivateIE-Container.h | 2 +- lib/asn1c/ngap/NGAP_PrivateIE-Field.c | 2 +- lib/asn1c/ngap/NGAP_PrivateIE-Field.h | 2 +- lib/asn1c/ngap/NGAP_PrivateIE-ID.c | 2 +- lib/asn1c/ngap/NGAP_PrivateIE-ID.h | 2 +- lib/asn1c/ngap/NGAP_PrivateMessage.c | 2 +- lib/asn1c/ngap/NGAP_PrivateMessage.h | 2 +- lib/asn1c/ngap/NGAP_ProcedureCode.c | 2 +- lib/asn1c/ngap/NGAP_ProcedureCode.h | 3 +- lib/asn1c/ngap/NGAP_ProcedureStageChoice.c | 2 +- lib/asn1c/ngap/NGAP_ProcedureStageChoice.h | 2 +- .../ngap/NGAP_ProtocolExtensionContainer.c | 2 +- .../ngap/NGAP_ProtocolExtensionContainer.h | 2 +- lib/asn1c/ngap/NGAP_ProtocolExtensionField.c | 2 +- lib/asn1c/ngap/NGAP_ProtocolExtensionField.h | 2 +- lib/asn1c/ngap/NGAP_ProtocolExtensionID.c | 2 +- lib/asn1c/ngap/NGAP_ProtocolExtensionID.h | 3 +- lib/asn1c/ngap/NGAP_ProtocolIE-Container.c | 2 +- lib/asn1c/ngap/NGAP_ProtocolIE-Container.h | 2 +- .../ngap/NGAP_ProtocolIE-ContainerList.c | 2 +- .../ngap/NGAP_ProtocolIE-ContainerList.h | 2 +- lib/asn1c/ngap/NGAP_ProtocolIE-Field.c | 2 +- lib/asn1c/ngap/NGAP_ProtocolIE-Field.h | 2 +- lib/asn1c/ngap/NGAP_ProtocolIE-ID.c | 2 +- lib/asn1c/ngap/NGAP_ProtocolIE-ID.h | 3 +- .../ngap/NGAP_ProtocolIE-SingleContainer.c | 2 +- .../ngap/NGAP_ProtocolIE-SingleContainer.h | 66 +--- lib/asn1c/ngap/NGAP_QMCConfigInfo.c | 2 +- lib/asn1c/ngap/NGAP_QMCConfigInfo.h | 2 +- lib/asn1c/ngap/NGAP_QMCDeactivation.c | 2 +- lib/asn1c/ngap/NGAP_QMCDeactivation.h | 2 +- lib/asn1c/ngap/NGAP_QoEReference.c | 2 +- lib/asn1c/ngap/NGAP_QoEReference.h | 3 +- lib/asn1c/ngap/NGAP_QoEReferenceList.c | 2 +- lib/asn1c/ngap/NGAP_QoEReferenceList.h | 2 +- lib/asn1c/ngap/NGAP_QoSFlowList.c | 2 +- lib/asn1c/ngap/NGAP_QoSFlowList.h | 2 +- .../ngap/NGAP_QoSFlowsUsageReport-Item.c | 2 +- .../ngap/NGAP_QoSFlowsUsageReport-Item.h | 2 +- lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.c | 2 +- lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.h | 2 +- lib/asn1c/ngap/NGAP_QosCharacteristics.c | 2 +- lib/asn1c/ngap/NGAP_QosCharacteristics.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowAcceptedList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowAcceptedList.h | 2 +- .../ngap/NGAP_QosFlowAddOrModifyRequestItem.c | 2 +- .../ngap/NGAP_QosFlowAddOrModifyRequestItem.h | 2 +- .../ngap/NGAP_QosFlowAddOrModifyRequestList.c | 2 +- .../ngap/NGAP_QosFlowAddOrModifyRequestList.h | 2 +- .../NGAP_QosFlowAddOrModifyResponseItem.c | 2 +- .../NGAP_QosFlowAddOrModifyResponseItem.h | 2 +- .../NGAP_QosFlowAddOrModifyResponseList.c | 2 +- .../NGAP_QosFlowAddOrModifyResponseList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowFeedbackList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowFeedbackList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowIdentifier.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowIdentifier.h | 3 +- lib/asn1c/ngap/NGAP_QosFlowInformationItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowInformationItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowInformationList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowInformationList.h | 2 +- .../ngap/NGAP_QosFlowItemWithDataForwarding.c | 2 +- .../ngap/NGAP_QosFlowItemWithDataForwarding.h | 2 +- .../ngap/NGAP_QosFlowLevelQosParameters.c | 2 +- .../ngap/NGAP_QosFlowLevelQosParameters.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowListWithCause.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowListWithCause.h | 2 +- .../ngap/NGAP_QosFlowListWithDataForwarding.c | 2 +- .../ngap/NGAP_QosFlowListWithDataForwarding.h | 2 +- .../ngap/NGAP_QosFlowModifyConfirmItem.c | 2 +- .../ngap/NGAP_QosFlowModifyConfirmItem.h | 2 +- .../ngap/NGAP_QosFlowModifyConfirmList.c | 2 +- .../ngap/NGAP_QosFlowModifyConfirmList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowNotifyItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowNotifyItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowNotifyList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowNotifyList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowParametersItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowParametersItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowParametersList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowParametersList.h | 2 +- .../ngap/NGAP_QosFlowPerTNLInformation.c | 2 +- .../ngap/NGAP_QosFlowPerTNLInformation.h | 2 +- .../ngap/NGAP_QosFlowPerTNLInformationItem.c | 2 +- .../ngap/NGAP_QosFlowPerTNLInformationItem.h | 2 +- .../ngap/NGAP_QosFlowPerTNLInformationList.c | 2 +- .../ngap/NGAP_QosFlowPerTNLInformationList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.h | 2 +- .../ngap/NGAP_QosFlowToBeForwardedItem.c | 2 +- .../ngap/NGAP_QosFlowToBeForwardedItem.h | 2 +- .../ngap/NGAP_QosFlowToBeForwardedList.c | 2 +- .../ngap/NGAP_QosFlowToBeForwardedList.h | 2 +- lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.c | 2 +- lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.h | 2 +- .../NGAP_QosMonitoringReportingFrequency.c | 2 +- .../NGAP_QosMonitoringReportingFrequency.h | 3 +- lib/asn1c/ngap/NGAP_QosMonitoringRequest.c | 2 +- lib/asn1c/ngap/NGAP_QosMonitoringRequest.h | 3 +- lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.c | 2 +- lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.h | 3 +- .../ngap/NGAP_RANCPRelocationIndication.c | 2 +- .../ngap/NGAP_RANCPRelocationIndication.h | 2 +- lib/asn1c/ngap/NGAP_RANConfigurationUpdate.c | 2 +- lib/asn1c/ngap/NGAP_RANConfigurationUpdate.h | 2 +- .../NGAP_RANConfigurationUpdateAcknowledge.c | 2 +- .../NGAP_RANConfigurationUpdateAcknowledge.h | 2 +- .../ngap/NGAP_RANConfigurationUpdateFailure.c | 2 +- .../ngap/NGAP_RANConfigurationUpdateFailure.h | 2 +- lib/asn1c/ngap/NGAP_RANNodeName.c | 2 +- lib/asn1c/ngap/NGAP_RANNodeName.h | 3 +- lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.c | 2 +- lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.h | 3 +- .../ngap/NGAP_RANNodeNameVisibleString.c | 2 +- .../ngap/NGAP_RANNodeNameVisibleString.h | 3 +- lib/asn1c/ngap/NGAP_RANPagingPriority.c | 2 +- lib/asn1c/ngap/NGAP_RANPagingPriority.h | 3 +- ...P_RANStatusTransfer-TransparentContainer.c | 2 +- ...P_RANStatusTransfer-TransparentContainer.h | 2 +- lib/asn1c/ngap/NGAP_RAT-Information.c | 2 +- lib/asn1c/ngap/NGAP_RAT-Information.h | 3 +- .../ngap/NGAP_RATRestrictionInformation.c | 2 +- .../ngap/NGAP_RATRestrictionInformation.h | 3 +- lib/asn1c/ngap/NGAP_RATRestrictions-Item.c | 2 +- lib/asn1c/ngap/NGAP_RATRestrictions-Item.h | 2 +- lib/asn1c/ngap/NGAP_RATRestrictions.c | 2 +- lib/asn1c/ngap/NGAP_RATRestrictions.h | 2 +- ...GAP_RGLevelWirelineAccessCharacteristics.c | 2 +- ...GAP_RGLevelWirelineAccessCharacteristics.h | 3 +- lib/asn1c/ngap/NGAP_RIMInformation.c | 2 +- lib/asn1c/ngap/NGAP_RIMInformation.h | 2 +- lib/asn1c/ngap/NGAP_RIMInformationTransfer.c | 2 +- lib/asn1c/ngap/NGAP_RIMInformationTransfer.h | 2 +- lib/asn1c/ngap/NGAP_RNC-ID.c | 2 +- lib/asn1c/ngap/NGAP_RNC-ID.h | 3 +- lib/asn1c/ngap/NGAP_RRCContainer.c | 2 +- lib/asn1c/ngap/NGAP_RRCContainer.h | 3 +- lib/asn1c/ngap/NGAP_RRCEstablishmentCause.c | 2 +- lib/asn1c/ngap/NGAP_RRCEstablishmentCause.h | 3 +- .../ngap/NGAP_RRCInactiveTransitionReport.c | 2 +- .../ngap/NGAP_RRCInactiveTransitionReport.h | 2 +- .../NGAP_RRCInactiveTransitionReportRequest.c | 2 +- .../NGAP_RRCInactiveTransitionReportRequest.h | 3 +- lib/asn1c/ngap/NGAP_RRCState.c | 2 +- lib/asn1c/ngap/NGAP_RRCState.h | 3 +- lib/asn1c/ngap/NGAP_RSN.c | 2 +- lib/asn1c/ngap/NGAP_RSN.h | 3 +- lib/asn1c/ngap/NGAP_Range.c | 2 +- lib/asn1c/ngap/NGAP_Range.h | 3 +- lib/asn1c/ngap/NGAP_RecommendedCellItem.c | 2 +- lib/asn1c/ngap/NGAP_RecommendedCellItem.h | 2 +- lib/asn1c/ngap/NGAP_RecommendedCellList.c | 2 +- lib/asn1c/ngap/NGAP_RecommendedCellList.h | 2 +- .../ngap/NGAP_RecommendedCellsForPaging.c | 2 +- .../ngap/NGAP_RecommendedCellsForPaging.h | 2 +- lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.c | 2 +- lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.h | 2 +- lib/asn1c/ngap/NGAP_RecommendedRANNodeList.c | 2 +- lib/asn1c/ngap/NGAP_RecommendedRANNodeList.h | 2 +- .../ngap/NGAP_RecommendedRANNodesForPaging.c | 2 +- .../ngap/NGAP_RecommendedRANNodesForPaging.h | 2 +- lib/asn1c/ngap/NGAP_RedCapIndication.c | 2 +- lib/asn1c/ngap/NGAP_RedCapIndication.h | 3 +- .../ngap/NGAP_RedirectionVoiceFallback.c | 2 +- .../ngap/NGAP_RedirectionVoiceFallback.h | 3 +- .../NGAP_RedundantPDUSessionInformation.c | 2 +- .../NGAP_RedundantPDUSessionInformation.h | 2 +- .../ngap/NGAP_RedundantQosFlowIndicator.c | 2 +- .../ngap/NGAP_RedundantQosFlowIndicator.h | 3 +- lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.c | 2 +- lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.h | 3 +- lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.c | 2 +- lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.h | 3 +- lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.c | 2 +- lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.h | 3 +- lib/asn1c/ngap/NGAP_RelativeAMFCapacity.c | 2 +- lib/asn1c/ngap/NGAP_RelativeAMFCapacity.h | 3 +- lib/asn1c/ngap/NGAP_RepetitionPeriod.c | 2 +- lib/asn1c/ngap/NGAP_RepetitionPeriod.h | 3 +- lib/asn1c/ngap/NGAP_ReportAmountMDT.c | 2 +- lib/asn1c/ngap/NGAP_ReportAmountMDT.h | 3 +- lib/asn1c/ngap/NGAP_ReportArea.c | 2 +- lib/asn1c/ngap/NGAP_ReportArea.h | 3 +- lib/asn1c/ngap/NGAP_ReportCharacteristics.c | 2 +- lib/asn1c/ngap/NGAP_ReportCharacteristics.h | 3 +- lib/asn1c/ngap/NGAP_ReportIntervalMDT.c | 2 +- lib/asn1c/ngap/NGAP_ReportIntervalMDT.h | 3 +- lib/asn1c/ngap/NGAP_ReportType.c | 2 +- lib/asn1c/ngap/NGAP_ReportType.h | 2 +- lib/asn1c/ngap/NGAP_ReportingPeriodicity.c | 2 +- lib/asn1c/ngap/NGAP_ReportingPeriodicity.h | 3 +- lib/asn1c/ngap/NGAP_ReportingSystem.c | 2 +- lib/asn1c/ngap/NGAP_ReportingSystem.h | 2 +- lib/asn1c/ngap/NGAP_RerouteNASRequest.c | 2 +- lib/asn1c/ngap/NGAP_RerouteNASRequest.h | 2 +- lib/asn1c/ngap/NGAP_ResetAll.c | 2 +- lib/asn1c/ngap/NGAP_ResetAll.h | 3 +- lib/asn1c/ngap/NGAP_ResetType.c | 2 +- lib/asn1c/ngap/NGAP_ResetType.h | 2 +- .../ngap/NGAP_ResourceStatusReportingSystem.c | 2 +- .../ngap/NGAP_ResourceStatusReportingSystem.h | 2 +- lib/asn1c/ngap/NGAP_RetrieveUEInformation.c | 2 +- lib/asn1c/ngap/NGAP_RetrieveUEInformation.h | 2 +- lib/asn1c/ngap/NGAP_RoutingID.c | 2 +- lib/asn1c/ngap/NGAP_RoutingID.h | 3 +- lib/asn1c/ngap/NGAP_S-NSSAI.c | 2 +- lib/asn1c/ngap/NGAP_S-NSSAI.h | 2 +- lib/asn1c/ngap/NGAP_SCTP-TLAs.c | 2 +- lib/asn1c/ngap/NGAP_SCTP-TLAs.h | 2 +- lib/asn1c/ngap/NGAP_SD.c | 2 +- lib/asn1c/ngap/NGAP_SD.h | 3 +- .../ngap/NGAP_SNPN-MobilityInformation.c | 2 +- .../ngap/NGAP_SNPN-MobilityInformation.h | 2 +- .../ngap/NGAP_SONConfigurationTransfer.c | 2 +- .../ngap/NGAP_SONConfigurationTransfer.h | 2 +- lib/asn1c/ngap/NGAP_SONInformation.c | 2 +- lib/asn1c/ngap/NGAP_SONInformation.h | 2 +- lib/asn1c/ngap/NGAP_SONInformationReply.c | 2 +- lib/asn1c/ngap/NGAP_SONInformationReply.h | 2 +- lib/asn1c/ngap/NGAP_SONInformationReport.c | 2 +- lib/asn1c/ngap/NGAP_SONInformationReport.h | 2 +- lib/asn1c/ngap/NGAP_SONInformationRequest.c | 2 +- lib/asn1c/ngap/NGAP_SONInformationRequest.h | 3 +- lib/asn1c/ngap/NGAP_SRVCCOperationPossible.c | 2 +- lib/asn1c/ngap/NGAP_SRVCCOperationPossible.h | 3 +- lib/asn1c/ngap/NGAP_SST.c | 2 +- lib/asn1c/ngap/NGAP_SST.h | 3 +- .../ngap/NGAP_ScheduledCommunicationTime.c | 2 +- .../ngap/NGAP_ScheduledCommunicationTime.h | 2 +- .../ngap/NGAP_SecondaryRATDataUsageReport.c | 2 +- .../ngap/NGAP_SecondaryRATDataUsageReport.h | 2 +- ...NGAP_SecondaryRATDataUsageReportTransfer.c | 2 +- ...NGAP_SecondaryRATDataUsageReportTransfer.h | 2 +- .../ngap/NGAP_SecondaryRATUsageInformation.c | 2 +- .../ngap/NGAP_SecondaryRATUsageInformation.h | 2 +- lib/asn1c/ngap/NGAP_SecurityContext.c | 2 +- lib/asn1c/ngap/NGAP_SecurityContext.h | 2 +- lib/asn1c/ngap/NGAP_SecurityIndication.c | 2 +- lib/asn1c/ngap/NGAP_SecurityIndication.h | 2 +- lib/asn1c/ngap/NGAP_SecurityKey.c | 2 +- lib/asn1c/ngap/NGAP_SecurityKey.h | 3 +- lib/asn1c/ngap/NGAP_SecurityResult.c | 2 +- lib/asn1c/ngap/NGAP_SecurityResult.h | 2 +- lib/asn1c/ngap/NGAP_SensorMeasConfig.c | 2 +- lib/asn1c/ngap/NGAP_SensorMeasConfig.h | 3 +- .../ngap/NGAP_SensorMeasConfigNameItem.c | 2 +- .../ngap/NGAP_SensorMeasConfigNameItem.h | 2 +- .../ngap/NGAP_SensorMeasConfigNameList.c | 2 +- .../ngap/NGAP_SensorMeasConfigNameList.h | 2 +- .../NGAP_SensorMeasurementConfiguration.c | 2 +- .../NGAP_SensorMeasurementConfiguration.h | 2 +- lib/asn1c/ngap/NGAP_SensorNameConfig.c | 2 +- lib/asn1c/ngap/NGAP_SensorNameConfig.h | 2 +- lib/asn1c/ngap/NGAP_SerialNumber.c | 2 +- lib/asn1c/ngap/NGAP_SerialNumber.h | 3 +- lib/asn1c/ngap/NGAP_ServedGUAMIItem.c | 2 +- lib/asn1c/ngap/NGAP_ServedGUAMIItem.h | 2 +- lib/asn1c/ngap/NGAP_ServedGUAMIList.c | 2 +- lib/asn1c/ngap/NGAP_ServedGUAMIList.h | 2 +- .../ngap/NGAP_ServiceAreaInformation-Item.c | 2 +- .../ngap/NGAP_ServiceAreaInformation-Item.h | 2 +- lib/asn1c/ngap/NGAP_ServiceAreaInformation.c | 2 +- lib/asn1c/ngap/NGAP_ServiceAreaInformation.h | 2 +- lib/asn1c/ngap/NGAP_ServiceType.c | 2 +- lib/asn1c/ngap/NGAP_ServiceType.h | 3 +- lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.c | 2 +- lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.h | 3 +- .../NGAP_SharedNGU-MulticastTNLInformation.c | 2 +- .../NGAP_SharedNGU-MulticastTNLInformation.h | 2 +- lib/asn1c/ngap/NGAP_SliceOverloadItem.c | 2 +- lib/asn1c/ngap/NGAP_SliceOverloadItem.h | 2 +- lib/asn1c/ngap/NGAP_SliceOverloadList.c | 2 +- lib/asn1c/ngap/NGAP_SliceOverloadList.h | 2 +- lib/asn1c/ngap/NGAP_SliceSupportItem.c | 2 +- lib/asn1c/ngap/NGAP_SliceSupportItem.h | 2 +- lib/asn1c/ngap/NGAP_SliceSupportList.c | 2 +- lib/asn1c/ngap/NGAP_SliceSupportList.h | 2 +- lib/asn1c/ngap/NGAP_SliceSupportListQMC.c | 2 +- lib/asn1c/ngap/NGAP_SliceSupportListQMC.h | 2 +- lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.c | 2 +- lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.h | 2 +- ...e-ToTargetNGRANNode-TransparentContainer.c | 2 +- ...e-ToTargetNGRANNode-TransparentContainer.h | 2 +- lib/asn1c/ngap/NGAP_SourceNodeID.c | 2 +- lib/asn1c/ngap/NGAP_SourceNodeID.h | 2 +- ...P_SourceOfUEActivityBehaviourInformation.c | 2 +- ...P_SourceOfUEActivityBehaviourInformation.h | 3 +- lib/asn1c/ngap/NGAP_SourceRANNodeID.c | 2 +- lib/asn1c/ngap/NGAP_SourceRANNodeID.h | 2 +- ...GAP_SourceToTarget-AMFInformationReroute.c | 2 +- ...GAP_SourceToTarget-AMFInformationReroute.h | 2 +- ...NGAP_SourceToTarget-TransparentContainer.c | 2 +- ...NGAP_SourceToTarget-TransparentContainer.h | 3 +- .../ngap/NGAP_SuccessfulHandoverReport-Item.c | 2 +- .../ngap/NGAP_SuccessfulHandoverReport-Item.h | 2 +- .../ngap/NGAP_SuccessfulHandoverReportList.c | 2 +- .../ngap/NGAP_SuccessfulHandoverReportList.h | 2 +- lib/asn1c/ngap/NGAP_SuccessfulOutcome.c | 2 +- lib/asn1c/ngap/NGAP_SuccessfulOutcome.h | 2 +- lib/asn1c/ngap/NGAP_SupportedTAItem.c | 2 +- lib/asn1c/ngap/NGAP_SupportedTAItem.h | 2 +- lib/asn1c/ngap/NGAP_SupportedTAList.c | 2 +- lib/asn1c/ngap/NGAP_SupportedTAList.h | 2 +- lib/asn1c/ngap/NGAP_SurvivalTime.c | 2 +- lib/asn1c/ngap/NGAP_SurvivalTime.h | 3 +- .../ngap/NGAP_Suspend-Request-Indication.c | 2 +- .../ngap/NGAP_Suspend-Request-Indication.h | 3 +- .../ngap/NGAP_Suspend-Response-Indication.c | 2 +- .../ngap/NGAP_Suspend-Response-Indication.h | 3 +- lib/asn1c/ngap/NGAP_SuspendIndicator.c | 2 +- lib/asn1c/ngap/NGAP_SuspendIndicator.h | 3 +- lib/asn1c/ngap/NGAP_TABasedMDT.c | 2 +- lib/asn1c/ngap/NGAP_TABasedMDT.h | 2 +- lib/asn1c/ngap/NGAP_TABasedQMC.c | 2 +- lib/asn1c/ngap/NGAP_TABasedQMC.h | 2 +- lib/asn1c/ngap/NGAP_TAC.c | 2 +- lib/asn1c/ngap/NGAP_TAC.h | 3 +- lib/asn1c/ngap/NGAP_TACListInNRNTN.c | 2 +- lib/asn1c/ngap/NGAP_TACListInNRNTN.h | 2 +- lib/asn1c/ngap/NGAP_TAI.c | 2 +- lib/asn1c/ngap/NGAP_TAI.h | 2 +- lib/asn1c/ngap/NGAP_TAIBasedMDT.c | 2 +- lib/asn1c/ngap/NGAP_TAIBasedMDT.h | 2 +- lib/asn1c/ngap/NGAP_TAIBasedQMC.c | 2 +- lib/asn1c/ngap/NGAP_TAIBasedQMC.h | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.c | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.h | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.c | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.h | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.c | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.h | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastNR.c | 2 +- lib/asn1c/ngap/NGAP_TAIBroadcastNR.h | 2 +- lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.c | 2 +- lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.h | 2 +- lib/asn1c/ngap/NGAP_TAICancelledEUTRA.c | 2 +- lib/asn1c/ngap/NGAP_TAICancelledEUTRA.h | 2 +- lib/asn1c/ngap/NGAP_TAICancelledNR-Item.c | 2 +- lib/asn1c/ngap/NGAP_TAICancelledNR-Item.h | 2 +- lib/asn1c/ngap/NGAP_TAICancelledNR.c | 2 +- lib/asn1c/ngap/NGAP_TAICancelledNR.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForInactive.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForInactive.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForInactiveItem.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForInactiveItem.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForPaging.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForPaging.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForPagingItem.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForPagingItem.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForRestart.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForRestart.h | 2 +- lib/asn1c/ngap/NGAP_TAIListForWarning.c | 2 +- lib/asn1c/ngap/NGAP_TAIListForWarning.h | 2 +- lib/asn1c/ngap/NGAP_TAIListforMDT.c | 2 +- lib/asn1c/ngap/NGAP_TAIListforMDT.h | 2 +- lib/asn1c/ngap/NGAP_TAIListforQMC.c | 2 +- lib/asn1c/ngap/NGAP_TAIListforQMC.h | 2 +- lib/asn1c/ngap/NGAP_TAINSAGSupportItem.c | 2 +- lib/asn1c/ngap/NGAP_TAINSAGSupportItem.h | 2 +- lib/asn1c/ngap/NGAP_TAINSAGSupportList.c | 2 +- lib/asn1c/ngap/NGAP_TAINSAGSupportList.h | 2 +- lib/asn1c/ngap/NGAP_TAListforMDT.c | 2 +- lib/asn1c/ngap/NGAP_TAListforMDT.h | 2 +- lib/asn1c/ngap/NGAP_TAListforQMC.c | 2 +- lib/asn1c/ngap/NGAP_TAListforQMC.h | 2 +- lib/asn1c/ngap/NGAP_TMGI.c | 2 +- lib/asn1c/ngap/NGAP_TMGI.h | 3 +- lib/asn1c/ngap/NGAP_TNAP-ID.c | 2 +- lib/asn1c/ngap/NGAP_TNAP-ID.h | 3 +- lib/asn1c/ngap/NGAP_TNGF-ID.c | 2 +- lib/asn1c/ngap/NGAP_TNGF-ID.h | 2 +- lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.c | 2 +- lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.h | 3 +- lib/asn1c/ngap/NGAP_TNLAssociationItem.c | 2 +- lib/asn1c/ngap/NGAP_TNLAssociationItem.h | 2 +- lib/asn1c/ngap/NGAP_TNLAssociationList.c | 2 +- lib/asn1c/ngap/NGAP_TNLAssociationList.h | 2 +- lib/asn1c/ngap/NGAP_TNLAssociationUsage.c | 2 +- lib/asn1c/ngap/NGAP_TNLAssociationUsage.h | 3 +- .../ngap/NGAP_TSCAssistanceInformation.c | 2 +- .../ngap/NGAP_TSCAssistanceInformation.h | 2 +- .../ngap/NGAP_TSCTrafficCharacteristics.c | 2 +- .../ngap/NGAP_TSCTrafficCharacteristics.h | 2 +- lib/asn1c/ngap/NGAP_TWAP-ID.c | 2 +- lib/asn1c/ngap/NGAP_TWAP-ID.h | 3 +- lib/asn1c/ngap/NGAP_TWIF-ID.c | 2 +- lib/asn1c/ngap/NGAP_TWIF-ID.h | 2 +- lib/asn1c/ngap/NGAP_TargetID.c | 2 +- lib/asn1c/ngap/NGAP_TargetID.h | 2 +- ...rceNGRANNode-FailureTransparentContainer.c | 2 +- ...rceNGRANNode-FailureTransparentContainer.h | 2 +- ...e-ToSourceNGRANNode-TransparentContainer.c | 2 +- ...e-ToSourceNGRANNode-TransparentContainer.h | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAI-Item.c | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAI-Item.h | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAI.c | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAI.h | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAIInformation.c | 2 +- lib/asn1c/ngap/NGAP_TargetNSSAIInformation.h | 2 +- lib/asn1c/ngap/NGAP_TargetRANNodeID.c | 2 +- lib/asn1c/ngap/NGAP_TargetRANNodeID.h | 2 +- lib/asn1c/ngap/NGAP_TargetRNC-ID.c | 2 +- lib/asn1c/ngap/NGAP_TargetRNC-ID.h | 2 +- ...NGAP_TargetToSource-TransparentContainer.c | 2 +- ...NGAP_TargetToSource-TransparentContainer.h | 3 +- lib/asn1c/ngap/NGAP_TargeteNB-ID.c | 2 +- lib/asn1c/ngap/NGAP_TargeteNB-ID.h | 2 +- ...gettoSource-Failure-TransparentContainer.c | 2 +- ...gettoSource-Failure-TransparentContainer.h | 3 +- lib/asn1c/ngap/NGAP_Threshold-RSRP.c | 2 +- lib/asn1c/ngap/NGAP_Threshold-RSRP.h | 3 +- lib/asn1c/ngap/NGAP_Threshold-RSRQ.c | 2 +- lib/asn1c/ngap/NGAP_Threshold-RSRQ.h | 3 +- lib/asn1c/ngap/NGAP_Threshold-SINR.c | 2 +- lib/asn1c/ngap/NGAP_Threshold-SINR.h | 3 +- lib/asn1c/ngap/NGAP_TimeStamp.c | 2 +- lib/asn1c/ngap/NGAP_TimeStamp.h | 3 +- lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.c | 2 +- lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.h | 2 +- lib/asn1c/ngap/NGAP_TimeToTrigger.c | 2 +- lib/asn1c/ngap/NGAP_TimeToTrigger.h | 3 +- lib/asn1c/ngap/NGAP_TimeToWait.c | 2 +- lib/asn1c/ngap/NGAP_TimeToWait.h | 3 +- lib/asn1c/ngap/NGAP_TimeUEStayedInCell.c | 2 +- lib/asn1c/ngap/NGAP_TimeUEStayedInCell.h | 3 +- ...AP_TimeUEStayedInCellEnhancedGranularity.c | 2 +- ...AP_TimeUEStayedInCellEnhancedGranularity.h | 3 +- .../ngap/NGAP_TimerApproachForGUAMIRemoval.c | 2 +- .../ngap/NGAP_TimerApproachForGUAMIRemoval.h | 3 +- lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.c | 2 +- lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.h | 2 +- lib/asn1c/ngap/NGAP_TraceActivation.c | 2 +- lib/asn1c/ngap/NGAP_TraceActivation.h | 2 +- lib/asn1c/ngap/NGAP_TraceDepth.c | 2 +- lib/asn1c/ngap/NGAP_TraceDepth.h | 3 +- lib/asn1c/ngap/NGAP_TraceFailureIndication.c | 2 +- lib/asn1c/ngap/NGAP_TraceFailureIndication.h | 2 +- lib/asn1c/ngap/NGAP_TraceStart.c | 2 +- lib/asn1c/ngap/NGAP_TraceStart.h | 2 +- .../NGAP_TrafficLoadReductionIndication.c | 2 +- .../NGAP_TrafficLoadReductionIndication.h | 3 +- lib/asn1c/ngap/NGAP_TransportLayerAddress.c | 2 +- lib/asn1c/ngap/NGAP_TransportLayerAddress.h | 3 +- lib/asn1c/ngap/NGAP_TriggeringMessage.c | 2 +- lib/asn1c/ngap/NGAP_TriggeringMessage.h | 3 +- lib/asn1c/ngap/NGAP_TypeOfError.c | 2 +- lib/asn1c/ngap/NGAP_TypeOfError.h | 3 +- lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.c | 2 +- lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.h | 2 +- lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.c | 2 +- lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.h | 2 +- lib/asn1c/ngap/NGAP_UE-NGAP-IDs.c | 2 +- lib/asn1c/ngap/NGAP_UE-NGAP-IDs.h | 2 +- lib/asn1c/ngap/NGAP_UE-PagingItem.c | 2 +- lib/asn1c/ngap/NGAP_UE-PagingItem.h | 2 +- lib/asn1c/ngap/NGAP_UE-PagingList.c | 2 +- lib/asn1c/ngap/NGAP_UE-PagingList.h | 2 +- lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.c | 2 +- lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.h | 3 +- ...AP_UE-associatedLogicalNG-connectionItem.c | 2 +- ...AP_UE-associatedLogicalNG-connectionItem.h | 2 +- ...AP_UE-associatedLogicalNG-connectionList.c | 2 +- ...AP_UE-associatedLogicalNG-connectionList.h | 2 +- .../ngap/NGAP_UEAggregateMaximumBitRate.c | 2 +- .../ngap/NGAP_UEAggregateMaximumBitRate.h | 2 +- .../ngap/NGAP_UEAppLayerMeasConfigInfo.c | 2 +- .../ngap/NGAP_UEAppLayerMeasConfigInfo.h | 2 +- lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.c | 2 +- lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.h | 2 +- lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.c | 2 +- lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.h | 2 +- lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.c | 2 +- lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.h | 3 +- .../ngap/NGAP_UEContextModificationFailure.c | 2 +- .../ngap/NGAP_UEContextModificationFailure.h | 2 +- .../ngap/NGAP_UEContextModificationRequest.c | 2 +- .../ngap/NGAP_UEContextModificationRequest.h | 2 +- .../ngap/NGAP_UEContextModificationResponse.c | 2 +- .../ngap/NGAP_UEContextModificationResponse.h | 2 +- lib/asn1c/ngap/NGAP_UEContextReleaseCommand.c | 2 +- lib/asn1c/ngap/NGAP_UEContextReleaseCommand.h | 2 +- .../ngap/NGAP_UEContextReleaseComplete.c | 2 +- .../ngap/NGAP_UEContextReleaseComplete.h | 2 +- lib/asn1c/ngap/NGAP_UEContextReleaseRequest.c | 2 +- lib/asn1c/ngap/NGAP_UEContextReleaseRequest.h | 2 +- lib/asn1c/ngap/NGAP_UEContextRequest.c | 2 +- lib/asn1c/ngap/NGAP_UEContextRequest.h | 3 +- lib/asn1c/ngap/NGAP_UEContextResumeFailure.c | 2 +- lib/asn1c/ngap/NGAP_UEContextResumeFailure.h | 2 +- lib/asn1c/ngap/NGAP_UEContextResumeRequest.c | 2 +- lib/asn1c/ngap/NGAP_UEContextResumeRequest.h | 2 +- .../NGAP_UEContextResumeRequestTransfer.c | 2 +- .../NGAP_UEContextResumeRequestTransfer.h | 2 +- lib/asn1c/ngap/NGAP_UEContextResumeResponse.c | 2 +- lib/asn1c/ngap/NGAP_UEContextResumeResponse.h | 2 +- .../NGAP_UEContextResumeResponseTransfer.c | 2 +- .../NGAP_UEContextResumeResponseTransfer.h | 2 +- lib/asn1c/ngap/NGAP_UEContextSuspendFailure.c | 2 +- lib/asn1c/ngap/NGAP_UEContextSuspendFailure.h | 2 +- lib/asn1c/ngap/NGAP_UEContextSuspendRequest.c | 2 +- lib/asn1c/ngap/NGAP_UEContextSuspendRequest.h | 2 +- .../NGAP_UEContextSuspendRequestTransfer.c | 2 +- .../NGAP_UEContextSuspendRequestTransfer.h | 2 +- .../ngap/NGAP_UEContextSuspendResponse.c | 2 +- .../ngap/NGAP_UEContextSuspendResponse.h | 2 +- lib/asn1c/ngap/NGAP_UEHistoryInformation.c | 2 +- lib/asn1c/ngap/NGAP_UEHistoryInformation.h | 2 +- .../ngap/NGAP_UEHistoryInformationFromTheUE.c | 2 +- .../ngap/NGAP_UEHistoryInformationFromTheUE.h | 2 +- lib/asn1c/ngap/NGAP_UEIdentityIndexValue.c | 2 +- lib/asn1c/ngap/NGAP_UEIdentityIndexValue.h | 2 +- lib/asn1c/ngap/NGAP_UEInformationTransfer.c | 2 +- lib/asn1c/ngap/NGAP_UEInformationTransfer.h | 2 +- lib/asn1c/ngap/NGAP_UEPagingIdentity.c | 2 +- lib/asn1c/ngap/NGAP_UEPagingIdentity.h | 2 +- lib/asn1c/ngap/NGAP_UEPresence.c | 2 +- lib/asn1c/ngap/NGAP_UEPresence.h | 3 +- .../NGAP_UEPresenceInAreaOfInterestItem.c | 2 +- .../NGAP_UEPresenceInAreaOfInterestItem.h | 2 +- .../NGAP_UEPresenceInAreaOfInterestList.c | 2 +- .../NGAP_UEPresenceInAreaOfInterestList.h | 2 +- lib/asn1c/ngap/NGAP_UERLFReportContainer.c | 2 +- lib/asn1c/ngap/NGAP_UERLFReportContainer.h | 2 +- lib/asn1c/ngap/NGAP_UERadioCapability.c | 2 +- lib/asn1c/ngap/NGAP_UERadioCapability.h | 3 +- .../ngap/NGAP_UERadioCapabilityCheckRequest.c | 2 +- .../ngap/NGAP_UERadioCapabilityCheckRequest.h | 2 +- .../NGAP_UERadioCapabilityCheckResponse.c | 2 +- .../NGAP_UERadioCapabilityCheckResponse.h | 2 +- .../ngap/NGAP_UERadioCapabilityForPaging.c | 2 +- .../ngap/NGAP_UERadioCapabilityForPaging.h | 2 +- .../NGAP_UERadioCapabilityForPagingOfEUTRA.c | 2 +- .../NGAP_UERadioCapabilityForPagingOfEUTRA.h | 3 +- .../NGAP_UERadioCapabilityForPagingOfNB-IoT.c | 2 +- .../NGAP_UERadioCapabilityForPagingOfNB-IoT.h | 3 +- .../NGAP_UERadioCapabilityForPagingOfNR.c | 2 +- .../NGAP_UERadioCapabilityForPagingOfNR.h | 3 +- lib/asn1c/ngap/NGAP_UERadioCapabilityID.c | 2 +- lib/asn1c/ngap/NGAP_UERadioCapabilityID.h | 3 +- .../NGAP_UERadioCapabilityIDMappingRequest.c | 2 +- .../NGAP_UERadioCapabilityIDMappingRequest.h | 2 +- .../NGAP_UERadioCapabilityIDMappingResponse.c | 2 +- .../NGAP_UERadioCapabilityIDMappingResponse.h | 2 +- .../NGAP_UERadioCapabilityInfoIndication.c | 2 +- .../NGAP_UERadioCapabilityInfoIndication.h | 2 +- lib/asn1c/ngap/NGAP_UERetentionInformation.c | 2 +- lib/asn1c/ngap/NGAP_UERetentionInformation.h | 3 +- lib/asn1c/ngap/NGAP_UESecurityCapabilities.c | 2 +- lib/asn1c/ngap/NGAP_UESecurityCapabilities.h | 2 +- .../ngap/NGAP_UESliceMaximumBitRateItem.c | 2 +- .../ngap/NGAP_UESliceMaximumBitRateItem.h | 2 +- .../ngap/NGAP_UESliceMaximumBitRateList.c | 2 +- .../ngap/NGAP_UESliceMaximumBitRateList.h | 2 +- .../ngap/NGAP_UETNLABindingReleaseRequest.c | 2 +- .../ngap/NGAP_UETNLABindingReleaseRequest.h | 2 +- .../ngap/NGAP_UL-CP-SecurityInformation.c | 2 +- .../ngap/NGAP_UL-CP-SecurityInformation.h | 2 +- lib/asn1c/ngap/NGAP_UL-NAS-Count.c | 2 +- lib/asn1c/ngap/NGAP_UL-NAS-Count.h | 3 +- lib/asn1c/ngap/NGAP_UL-NAS-MAC.c | 2 +- lib/asn1c/ngap/NGAP_UL-NAS-MAC.h | 3 +- lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.c | 2 +- lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.h | 2 +- lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.c | 2 +- lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.h | 2 +- lib/asn1c/ngap/NGAP_ULForwarding.c | 2 +- lib/asn1c/ngap/NGAP_ULForwarding.h | 3 +- .../ngap/NGAP_UPTransportLayerInformation.c | 2 +- .../ngap/NGAP_UPTransportLayerInformation.h | 2 +- .../NGAP_UPTransportLayerInformationItem.c | 2 +- .../NGAP_UPTransportLayerInformationItem.h | 2 +- .../NGAP_UPTransportLayerInformationList.c | 2 +- .../NGAP_UPTransportLayerInformationList.h | 2 +- ...NGAP_UPTransportLayerInformationPairItem.c | 2 +- ...NGAP_UPTransportLayerInformationPairItem.h | 2 +- ...NGAP_UPTransportLayerInformationPairList.c | 2 +- ...NGAP_UPTransportLayerInformationPairList.h | 2 +- lib/asn1c/ngap/NGAP_URI-address.c | 2 +- lib/asn1c/ngap/NGAP_URI-address.h | 3 +- lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.c | 2 +- lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.h | 2 +- lib/asn1c/ngap/NGAP_UnavailableGUAMIList.c | 2 +- lib/asn1c/ngap/NGAP_UnavailableGUAMIList.h | 2 +- lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.c | 2 +- lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.h | 2 +- lib/asn1c/ngap/NGAP_UpdateFeedback.c | 2 +- lib/asn1c/ngap/NGAP_UpdateFeedback.h | 3 +- lib/asn1c/ngap/NGAP_UplinkNASTransport.c | 2 +- lib/asn1c/ngap/NGAP_UplinkNASTransport.h | 2 +- ...NGAP_UplinkNonUEAssociatedNRPPaTransport.c | 2 +- ...NGAP_UplinkNonUEAssociatedNRPPaTransport.h | 2 +- .../NGAP_UplinkRANConfigurationTransfer.c | 2 +- .../NGAP_UplinkRANConfigurationTransfer.h | 2 +- .../ngap/NGAP_UplinkRANEarlyStatusTransfer.c | 2 +- .../ngap/NGAP_UplinkRANEarlyStatusTransfer.h | 2 +- lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.c | 2 +- lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.h | 2 +- .../ngap/NGAP_UplinkRIMInformationTransfer.c | 2 +- .../ngap/NGAP_UplinkRIMInformationTransfer.h | 2 +- .../NGAP_UplinkUEAssociatedNRPPaTransport.c | 2 +- .../NGAP_UplinkUEAssociatedNRPPaTransport.h | 2 +- lib/asn1c/ngap/NGAP_UserLocationInformation.c | 2 +- lib/asn1c/ngap/NGAP_UserLocationInformation.h | 2 +- .../ngap/NGAP_UserLocationInformationEUTRA.c | 2 +- .../ngap/NGAP_UserLocationInformationEUTRA.h | 2 +- .../ngap/NGAP_UserLocationInformationN3IWF.c | 2 +- .../ngap/NGAP_UserLocationInformationN3IWF.h | 2 +- .../ngap/NGAP_UserLocationInformationNR.c | 2 +- .../ngap/NGAP_UserLocationInformationNR.h | 2 +- .../ngap/NGAP_UserLocationInformationTNGF.c | 2 +- .../ngap/NGAP_UserLocationInformationTNGF.h | 2 +- .../ngap/NGAP_UserLocationInformationTWIF.c | 2 +- .../ngap/NGAP_UserLocationInformationTWIF.h | 2 +- .../ngap/NGAP_UserLocationInformationW-AGF.c | 2 +- .../ngap/NGAP_UserLocationInformationW-AGF.h | 2 +- .../ngap/NGAP_UserPlaneSecurityInformation.c | 2 +- .../ngap/NGAP_UserPlaneSecurityInformation.h | 2 +- lib/asn1c/ngap/NGAP_VehicleUE.c | 2 +- lib/asn1c/ngap/NGAP_VehicleUE.h | 3 +- lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.c | 2 +- lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.h | 2 +- lib/asn1c/ngap/NGAP_VolumeTimedReportList.c | 2 +- lib/asn1c/ngap/NGAP_VolumeTimedReportList.h | 2 +- lib/asn1c/ngap/NGAP_W-AGF-ID.c | 2 +- lib/asn1c/ngap/NGAP_W-AGF-ID.h | 2 +- lib/asn1c/ngap/NGAP_WLANMeasConfig.c | 2 +- lib/asn1c/ngap/NGAP_WLANMeasConfig.h | 3 +- lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.c | 2 +- lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.h | 2 +- lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.c | 2 +- lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.h | 2 +- .../ngap/NGAP_WLANMeasurementConfiguration.c | 2 +- .../ngap/NGAP_WLANMeasurementConfiguration.h | 2 +- lib/asn1c/ngap/NGAP_WLANName.c | 2 +- lib/asn1c/ngap/NGAP_WLANName.h | 3 +- .../ngap/NGAP_WUS-Assistance-Information.c | 2 +- .../ngap/NGAP_WUS-Assistance-Information.h | 2 +- lib/asn1c/ngap/NGAP_WarningAreaCoordinates.c | 2 +- lib/asn1c/ngap/NGAP_WarningAreaCoordinates.h | 3 +- lib/asn1c/ngap/NGAP_WarningAreaList.c | 2 +- lib/asn1c/ngap/NGAP_WarningAreaList.h | 2 +- lib/asn1c/ngap/NGAP_WarningMessageContents.c | 2 +- lib/asn1c/ngap/NGAP_WarningMessageContents.h | 3 +- lib/asn1c/ngap/NGAP_WarningSecurityInfo.c | 2 +- lib/asn1c/ngap/NGAP_WarningSecurityInfo.h | 3 +- lib/asn1c/ngap/NGAP_WarningType.c | 2 +- lib/asn1c/ngap/NGAP_WarningType.h | 3 +- .../ngap/NGAP_WriteReplaceWarningRequest.c | 2 +- .../ngap/NGAP_WriteReplaceWarningRequest.h | 2 +- .../ngap/NGAP_WriteReplaceWarningResponse.c | 2 +- .../ngap/NGAP_WriteReplaceWarningResponse.h | 2 +- lib/asn1c/ngap/NGAP_XnExtTLA-Item.c | 2 +- lib/asn1c/ngap/NGAP_XnExtTLA-Item.h | 2 +- lib/asn1c/ngap/NGAP_XnExtTLAs.c | 2 +- lib/asn1c/ngap/NGAP_XnExtTLAs.h | 2 +- lib/asn1c/ngap/NGAP_XnGTP-TLAs.c | 2 +- lib/asn1c/ngap/NGAP_XnGTP-TLAs.h | 2 +- lib/asn1c/ngap/NGAP_XnTLAs.c | 2 +- lib/asn1c/ngap/NGAP_XnTLAs.h | 2 +- lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.c | 2 +- lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.h | 2 +- lib/asn1c/s1ap/S1AP_Additional-GUTI.c | 2 +- lib/asn1c/s1ap/S1AP_Additional-GUTI.h | 2 +- .../s1ap/S1AP_AdditionalCSFallbackIndicator.c | 2 +- .../s1ap/S1AP_AdditionalCSFallbackIndicator.h | 3 +- .../s1ap/S1AP_AdditionalRRMPriorityIndex.c | 2 +- .../s1ap/S1AP_AdditionalRRMPriorityIndex.h | 3 +- .../S1AP_AerialUEsubscriptionInformation.c | 2 +- .../S1AP_AerialUEsubscriptionInformation.h | 3 +- .../S1AP_AllocationAndRetentionPriority.c | 2 +- .../S1AP_AllocationAndRetentionPriority.h | 2 +- lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.c | 2 +- lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.h | 2 +- lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.c | 2 +- lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.h | 2 +- .../s1ap/S1AP_AssistanceDataForCECapableUEs.c | 2 +- .../s1ap/S1AP_AssistanceDataForCECapableUEs.h | 2 +- lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.c | 2 +- lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.h | 2 +- .../S1AP_AssistanceDataForRecommendedCells.c | 2 +- .../S1AP_AssistanceDataForRecommendedCells.h | 2 +- lib/asn1c/s1ap/S1AP_BPLMNs.c | 2 +- lib/asn1c/s1ap/S1AP_BPLMNs.h | 2 +- lib/asn1c/s1ap/S1AP_BearerType.c | 2 +- lib/asn1c/s1ap/S1AP_BearerType.h | 3 +- ...earers-SubjectToEarlyStatusTransfer-Item.c | 2 +- ...earers-SubjectToEarlyStatusTransfer-Item.h | 2 +- ...Bearers-SubjectToEarlyStatusTransferList.c | 2 +- ...Bearers-SubjectToEarlyStatusTransferList.h | 2 +- ...1AP_Bearers-SubjectToStatusTransfer-Item.c | 2 +- ...1AP_Bearers-SubjectToStatusTransfer-Item.h | 2 +- ...S1AP_Bearers-SubjectToStatusTransferList.c | 2 +- ...S1AP_Bearers-SubjectToStatusTransferList.h | 2 +- lib/asn1c/s1ap/S1AP_BitRate.c | 2 +- lib/asn1c/s1ap/S1AP_BitRate.h | 3 +- lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.c | 2 +- lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.h | 3 +- .../s1ap/S1AP_BluetoothMeasConfigNameList.c | 2 +- .../s1ap/S1AP_BluetoothMeasConfigNameList.h | 2 +- .../S1AP_BluetoothMeasurementConfiguration.c | 2 +- .../S1AP_BluetoothMeasurementConfiguration.h | 2 +- lib/asn1c/s1ap/S1AP_BluetoothName.c | 2 +- lib/asn1c/s1ap/S1AP_BluetoothName.h | 3 +- .../s1ap/S1AP_BroadcastCancelledAreaList.c | 2 +- .../s1ap/S1AP_BroadcastCancelledAreaList.h | 2 +- .../s1ap/S1AP_BroadcastCompletedAreaList.c | 2 +- .../s1ap/S1AP_BroadcastCompletedAreaList.h | 2 +- lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.c | 2 +- lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.h | 3 +- .../s1ap/S1AP_CE-mode-B-SupportIndicator.c | 2 +- .../s1ap/S1AP_CE-mode-B-SupportIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_CELevel.c | 2 +- lib/asn1c/s1ap/S1AP_CELevel.h | 3 +- lib/asn1c/s1ap/S1AP_CGI.c | 2 +- lib/asn1c/s1ap/S1AP_CGI.h | 2 +- lib/asn1c/s1ap/S1AP_CI.c | 2 +- lib/asn1c/s1ap/S1AP_CI.h | 3 +- lib/asn1c/s1ap/S1AP_CNDomain.c | 2 +- lib/asn1c/s1ap/S1AP_CNDomain.h | 3 +- lib/asn1c/s1ap/S1AP_CNType.c | 2 +- lib/asn1c/s1ap/S1AP_CNType.h | 3 +- lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CNTypeRestrictions.c | 2 +- lib/asn1c/s1ap/S1AP_CNTypeRestrictions.h | 2 +- lib/asn1c/s1ap/S1AP_COUNTValueExtended.c | 2 +- lib/asn1c/s1ap/S1AP_COUNTValueExtended.h | 2 +- lib/asn1c/s1ap/S1AP_COUNTvalue.c | 2 +- lib/asn1c/s1ap/S1AP_COUNTvalue.h | 2 +- .../s1ap/S1AP_COUNTvaluePDCP-SNlength18.c | 2 +- .../s1ap/S1AP_COUNTvaluePDCP-SNlength18.h | 2 +- lib/asn1c/s1ap/S1AP_CSFallbackIndicator.c | 2 +- lib/asn1c/s1ap/S1AP_CSFallbackIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_CSG-Id.c | 2 +- lib/asn1c/s1ap/S1AP_CSG-Id.h | 3 +- lib/asn1c/s1ap/S1AP_CSG-IdList-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CSG-IdList-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CSG-IdList.c | 2 +- lib/asn1c/s1ap/S1AP_CSG-IdList.h | 2 +- lib/asn1c/s1ap/S1AP_CSGMembershipInfo.c | 2 +- lib/asn1c/s1ap/S1AP_CSGMembershipInfo.h | 2 +- lib/asn1c/s1ap/S1AP_CSGMembershipStatus.c | 2 +- lib/asn1c/s1ap/S1AP_CSGMembershipStatus.h | 3 +- lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinEAI.c | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinEAI.h | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinTAI.c | 2 +- lib/asn1c/s1ap/S1AP_CancelledCellinTAI.h | 2 +- lib/asn1c/s1ap/S1AP_Cause.c | 2 +- lib/asn1c/s1ap/S1AP_Cause.h | 2 +- lib/asn1c/s1ap/S1AP_CauseMisc.c | 2 +- lib/asn1c/s1ap/S1AP_CauseMisc.h | 3 +- lib/asn1c/s1ap/S1AP_CauseNas.c | 2 +- lib/asn1c/s1ap/S1AP_CauseNas.h | 3 +- lib/asn1c/s1ap/S1AP_CauseProtocol.c | 2 +- lib/asn1c/s1ap/S1AP_CauseProtocol.h | 3 +- lib/asn1c/s1ap/S1AP_CauseRadioNetwork.c | 2 +- lib/asn1c/s1ap/S1AP_CauseRadioNetwork.h | 3 +- lib/asn1c/s1ap/S1AP_CauseTransport.c | 2 +- lib/asn1c/s1ap/S1AP_CauseTransport.h | 3 +- .../s1ap/S1AP_Cdma2000HORequiredIndication.c | 2 +- .../s1ap/S1AP_Cdma2000HORequiredIndication.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.h | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000PDU.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000PDU.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000RATType.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000RATType.h | 3 +- lib/asn1c/s1ap/S1AP_Cdma2000SectorID.c | 2 +- lib/asn1c/s1ap/S1AP_Cdma2000SectorID.h | 3 +- lib/asn1c/s1ap/S1AP_Cell-Size.c | 2 +- lib/asn1c/s1ap/S1AP_Cell-Size.h | 3 +- lib/asn1c/s1ap/S1AP_CellAccessMode.c | 2 +- lib/asn1c/s1ap/S1AP_CellAccessMode.h | 3 +- lib/asn1c/s1ap/S1AP_CellBasedMDT.c | 2 +- lib/asn1c/s1ap/S1AP_CellBasedMDT.h | 2 +- lib/asn1c/s1ap/S1AP_CellBasedQMC.c | 2 +- lib/asn1c/s1ap/S1AP_CellBasedQMC.h | 2 +- lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CellID-Broadcast.c | 2 +- lib/asn1c/s1ap/S1AP_CellID-Broadcast.h | 2 +- lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CellID-Cancelled.c | 2 +- lib/asn1c/s1ap/S1AP_CellID-Cancelled.h | 2 +- lib/asn1c/s1ap/S1AP_CellIdListforMDT.c | 2 +- lib/asn1c/s1ap/S1AP_CellIdListforMDT.h | 2 +- lib/asn1c/s1ap/S1AP_CellIdListforQMC.c | 2 +- lib/asn1c/s1ap/S1AP_CellIdListforQMC.h | 2 +- ..._CellIdentifierAndCELevelForCECapableUEs.c | 2 +- ..._CellIdentifierAndCELevelForCECapableUEs.h | 2 +- lib/asn1c/s1ap/S1AP_CellIdentity.c | 2 +- lib/asn1c/s1ap/S1AP_CellIdentity.h | 3 +- lib/asn1c/s1ap/S1AP_CellTrafficTrace.c | 2 +- lib/asn1c/s1ap/S1AP_CellTrafficTrace.h | 2 +- lib/asn1c/s1ap/S1AP_CellType.c | 2 +- lib/asn1c/s1ap/S1AP_CellType.h | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinEAI.c | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinEAI.h | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.c | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.h | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinTAI.c | 2 +- lib/asn1c/s1ap/S1AP_CompletedCellinTAI.h | 2 +- .../S1AP_ConcurrentWarningMessageIndicator.c | 2 +- .../S1AP_ConcurrentWarningMessageIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_ConnectedengNBItem.c | 2 +- lib/asn1c/s1ap/S1AP_ConnectedengNBItem.h | 2 +- lib/asn1c/s1ap/S1AP_ConnectedengNBList.c | 2 +- lib/asn1c/s1ap/S1AP_ConnectedengNBList.h | 2 +- .../S1AP_ConnectionEstablishmentIndication.c | 2 +- .../S1AP_ConnectionEstablishmentIndication.h | 2 +- lib/asn1c/s1ap/S1AP_ContextatSource.c | 2 +- lib/asn1c/s1ap/S1AP_ContextatSource.h | 2 +- lib/asn1c/s1ap/S1AP_Correlation-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Correlation-ID.h | 3 +- lib/asn1c/s1ap/S1AP_Coverage-Level.c | 2 +- lib/asn1c/s1ap/S1AP_Coverage-Level.h | 3 +- lib/asn1c/s1ap/S1AP_Criticality.c | 2 +- lib/asn1c/s1ap/S1AP_Criticality.h | 3 +- .../S1AP_CriticalityDiagnostics-IE-Item.c | 2 +- .../S1AP_CriticalityDiagnostics-IE-Item.h | 2 +- .../S1AP_CriticalityDiagnostics-IE-List.c | 2 +- .../S1AP_CriticalityDiagnostics-IE-List.h | 2 +- lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.c | 2 +- lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.h | 2 +- lib/asn1c/s1ap/S1AP_DAPSRequestInfo.c | 2 +- lib/asn1c/s1ap/S1AP_DAPSRequestInfo.h | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfo.c | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfo.h | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.c | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.h | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.c | 2 +- lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.h | 2 +- lib/asn1c/s1ap/S1AP_DCN-ID.c | 2 +- lib/asn1c/s1ap/S1AP_DCN-ID.h | 3 +- .../s1ap/S1AP_DL-CP-SecurityInformation.c | 2 +- .../s1ap/S1AP_DL-CP-SecurityInformation.h | 2 +- lib/asn1c/s1ap/S1AP_DL-Forwarding.c | 2 +- lib/asn1c/s1ap/S1AP_DL-Forwarding.h | 3 +- lib/asn1c/s1ap/S1AP_DL-NAS-MAC.c | 2 +- lib/asn1c/s1ap/S1AP_DL-NAS-MAC.h | 3 +- lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.c | 2 +- lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.h | 2 +- .../s1ap/S1AP_DLNASPDUDeliveryAckRequest.c | 2 +- .../s1ap/S1AP_DLNASPDUDeliveryAckRequest.h | 3 +- .../s1ap/S1AP_Data-Forwarding-Not-Possible.c | 2 +- .../s1ap/S1AP_Data-Forwarding-Not-Possible.h | 3 +- lib/asn1c/s1ap/S1AP_DataCodingScheme.c | 2 +- lib/asn1c/s1ap/S1AP_DataCodingScheme.h | 3 +- lib/asn1c/s1ap/S1AP_DataSize.c | 2 +- lib/asn1c/s1ap/S1AP_DataSize.h | 3 +- lib/asn1c/s1ap/S1AP_DeactivateTrace.c | 2 +- lib/asn1c/s1ap/S1AP_DeactivateTrace.h | 2 +- ...S1AP_Direct-Forwarding-Path-Availability.c | 2 +- ...S1AP_Direct-Forwarding-Path-Availability.h | 3 +- lib/asn1c/s1ap/S1AP_DownlinkNASTransport.c | 2 +- lib/asn1c/s1ap/S1AP_DownlinkNASTransport.h | 2 +- ...1AP_DownlinkNonUEAssociatedLPPaTransport.c | 2 +- ...1AP_DownlinkNonUEAssociatedLPPaTransport.h | 2 +- .../s1ap/S1AP_DownlinkS1cdma2000tunnelling.c | 2 +- .../s1ap/S1AP_DownlinkS1cdma2000tunnelling.h | 2 +- .../S1AP_DownlinkUEAssociatedLPPaTransport.c | 2 +- .../S1AP_DownlinkUEAssociatedLPPaTransport.h | 2 +- lib/asn1c/s1ap/S1AP_E-RAB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_E-RAB-ID.h | 3 +- lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.h | 13 +- .../s1ap/S1AP_E-RAB-IE-ContainerPairList.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABAdmittedList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABAdmittedList.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.h | 2 +- .../S1AP_E-RABFailedToResumeItemResumeReq.c | 2 +- .../S1AP_E-RABFailedToResumeItemResumeReq.h | 2 +- .../S1AP_E-RABFailedToResumeItemResumeRes.c | 2 +- .../S1AP_E-RABFailedToResumeItemResumeRes.h | 2 +- .../S1AP_E-RABFailedToResumeListResumeReq.c | 2 +- .../S1AP_E-RABFailedToResumeListResumeReq.h | 3 +- .../S1AP_E-RABFailedToResumeListResumeRes.c | 2 +- .../S1AP_E-RABFailedToResumeListResumeRes.h | 3 +- .../S1AP_E-RABFailedToSetupItemHOReqAck.c | 2 +- .../S1AP_E-RABFailedToSetupItemHOReqAck.h | 2 +- .../S1AP_E-RABFailedtoSetupListHOReqAck.c | 2 +- .../S1AP_E-RABFailedtoSetupListHOReqAck.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABInformationList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABInformationList.h | 2 +- .../s1ap/S1AP_E-RABInformationListItem.c | 2 +- .../s1ap/S1AP_E-RABInformationListItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABList.h | 2 +- .../s1ap/S1AP_E-RABModificationConfirm.c | 2 +- .../s1ap/S1AP_E-RABModificationConfirm.h | 2 +- .../s1ap/S1AP_E-RABModificationIndication.c | 2 +- .../s1ap/S1AP_E-RABModificationIndication.h | 2 +- .../s1ap/S1AP_E-RABModifyItemBearerModConf.c | 2 +- .../s1ap/S1AP_E-RABModifyItemBearerModConf.h | 2 +- .../s1ap/S1AP_E-RABModifyItemBearerModRes.c | 2 +- .../s1ap/S1AP_E-RABModifyItemBearerModRes.h | 2 +- .../s1ap/S1AP_E-RABModifyListBearerModConf.c | 2 +- .../s1ap/S1AP_E-RABModifyListBearerModConf.h | 2 +- .../s1ap/S1AP_E-RABModifyListBearerModRes.c | 2 +- .../s1ap/S1AP_E-RABModifyListBearerModRes.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABModifyRequest.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABModifyRequest.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABModifyResponse.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABModifyResponse.h | 2 +- ...1AP_E-RABNotToBeModifiedItemBearerModInd.c | 2 +- ...1AP_E-RABNotToBeModifiedItemBearerModInd.h | 2 +- ...1AP_E-RABNotToBeModifiedListBearerModInd.c | 2 +- ...1AP_E-RABNotToBeModifiedListBearerModInd.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.h | 2 +- .../s1ap/S1AP_E-RABReleaseItemBearerRelComp.c | 2 +- .../s1ap/S1AP_E-RABReleaseItemBearerRelComp.h | 2 +- .../s1ap/S1AP_E-RABReleaseListBearerRelComp.c | 2 +- .../s1ap/S1AP_E-RABReleaseListBearerRelComp.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.h | 2 +- .../s1ap/S1AP_E-RABSetupItemBearerSURes.c | 2 +- .../s1ap/S1AP_E-RABSetupItemBearerSURes.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.h | 2 +- .../s1ap/S1AP_E-RABSetupListBearerSURes.c | 2 +- .../s1ap/S1AP_E-RABSetupListBearerSURes.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupRequest.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupRequest.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupResponse.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABSetupResponse.h | 2 +- .../S1AP_E-RABSubjecttoDataForwardingList.c | 2 +- .../S1AP_E-RABSubjecttoDataForwardingList.h | 3 +- .../S1AP_E-RABToBeModifiedItemBearerModInd.c | 2 +- .../S1AP_E-RABToBeModifiedItemBearerModInd.h | 2 +- .../S1AP_E-RABToBeModifiedItemBearerModReq.c | 2 +- .../S1AP_E-RABToBeModifiedItemBearerModReq.h | 2 +- .../S1AP_E-RABToBeModifiedListBearerModInd.c | 2 +- .../S1AP_E-RABToBeModifiedListBearerModInd.h | 3 +- .../S1AP_E-RABToBeModifiedListBearerModReq.c | 2 +- .../S1AP_E-RABToBeModifiedListBearerModReq.h | 2 +- .../s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.c | 2 +- .../s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.h | 2 +- .../s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.c | 2 +- .../s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.h | 2 +- .../s1ap/S1AP_E-RABToBeSetupListBearerSUReq.c | 2 +- .../s1ap/S1AP_E-RABToBeSetupListBearerSUReq.h | 2 +- .../s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.c | 2 +- .../s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.h | 3 +- lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.h | 2 +- lib/asn1c/s1ap/S1AP_E-RABUsageReportList.c | 2 +- lib/asn1c/s1ap/S1AP_E-RABUsageReportList.h | 2 +- lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.c | 2 +- lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.h | 3 +- lib/asn1c/s1ap/S1AP_EARFCN.c | 2 +- lib/asn1c/s1ap/S1AP_EARFCN.h | 3 +- lib/asn1c/s1ap/S1AP_ECGI-List.c | 2 +- lib/asn1c/s1ap/S1AP_ECGI-List.h | 2 +- lib/asn1c/s1ap/S1AP_ECGIList.c | 2 +- lib/asn1c/s1ap/S1AP_ECGIList.h | 2 +- lib/asn1c/s1ap/S1AP_ECGIListForRestart.c | 2 +- lib/asn1c/s1ap/S1AP_ECGIListForRestart.h | 2 +- lib/asn1c/s1ap/S1AP_EDT-Session.c | 2 +- lib/asn1c/s1ap/S1AP_EDT-Session.h | 3 +- .../s1ap/S1AP_EN-DCSONConfigurationTransfer.c | 2 +- .../s1ap/S1AP_EN-DCSONConfigurationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.c | 2 +- lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.h | 2 +- .../s1ap/S1AP_EN-DCSONeNBIdentification.c | 2 +- .../s1ap/S1AP_EN-DCSONeNBIdentification.h | 2 +- .../s1ap/S1AP_EN-DCSONengNBIdentification.c | 2 +- .../s1ap/S1AP_EN-DCSONengNBIdentification.h | 2 +- lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.c | 2 +- lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.h | 2 +- .../s1ap/S1AP_EN-DCTransferTypeRequest.c | 2 +- .../s1ap/S1AP_EN-DCTransferTypeRequest.h | 2 +- ...EarlyStatusTransfer-TransparentContainer.c | 2 +- ...EarlyStatusTransfer-TransparentContainer.h | 2 +- lib/asn1c/s1ap/S1AP_ENB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_ENB-ID.h | 2 +- ..._ENB-StatusTransfer-TransparentContainer.c | 2 +- ..._ENB-StatusTransfer-TransparentContainer.h | 2 +- lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.c | 2 +- lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.h | 3 +- .../s1ap/S1AP_ENBCPRelocationIndication.c | 2 +- .../s1ap/S1AP_ENBCPRelocationIndication.h | 2 +- .../s1ap/S1AP_ENBConfigurationTransfer.c | 2 +- .../s1ap/S1AP_ENBConfigurationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.c | 2 +- lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.h | 2 +- .../S1AP_ENBConfigurationUpdateAcknowledge.c | 2 +- .../S1AP_ENBConfigurationUpdateAcknowledge.h | 2 +- .../s1ap/S1AP_ENBConfigurationUpdateFailure.c | 2 +- .../s1ap/S1AP_ENBConfigurationUpdateFailure.h | 2 +- .../s1ap/S1AP_ENBDirectInformationTransfer.c | 2 +- .../s1ap/S1AP_ENBDirectInformationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.h | 2 +- ...1AP_ENBIndirectX2TransportLayerAddresses.c | 2 +- ...1AP_ENBIndirectX2TransportLayerAddresses.h | 2 +- lib/asn1c/s1ap/S1AP_ENBStatusTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_ENBStatusTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.c | 2 +- lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.h | 2 +- lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.c | 2 +- lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.h | 2 +- lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.c | 2 +- lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.h | 2 +- lib/asn1c/s1ap/S1AP_ENBX2TLAs.c | 2 +- lib/asn1c/s1ap/S1AP_ENBX2TLAs.h | 2 +- lib/asn1c/s1ap/S1AP_ENBname.c | 2 +- lib/asn1c/s1ap/S1AP_ENBname.h | 3 +- lib/asn1c/s1ap/S1AP_EPLMNs.c | 2 +- lib/asn1c/s1ap/S1AP_EPLMNs.h | 2 +- lib/asn1c/s1ap/S1AP_EUTRAN-CGI.c | 2 +- lib/asn1c/s1ap/S1AP_EUTRAN-CGI.h | 2 +- .../S1AP_EUTRANRoundTripDelayEstimationInfo.c | 2 +- .../S1AP_EUTRANRoundTripDelayEstimationInfo.h | 3 +- lib/asn1c/s1ap/S1AP_EXTERNAL.c | 2 +- lib/asn1c/s1ap/S1AP_EXTERNAL.h | 2 +- .../S1AP_EmergencyAreaID-Broadcast-Item.c | 2 +- .../S1AP_EmergencyAreaID-Broadcast-Item.h | 2 +- .../s1ap/S1AP_EmergencyAreaID-Broadcast.c | 2 +- .../s1ap/S1AP_EmergencyAreaID-Broadcast.h | 2 +- .../S1AP_EmergencyAreaID-Cancelled-Item.c | 2 +- .../S1AP_EmergencyAreaID-Cancelled-Item.h | 2 +- .../s1ap/S1AP_EmergencyAreaID-Cancelled.c | 2 +- .../s1ap/S1AP_EmergencyAreaID-Cancelled.h | 2 +- lib/asn1c/s1ap/S1AP_EmergencyAreaID.c | 2 +- lib/asn1c/s1ap/S1AP_EmergencyAreaID.h | 3 +- lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.c | 2 +- lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.h | 2 +- .../s1ap/S1AP_EmergencyAreaIDListForRestart.c | 2 +- .../s1ap/S1AP_EmergencyAreaIDListForRestart.h | 2 +- lib/asn1c/s1ap/S1AP_EmergencyIndicator.c | 2 +- lib/asn1c/s1ap/S1AP_EmergencyIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_En-gNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_En-gNB-ID.h | 3 +- lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.c | 2 +- lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.h | 3 +- lib/asn1c/s1ap/S1AP_EndIndication.c | 2 +- lib/asn1c/s1ap/S1AP_EndIndication.h | 3 +- .../s1ap/S1AP_EnhancedCoverageRestricted.c | 2 +- .../s1ap/S1AP_EnhancedCoverageRestricted.h | 3 +- lib/asn1c/s1ap/S1AP_ErrorIndication.c | 2 +- lib/asn1c/s1ap/S1AP_ErrorIndication.h | 2 +- lib/asn1c/s1ap/S1AP_Ethernet-Type.c | 2 +- lib/asn1c/s1ap/S1AP_Ethernet-Type.h | 3 +- lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.c | 2 +- lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.h | 2 +- lib/asn1c/s1ap/S1AP_EventTrigger.c | 2 +- lib/asn1c/s1ap/S1AP_EventTrigger.h | 2 +- lib/asn1c/s1ap/S1AP_EventType.c | 2 +- lib/asn1c/s1ap/S1AP_EventType.h | 3 +- lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.c | 2 +- lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.h | 3 +- lib/asn1c/s1ap/S1AP_ExpectedHOInterval.c | 2 +- lib/asn1c/s1ap/S1AP_ExpectedHOInterval.h | 3 +- lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.c | 2 +- lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.h | 3 +- .../s1ap/S1AP_ExpectedUEActivityBehaviour.c | 2 +- .../s1ap/S1AP_ExpectedUEActivityBehaviour.h | 2 +- lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.c | 2 +- lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.h | 2 +- .../s1ap/S1AP_Extended-UEIdentityIndexValue.c | 2 +- .../s1ap/S1AP_Extended-UEIdentityIndexValue.h | 3 +- lib/asn1c/s1ap/S1AP_ExtendedBitRate.c | 2 +- lib/asn1c/s1ap/S1AP_ExtendedBitRate.h | 3 +- lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.c | 2 +- lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.h | 3 +- .../s1ap/S1AP_ExtendedRepetitionPeriod.c | 2 +- .../s1ap/S1AP_ExtendedRepetitionPeriod.h | 3 +- lib/asn1c/s1ap/S1AP_FiveGSTAC.c | 2 +- lib/asn1c/s1ap/S1AP_FiveGSTAC.h | 3 +- lib/asn1c/s1ap/S1AP_FiveGSTAI.c | 2 +- lib/asn1c/s1ap/S1AP_FiveGSTAI.h | 2 +- lib/asn1c/s1ap/S1AP_FiveQI.c | 2 +- lib/asn1c/s1ap/S1AP_FiveQI.h | 3 +- lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.h | 3 +- lib/asn1c/s1ap/S1AP_ForbiddenLACs.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenLACs.h | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.h | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenLAs.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenLAs.h | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTACs.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTACs.h | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.h | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTAs.c | 2 +- lib/asn1c/s1ap/S1AP_ForbiddenTAs.h | 2 +- lib/asn1c/s1ap/S1AP_GBR-QosInformation.c | 2 +- lib/asn1c/s1ap/S1AP_GBR-QosInformation.h | 2 +- lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.c | 2 +- lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.h | 2 +- lib/asn1c/s1ap/S1AP_GNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_GNB-ID.h | 3 +- lib/asn1c/s1ap/S1AP_GNB-Identity.c | 2 +- lib/asn1c/s1ap/S1AP_GNB-Identity.h | 2 +- lib/asn1c/s1ap/S1AP_GNB.c | 2 +- lib/asn1c/s1ap/S1AP_GNB.h | 2 +- lib/asn1c/s1ap/S1AP_GTP-TEID.c | 2 +- lib/asn1c/s1ap/S1AP_GTP-TEID.h | 3 +- lib/asn1c/s1ap/S1AP_GUMMEI.c | 2 +- lib/asn1c/s1ap/S1AP_GUMMEI.h | 2 +- lib/asn1c/s1ap/S1AP_GUMMEIList.c | 2 +- lib/asn1c/s1ap/S1AP_GUMMEIList.h | 2 +- lib/asn1c/s1ap/S1AP_GUMMEIType.c | 2 +- lib/asn1c/s1ap/S1AP_GUMMEIType.h | 3 +- .../s1ap/S1AP_GWContextReleaseIndication.c | 2 +- .../s1ap/S1AP_GWContextReleaseIndication.h | 3 +- lib/asn1c/s1ap/S1AP_Global-ENB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Global-ENB-ID.h | 2 +- lib/asn1c/s1ap/S1AP_Global-GNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Global-GNB-ID.h | 2 +- lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.h | 2 +- lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.h | 2 +- lib/asn1c/s1ap/S1AP_HFN.c | 2 +- lib/asn1c/s1ap/S1AP_HFN.h | 3 +- lib/asn1c/s1ap/S1AP_HFNModified.c | 2 +- lib/asn1c/s1ap/S1AP_HFNModified.h | 3 +- lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.c | 2 +- lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.h | 3 +- lib/asn1c/s1ap/S1AP_HandoverCancel.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverCancel.h | 2 +- .../s1ap/S1AP_HandoverCancelAcknowledge.c | 2 +- .../s1ap/S1AP_HandoverCancelAcknowledge.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverCommand.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverCommand.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverFailure.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverFailure.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverFlag.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverFlag.h | 3 +- lib/asn1c/s1ap/S1AP_HandoverNotify.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverNotify.h | 2 +- .../s1ap/S1AP_HandoverPreparationFailure.c | 2 +- .../s1ap/S1AP_HandoverPreparationFailure.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverRequest.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverRequest.h | 2 +- .../s1ap/S1AP_HandoverRequestAcknowledge.c | 2 +- .../s1ap/S1AP_HandoverRequestAcknowledge.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverRequired.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverRequired.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverRestrictionList.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverRestrictionList.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverSuccess.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverSuccess.h | 2 +- lib/asn1c/s1ap/S1AP_HandoverType.c | 2 +- lib/asn1c/s1ap/S1AP_HandoverType.h | 3 +- lib/asn1c/s1ap/S1AP_Hysteresis.c | 2 +- lib/asn1c/s1ap/S1AP_Hysteresis.h | 3 +- lib/asn1c/s1ap/S1AP_IAB-Authorized.c | 2 +- lib/asn1c/s1ap/S1AP_IAB-Authorized.h | 3 +- lib/asn1c/s1ap/S1AP_IAB-Node-Indication.c | 2 +- lib/asn1c/s1ap/S1AP_IAB-Node-Indication.h | 3 +- lib/asn1c/s1ap/S1AP_IAB-Supported.c | 2 +- lib/asn1c/s1ap/S1AP_IAB-Supported.h | 3 +- lib/asn1c/s1ap/S1AP_IMSI.c | 2 +- lib/asn1c/s1ap/S1AP_IMSI.h | 3 +- .../s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.c | 2 +- .../s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.h | 3 +- lib/asn1c/s1ap/S1AP_ImmediateMDT.c | 2 +- lib/asn1c/s1ap/S1AP_ImmediateMDT.h | 2 +- ...mationOnRecommendedCellsAndENBsForPaging.c | 2 +- ...mationOnRecommendedCellsAndENBsForPaging.h | 2 +- .../s1ap/S1AP_InitialContextSetupFailure.c | 2 +- .../s1ap/S1AP_InitialContextSetupFailure.h | 2 +- .../s1ap/S1AP_InitialContextSetupRequest.c | 2 +- .../s1ap/S1AP_InitialContextSetupRequest.h | 2 +- .../s1ap/S1AP_InitialContextSetupResponse.c | 2 +- .../s1ap/S1AP_InitialContextSetupResponse.h | 2 +- lib/asn1c/s1ap/S1AP_InitialUEMessage.c | 2 +- lib/asn1c/s1ap/S1AP_InitialUEMessage.h | 2 +- lib/asn1c/s1ap/S1AP_InitiatingMessage.c | 2 +- lib/asn1c/s1ap/S1AP_InitiatingMessage.h | 2 +- .../s1ap/S1AP_IntegrityProtectionAlgorithms.c | 2 +- .../s1ap/S1AP_IntegrityProtectionAlgorithms.h | 3 +- .../s1ap/S1AP_IntegrityProtectionIndication.c | 2 +- .../s1ap/S1AP_IntegrityProtectionIndication.h | 3 +- .../s1ap/S1AP_IntegrityProtectionResult.c | 2 +- .../s1ap/S1AP_IntegrityProtectionResult.h | 3 +- .../S1AP_IntendedNumberOfPagingAttempts.c | 2 +- .../S1AP_IntendedNumberOfPagingAttempts.h | 3 +- ...S1AP_Inter-SystemInformationTransferType.c | 2 +- ...S1AP_Inter-SystemInformationTransferType.h | 2 +- .../s1ap/S1AP_InterSystemMeasurementItem.c | 2 +- .../s1ap/S1AP_InterSystemMeasurementItem.h | 2 +- .../s1ap/S1AP_InterSystemMeasurementList.c | 2 +- .../s1ap/S1AP_InterSystemMeasurementList.h | 2 +- .../S1AP_InterSystemMeasurementParameters.c | 2 +- .../S1AP_InterSystemMeasurementParameters.h | 2 +- lib/asn1c/s1ap/S1AP_InterfacesToTrace.c | 2 +- lib/asn1c/s1ap/S1AP_InterfacesToTrace.h | 3 +- ...S1AP_IntersystemMeasurementConfiguration.c | 2 +- ...S1AP_IntersystemMeasurementConfiguration.h | 2 +- ...S1AP_IntersystemSONConfigurationTransfer.c | 2 +- ...S1AP_IntersystemSONConfigurationTransfer.h | 3 +- lib/asn1c/s1ap/S1AP_KillAllWarningMessages.c | 2 +- lib/asn1c/s1ap/S1AP_KillAllWarningMessages.h | 3 +- lib/asn1c/s1ap/S1AP_KillRequest.c | 2 +- lib/asn1c/s1ap/S1AP_KillRequest.h | 2 +- lib/asn1c/s1ap/S1AP_KillResponse.c | 2 +- lib/asn1c/s1ap/S1AP_KillResponse.h | 2 +- lib/asn1c/s1ap/S1AP_L3-Information.c | 2 +- lib/asn1c/s1ap/S1AP_L3-Information.h | 3 +- lib/asn1c/s1ap/S1AP_LAC.c | 2 +- lib/asn1c/s1ap/S1AP_LAC.h | 3 +- lib/asn1c/s1ap/S1AP_LAI.c | 2 +- lib/asn1c/s1ap/S1AP_LAI.h | 2 +- lib/asn1c/s1ap/S1AP_LHN-ID.c | 2 +- lib/asn1c/s1ap/S1AP_LHN-ID.h | 3 +- lib/asn1c/s1ap/S1AP_LPPa-PDU.c | 2 +- lib/asn1c/s1ap/S1AP_LPPa-PDU.h | 3 +- lib/asn1c/s1ap/S1AP_LTE-M-Indication.c | 2 +- lib/asn1c/s1ap/S1AP_LTE-M-Indication.h | 3 +- lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.c | 2 +- lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.h | 2 +- lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.c | 2 +- lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.h | 2 +- .../S1AP_LastVisitedEUTRANCellInformation.c | 2 +- .../S1AP_LastVisitedEUTRANCellInformation.h | 2 +- .../S1AP_LastVisitedGERANCellInformation.c | 2 +- .../S1AP_LastVisitedGERANCellInformation.h | 2 +- .../S1AP_LastVisitedNGRANCellInformation.c | 2 +- .../S1AP_LastVisitedNGRANCellInformation.h | 3 +- .../s1ap/S1AP_LastVisitedPSCellInformation.c | 2 +- .../s1ap/S1AP_LastVisitedPSCellInformation.h | 2 +- lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.c | 2 +- lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.h | 2 +- .../S1AP_LastVisitedUTRANCellInformation.c | 2 +- .../S1AP_LastVisitedUTRANCellInformation.h | 3 +- lib/asn1c/s1ap/S1AP_Links-to-log.c | 2 +- lib/asn1c/s1ap/S1AP_Links-to-log.h | 3 +- .../s1ap/S1AP_ListeningSubframePattern.c | 2 +- .../s1ap/S1AP_ListeningSubframePattern.h | 2 +- lib/asn1c/s1ap/S1AP_LocationReport.c | 2 +- lib/asn1c/s1ap/S1AP_LocationReport.h | 2 +- .../s1ap/S1AP_LocationReportingControl.c | 2 +- .../s1ap/S1AP_LocationReportingControl.h | 2 +- .../S1AP_LocationReportingFailureIndication.c | 2 +- .../S1AP_LocationReportingFailureIndication.h | 2 +- lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.c | 2 +- lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.h | 2 +- lib/asn1c/s1ap/S1AP_LoggedMDT.c | 2 +- lib/asn1c/s1ap/S1AP_LoggedMDT.h | 2 +- lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.c | 2 +- lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.h | 2 +- lib/asn1c/s1ap/S1AP_LoggingDuration.c | 2 +- lib/asn1c/s1ap/S1AP_LoggingDuration.h | 3 +- lib/asn1c/s1ap/S1AP_LoggingInterval.c | 2 +- lib/asn1c/s1ap/S1AP_LoggingInterval.h | 3 +- lib/asn1c/s1ap/S1AP_M-TMSI.c | 2 +- lib/asn1c/s1ap/S1AP_M-TMSI.h | 3 +- lib/asn1c/s1ap/S1AP_M1PeriodicReporting.c | 2 +- lib/asn1c/s1ap/S1AP_M1PeriodicReporting.h | 2 +- lib/asn1c/s1ap/S1AP_M1ReportingTrigger.c | 2 +- lib/asn1c/s1ap/S1AP_M1ReportingTrigger.h | 3 +- lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.c | 2 +- lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.h | 2 +- lib/asn1c/s1ap/S1AP_M3Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_M3Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_M3period.c | 2 +- lib/asn1c/s1ap/S1AP_M3period.h | 3 +- lib/asn1c/s1ap/S1AP_M4Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_M4Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_M4period.c | 2 +- lib/asn1c/s1ap/S1AP_M4period.h | 3 +- lib/asn1c/s1ap/S1AP_M5Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_M5Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_M5period.c | 2 +- lib/asn1c/s1ap/S1AP_M5period.h | 3 +- lib/asn1c/s1ap/S1AP_M6Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_M6Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_M6delay-threshold.c | 2 +- lib/asn1c/s1ap/S1AP_M6delay-threshold.h | 3 +- lib/asn1c/s1ap/S1AP_M6report-Interval.c | 2 +- lib/asn1c/s1ap/S1AP_M6report-Interval.h | 3 +- lib/asn1c/s1ap/S1AP_M7Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_M7Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_M7period.c | 2 +- lib/asn1c/s1ap/S1AP_M7period.h | 3 +- lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.c | 2 +- lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.h | 2 +- lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.c | 2 +- lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.h | 2 +- lib/asn1c/s1ap/S1AP_MDT-Activation.c | 2 +- lib/asn1c/s1ap/S1AP_MDT-Activation.h | 3 +- lib/asn1c/s1ap/S1AP_MDT-Configuration.c | 2 +- lib/asn1c/s1ap/S1AP_MDT-Configuration.h | 2 +- lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.c | 2 +- lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.h | 3 +- lib/asn1c/s1ap/S1AP_MDT-Location-Info.c | 2 +- lib/asn1c/s1ap/S1AP_MDT-Location-Info.h | 3 +- lib/asn1c/s1ap/S1AP_MDTMode-Extension.c | 2 +- lib/asn1c/s1ap/S1AP_MDTMode-Extension.h | 3 +- lib/asn1c/s1ap/S1AP_MDTMode.c | 2 +- lib/asn1c/s1ap/S1AP_MDTMode.h | 2 +- lib/asn1c/s1ap/S1AP_MDTPLMNList.c | 2 +- lib/asn1c/s1ap/S1AP_MDTPLMNList.h | 2 +- lib/asn1c/s1ap/S1AP_MME-Code.c | 2 +- lib/asn1c/s1ap/S1AP_MME-Code.h | 3 +- lib/asn1c/s1ap/S1AP_MME-Group-ID.c | 2 +- lib/asn1c/s1ap/S1AP_MME-Group-ID.h | 3 +- lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.c | 2 +- lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.h | 3 +- .../s1ap/S1AP_MMECPRelocationIndication.c | 2 +- .../s1ap/S1AP_MMECPRelocationIndication.h | 2 +- .../s1ap/S1AP_MMEConfigurationTransfer.c | 2 +- .../s1ap/S1AP_MMEConfigurationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.c | 2 +- lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.h | 2 +- .../S1AP_MMEConfigurationUpdateAcknowledge.c | 2 +- .../S1AP_MMEConfigurationUpdateAcknowledge.h | 2 +- .../s1ap/S1AP_MMEConfigurationUpdateFailure.c | 2 +- .../s1ap/S1AP_MMEConfigurationUpdateFailure.h | 2 +- .../s1ap/S1AP_MMEDirectInformationTransfer.c | 2 +- .../s1ap/S1AP_MMEDirectInformationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_MMEPagingTarget.c | 2 +- lib/asn1c/s1ap/S1AP_MMEPagingTarget.h | 2 +- .../s1ap/S1AP_MMERelaySupportIndicator.c | 2 +- .../s1ap/S1AP_MMERelaySupportIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_MMEStatusTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_MMEStatusTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_MMEname.c | 2 +- lib/asn1c/s1ap/S1AP_MMEname.h | 3 +- lib/asn1c/s1ap/S1AP_MSClassmark2.c | 2 +- lib/asn1c/s1ap/S1AP_MSClassmark2.h | 3 +- lib/asn1c/s1ap/S1AP_MSClassmark3.c | 2 +- lib/asn1c/s1ap/S1AP_MSClassmark3.h | 3 +- .../s1ap/S1AP_ManagementBasedMDTAllowed.c | 2 +- .../s1ap/S1AP_ManagementBasedMDTAllowed.h | 3 +- lib/asn1c/s1ap/S1AP_Masked-IMEISV.c | 2 +- lib/asn1c/s1ap/S1AP_Masked-IMEISV.h | 3 +- lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.c | 2 +- lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.h | 2 +- .../S1AP_MeasurementThresholdL1LoggedMDT.c | 2 +- .../S1AP_MeasurementThresholdL1LoggedMDT.h | 2 +- lib/asn1c/s1ap/S1AP_MeasurementsToActivate.c | 2 +- lib/asn1c/s1ap/S1AP_MeasurementsToActivate.h | 3 +- lib/asn1c/s1ap/S1AP_MessageIdentifier.c | 2 +- lib/asn1c/s1ap/S1AP_MessageIdentifier.h | 3 +- lib/asn1c/s1ap/S1AP_MobilityInformation.c | 2 +- lib/asn1c/s1ap/S1AP_MobilityInformation.h | 3 +- .../s1ap/S1AP_MutingAvailabilityIndication.c | 2 +- .../s1ap/S1AP_MutingAvailabilityIndication.h | 3 +- .../s1ap/S1AP_MutingPatternInformation.c | 2 +- .../s1ap/S1AP_MutingPatternInformation.h | 2 +- lib/asn1c/s1ap/S1AP_NAS-PDU.c | 2 +- lib/asn1c/s1ap/S1AP_NAS-PDU.h | 3 +- lib/asn1c/s1ap/S1AP_NASDeliveryIndication.c | 2 +- lib/asn1c/s1ap/S1AP_NASDeliveryIndication.h | 2 +- .../s1ap/S1AP_NASNonDeliveryIndication.c | 2 +- .../s1ap/S1AP_NASNonDeliveryIndication.h | 2 +- .../S1AP_NASSecurityParametersfromE-UTRAN.c | 2 +- .../S1AP_NASSecurityParametersfromE-UTRAN.h | 3 +- .../S1AP_NASSecurityParameterstoE-UTRAN.c | 2 +- .../S1AP_NASSecurityParameterstoE-UTRAN.h | 3 +- lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.c | 2 +- lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.h | 3 +- .../s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.c | 2 +- .../s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.h | 3 +- .../s1ap/S1AP_NB-IoT-Paging-eDRXInformation.c | 2 +- .../s1ap/S1AP_NB-IoT-Paging-eDRXInformation.h | 2 +- lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.c | 2 +- lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.h | 3 +- lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.c | 2 +- lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.h | 3 +- .../s1ap/S1AP_NB-IoT-RLF-Report-Container.c | 2 +- .../s1ap/S1AP_NB-IoT-RLF-Report-Container.h | 3 +- .../s1ap/S1AP_NB-IoT-UEIdentityIndexValue.c | 2 +- .../s1ap/S1AP_NB-IoT-UEIdentityIndexValue.h | 3 +- lib/asn1c/s1ap/S1AP_NG-eNB.c | 2 +- lib/asn1c/s1ap/S1AP_NG-eNB.h | 2 +- lib/asn1c/s1ap/S1AP_NR-CGI.c | 2 +- lib/asn1c/s1ap/S1AP_NR-CGI.h | 2 +- lib/asn1c/s1ap/S1AP_NRCellIdentity.c | 2 +- lib/asn1c/s1ap/S1AP_NRCellIdentity.h | 3 +- .../s1ap/S1AP_NRUESecurityCapabilities.c | 2 +- .../s1ap/S1AP_NRUESecurityCapabilities.h | 2 +- ...S1AP_NRUESidelinkAggregateMaximumBitrate.c | 2 +- ...S1AP_NRUESidelinkAggregateMaximumBitrate.h | 2 +- lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.c | 2 +- lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.h | 2 +- lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.c | 2 +- lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.h | 3 +- .../S1AP_NRintegrityProtectionAlgorithms.c | 2 +- .../S1AP_NRintegrityProtectionAlgorithms.h | 3 +- lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.c | 2 +- lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.h | 3 +- .../S1AP_NRrestrictioninEPSasSecondaryRAT.c | 2 +- .../S1AP_NRrestrictioninEPSasSecondaryRAT.h | 3 +- lib/asn1c/s1ap/S1AP_NextPagingAreaScope.c | 2 +- lib/asn1c/s1ap/S1AP_NextPagingAreaScope.h | 3 +- lib/asn1c/s1ap/S1AP_NotifySourceeNB.c | 2 +- lib/asn1c/s1ap/S1AP_NotifySourceeNB.h | 3 +- lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.c | 2 +- lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.h | 3 +- .../s1ap/S1AP_NumberofBroadcastRequest.c | 2 +- .../s1ap/S1AP_NumberofBroadcastRequest.h | 3 +- .../s1ap/S1AP_OldBSS-ToNewBSS-Information.c | 2 +- .../s1ap/S1AP_OldBSS-ToNewBSS-Information.h | 3 +- lib/asn1c/s1ap/S1AP_OverloadAction.c | 2 +- lib/asn1c/s1ap/S1AP_OverloadAction.h | 3 +- lib/asn1c/s1ap/S1AP_OverloadResponse.c | 2 +- lib/asn1c/s1ap/S1AP_OverloadResponse.h | 2 +- lib/asn1c/s1ap/S1AP_OverloadStart.c | 2 +- lib/asn1c/s1ap/S1AP_OverloadStart.h | 2 +- lib/asn1c/s1ap/S1AP_OverloadStop.c | 2 +- lib/asn1c/s1ap/S1AP_OverloadStop.h | 2 +- lib/asn1c/s1ap/S1AP_PC5FlowBitRates.c | 2 +- lib/asn1c/s1ap/S1AP_PC5FlowBitRates.h | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.c | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.h | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSFlowList.c | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSFlowList.h | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSParameters.c | 2 +- lib/asn1c/s1ap/S1AP_PC5QoSParameters.h | 2 +- lib/asn1c/s1ap/S1AP_PDCP-SN.c | 2 +- lib/asn1c/s1ap/S1AP_PDCP-SN.h | 3 +- lib/asn1c/s1ap/S1AP_PDCP-SNExtended.c | 2 +- lib/asn1c/s1ap/S1AP_PDCP-SNExtended.h | 3 +- lib/asn1c/s1ap/S1AP_PDCP-SNlength18.c | 2 +- lib/asn1c/s1ap/S1AP_PDCP-SNlength18.h | 3 +- lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.c | 2 +- lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.h | 2 +- lib/asn1c/s1ap/S1AP_PLMNListforQMC.c | 2 +- lib/asn1c/s1ap/S1AP_PLMNListforQMC.h | 2 +- lib/asn1c/s1ap/S1AP_PLMNidentity.c | 2 +- lib/asn1c/s1ap/S1AP_PLMNidentity.h | 3 +- lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.c | 2 +- lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.h | 3 +- lib/asn1c/s1ap/S1AP_PSCellInformation.c | 2 +- lib/asn1c/s1ap/S1AP_PSCellInformation.h | 2 +- lib/asn1c/s1ap/S1AP_PWSFailureIndication.c | 2 +- lib/asn1c/s1ap/S1AP_PWSFailureIndication.h | 2 +- lib/asn1c/s1ap/S1AP_PWSRestartIndication.c | 2 +- lib/asn1c/s1ap/S1AP_PWSRestartIndication.h | 2 +- lib/asn1c/s1ap/S1AP_PWSfailedECGIList.c | 2 +- lib/asn1c/s1ap/S1AP_PWSfailedECGIList.h | 2 +- lib/asn1c/s1ap/S1AP_Packet-LossRate.c | 2 +- lib/asn1c/s1ap/S1AP_Packet-LossRate.h | 3 +- lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.c | 2 +- lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.h | 3 +- lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.c | 2 +- lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.h | 2 +- lib/asn1c/s1ap/S1AP_Paging.c | 2 +- lib/asn1c/s1ap/S1AP_Paging.h | 2 +- lib/asn1c/s1ap/S1AP_PagingAttemptCount.c | 2 +- lib/asn1c/s1ap/S1AP_PagingAttemptCount.h | 3 +- .../s1ap/S1AP_PagingAttemptInformation.c | 2 +- .../s1ap/S1AP_PagingAttemptInformation.h | 2 +- lib/asn1c/s1ap/S1AP_PagingCause.c | 2 +- lib/asn1c/s1ap/S1AP_PagingCause.h | 3 +- lib/asn1c/s1ap/S1AP_PagingDRX.c | 2 +- lib/asn1c/s1ap/S1AP_PagingDRX.h | 3 +- lib/asn1c/s1ap/S1AP_PagingPriority.c | 2 +- lib/asn1c/s1ap/S1AP_PagingPriority.h | 3 +- .../s1ap/S1AP_PagingProbabilityInformation.c | 2 +- .../s1ap/S1AP_PagingProbabilityInformation.h | 3 +- lib/asn1c/s1ap/S1AP_PagingTimeWindow.c | 2 +- lib/asn1c/s1ap/S1AP_PagingTimeWindow.h | 3 +- lib/asn1c/s1ap/S1AP_PathSwitchRequest.c | 2 +- lib/asn1c/s1ap/S1AP_PathSwitchRequest.h | 2 +- .../s1ap/S1AP_PathSwitchRequestAcknowledge.c | 2 +- .../s1ap/S1AP_PathSwitchRequestAcknowledge.h | 2 +- .../s1ap/S1AP_PathSwitchRequestFailure.c | 2 +- .../s1ap/S1AP_PathSwitchRequestFailure.h | 2 +- lib/asn1c/s1ap/S1AP_PedestrianUE.c | 2 +- lib/asn1c/s1ap/S1AP_PedestrianUE.h | 3 +- lib/asn1c/s1ap/S1AP_PendingDataIndication.c | 2 +- lib/asn1c/s1ap/S1AP_PendingDataIndication.h | 3 +- lib/asn1c/s1ap/S1AP_Port-Number.c | 2 +- lib/asn1c/s1ap/S1AP_Port-Number.h | 3 +- lib/asn1c/s1ap/S1AP_Pre-emptionCapability.c | 2 +- lib/asn1c/s1ap/S1AP_Pre-emptionCapability.h | 3 +- .../s1ap/S1AP_Pre-emptionVulnerability.c | 2 +- .../s1ap/S1AP_Pre-emptionVulnerability.h | 3 +- lib/asn1c/s1ap/S1AP_Presence.c | 2 +- lib/asn1c/s1ap/S1AP_Presence.h | 3 +- lib/asn1c/s1ap/S1AP_PriorityLevel.c | 2 +- lib/asn1c/s1ap/S1AP_PriorityLevel.h | 3 +- lib/asn1c/s1ap/S1AP_PrivacyIndicator.c | 2 +- lib/asn1c/s1ap/S1AP_PrivacyIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_PrivateIE-Container.c | 2 +- lib/asn1c/s1ap/S1AP_PrivateIE-Container.h | 2 +- lib/asn1c/s1ap/S1AP_PrivateIE-Field.c | 2 +- lib/asn1c/s1ap/S1AP_PrivateIE-Field.h | 2 +- lib/asn1c/s1ap/S1AP_PrivateIE-ID.c | 2 +- lib/asn1c/s1ap/S1AP_PrivateIE-ID.h | 2 +- lib/asn1c/s1ap/S1AP_PrivateMessage.c | 2 +- lib/asn1c/s1ap/S1AP_PrivateMessage.h | 2 +- lib/asn1c/s1ap/S1AP_ProSeAuthorized.c | 2 +- lib/asn1c/s1ap/S1AP_ProSeAuthorized.h | 2 +- .../s1ap/S1AP_ProSeDirectCommunication.c | 2 +- .../s1ap/S1AP_ProSeDirectCommunication.h | 3 +- lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.c | 2 +- lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.h | 3 +- .../s1ap/S1AP_ProSeUEtoNetworkRelaying.c | 2 +- .../s1ap/S1AP_ProSeUEtoNetworkRelaying.h | 3 +- lib/asn1c/s1ap/S1AP_ProcedureCode.c | 2 +- lib/asn1c/s1ap/S1AP_ProcedureCode.h | 3 +- .../S1AP_ProtocolError-IE-ContainerList.h | 2 +- .../s1ap/S1AP_ProtocolExtensionContainer.c | 2 +- .../s1ap/S1AP_ProtocolExtensionContainer.h | 2 +- lib/asn1c/s1ap/S1AP_ProtocolExtensionField.c | 2 +- lib/asn1c/s1ap/S1AP_ProtocolExtensionField.h | 2 +- lib/asn1c/s1ap/S1AP_ProtocolExtensionID.c | 2 +- lib/asn1c/s1ap/S1AP_ProtocolExtensionID.h | 3 +- lib/asn1c/s1ap/S1AP_ProtocolIE-Container.c | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-Container.h | 2 +- .../s1ap/S1AP_ProtocolIE-ContainerList.c | 2 +- .../s1ap/S1AP_ProtocolIE-ContainerList.h | 2 +- .../s1ap/S1AP_ProtocolIE-ContainerPair.h | 2 +- .../s1ap/S1AP_ProtocolIE-ContainerPairList.h | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-Field.c | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-Field.h | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-FieldPair.h | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-ID.c | 2 +- lib/asn1c/s1ap/S1AP_ProtocolIE-ID.h | 3 +- .../s1ap/S1AP_ProtocolIE-SingleContainer.c | 2 +- .../s1ap/S1AP_ProtocolIE-SingleContainer.h | 40 +-- lib/asn1c/s1ap/S1AP_QCI.c | 2 +- lib/asn1c/s1ap/S1AP_QCI.h | 3 +- lib/asn1c/s1ap/S1AP_RAC.c | 2 +- lib/asn1c/s1ap/S1AP_RAC.h | 3 +- lib/asn1c/s1ap/S1AP_RACSIndication.c | 2 +- lib/asn1c/s1ap/S1AP_RACSIndication.h | 3 +- lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.c | 2 +- lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.h | 3 +- lib/asn1c/s1ap/S1AP_RAT-Restrictions.c | 2 +- lib/asn1c/s1ap/S1AP_RAT-Restrictions.h | 2 +- lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.c | 2 +- lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.h | 2 +- lib/asn1c/s1ap/S1AP_RAT-Type.c | 2 +- lib/asn1c/s1ap/S1AP_RAT-Type.h | 3 +- lib/asn1c/s1ap/S1AP_RIMInformation.c | 2 +- lib/asn1c/s1ap/S1AP_RIMInformation.h | 3 +- lib/asn1c/s1ap/S1AP_RIMRoutingAddress.c | 2 +- lib/asn1c/s1ap/S1AP_RIMRoutingAddress.h | 2 +- lib/asn1c/s1ap/S1AP_RIMTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_RIMTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_RLFReportInformation.c | 2 +- lib/asn1c/s1ap/S1AP_RLFReportInformation.h | 2 +- lib/asn1c/s1ap/S1AP_RNC-ID.c | 2 +- lib/asn1c/s1ap/S1AP_RNC-ID.h | 3 +- lib/asn1c/s1ap/S1AP_RRC-Container.c | 2 +- lib/asn1c/s1ap/S1AP_RRC-Container.h | 3 +- lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.c | 2 +- lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.h | 3 +- lib/asn1c/s1ap/S1AP_Range.c | 2 +- lib/asn1c/s1ap/S1AP_Range.h | 3 +- .../S1AP_ReceiveStatusOfULPDCPSDUsExtended.c | 2 +- .../S1AP_ReceiveStatusOfULPDCPSDUsExtended.h | 3 +- ...ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c | 2 +- ...ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h | 3 +- .../s1ap/S1AP_ReceiveStatusofULPDCPSDUs.c | 2 +- .../s1ap/S1AP_ReceiveStatusofULPDCPSDUs.h | 3 +- lib/asn1c/s1ap/S1AP_RecommendedCellItem.c | 2 +- lib/asn1c/s1ap/S1AP_RecommendedCellItem.h | 2 +- lib/asn1c/s1ap/S1AP_RecommendedCellList.c | 2 +- lib/asn1c/s1ap/S1AP_RecommendedCellList.h | 2 +- .../s1ap/S1AP_RecommendedCellsForPaging.c | 2 +- .../s1ap/S1AP_RecommendedCellsForPaging.h | 2 +- lib/asn1c/s1ap/S1AP_RecommendedENBItem.c | 2 +- lib/asn1c/s1ap/S1AP_RecommendedENBItem.h | 2 +- lib/asn1c/s1ap/S1AP_RecommendedENBList.c | 2 +- lib/asn1c/s1ap/S1AP_RecommendedENBList.h | 2 +- .../s1ap/S1AP_RecommendedENBsForPaging.c | 2 +- .../s1ap/S1AP_RecommendedENBsForPaging.h | 2 +- lib/asn1c/s1ap/S1AP_RelativeMMECapacity.c | 2 +- lib/asn1c/s1ap/S1AP_RelativeMMECapacity.h | 3 +- lib/asn1c/s1ap/S1AP_RelayNode-Indicator.c | 2 +- lib/asn1c/s1ap/S1AP_RelayNode-Indicator.h | 3 +- lib/asn1c/s1ap/S1AP_RepetitionPeriod.c | 2 +- lib/asn1c/s1ap/S1AP_RepetitionPeriod.h | 3 +- lib/asn1c/s1ap/S1AP_ReportAmountMDT.c | 2 +- lib/asn1c/s1ap/S1AP_ReportAmountMDT.h | 3 +- lib/asn1c/s1ap/S1AP_ReportArea.c | 2 +- lib/asn1c/s1ap/S1AP_ReportArea.h | 3 +- lib/asn1c/s1ap/S1AP_ReportIntervalMDT.c | 2 +- lib/asn1c/s1ap/S1AP_ReportIntervalMDT.h | 3 +- lib/asn1c/s1ap/S1AP_RequestType.c | 2 +- lib/asn1c/s1ap/S1AP_RequestType.h | 2 +- .../s1ap/S1AP_RequestTypeAdditionalInfo.c | 2 +- .../s1ap/S1AP_RequestTypeAdditionalInfo.h | 3 +- lib/asn1c/s1ap/S1AP_RerouteNASRequest.c | 2 +- lib/asn1c/s1ap/S1AP_RerouteNASRequest.h | 2 +- lib/asn1c/s1ap/S1AP_Reset.c | 2 +- lib/asn1c/s1ap/S1AP_Reset.h | 2 +- lib/asn1c/s1ap/S1AP_ResetAcknowledge.c | 2 +- lib/asn1c/s1ap/S1AP_ResetAcknowledge.h | 2 +- lib/asn1c/s1ap/S1AP_ResetAll.c | 2 +- lib/asn1c/s1ap/S1AP_ResetAll.h | 3 +- lib/asn1c/s1ap/S1AP_ResetType.c | 2 +- lib/asn1c/s1ap/S1AP_ResetType.h | 2 +- lib/asn1c/s1ap/S1AP_RetrieveUEInformation.c | 2 +- lib/asn1c/s1ap/S1AP_RetrieveUEInformation.h | 2 +- lib/asn1c/s1ap/S1AP_Routing-ID.c | 2 +- lib/asn1c/s1ap/S1AP_Routing-ID.h | 3 +- lib/asn1c/s1ap/S1AP_S-TMSI.c | 2 +- lib/asn1c/s1ap/S1AP_S-TMSI.h | 2 +- lib/asn1c/s1ap/S1AP_S1AP-PDU.c | 2 +- lib/asn1c/s1ap/S1AP_S1AP-PDU.h | 2 +- lib/asn1c/s1ap/S1AP_S1SetupFailure.c | 2 +- lib/asn1c/s1ap/S1AP_S1SetupFailure.h | 2 +- lib/asn1c/s1ap/S1AP_S1SetupRequest.c | 2 +- lib/asn1c/s1ap/S1AP_S1SetupRequest.h | 2 +- lib/asn1c/s1ap/S1AP_S1SetupResponse.c | 2 +- lib/asn1c/s1ap/S1AP_S1SetupResponse.h | 2 +- .../s1ap/S1AP_SONConfigurationTransfer.c | 2 +- .../s1ap/S1AP_SONConfigurationTransfer.h | 2 +- .../s1ap/S1AP_SONInformation-Extension.c | 2 +- .../s1ap/S1AP_SONInformation-Extension.h | 3 +- lib/asn1c/s1ap/S1AP_SONInformation.c | 2 +- lib/asn1c/s1ap/S1AP_SONInformation.h | 2 +- lib/asn1c/s1ap/S1AP_SONInformationReply.c | 2 +- lib/asn1c/s1ap/S1AP_SONInformationReply.h | 2 +- lib/asn1c/s1ap/S1AP_SONInformationReport.c | 2 +- lib/asn1c/s1ap/S1AP_SONInformationReport.h | 2 +- lib/asn1c/s1ap/S1AP_SONInformationRequest.c | 2 +- lib/asn1c/s1ap/S1AP_SONInformationRequest.h | 3 +- lib/asn1c/s1ap/S1AP_SRVCCHOIndication.c | 2 +- lib/asn1c/s1ap/S1AP_SRVCCHOIndication.h | 3 +- .../s1ap/S1AP_SRVCCOperationNotPossible.c | 2 +- .../s1ap/S1AP_SRVCCOperationNotPossible.h | 3 +- lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.c | 2 +- lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.h | 3 +- .../s1ap/S1AP_ScheduledCommunicationTime.c | 2 +- .../s1ap/S1AP_ScheduledCommunicationTime.h | 2 +- .../s1ap/S1AP_SecondaryRATDataUsageReport.c | 2 +- .../s1ap/S1AP_SecondaryRATDataUsageReport.h | 2 +- .../S1AP_SecondaryRATDataUsageReportItem.c | 2 +- .../S1AP_SecondaryRATDataUsageReportItem.h | 2 +- .../S1AP_SecondaryRATDataUsageReportList.c | 2 +- .../S1AP_SecondaryRATDataUsageReportList.h | 2 +- .../s1ap/S1AP_SecondaryRATDataUsageRequest.c | 2 +- .../s1ap/S1AP_SecondaryRATDataUsageRequest.h | 3 +- lib/asn1c/s1ap/S1AP_SecondaryRATType.c | 2 +- lib/asn1c/s1ap/S1AP_SecondaryRATType.h | 3 +- lib/asn1c/s1ap/S1AP_SecurityContext.c | 2 +- lib/asn1c/s1ap/S1AP_SecurityContext.h | 2 +- lib/asn1c/s1ap/S1AP_SecurityIndication.c | 2 +- lib/asn1c/s1ap/S1AP_SecurityIndication.h | 2 +- lib/asn1c/s1ap/S1AP_SecurityKey.c | 2 +- lib/asn1c/s1ap/S1AP_SecurityKey.h | 3 +- lib/asn1c/s1ap/S1AP_SecurityResult.c | 2 +- lib/asn1c/s1ap/S1AP_SecurityResult.h | 2 +- lib/asn1c/s1ap/S1AP_SensorMeasConfig.c | 2 +- lib/asn1c/s1ap/S1AP_SensorMeasConfig.h | 3 +- .../s1ap/S1AP_SensorMeasConfigNameItem.c | 2 +- .../s1ap/S1AP_SensorMeasConfigNameItem.h | 2 +- .../s1ap/S1AP_SensorMeasConfigNameList.c | 2 +- .../s1ap/S1AP_SensorMeasConfigNameList.h | 2 +- .../S1AP_SensorMeasurementConfiguration.c | 2 +- .../S1AP_SensorMeasurementConfiguration.h | 2 +- lib/asn1c/s1ap/S1AP_SensorNameConfig.c | 2 +- lib/asn1c/s1ap/S1AP_SensorNameConfig.h | 2 +- lib/asn1c/s1ap/S1AP_SerialNumber.c | 2 +- lib/asn1c/s1ap/S1AP_SerialNumber.h | 3 +- lib/asn1c/s1ap/S1AP_ServedDCNs.c | 2 +- lib/asn1c/s1ap/S1AP_ServedDCNs.h | 2 +- lib/asn1c/s1ap/S1AP_ServedDCNsItem.c | 2 +- lib/asn1c/s1ap/S1AP_ServedDCNsItem.h | 2 +- lib/asn1c/s1ap/S1AP_ServedGUMMEIs.c | 2 +- lib/asn1c/s1ap/S1AP_ServedGUMMEIs.h | 2 +- lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.c | 2 +- lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.h | 2 +- lib/asn1c/s1ap/S1AP_ServedGroupIDs.c | 2 +- lib/asn1c/s1ap/S1AP_ServedGroupIDs.h | 2 +- lib/asn1c/s1ap/S1AP_ServedMMECs.c | 2 +- lib/asn1c/s1ap/S1AP_ServedMMECs.h | 2 +- lib/asn1c/s1ap/S1AP_ServedPLMNs.c | 2 +- lib/asn1c/s1ap/S1AP_ServedPLMNs.h | 2 +- lib/asn1c/s1ap/S1AP_ServiceType.c | 2 +- lib/asn1c/s1ap/S1AP_ServiceType.h | 3 +- ...1AP_Source-ToTarget-TransparentContainer.c | 2 +- ...1AP_Source-ToTarget-TransparentContainer.h | 3 +- ...urceBSS-ToTargetBSS-TransparentContainer.c | 2 +- ...urceBSS-ToTargetBSS-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.c | 2 +- lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.h | 2 +- ...e-ToTargetNgRanNode-TransparentContainer.c | 2 +- ...e-ToTargetNgRanNode-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.c | 2 +- lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.h | 3 +- lib/asn1c/s1ap/S1AP_SourceNodeID.c | 2 +- lib/asn1c/s1ap/S1AP_SourceNodeID.h | 2 +- ...P_SourceOfUEActivityBehaviourInformation.c | 2 +- ...P_SourceOfUEActivityBehaviourInformation.h | 3 +- ...urceRNC-ToTargetRNC-TransparentContainer.c | 2 +- ...urceRNC-ToTargetRNC-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_SourceeNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_SourceeNB-ID.h | 2 +- ...urceeNB-ToTargeteNB-TransparentContainer.c | 2 +- ...urceeNB-ToTargeteNB-TransparentContainer.h | 2 +- lib/asn1c/s1ap/S1AP_StratumLevel.c | 2 +- lib/asn1c/s1ap/S1AP_StratumLevel.h | 3 +- .../s1ap/S1AP_SubscriberProfileIDforRFP.c | 2 +- .../s1ap/S1AP_SubscriberProfileIDforRFP.h | 3 +- ...ubscription-Based-UE-DifferentiationInfo.c | 2 +- ...ubscription-Based-UE-DifferentiationInfo.h | 2 +- lib/asn1c/s1ap/S1AP_SuccessfulOutcome.c | 2 +- lib/asn1c/s1ap/S1AP_SuccessfulOutcome.h | 2 +- lib/asn1c/s1ap/S1AP_SupportedTAs-Item.c | 2 +- lib/asn1c/s1ap/S1AP_SupportedTAs-Item.h | 2 +- lib/asn1c/s1ap/S1AP_SupportedTAs.c | 2 +- lib/asn1c/s1ap/S1AP_SupportedTAs.h | 2 +- .../s1ap/S1AP_SynchronisationInformation.c | 2 +- .../s1ap/S1AP_SynchronisationInformation.h | 2 +- lib/asn1c/s1ap/S1AP_SynchronisationStatus.c | 2 +- lib/asn1c/s1ap/S1AP_SynchronisationStatus.h | 3 +- lib/asn1c/s1ap/S1AP_TABasedMDT.c | 2 +- lib/asn1c/s1ap/S1AP_TABasedMDT.h | 2 +- lib/asn1c/s1ap/S1AP_TABasedQMC.c | 2 +- lib/asn1c/s1ap/S1AP_TABasedQMC.h | 2 +- lib/asn1c/s1ap/S1AP_TAC.c | 2 +- lib/asn1c/s1ap/S1AP_TAC.h | 3 +- lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.c | 2 +- lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.h | 2 +- lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.c | 2 +- lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.h | 2 +- lib/asn1c/s1ap/S1AP_TAI-Broadcast.c | 2 +- lib/asn1c/s1ap/S1AP_TAI-Broadcast.h | 2 +- lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.c | 2 +- lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.h | 2 +- lib/asn1c/s1ap/S1AP_TAI-Cancelled.c | 2 +- lib/asn1c/s1ap/S1AP_TAI-Cancelled.h | 2 +- lib/asn1c/s1ap/S1AP_TAI.c | 2 +- lib/asn1c/s1ap/S1AP_TAI.h | 2 +- lib/asn1c/s1ap/S1AP_TAIBasedMDT.c | 2 +- lib/asn1c/s1ap/S1AP_TAIBasedMDT.h | 2 +- lib/asn1c/s1ap/S1AP_TAIBasedQMC.c | 2 +- lib/asn1c/s1ap/S1AP_TAIBasedQMC.h | 2 +- lib/asn1c/s1ap/S1AP_TAIItem.c | 2 +- lib/asn1c/s1ap/S1AP_TAIItem.h | 2 +- lib/asn1c/s1ap/S1AP_TAIList.c | 2 +- lib/asn1c/s1ap/S1AP_TAIList.h | 2 +- lib/asn1c/s1ap/S1AP_TAIListForRestart.c | 2 +- lib/asn1c/s1ap/S1AP_TAIListForRestart.h | 2 +- lib/asn1c/s1ap/S1AP_TAIListforMDT.c | 2 +- lib/asn1c/s1ap/S1AP_TAIListforMDT.h | 2 +- lib/asn1c/s1ap/S1AP_TAIListforQMC.c | 2 +- lib/asn1c/s1ap/S1AP_TAIListforQMC.h | 2 +- lib/asn1c/s1ap/S1AP_TAIListforWarning.c | 2 +- lib/asn1c/s1ap/S1AP_TAIListforWarning.h | 2 +- lib/asn1c/s1ap/S1AP_TAListforMDT.c | 2 +- lib/asn1c/s1ap/S1AP_TAListforMDT.h | 2 +- lib/asn1c/s1ap/S1AP_TAListforQMC.c | 2 +- lib/asn1c/s1ap/S1AP_TAListforQMC.h | 2 +- lib/asn1c/s1ap/S1AP_TBCD-STRING.c | 2 +- lib/asn1c/s1ap/S1AP_TBCD-STRING.h | 3 +- ...1AP_Target-ToSource-TransparentContainer.c | 2 +- ...1AP_Target-ToSource-TransparentContainer.h | 3 +- ...rgetBSS-ToSourceBSS-TransparentContainer.c | 2 +- ...rgetBSS-ToSourceBSS-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_TargetID.c | 2 +- lib/asn1c/s1ap/S1AP_TargetID.h | 2 +- lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.c | 2 +- lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.h | 2 +- ...e-ToSourceNgRanNode-TransparentContainer.c | 2 +- ...e-ToSourceNgRanNode-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_TargetRNC-ID.c | 2 +- lib/asn1c/s1ap/S1AP_TargetRNC-ID.h | 2 +- ...rgetRNC-ToSourceRNC-TransparentContainer.c | 2 +- ...rgetRNC-ToSourceRNC-TransparentContainer.h | 3 +- lib/asn1c/s1ap/S1AP_TargeteNB-ID.c | 2 +- lib/asn1c/s1ap/S1AP_TargeteNB-ID.h | 2 +- ...rgeteNB-ToSourceeNB-TransparentContainer.c | 2 +- ...rgeteNB-ToSourceeNB-TransparentContainer.h | 2 +- lib/asn1c/s1ap/S1AP_Threshold-RSRP.c | 2 +- lib/asn1c/s1ap/S1AP_Threshold-RSRP.h | 3 +- lib/asn1c/s1ap/S1AP_Threshold-RSRQ.c | 2 +- lib/asn1c/s1ap/S1AP_Threshold-RSRQ.h | 3 +- ...Time-UE-StayedInCell-EnhancedGranularity.c | 2 +- ...Time-UE-StayedInCell-EnhancedGranularity.h | 3 +- lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.c | 2 +- lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.h | 3 +- .../s1ap/S1AP_TimeSinceSecondaryNodeRelease.c | 2 +- .../s1ap/S1AP_TimeSinceSecondaryNodeRelease.h | 3 +- lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.c | 2 +- lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.h | 2 +- lib/asn1c/s1ap/S1AP_TimeToTrigger.c | 2 +- lib/asn1c/s1ap/S1AP_TimeToTrigger.h | 3 +- lib/asn1c/s1ap/S1AP_TimeToWait.c | 2 +- lib/asn1c/s1ap/S1AP_TimeToWait.h | 3 +- lib/asn1c/s1ap/S1AP_TraceActivation.c | 2 +- lib/asn1c/s1ap/S1AP_TraceActivation.h | 2 +- lib/asn1c/s1ap/S1AP_TraceDepth.c | 2 +- lib/asn1c/s1ap/S1AP_TraceDepth.h | 3 +- lib/asn1c/s1ap/S1AP_TraceFailureIndication.c | 2 +- lib/asn1c/s1ap/S1AP_TraceFailureIndication.h | 2 +- lib/asn1c/s1ap/S1AP_TraceStart.c | 2 +- lib/asn1c/s1ap/S1AP_TraceStart.h | 2 +- .../S1AP_TrafficLoadReductionIndication.c | 2 +- .../S1AP_TrafficLoadReductionIndication.h | 3 +- lib/asn1c/s1ap/S1AP_TransportInformation.c | 2 +- lib/asn1c/s1ap/S1AP_TransportInformation.h | 2 +- lib/asn1c/s1ap/S1AP_TransportLayerAddress.c | 2 +- lib/asn1c/s1ap/S1AP_TransportLayerAddress.h | 3 +- lib/asn1c/s1ap/S1AP_TriggeringMessage.c | 2 +- lib/asn1c/s1ap/S1AP_TriggeringMessage.h | 3 +- lib/asn1c/s1ap/S1AP_TunnelInformation.c | 2 +- lib/asn1c/s1ap/S1AP_TunnelInformation.h | 2 +- lib/asn1c/s1ap/S1AP_TypeOfError.c | 2 +- lib/asn1c/s1ap/S1AP_TypeOfError.h | 3 +- ...Application-Layer-Measurement-Capability.c | 2 +- ...Application-Layer-Measurement-Capability.h | 3 +- lib/asn1c/s1ap/S1AP_UE-HistoryInformation.c | 2 +- lib/asn1c/s1ap/S1AP_UE-HistoryInformation.h | 2 +- .../S1AP_UE-HistoryInformationFromTheUE.c | 2 +- .../S1AP_UE-HistoryInformationFromTheUE.h | 3 +- ...-RLF-Report-Container-for-extended-bands.c | 2 +- ...-RLF-Report-Container-for-extended-bands.h | 3 +- lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.c | 2 +- lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.h | 3 +- lib/asn1c/s1ap/S1AP_UE-RetentionInformation.c | 2 +- lib/asn1c/s1ap/S1AP_UE-RetentionInformation.h | 3 +- lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.c | 2 +- lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.h | 2 +- lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.c | 2 +- lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.h | 2 +- lib/asn1c/s1ap/S1AP_UE-Usage-Type.c | 2 +- lib/asn1c/s1ap/S1AP_UE-Usage-Type.h | 3 +- ...AP_UE-associatedLogicalS1-ConnectionItem.c | 2 +- ...AP_UE-associatedLogicalS1-ConnectionItem.h | 2 +- ...UE-associatedLogicalS1-ConnectionListRes.c | 2 +- ...UE-associatedLogicalS1-ConnectionListRes.h | 2 +- ...associatedLogicalS1-ConnectionListResAck.c | 2 +- ...associatedLogicalS1-ConnectionListResAck.h | 2 +- .../s1ap/S1AP_UEAggregateMaximumBitrate.c | 2 +- .../s1ap/S1AP_UEAggregateMaximumBitrate.h | 2 +- lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.c | 2 +- lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.h | 2 +- .../s1ap/S1AP_UECapabilityInfoIndication.c | 2 +- .../s1ap/S1AP_UECapabilityInfoIndication.h | 2 +- lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.c | 2 +- lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.h | 3 +- .../s1ap/S1AP_UEContextModificationConfirm.c | 2 +- .../s1ap/S1AP_UEContextModificationConfirm.h | 2 +- .../s1ap/S1AP_UEContextModificationFailure.c | 2 +- .../s1ap/S1AP_UEContextModificationFailure.h | 2 +- .../S1AP_UEContextModificationIndication.c | 2 +- .../S1AP_UEContextModificationIndication.h | 2 +- .../s1ap/S1AP_UEContextModificationRequest.c | 2 +- .../s1ap/S1AP_UEContextModificationRequest.h | 2 +- .../s1ap/S1AP_UEContextModificationResponse.c | 2 +- .../s1ap/S1AP_UEContextModificationResponse.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.h | 2 +- .../s1ap/S1AP_UEContextReleaseComplete.c | 2 +- .../s1ap/S1AP_UEContextReleaseComplete.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeFailure.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeFailure.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeRequest.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeRequest.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeResponse.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextResumeResponse.h | 2 +- lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.c | 2 +- lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.h | 2 +- .../s1ap/S1AP_UEContextSuspendResponse.c | 2 +- .../s1ap/S1AP_UEContextSuspendResponse.h | 2 +- lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.c | 2 +- lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.h | 3 +- lib/asn1c/s1ap/S1AP_UEInformationTransfer.c | 2 +- lib/asn1c/s1ap/S1AP_UEInformationTransfer.h | 2 +- lib/asn1c/s1ap/S1AP_UEPagingID.c | 2 +- lib/asn1c/s1ap/S1AP_UEPagingID.h | 2 +- lib/asn1c/s1ap/S1AP_UERadioCapability.c | 2 +- lib/asn1c/s1ap/S1AP_UERadioCapability.h | 3 +- .../s1ap/S1AP_UERadioCapabilityForPaging.c | 2 +- .../s1ap/S1AP_UERadioCapabilityForPaging.h | 3 +- lib/asn1c/s1ap/S1AP_UERadioCapabilityID.c | 2 +- lib/asn1c/s1ap/S1AP_UERadioCapabilityID.h | 3 +- .../S1AP_UERadioCapabilityIDMappingRequest.c | 2 +- .../S1AP_UERadioCapabilityIDMappingRequest.h | 2 +- .../S1AP_UERadioCapabilityIDMappingResponse.c | 2 +- .../S1AP_UERadioCapabilityIDMappingResponse.h | 2 +- .../s1ap/S1AP_UERadioCapabilityMatchRequest.c | 2 +- .../s1ap/S1AP_UERadioCapabilityMatchRequest.h | 2 +- .../S1AP_UERadioCapabilityMatchResponse.c | 2 +- .../S1AP_UERadioCapabilityMatchResponse.h | 2 +- lib/asn1c/s1ap/S1AP_UESecurityCapabilities.c | 2 +- lib/asn1c/s1ap/S1AP_UESecurityCapabilities.h | 2 +- .../S1AP_UESidelinkAggregateMaximumBitrate.c | 2 +- .../S1AP_UESidelinkAggregateMaximumBitrate.h | 2 +- .../S1AP_UEUserPlaneCIoTSupportIndicator.c | 2 +- .../S1AP_UEUserPlaneCIoTSupportIndicator.h | 3 +- .../s1ap/S1AP_UL-CP-SecurityInformation.c | 2 +- .../s1ap/S1AP_UL-CP-SecurityInformation.h | 2 +- lib/asn1c/s1ap/S1AP_UL-NAS-Count.c | 2 +- lib/asn1c/s1ap/S1AP_UL-NAS-Count.h | 3 +- lib/asn1c/s1ap/S1AP_UL-NAS-MAC.c | 2 +- lib/asn1c/s1ap/S1AP_UL-NAS-MAC.h | 3 +- lib/asn1c/s1ap/S1AP_URI-Address.c | 2 +- lib/asn1c/s1ap/S1AP_URI-Address.h | 3 +- .../s1ap/S1AP_UnlicensedSpectrumRestriction.c | 2 +- .../s1ap/S1AP_UnlicensedSpectrumRestriction.h | 3 +- lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.c | 2 +- lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.h | 2 +- lib/asn1c/s1ap/S1AP_UplinkNASTransport.c | 2 +- lib/asn1c/s1ap/S1AP_UplinkNASTransport.h | 2 +- .../S1AP_UplinkNonUEAssociatedLPPaTransport.c | 2 +- .../S1AP_UplinkNonUEAssociatedLPPaTransport.h | 2 +- .../s1ap/S1AP_UplinkS1cdma2000tunnelling.c | 2 +- .../s1ap/S1AP_UplinkS1cdma2000tunnelling.h | 2 +- .../S1AP_UplinkUEAssociatedLPPaTransport.c | 2 +- .../S1AP_UplinkUEAssociatedLPPaTransport.h | 2 +- lib/asn1c/s1ap/S1AP_UserLocationInformation.c | 2 +- lib/asn1c/s1ap/S1AP_UserLocationInformation.h | 2 +- lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.c | 2 +- lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.h | 2 +- lib/asn1c/s1ap/S1AP_VehicleUE.c | 2 +- lib/asn1c/s1ap/S1AP_VehicleUE.h | 3 +- .../s1ap/S1AP_VoiceSupportMatchIndicator.c | 2 +- .../s1ap/S1AP_VoiceSupportMatchIndicator.h | 3 +- lib/asn1c/s1ap/S1AP_WLANMeasConfig.c | 2 +- lib/asn1c/s1ap/S1AP_WLANMeasConfig.h | 3 +- lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.c | 2 +- lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.h | 2 +- .../s1ap/S1AP_WLANMeasurementConfiguration.c | 2 +- .../s1ap/S1AP_WLANMeasurementConfiguration.h | 2 +- lib/asn1c/s1ap/S1AP_WLANName.c | 2 +- lib/asn1c/s1ap/S1AP_WLANName.h | 3 +- .../s1ap/S1AP_WUS-Assistance-Information.c | 2 +- .../s1ap/S1AP_WUS-Assistance-Information.h | 2 +- lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.c | 2 +- lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.h | 3 +- lib/asn1c/s1ap/S1AP_WarningAreaList.c | 2 +- lib/asn1c/s1ap/S1AP_WarningAreaList.h | 2 +- lib/asn1c/s1ap/S1AP_WarningMessageContents.c | 2 +- lib/asn1c/s1ap/S1AP_WarningMessageContents.h | 3 +- lib/asn1c/s1ap/S1AP_WarningSecurityInfo.c | 2 +- lib/asn1c/s1ap/S1AP_WarningSecurityInfo.h | 3 +- lib/asn1c/s1ap/S1AP_WarningType.c | 2 +- lib/asn1c/s1ap/S1AP_WarningType.h | 3 +- .../s1ap/S1AP_WriteReplaceWarningRequest.c | 2 +- .../s1ap/S1AP_WriteReplaceWarningRequest.h | 2 +- .../s1ap/S1AP_WriteReplaceWarningResponse.c | 2 +- .../s1ap/S1AP_WriteReplaceWarningResponse.h | 2 +- lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.c | 2 +- lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.h | 2 +- lib/asn1c/support/README.md | 32 +- lib/ngap/build.c | 3 +- lib/sctp/ogs-sctp.c | 21 +- src/amf/ngap-handler.c | 61 ++-- src/mme/sgsap-sctp.c | 10 +- src/pcf/npcf-handler.c | 2 +- src/smf/s5c-build.c | 1 - tests/common/ngap-handler.c | 39 +-- tests/common/sctp.c | 2 +- tests/unit/ngap-message-test.c | 189 ++++++++++++ 3528 files changed, 4782 insertions(+), 4373 deletions(-) create mode 120000 docker/debian/bookworm create mode 120000 docker/i386/debian create mode 120000 docker/i386/ubuntu create mode 120000 docker/ubuntu/lunar create mode 120000 docker/ubuntu/noble create mode 100644 lib/asn1c/common/ENUMERATED.c create mode 100644 lib/asn1c/common/ENUMERATED.h create mode 100644 lib/asn1c/common/ENUMERATED_aper.c diff --git a/docker/debian/bookworm b/docker/debian/bookworm new file mode 120000 index 0000000000..b9bc2fdcb1 --- /dev/null +++ b/docker/debian/bookworm @@ -0,0 +1 @@ +latest \ No newline at end of file diff --git a/docker/i386/debian b/docker/i386/debian new file mode 120000 index 0000000000..3863e7488e --- /dev/null +++ b/docker/i386/debian @@ -0,0 +1 @@ +../debian \ No newline at end of file diff --git a/docker/i386/ubuntu b/docker/i386/ubuntu new file mode 120000 index 0000000000..47aec456ec --- /dev/null +++ b/docker/i386/ubuntu @@ -0,0 +1 @@ +../ubuntu \ No newline at end of file diff --git a/docker/ubuntu/lunar b/docker/ubuntu/lunar new file mode 120000 index 0000000000..b9bc2fdcb1 --- /dev/null +++ b/docker/ubuntu/lunar @@ -0,0 +1 @@ +latest \ No newline at end of file diff --git a/docker/ubuntu/noble b/docker/ubuntu/noble new file mode 120000 index 0000000000..b9bc2fdcb1 --- /dev/null +++ b/docker/ubuntu/noble @@ -0,0 +1 @@ +latest \ No newline at end of file diff --git a/docs/_docs/troubleshoot/02-now-in-github-issues.md b/docs/_docs/troubleshoot/02-now-in-github-issues.md index ab5a587221..8517632a34 100644 --- a/docs/_docs/troubleshoot/02-now-in-github-issues.md +++ b/docs/_docs/troubleshoot/02-now-in-github-issues.md @@ -10,6 +10,62 @@ head_inline: "<style> .blue { color: blue; } </style>" } </style> +#### How to run wireshark from within Docker? + +In the following, I will explain how to run wireshark on Ubuntu 32bit. + +First, make the following modifications to get wireshark working. + +```diff +$ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml +index 01925303b..8d5e23a4f 100644 +--- a/docker/docker-compose.yml ++++ b/docker/docker-compose.yml +@@ -105,7 +105,7 @@ services: + volumes: + - home:/home/${USER} + - ${HOME}:/mnt +- # - /tmp/.X11-unix:/tmp/.X11-unix ++ - /tmp/.X11-unix:/tmp/.X11-unix + # - /etc/localtime:/etc/localtime:ro + # - /usr/share/zoneinfo/Europe/Helsinki:/etc/localtime:ro + hostname: open5gs-dev + +$ diff --git a/docker/ubuntu/latest/dev/Dockerfile b/docker/ubuntu/latest/dev/Dockerfile +index 970dddb72..6902fc59c 100644 +--- a/docker/ubuntu/latest/dev/Dockerfile ++++ b/docker/ubuntu/latest/dev/Dockerfile +@@ -23,12 +23,12 @@ RUN apt-get update && \ + net-tools && \ + apt-get clean + +-#RUN apt-get update && \ +-# apt-get install -y software-properties-common && \ +-# sudo add-apt-repository ppa:wireshark-dev/stable -y && \ +-# apt-get update && \ +-# DEBIAN_FRONTEND=noninteractive \ +-# apt-get install -y wireshark ++RUN apt-get update && \ ++ apt-get install -y software-properties-common && \ ++ sudo add-apt-repository ppa:wireshark-dev/stable -y && \ ++ apt-get update && \ ++ DEBIAN_FRONTEND=noninteractive \ ++ apt-get install -y wireshark + + COPY setup.sh /root +``` + +It allows any program run by the docker user to communicate with X windows. +``` +$ xhost +local:docker +``` + +And run 32bit ubuntu like below. +``` +$ cd docker +$ DIST=i386/ubuntu docker compose run dev +``` + #### What to do if a FATAL occurs? You may occasionally encounter a FATAL like the one below. diff --git a/lib/asn1c/common/ANY.c b/lib/asn1c/common/ANY.c index bf988dbda0..3cbe1e272b 100644 --- a/lib/asn1c/common/ANY.c +++ b/lib/asn1c/common/ANY.c @@ -18,6 +18,7 @@ asn_TYPE_operation_t asn_OP_ANY = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, OCTET_STRING_encode_der, @@ -33,9 +34,11 @@ asn_TYPE_operation_t asn_OP_ANY = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_hex, ANY_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) 0, diff --git a/lib/asn1c/common/ANY.h b/lib/asn1c/common/ANY.h index 871ed5ed39..6434aab71a 100644 --- a/lib/asn1c/common/ANY.h +++ b/lib/asn1c/common/ANY.h @@ -29,6 +29,7 @@ extern asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define ANY_compare OCTET_STRING_compare +#define ANY_copy OCTET_STRING_copy #define ANY_constraint asn_generic_no_constraint @@ -43,6 +44,7 @@ xer_type_encoder_f ANY_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f ANY_decode_jer; jer_type_encoder_f ANY_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/BIT_STRING.c b/lib/asn1c/common/BIT_STRING.c index b5ba94017c..208ac14c78 100644 --- a/lib/asn1c/common/BIT_STRING.c +++ b/lib/asn1c/common/BIT_STRING.c @@ -24,6 +24,7 @@ asn_TYPE_operation_t asn_OP_BIT_STRING = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ BIT_STRING_compare, + BIT_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ @@ -39,9 +40,11 @@ asn_TYPE_operation_t asn_OP_BIT_STRING = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_hex, BIT_STRING_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) BIT_STRING_decode_oer, @@ -211,3 +214,37 @@ BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, return 1; } } + +int +BIT_STRING_copy(const asn_TYPE_descriptor_t *td, void **aptr, + const void *bptr) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics; + BIT_STRING_t *a = (BIT_STRING_t *)*aptr; + const BIT_STRING_t *b = (const BIT_STRING_t *)bptr; + + if(!b) { + if(a) { + FREEMEM(a->buf); + FREEMEM(a); + *aptr = 0; + } + return 0; + } + + if(!a) { + a = *aptr = CALLOC(1, specs->struct_size); + if(!a) return -1; + } + + uint8_t* buf = MALLOC(b->size + 1); + if(!buf) return -1; + memcpy(buf, b->buf, b->size); + buf[b->size] = 0; + + FREEMEM(a->buf); + a->buf = buf; + a->size = b->size; + a->bits_unused = b->bits_unused; + + return 0; +} diff --git a/lib/asn1c/common/BIT_STRING.h b/lib/asn1c/common/BIT_STRING.h index e755fe9f5c..0b71feb7b4 100644 --- a/lib/asn1c/common/BIT_STRING.h +++ b/lib/asn1c/common/BIT_STRING.h @@ -31,6 +31,7 @@ asn_struct_print_f BIT_STRING_print; /* Human-readable output */ #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f BIT_STRING_compare; +asn_struct_copy_f BIT_STRING_copy; asn_constr_check_f BIT_STRING_constraint; @@ -45,6 +46,7 @@ xer_type_encoder_f BIT_STRING_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define BIT_STRING_decode_jer OCTET_STRING_decode_jer_binary jer_type_encoder_f BIT_STRING_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/ENUMERATED.c b/lib/asn1c/common/ENUMERATED.c new file mode 100644 index 0000000000..97bc9b1ebc --- /dev/null +++ b/lib/asn1c/common/ENUMERATED.c @@ -0,0 +1,92 @@ +/*- + * Copyright (c) 2003, 2005, 2006 Lev Walkin <vlm@lionet.info>. + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include <asn_internal.h> +#include <ENUMERATED.h> + +/* + * ENUMERATED basic type description. + */ +static const ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_operation_t asn_OP_ENUMERATED = { + ASN__PRIMITIVE_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + INTEGER_print, /* Implemented in terms of INTEGER */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + INTEGER_compare, /* Implemented in terms of INTEGER */ + INTEGER_copy, /* Implemented in terms of INTEGER */ +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + INTEGER_encode_der, /* Implemented in terms of INTEGER */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + INTEGER_decode_xer, /* This is temporary! */ + INTEGER_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + ENUMERATED_decode_jer, + INTEGER_encode_jer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + ENUMERATED_decode_oer, + ENUMERATED_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + ENUMERATED_decode_uper, /* Unaligned PER decoder */ + ENUMERATED_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + ENUMERATED_decode_aper, /* Aligned PER decoder */ + ENUMERATED_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + ENUMERATED_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { + "ENUMERATED", + "ENUMERATED", + &asn_OP_ENUMERATED, + asn_DEF_ENUMERATED_tags, + sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), + asn_DEF_ENUMERATED_tags, /* Same as above */ + sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; diff --git a/lib/asn1c/common/ENUMERATED.h b/lib/asn1c/common/ENUMERATED.h new file mode 100644 index 0000000000..b1519030bb --- /dev/null +++ b/lib/asn1c/common/ENUMERATED.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ENUMERATED_H_ +#define _ENUMERATED_H_ + +#include <INTEGER.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ + +extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; +extern asn_TYPE_operation_t asn_OP_ENUMERATED; + +#define ENUMERATED_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define ENUMERATED_print INTEGER_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define ENUMERATED_compare INTEGER_compare +#define ENUMERATED_copy INTEGER_copy + +#define ENUMERATED_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define ENUMERATED_decode_ber ber_decode_primitive +#define ENUMERATED_encode_der INTEGER_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define ENUMERATED_decode_xer INTEGER_decode_xer +#define ENUMERATED_encode_xer INTEGER_encode_xer +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f ENUMERATED_decode_jer; +#define ENUMERATED_encode_jer INTEGER_encode_jer +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +oer_type_decoder_f ENUMERATED_decode_oer; +oer_type_encoder_f ENUMERATED_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +per_type_decoder_f ENUMERATED_decode_uper; +per_type_encoder_f ENUMERATED_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +per_type_decoder_f ENUMERATED_decode_aper; +per_type_encoder_f ENUMERATED_encode_aper; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +#define ENUMERATED_random_fill INTEGER_random_fill +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ENUMERATED_H_ */ diff --git a/lib/asn1c/common/ENUMERATED_aper.c b/lib/asn1c/common/ENUMERATED_aper.c new file mode 100644 index 0000000000..58911a4038 --- /dev/null +++ b/lib/asn1c/common/ENUMERATED_aper.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include <asn_internal.h> +#include <ENUMERATED.h> +#include <NativeEnumerated.h> + +asn_dec_rval_t +ENUMERATED_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rval; + ENUMERATED_t *st = (ENUMERATED_t *)*sptr; + long value; + void *vptr = &value; + + if(!st) { + st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + rval = NativeEnumerated_decode_aper(opt_codec_ctx, td, constraints, + (void **)&vptr, pd); + if(rval.code == RC_OK) + if(asn_long2INTEGER(st, value)) + rval.code = RC_FAIL; + return rval; +} + +asn_enc_rval_t +ENUMERATED_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const ENUMERATED_t *st = (const ENUMERATED_t *)sptr; + long value; + + if(asn_INTEGER2long(st, &value)) + ASN__ENCODE_FAILED; + + return NativeEnumerated_encode_aper(td, constraints, &value, po); +} diff --git a/lib/asn1c/common/GraphicString.c b/lib/asn1c/common/GraphicString.c index b76118710a..0f2fc39bad 100644 --- a/lib/asn1c/common/GraphicString.c +++ b/lib/asn1c/common/GraphicString.c @@ -20,6 +20,7 @@ asn_TYPE_operation_t asn_OP_GraphicString = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, @@ -35,9 +36,11 @@ asn_TYPE_operation_t asn_OP_GraphicString = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_hex, OCTET_STRING_encode_jer, /* Can't expect it to be ASCII/UTF8 */ #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OCTET_STRING_decode_oer, diff --git a/lib/asn1c/common/GraphicString.h b/lib/asn1c/common/GraphicString.h index 807e9d6b01..9368e507b2 100644 --- a/lib/asn1c/common/GraphicString.h +++ b/lib/asn1c/common/GraphicString.h @@ -23,6 +23,7 @@ extern asn_TYPE_operation_t asn_OP_GraphicString; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define GraphicString_compare OCTET_STRING_compare +#define GraphicString_copy OCTET_STRING_copy #define GraphicString_constraint asn_generic_unknown_constraint @@ -37,6 +38,7 @@ extern asn_TYPE_operation_t asn_OP_GraphicString; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define GraphicString_decode_jer OCTET_STRING_decode_jer #define GraphicString_encode_jer OCTET_STRING_encode_jer #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/INTEGER.c b/lib/asn1c/common/INTEGER.c index 095063fefd..8ea2fffdbd 100644 --- a/lib/asn1c/common/INTEGER.c +++ b/lib/asn1c/common/INTEGER.c @@ -22,6 +22,7 @@ asn_TYPE_operation_t asn_OP_INTEGER = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ INTEGER_compare, + INTEGER_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) ber_decode_primitive, INTEGER_encode_der, @@ -37,9 +38,11 @@ asn_TYPE_operation_t asn_OP_INTEGER = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + INTEGER_decode_jer, INTEGER_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) INTEGER_decode_oer, /* OER decoder */ @@ -411,6 +414,33 @@ asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { return asn_imax2INTEGER(st, value); } +int asn_INTEGER2int64(const INTEGER_t *st, int64_t *value) { + intmax_t v; + if(asn_INTEGER2imax(st, &v) == 0) { + if(v < INT64_MIN || v > INT64_MAX) { + errno = ERANGE; + return -1; + } + *value = v; + return 0; + } else { + return -1; + } +} + +int asn_INTEGER2uint64(const INTEGER_t *st, uint64_t *value) { + uintmax_t v; + if(asn_INTEGER2umax(st, &v) == 0) { + if(v > UINT64_MAX) { + errno = ERANGE; + return -1; + } + *value = v; + return 0; + } else { + return -1; + } +} int asn_uint642INTEGER(INTEGER_t *st, uint64_t value) { @@ -736,3 +766,40 @@ INTEGER_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } } + +int +INTEGER_copy(const asn_TYPE_descriptor_t *td, void **aptr, + const void *bptr) { + (void)td; + INTEGER_t *a = *aptr; + const INTEGER_t *b = bptr; + + if(!b) { + if(a) { + FREEMEM(a->buf); + FREEMEM(a); + *aptr = 0; + } + return 0; + } + + if(!a) { + a = *aptr = CALLOC(1, sizeof(*a)); + if(!a) return -1; + } + + if(b->size) { + uint8_t* buf = MALLOC(b->size); + if(!buf) return -1; + memcpy(buf, b->buf, b->size); + FREEMEM(a->buf); + a->buf = buf; + a->size = b->size; + } else { + FREEMEM(a->buf); + a->buf = 0; + a->size = 0; + } + + return 0; +} diff --git a/lib/asn1c/common/INTEGER.h b/lib/asn1c/common/INTEGER.h index 1666e0bce4..5fa1c7b8d1 100644 --- a/lib/asn1c/common/INTEGER.h +++ b/lib/asn1c/common/INTEGER.h @@ -47,6 +47,7 @@ asn_struct_print_f INTEGER_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f INTEGER_compare; +asn_struct_copy_f INTEGER_copy; #define INTEGER_constraint asn_generic_no_constraint @@ -61,6 +62,7 @@ xer_type_encoder_f INTEGER_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f INTEGER_decode_jer; jer_type_encoder_f INTEGER_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ @@ -106,6 +108,8 @@ int asn_INTEGER2long(const INTEGER_t *i, long *l); int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); int asn_long2INTEGER(INTEGER_t *i, long l); int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); +int asn_INTEGER2int64(const INTEGER_t *i, int64_t *l); +int asn_INTEGER2uint64(const INTEGER_t *i, uint64_t *l); int asn_int642INTEGER(INTEGER_t *i, int64_t l); int asn_uint642INTEGER(INTEGER_t *i, uint64_t l); diff --git a/lib/asn1c/common/INTEGER_aper.c b/lib/asn1c/common/INTEGER_aper.c index fc88268ef2..009c441c82 100644 --- a/lib/asn1c/common/INTEGER_aper.c +++ b/lib/asn1c/common/INTEGER_aper.c @@ -57,7 +57,7 @@ INTEGER_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, int max_range_bytes = (ct->range_bits >> 3) + (((ct->range_bits % 8) > 0) ? 1 : 0); int length = 0, i; - long value = 0; + intmax_t value = 0; for (i = 1; ; i++) { int upper = 1 << i; @@ -79,18 +79,18 @@ INTEGER_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, int buf = per_get_few_bits(pd, 8); if (buf < 0) ASN__DECODE_FAILED; - value += (((long)buf) << (8 * length)); + value += (((intmax_t)buf) << (8 * length)); } value += ct->lower_bound; if((specs && specs->field_unsigned) - ? asn_uint642INTEGER(st, (unsigned long)value) - : asn_int642INTEGER(st, value)) + ? asn_umax2INTEGER(st, (uintmax_t)value) + : asn_imax2INTEGER(st, value)) ASN__DECODE_FAILED; ASN_DEBUG("Got value %ld + low %lld", - value, (long long int)ct->lower_bound); + value, (intmax_t)ct->lower_bound); } else { - long value = 0; + intmax_t value = 0; if (ct->range_bits < 8) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) ASN__DECODE_STARVED; @@ -108,11 +108,11 @@ INTEGER_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, } value += ct->lower_bound; if((specs && specs->field_unsigned) - ? asn_ulong2INTEGER(st, value) - : asn_long2INTEGER(st, value)) + ? asn_umax2INTEGER(st, (uintmax_t)value) + : asn_imax2INTEGER(st, value)) ASN__DECODE_FAILED; ASN_DEBUG("Got value %ld + low %lld", - value, (long long int)ct->lower_bound); + value, (intmax_t)ct->lower_bound); } return rval; } else { @@ -167,7 +167,7 @@ INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, const uint8_t *buf; const uint8_t *end; const asn_per_constraint_t *ct; - long value = 0; + intmax_t value = 0; if(!st || st->size == 0) ASN__ENCODE_FAILED; @@ -179,26 +179,26 @@ INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, if(ct) { int inext = 0; if(specs && specs->field_unsigned) { - unsigned long uval; - if(asn_INTEGER2ulong(st, &uval)) + uintmax_t uval; + if(asn_INTEGER2umax(st, &uval)) ASN__ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { - if(uval < (unsigned long)ct->lower_bound) + if(uval < (uintmax_t)ct->lower_bound) inext = 1; } else if(ct->range_bits >= 0) { - if(uval < (unsigned long)ct->lower_bound - || uval > (unsigned long)ct->upper_bound) + if(uval < (uintmax_t)ct->lower_bound + || uval > (uintmax_t)ct->upper_bound) inext = 1; } ASN_DEBUG("Value %lu (%02x/%zu) lb %lld ub %lld %s", uval, st->buf[0], st->size, - (long long int)ct->lower_bound, - (long long int)ct->upper_bound, + (intmax_t)ct->lower_bound, + (intmax_t)ct->upper_bound, inext ? "ext" : "fix"); value = uval; } else { - if(asn_INTEGER2long(st, &value)) ASN__ENCODE_FAILED; + if(asn_INTEGER2imax(st, &value)) ASN__ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { if(value < ct->lower_bound) @@ -210,8 +210,8 @@ INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, } ASN_DEBUG("Value %lu (%02x/%zu) lb %lld ub %lld %s", value, st->buf[0], st->size, - (long long int)ct->lower_bound, - (long long int)ct->upper_bound, + (intmax_t)ct->lower_bound, + (intmax_t)ct->upper_bound, inext ? "ext" : "fix"); } if(ct->flags & APC_EXTENSIBLE) { @@ -225,11 +225,11 @@ INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, /* X.691, #12.2.2 */ if(ct && ct->range_bits >= 0) { - unsigned long v; + uintmax_t v; /* #10.5.6 */ ASN_DEBUG("Encoding integer %ld (%lld) with range %d bits", - value, (long long int)(value - ct->lower_bound), + value, (intmax_t)(value - ct->lower_bound), ct->range_bits); v = value - ct->lower_bound; @@ -287,7 +287,7 @@ INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, } if(ct && ct->lower_bound) { - ASN_DEBUG("Adjust lower bound to %lld", (long long int)ct->lower_bound); + ASN_DEBUG("Adjust lower bound to %lld", (intmax_t)ct->lower_bound); /* TODO: adjust lower bound */ ASN__ENCODE_FAILED; } diff --git a/lib/asn1c/common/NULL.c b/lib/asn1c/common/NULL.c index d160e695f4..3729291471 100644 --- a/lib/asn1c/common/NULL.c +++ b/lib/asn1c/common/NULL.c @@ -19,6 +19,7 @@ asn_TYPE_operation_t asn_OP_NULL = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ NULL_compare, + NULL_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) NULL_decode_ber, NULL_encode_der, /* Special handling of DER encoding */ @@ -34,9 +35,11 @@ asn_TYPE_operation_t asn_OP_NULL = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + NULL_decode_jer, NULL_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) NULL_decode_oer, @@ -111,3 +114,15 @@ NULL_compare(const asn_TYPE_descriptor_t *td, const void *a, const void *b) { (void)b; return 0; } + +int +NULL_copy(const asn_TYPE_descriptor_t *td, void **a, const void *b) { + (void)td; + + if(b && !*a) { + *a = CALLOC(1, sizeof(NULL_t)); + if (!*a) return -1; + } + + return 0; +} diff --git a/lib/asn1c/common/NULL.h b/lib/asn1c/common/NULL.h index 726447569a..ca9d6fab9b 100644 --- a/lib/asn1c/common/NULL.h +++ b/lib/asn1c/common/NULL.h @@ -27,6 +27,7 @@ asn_struct_print_f NULL_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f NULL_compare; +asn_struct_copy_f NULL_copy; #define NULL_constraint asn_generic_no_constraint @@ -41,6 +42,7 @@ xer_type_encoder_f NULL_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f NULL_decode_jer; jer_type_encoder_f NULL_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/NativeEnumerated.c b/lib/asn1c/common/NativeEnumerated.c index aee450c17f..148cb8fb48 100644 --- a/lib/asn1c/common/NativeEnumerated.c +++ b/lib/asn1c/common/NativeEnumerated.c @@ -26,6 +26,7 @@ asn_TYPE_operation_t asn_OP_NativeEnumerated = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ NativeInteger_compare, + NativeInteger_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) NativeInteger_decode_ber, NativeInteger_encode_der, @@ -41,9 +42,11 @@ asn_TYPE_operation_t asn_OP_NativeEnumerated = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + NativeEnumerated_decode_jer, NativeEnumerated_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) NativeEnumerated_decode_oer, diff --git a/lib/asn1c/common/NativeEnumerated.h b/lib/asn1c/common/NativeEnumerated.h index 0c711e3fe4..8c045e5245 100644 --- a/lib/asn1c/common/NativeEnumerated.h +++ b/lib/asn1c/common/NativeEnumerated.h @@ -13,6 +13,7 @@ #define _NativeEnumerated_H_ #include <NativeInteger.h> +#include <ENUMERATED.h> #ifdef __cplusplus extern "C" { @@ -28,6 +29,7 @@ extern asn_TYPE_operation_t asn_OP_NativeEnumerated; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define NativeEnumerated_compare NativeInteger_compare +#define NativeEnumerated_copy NativeInteger_copy #define NativeEnumerated_constraint asn_generic_no_constraint @@ -42,6 +44,7 @@ xer_type_encoder_f NativeEnumerated_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f NativeEnumerated_decode_jer; jer_type_encoder_f NativeEnumerated_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/NativeEnumerated_aper.c b/lib/asn1c/common/NativeEnumerated_aper.c index 5c4c2561d4..bd205b1b03 100644 --- a/lib/asn1c/common/NativeEnumerated_aper.c +++ b/lib/asn1c/common/NativeEnumerated_aper.c @@ -64,7 +64,7 @@ NativeEnumerated_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, */ /* XXX handle indefinite index length > 64k */ - value = aper_get_nsnnwn(pd, 65537); + value = aper_get_nsnnwn(pd); if(value < 0) ASN__DECODE_STARVED; value += specs->extension - 1; //if(value >= specs->map_count) @@ -148,9 +148,7 @@ NativeEnumerated_encode_aper(const asn_TYPE_descriptor_t *td, ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", value, specs->extension, inext, value - (inext ? (specs->extension - 1) : 0)); - if(aper_put_nsnnwn(po, - ct->upper_bound - ct->lower_bound + 1, - value - (inext ? (specs->extension - 1) : 0))) + if(aper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) ASN__ENCODE_FAILED; ASN__ENCODED_OK(er); diff --git a/lib/asn1c/common/NativeInteger.c b/lib/asn1c/common/NativeInteger.c index f0309b0d2d..8957b65c34 100644 --- a/lib/asn1c/common/NativeInteger.c +++ b/lib/asn1c/common/NativeInteger.c @@ -27,6 +27,7 @@ asn_TYPE_operation_t asn_OP_NativeInteger = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ NativeInteger_compare, + NativeInteger_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) NativeInteger_decode_ber, NativeInteger_encode_der, @@ -42,9 +43,11 @@ asn_TYPE_operation_t asn_OP_NativeInteger = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + NativeInteger_decode_jer, NativeInteger_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) NativeInteger_decode_oer, /* OER decoder */ @@ -150,3 +153,30 @@ NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const v return 1; } } + +int +NativeInteger_copy(const asn_TYPE_descriptor_t *td, void **aptr, const void *bptr) { + unsigned long *a = *aptr; + const unsigned long *b = bptr; + + (void)td; + + /* Check if source has data */ + if(!b) { + /* Clear destination */ + if(a) { + FREEMEM(a); + *aptr = 0; + } + return 0; + } + + if(!a) { + a = *aptr = MALLOC(sizeof(*a)); + if(!a) return -1; + } + + *a = *b; + + return 0; +} diff --git a/lib/asn1c/common/NativeInteger.h b/lib/asn1c/common/NativeInteger.h index 3a47c11a0a..352926b412 100644 --- a/lib/asn1c/common/NativeInteger.h +++ b/lib/asn1c/common/NativeInteger.h @@ -29,6 +29,7 @@ asn_struct_print_f NativeInteger_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f NativeInteger_compare; +asn_struct_copy_f NativeInteger_copy; #define NativeInteger_constraint asn_generic_no_constraint @@ -43,6 +44,7 @@ xer_type_encoder_f NativeInteger_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f NativeInteger_decode_jer; jer_type_encoder_f NativeInteger_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/NativeInteger_rfill.c b/lib/asn1c/common/NativeInteger_rfill.c index 0e2cee8e45..fddd149689 100644 --- a/lib/asn1c/common/NativeInteger_rfill.c +++ b/lib/asn1c/common/NativeInteger_rfill.c @@ -63,8 +63,10 @@ NativeInteger_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, 0, sizeof(variants) / sizeof(variants[0]) - 1)]; } - if(!constraints) constraints = &td->encoding_constraints; #if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + const asn_per_constraints_t *ct; ct = constraints ? constraints->per_constraints : 0; @@ -74,6 +76,8 @@ NativeInteger_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, ct->value.upper_bound); } } +#else + if(!constraints) constraints = &td->encoding_constraints; #endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ } diff --git a/lib/asn1c/common/OBJECT_IDENTIFIER.c b/lib/asn1c/common/OBJECT_IDENTIFIER.c index 5cf2d6066f..c5ab38ea3e 100644 --- a/lib/asn1c/common/OBJECT_IDENTIFIER.c +++ b/lib/asn1c/common/OBJECT_IDENTIFIER.c @@ -24,6 +24,7 @@ asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, /* Implemented in terms of a string comparison */ + OCTET_STRING_copy, /* Implemented in terms of a string copy */ #if !defined(ASN_DISABLE_BER_SUPPORT) ber_decode_primitive, der_encode_primitive, @@ -39,9 +40,11 @@ asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OBJECT_IDENTIFIER_decode_jer, OBJECT_IDENTIFIER_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OBJECT_IDENTIFIER_decode_oer, diff --git a/lib/asn1c/common/OBJECT_IDENTIFIER.h b/lib/asn1c/common/OBJECT_IDENTIFIER.h index f878055c60..cef8c6cde1 100644 --- a/lib/asn1c/common/OBJECT_IDENTIFIER.h +++ b/lib/asn1c/common/OBJECT_IDENTIFIER.h @@ -32,6 +32,7 @@ asn_struct_print_f OBJECT_IDENTIFIER_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define OBJECT_IDENTIFIER_compare OCTET_STRING_compare +#define OBJECT_IDENTIFIER_copy OCTET_STRING_copy asn_constr_check_f OBJECT_IDENTIFIER_constraint; @@ -46,6 +47,7 @@ xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f OBJECT_IDENTIFIER_decode_jer; jer_type_encoder_f OBJECT_IDENTIFIER_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/OCTET_STRING.c b/lib/asn1c/common/OCTET_STRING.c index d0bdeade72..fc983b4e2e 100644 --- a/lib/asn1c/common/OCTET_STRING.c +++ b/lib/asn1c/common/OCTET_STRING.c @@ -26,6 +26,7 @@ asn_TYPE_operation_t asn_OP_OCTET_STRING = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, OCTET_STRING_encode_der, @@ -41,9 +42,11 @@ asn_TYPE_operation_t asn_OP_OCTET_STRING = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_hex, OCTET_STRING_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OCTET_STRING_decode_oer, @@ -247,6 +250,43 @@ OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } +int +OCTET_STRING_copy(const asn_TYPE_descriptor_t *td, void **aptr, + const void *bptr) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + OCTET_STRING_t *a = *aptr; + const OCTET_STRING_t *b = bptr; + + if(!b) { + if(a) { + FREEMEM(a->buf); + a->buf = 0; + a->size = 0; + FREEMEM(a); + } + *aptr = 0; + return 0; + } + + if(!a) { + a = *aptr = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); + if(!a) return -1; + } + + void *buf = MALLOC(b->size + 1); + if(!buf) return -1; + memcpy(buf, b->buf, b->size); + ((uint8_t *)buf)[b->size] = '\0'; + + FREEMEM(a->buf); + a->buf = (uint8_t *)buf; + a->size = b->size; + + return 0; +} + #if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) int OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, diff --git a/lib/asn1c/common/OCTET_STRING.h b/lib/asn1c/common/OCTET_STRING.h index b1ace1409e..1340865da3 100644 --- a/lib/asn1c/common/OCTET_STRING.h +++ b/lib/asn1c/common/OCTET_STRING.h @@ -29,6 +29,7 @@ asn_struct_print_f OCTET_STRING_print_utf8; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f OCTET_STRING_compare; +asn_struct_copy_f OCTET_STRING_copy; #define OCTET_STRING_constraint asn_generic_no_constraint @@ -46,6 +47,8 @@ xer_type_encoder_f OCTET_STRING_encode_xer_utf8; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f OCTET_STRING_decode_jer_hex; /* Hexadecimal */ +jer_type_decoder_f OCTET_STRING_decode_jer_utf8; /* ASCII/UTF-8 */ jer_type_encoder_f OCTET_STRING_encode_jer; jer_type_encoder_f OCTET_STRING_encode_jer_utf8; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/OCTET_STRING_aper.c b/lib/asn1c/common/OCTET_STRING_aper.c index 0373fe6ad5..2601383194 100644 --- a/lib/asn1c/common/OCTET_STRING_aper.c +++ b/lib/asn1c/common/OCTET_STRING_aper.c @@ -179,7 +179,6 @@ OCTET_STRING_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, raw_len = aper_get_length(pd, csiz->lower_bound, csiz->upper_bound, csiz->effective_bits, &repeat); if(raw_len < 0) RETURN(RC_WMORE); - raw_len += csiz->lower_bound; ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", (long)csiz->effective_bits, (long)raw_len, diff --git a/lib/asn1c/common/OPEN_TYPE.c b/lib/asn1c/common/OPEN_TYPE.c index c9afecffed..75f9b95851 100644 --- a/lib/asn1c/common/OPEN_TYPE.c +++ b/lib/asn1c/common/OPEN_TYPE.c @@ -14,6 +14,7 @@ asn_TYPE_operation_t asn_OP_OPEN_TYPE = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OPEN_TYPE_compare, + OPEN_TYPE_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OPEN_TYPE_decode_ber, OPEN_TYPE_encode_der, @@ -29,9 +30,11 @@ asn_TYPE_operation_t asn_OP_OPEN_TYPE = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OPEN_TYPE_decode_jer, OPEN_TYPE_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OPEN_TYPE_decode_oer, diff --git a/lib/asn1c/common/OPEN_TYPE.h b/lib/asn1c/common/OPEN_TYPE.h index 5e979773e0..c4b5d1b815 100644 --- a/lib/asn1c/common/OPEN_TYPE.h +++ b/lib/asn1c/common/OPEN_TYPE.h @@ -33,6 +33,7 @@ extern "C" { #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define OPEN_TYPE_compare CHOICE_compare +#define OPEN_TYPE_copy CHOICE_copy #define OPEN_TYPE_constraint CHOICE_constraint @@ -59,6 +60,13 @@ asn_dec_rval_t OPEN_TYPE_xer_get( #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +asn_dec_rval_t OPEN_TYPE_jer_get( + const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + const asn_TYPE_member_t *element, + const void *ptr, size_t size); +#define OPEN_TYPE_decode_jer NULL #define OPEN_TYPE_encode_jer CHOICE_encode_jer #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ @@ -70,7 +78,10 @@ asn_dec_rval_t OPEN_TYPE_oer_get( asn_TYPE_member_t *element, const void *ptr, size_t size); #define OPEN_TYPE_decode_oer NULL -#define OPEN_TYPE_encode_oer CHOICE_encode_oer +asn_enc_rval_t OPEN_TYPE_encode_oer( + const asn_TYPE_descriptor_t *type_descriptor, + const asn_oer_constraints_t *constraints, const void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes_cb, void *app_key); #endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ #if !defined(ASN_DISABLE_UPER_SUPPORT) diff --git a/lib/asn1c/common/OPEN_TYPE_aper.c b/lib/asn1c/common/OPEN_TYPE_aper.c index 3e2ab18881..78799ff6d2 100644 --- a/lib/asn1c/common/OPEN_TYPE_aper.c +++ b/lib/asn1c/common/OPEN_TYPE_aper.c @@ -53,7 +53,8 @@ OPEN_TYPE_aper_get(const asn_codec_ctx_t *opt_codec_ctx, (char *)*memb_ptr2 + elm->type->elements[selected.presence_index - 1].memb_offset; - rv = aper_open_type_get(opt_codec_ctx, selected.type_descriptor, NULL, + rv = aper_open_type_get(opt_codec_ctx, selected.type_descriptor, + elm->type->elements[selected.presence_index - 1].encoding_constraints.per_constraints, &inner_value, pd); switch(rv.code) { case RC_OK: @@ -110,7 +111,7 @@ OPEN_TYPE_encode_aper(const asn_TYPE_descriptor_t *td, memb_ptr = (const char *)sptr + elm->memb_offset; } - if(aper_open_type_put(elm->type, NULL, memb_ptr, po) < 0) { + if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po) < 0) { ASN__ENCODE_FAILED; } diff --git a/lib/asn1c/common/ObjectDescriptor.c b/lib/asn1c/common/ObjectDescriptor.c index c311a9291d..4b3560af19 100644 --- a/lib/asn1c/common/ObjectDescriptor.c +++ b/lib/asn1c/common/ObjectDescriptor.c @@ -20,6 +20,7 @@ asn_TYPE_operation_t asn_OP_ObjectDescriptor = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, @@ -35,9 +36,11 @@ asn_TYPE_operation_t asn_OP_ObjectDescriptor = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_utf8, OCTET_STRING_encode_jer_utf8, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) 0, diff --git a/lib/asn1c/common/ObjectDescriptor.h b/lib/asn1c/common/ObjectDescriptor.h index 852c45d036..b70c0cbaf0 100644 --- a/lib/asn1c/common/ObjectDescriptor.h +++ b/lib/asn1c/common/ObjectDescriptor.h @@ -35,6 +35,7 @@ extern asn_TYPE_operation_t asn_OP_ObjectDescriptor; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define ObjectDescriptor_decode_jer OCTET_STRING_decode_jer_utf8 #define ObjectDescriptor_encode_jer OCTET_STRING_encode_jer_utf8 #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/PrintableString.c b/lib/asn1c/common/PrintableString.c index f046f12e18..da4dabc727 100644 --- a/lib/asn1c/common/PrintableString.c +++ b/lib/asn1c/common/PrintableString.c @@ -57,6 +57,7 @@ asn_TYPE_operation_t asn_OP_PrintableString = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, @@ -72,9 +73,11 @@ asn_TYPE_operation_t asn_OP_PrintableString = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_utf8, OCTET_STRING_encode_jer_utf8, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OCTET_STRING_decode_oer, diff --git a/lib/asn1c/common/PrintableString.h b/lib/asn1c/common/PrintableString.h index c24861d5c6..aa37f39a3f 100644 --- a/lib/asn1c/common/PrintableString.h +++ b/lib/asn1c/common/PrintableString.h @@ -23,6 +23,7 @@ extern asn_TYPE_operation_t asn_OP_PrintableString; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define PrintableString_compare OCTET_STRING_compare +#define PrintableString_copy OCTET_STRING_copy asn_constr_check_f PrintableString_constraint; @@ -37,6 +38,7 @@ asn_constr_check_f PrintableString_constraint; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define PrintableString_decode_jer OCTET_STRING_decode_jer_utf8 #define PrintableString_encode_jer OCTET_STRING_encode_jer_utf8 #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/UTF8String.c b/lib/asn1c/common/UTF8String.c index 51923b7610..bb627d9882 100644 --- a/lib/asn1c/common/UTF8String.c +++ b/lib/asn1c/common/UTF8String.c @@ -21,6 +21,7 @@ asn_TYPE_operation_t asn_OP_UTF8String = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, @@ -36,9 +37,11 @@ asn_TYPE_operation_t asn_OP_UTF8String = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_utf8, OCTET_STRING_encode_jer_utf8, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OCTET_STRING_decode_oer, diff --git a/lib/asn1c/common/UTF8String.h b/lib/asn1c/common/UTF8String.h index 3a31def822..e1fefeee64 100644 --- a/lib/asn1c/common/UTF8String.h +++ b/lib/asn1c/common/UTF8String.h @@ -23,6 +23,7 @@ asn_struct_print_f UTF8String_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define UTF8String_compare OCTET_STRING_compare +#define UTF8String_copy OCTET_STRING_copy asn_constr_check_f UTF8String_constraint; @@ -37,6 +38,7 @@ asn_constr_check_f UTF8String_constraint; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define UTF8String_decode_jer OCTET_STRING_decode_jer_utf8 #define UTF8String_encode_jer OCTET_STRING_encode_jer_utf8 #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/VisibleString.c b/lib/asn1c/common/VisibleString.c index ea4c43bd58..f583b6203d 100644 --- a/lib/asn1c/common/VisibleString.c +++ b/lib/asn1c/common/VisibleString.c @@ -27,6 +27,7 @@ asn_TYPE_operation_t asn_OP_VisibleString = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ OCTET_STRING_compare, + OCTET_STRING_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, @@ -42,9 +43,11 @@ asn_TYPE_operation_t asn_OP_VisibleString = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_decode_jer_utf8, OCTET_STRING_encode_jer_utf8, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) OCTET_STRING_decode_oer, diff --git a/lib/asn1c/common/VisibleString.h b/lib/asn1c/common/VisibleString.h index 4ed5763ecc..013f12f0c9 100644 --- a/lib/asn1c/common/VisibleString.h +++ b/lib/asn1c/common/VisibleString.h @@ -23,6 +23,7 @@ extern asn_TYPE_operation_t asn_OP_VisibleString; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ #define VisibleString_compare OCTET_STRING_compare +#define VisibleString_copy OCTET_STRING_copy asn_constr_check_f VisibleString_constraint; @@ -37,6 +38,7 @@ asn_constr_check_f VisibleString_constraint; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define VisibleString_decode_jer OCTET_STRING_decode_jer_hex #define VisibleString_encode_jer OCTET_STRING_encode_jer #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/aper_support.c b/lib/asn1c/common/aper_support.c index 1f34c60d6b..6731c1c766 100644 --- a/lib/asn1c/common/aper_support.c +++ b/lib/asn1c/common/aper_support.c @@ -25,8 +25,7 @@ aper_get_length(asn_per_data_t *pd, ssize_t lb, ssize_t ub, *repeat = 0; if (constrained && ub < 65536) { - int range = ub - lb + 1; - return aper_get_nsnnwn(pd, range); + return aper_get_constrained_whole_number(pd, lb, ub); } if (aper_get_align(pd) < 0) @@ -70,55 +69,117 @@ aper_get_nslength(asn_per_data_t *pd) { } ssize_t -aper_get_nsnnwn(asn_per_data_t *pd, int range) { - ssize_t value; - int bytes = 0; +aper_get_nsnnwn(asn_per_data_t *pd) { + int b; + int length; - ASN_DEBUG("getting nsnnwn with range %d", range); + ASN_DEBUG("getting nsnnwn"); - if(range <= 255) { - int i; + b = per_get_few_bits(pd, 1); + if (b == -1) + return -1; - if (range < 0) return -1; - /* 1 -> 8 bits */ - for (i = 1; i <= 8; i++) { - int upper = 1 << i; - if (upper >= range) - break; - } - value = per_get_few_bits(pd, i); - return value; - } else if (range == 256){ - /* 1 byte */ - bytes = 1; - } else if (range <= 65536) { - /* 2 bytes */ - bytes = 2; - } else { - //return -1; - int length; + /* X.691 2002 10.6.1 */ + if (b == 0) + return per_get_few_bits(pd, 6); + + if (aper_get_align(pd) < 0) + return -1; - /* handle indefinite range */ - length = per_get_few_bits(pd, 1); - if (length == 0) - return per_get_few_bits(pd, 6); + /* X.691 2002 10.6.2 */ + /* X.691 2002 10.9.3.5 */ + b = per_get_few_bits(pd, 1); + if (b == -1) + return -1; + + if (b == 1) { + /* other 10.9.3.x cases not handled, it's doubtful we reach them in practice */ + ASN_DEBUG("todo: X.691 2002 10.9.3.x"); + return -1; + } + + /* X.691 2002 10.9.3.6 */ + length = per_get_few_bits(pd, 7); + if (length > 4) { + /* todo */ + ASN_DEBUG("todo: X.691 2002 10.9.3.6 for length > 4"); + return -1; + } + ASN_DEBUG("length %d\n", length); + + /* todo: 0xffffffff will be seen as -1 and will lead to decoding failure */ + return per_get_few_bits(pd, length * 8); +} - if (aper_get_align(pd) < 0) +/* X.691 2002 10.5 - Decoding of a constrained whole number */ +long +aper_get_constrained_whole_number(asn_per_data_t *pd, long lb, long ub) { + assert(ub >= lb); + long range = ub - lb + 1; + int range_len; + int value_len; + long value; + + ASN_DEBUG("aper get constrained_whole_number with lb %ld and ub %ld", lb, ub); + + /* X.691 2002 10.5.4 */ + if (range == 1) + return lb; + + /* X.691 2002 10.5.7.1 - The bit-field case. */ + if (range <= 255) { + int bitfield_size = 8; + for (bitfield_size = 8; bitfield_size >= 2; bitfield_size--) + if ((range - 1) & (1 << (bitfield_size-1))) + break; + value = per_get_few_bits(pd, bitfield_size); + if (value < 0 || value >= range) return -1; + return value + lb; + } - length = per_get_few_bits(pd, 8); - /* the length is not likely to be that big */ - if (length > 4) + /* X.691 2002 10.5.7.2 - The one-octet case. */ + if (range == 256) { + if (aper_get_align(pd)) return -1; - value = 0; - if (per_get_many_bits(pd, (uint8_t *)&value, 0, length * 8) < 0) + value = per_get_few_bits(pd, 8); + if (value < 0 || value >= range) return -1; - return value; + return value + lb; } - if (aper_get_align(pd) < 0) + + /* X.691 2002 10.5.7.3 - The two-octet case. */ + if (range <= 65536) { + if (aper_get_align(pd)) + return -1; + value = per_get_few_bits(pd, 16); + if (value < 0 || value >= range) + return -1; + return value + lb; + } + + /* X.691 2002 10.5.7.4 - The indefinite length case. */ + /* since we limit input to be 'long' we don't handle all numbers */ + /* and so length determinant is retrieved as X.691 2002 10.9.3.3 */ + /* number of bytes to store the range */ + for (range_len = 3; ; range_len++) { + long bits = ((long)1) << (8 * range_len); + if (range - 1 < bits) + break; + } + value_len = aper_get_constrained_whole_number(pd, 1, range_len); + if (value_len == -1) + return -1; + if (value_len > 4) { + ASN_DEBUG("todo: aper_get_constrained_whole_number: value_len > 4"); + return -1; + } + if (aper_get_align(pd)) + return -1; + value = per_get_few_bits(pd, value_len * 8); + if (value < 0 || value >= range) return -1; - value = per_get_few_bits(pd, 8 * bytes); - return value; + return value + lb; } int aper_put_align(asn_per_outp_t *po) { @@ -142,11 +203,9 @@ aper_put_length(asn_per_outp_t *po, ssize_t lb, ssize_t ub, size_t n, int *need_ ASN_DEBUG("APER put length %zu with range (%zd..%zd)", n, lb, ub); - /* 11.9 X.691 Note 2 */ - if (constrained && ub < 65536) { - int range = ub - lb + 1; - return aper_put_nsnnwn(po, range, n) ? -1 : (ssize_t)n; - } + /* X.691 2002 10.9.3.3 */ + if (constrained && ub < 65536) + return aper_put_constrained_whole_number(po, lb, ub, n + lb) ? -1 : (ssize_t)n; if (aper_put_align(po) < 0) return -1; @@ -189,51 +248,113 @@ aper_put_nslength(asn_per_outp_t *po, size_t length) { } int -aper_put_nsnnwn(asn_per_outp_t *po, int range, int number) { - int bytes; +aper_put_nsnnwn(asn_per_outp_t *po, int number) { + int len; + + ASN_DEBUG("aper put nsnnwn %d", number); + + if (number <= 63) { + if (per_put_few_bits(po, 0, 1)) + return -1; + return per_put_few_bits(po, number, 6); + } - ASN_DEBUG("aper put nsnnwn %d with range %d", number, range); - /* 10.5.7.1 X.691 */ - if(range < 0) { + if (per_put_few_bits(po, 1, 1)) + return -1; + + if (number < 256) { + len = 1; + } else if (number < 65536) { + len = 2; + } else { /* number > 64K */ int i; - for (i = 1; ; i++) { + for (i = 3; ; i++) { int bits = 1 << (8 * i); - if (number <= bits) + if (number < bits) break; } - bytes = i; - assert(i <= 4); + len = i; } - if(range <= 255) { - int i; - for (i = 1; i <= 8; i++) { - int bits = 1 << i; - if (range <= bits) - break; - } - return per_put_few_bits(po, number, i); - } else if(range == 256) { - if (number >= range) + + if (aper_put_align(po) < 0) + return -1; + + /* put the length which is a non-constrained whole number */ + if (len <= 127) { + if(per_put_few_bits(po, 0, 1)) return -1; - bytes = 1; - } else if(range <= 65536) { - if (number >= range) + if(per_put_few_bits(po, len, 7)) return -1; - bytes = 2; - } else { /* Ranges > 64K */ - int i; - for (i = 1; ; i++) { - int bits = 1 << (8 * i); - if (range <= bits) - break; - } - assert(i <= 4); - bytes = i; + } else { + /* todo but not big problem, it's very doubtful that the + * number of bytes to encode 'number' will be > 127 + */ + return -1; } if(aper_put_align(po) < 0) /* Aligning on octet */ return -1; -/* if(per_put_few_bits(po, bytes, 8)) + return per_put_few_bits(po, number, 8 * len); +} + +/* X.691 2002 10.5 - Encoding of a constrained whole number */ +int +aper_put_constrained_whole_number(asn_per_outp_t *po, long lb, long ub, long number) { + assert(ub >= lb); + long range = ub - lb + 1; + long value = number - lb; + int range_len; + int value_len; + + ASN_DEBUG("aper put constrained_whole_number %ld with lb %ld and ub %ld", number, lb, ub); + + if (number < lb || number > ub) + return -1; + + /* X.691 2002 10.5.4 */ + if (range == 1) + return 0; + + /* X.691 2002 10.5.7.1 - The bit-field case. */ + if (range <= 255) { + int bitfield_size = 8; + for (bitfield_size = 8; bitfield_size >= 2; bitfield_size--) + if ((range - 1) & (1 << (bitfield_size-1))) + break; + return per_put_few_bits(po, value, bitfield_size); + } + + /* X.691 2002 10.5.7.2 - The one-octet case. */ + if (range == 256) { + if (aper_put_align(po)) + return -1; + return per_put_few_bits(po, value, 8); + } + + /* X.691 2002 10.5.7.3 - The two-octet case. */ + if (range <= 65536) { + if (aper_put_align(po)) + return -1; + return per_put_few_bits(po, value, 16); + } + + /* X.691 2002 10.5.7.4 - The indefinite length case. */ + /* since we limit input to be 'long' we don't handle all numbers */ + /* and so length determinant is stored as X.691 2002 10.9.3.3 */ + /* number of bytes to store the range */ + for (range_len = 3; ; range_len++) { + int bits = 1 << (8 * range_len); + if (range - 1 < bits) + break; + } + /* number of bytes to store the value */ + for (value_len = 1; ; value_len++) { + long bits = ((long)1) << (8 * value_len); + if (value < bits) + break; + } + if (aper_put_constrained_whole_number(po, 1, range_len, value_len)) + return -1; + if (aper_put_align(po)) return -1; -*/ - return per_put_few_bits(po, number, 8 * bytes); + return per_put_few_bits(po, value, value_len * 8); } diff --git a/lib/asn1c/common/aper_support.h b/lib/asn1c/common/aper_support.h index a3724455c8..62d37905e7 100644 --- a/lib/asn1c/common/aper_support.h +++ b/lib/asn1c/common/aper_support.h @@ -27,7 +27,12 @@ ssize_t aper_get_nslength(asn_per_data_t *pd); /* * Get the normally small non-negative whole number. */ -ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range); +ssize_t aper_get_nsnnwn(asn_per_data_t *pd); + +/* + * Get the constrained whole number. + */ +long aper_get_constrained_whole_number(asn_per_data_t *po, long lb, long ub); /* * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" @@ -54,7 +59,12 @@ int aper_put_nslength(asn_per_outp_t *po, size_t length); /* * Put the normally small non-negative whole number. */ -int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number); +int aper_put_nsnnwn(asn_per_outp_t *po, int number); + +/* + * Put the constrained whole number. + */ +int aper_put_constrained_whole_number(asn_per_outp_t *po, long lb, long ub, long number); #ifdef __cplusplus } diff --git a/lib/asn1c/common/asn_application.c b/lib/asn1c/common/asn_application.c index 7992185b5f..4309593d07 100644 --- a/lib/asn1c/common/asn_application.c +++ b/lib/asn1c/common/asn_application.c @@ -229,6 +229,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, #if !defined(ASN_DISABLE_XER_SUPPORT) enum xer_encoder_flags_e xer_flags = XER_F_CANONICAL; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + enum jer_encoder_flags_e jer_flags = JER_F; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ (void)opt_codec_ctx; /* Parameters are not checked on encode yet. */ @@ -432,9 +435,15 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + case ATS_JER_MINIFIED: + /* Currently JER_F and JER_F_MINIFIED have opposite purposes + * so we just flip the flag. */ + jer_flags &= ~JER_F; + jer_flags |= JER_F_MINIFIED; + /* Fall through. */ case ATS_JER: if(td->op->jer_encoder) { - er = jer_encode(td, sptr, callback, callback_key); + er = jer_encode(td, sptr, jer_flags, callback, callback_key); if(er.encoded == -1) { if(er.failed_type && er.failed_type->op->jer_encoder) { errno = EBADF; /* Structure has incorrect form. */ @@ -533,6 +542,15 @@ asn_decode(const asn_codec_ctx_t *opt_codec_ctx, errno = ENOENT; ASN__DECODE_FAILED; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + + case ATS_JER: + case ATS_JER_MINIFIED: +#if !defined(ASN_DISABLE_JER_SUPPORT) + return jer_decode(opt_codec_ctx, td, sptr, buffer, size); +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ } } diff --git a/lib/asn1c/common/asn_application.h b/lib/asn1c/common/asn_application.h index bf10cd3e2d..355bc84583 100644 --- a/lib/asn1c/common/asn_application.h +++ b/lib/asn1c/common/asn_application.h @@ -61,7 +61,13 @@ enum asn_transfer_syntax { */ ATS_BASIC_XER, ATS_CANONICAL_XER, + /* + * X.697: + * JER: JSON Encoding Rules. + * MINIFIED produces a whitespace-free JSON. + */ ATS_JER, + ATS_JER_MINIFIED, }; /* diff --git a/lib/asn1c/common/asn_codecs_prim.h b/lib/asn1c/common/asn_codecs_prim.h index 5bbd9cfbc8..8647ab9f71 100644 --- a/lib/asn1c/common/asn_codecs_prim.h +++ b/lib/asn1c/common/asn_codecs_prim.h @@ -49,6 +49,32 @@ asn_dec_rval_t xer_decode_primitive( xer_primitive_body_decoder_f *prim_body_decoder); #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) +/* + * A callback specification for the jer_decode_primitive() function below. + */ +enum jer_pbd_rval { + JPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ + JPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ + JPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ + JPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ + JPBD_BODY_CONSUMED /* Body is recognized and consumed */ +}; +typedef enum jer_pbd_rval(jer_primitive_body_decoder_f)( + const asn_TYPE_descriptor_t *td, void *struct_ptr, const void *chunk_buf, + size_t chunk_size); + +/* + * Specific function to decode simple primitive types. + * Also see jer_decode_general() in jer_decoder.h + */ +asn_dec_rval_t jer_decode_primitive( + const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, + size_t struct_size, const void *buf_ptr, size_t size, + jer_primitive_body_decoder_f *prim_body_decoder); +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + #ifdef __cplusplus } #endif diff --git a/lib/asn1c/common/asn_config.h b/lib/asn1c/common/asn_config.h index 7c3befe479..dd73c7e9ec 100644 --- a/lib/asn1c/common/asn_config.h +++ b/lib/asn1c/common/asn_config.h @@ -4,3 +4,4 @@ #define ASN_DISABLE_XER_SUPPORT 1 #define ASN_DISABLE_OER_SUPPORT 1 #define ASN_DISABLE_UPER_SUPPORT 1 +#define ASN_DISABLE_JER_SUPPORT 1 diff --git a/lib/asn1c/common/asn_internal.c b/lib/asn1c/common/asn_internal.c index c2a8108e79..1b282661dc 100644 --- a/lib/asn1c/common/asn_internal.c +++ b/lib/asn1c/common/asn_internal.c @@ -26,7 +26,9 @@ asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key, buf_size <<= 1; if(buf == scratch) { buf = MALLOC(buf_size); - if(!buf) return -1; + if(!buf) { + return -1; + } } else { void *p = REALLOC(buf, buf_size); if(!p) { diff --git a/lib/asn1c/common/asn_random_fill.c b/lib/asn1c/common/asn_random_fill.c index 15771b6c7c..4d14cbfdc2 100644 --- a/lib/asn1c/common/asn_random_fill.c +++ b/lib/asn1c/common/asn_random_fill.c @@ -6,6 +6,7 @@ #include <asn_internal.h> #include <asn_random_fill.h> #include <constr_TYPE.h> +#include <stdlib.h> int asn_random_fill(const struct asn_TYPE_descriptor_s *td, void **struct_ptr, diff --git a/lib/asn1c/common/constr_CHOICE.c b/lib/asn1c/common/constr_CHOICE.c index 5f52e3d8bf..2a20583a1d 100644 --- a/lib/asn1c/common/constr_CHOICE.c +++ b/lib/asn1c/common/constr_CHOICE.c @@ -13,6 +13,7 @@ asn_TYPE_operation_t asn_OP_CHOICE = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ CHOICE_compare, + CHOICE_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) CHOICE_decode_ber, CHOICE_encode_der, @@ -28,9 +29,11 @@ asn_TYPE_operation_t asn_OP_CHOICE = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + CHOICE_decode_jer, CHOICE_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) CHOICE_decode_oer, @@ -154,13 +157,14 @@ CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, void CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, enum asn_struct_free_method method) { - const asn_CHOICE_specifics_t *specs = - (const asn_CHOICE_specifics_t *)td->specifics; + const asn_CHOICE_specifics_t *specs; unsigned present; if(!td || !ptr) return; + specs = (const asn_CHOICE_specifics_t *)td->specifics; + ASN_DEBUG("Freeing %s as CHOICE", td->name); /* @@ -311,6 +315,59 @@ CHOICE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bp } } +int +CHOICE_copy(const asn_TYPE_descriptor_t *td, void **aptr, const void *bptr) { + if(!td) return -1; + + void *st = *aptr; + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm; /* CHOICE's element */ + int present; + int ret; + void *amemb; + void **amembp; + const void *bmemb; + + if(!bptr) { + if(st) { + ASN_STRUCT_FREE(*td, st); + *aptr = NULL; + } + return 0; + } + + if(!st) { + st = *aptr = CALLOC(1, specs->struct_size); + if(!st) return -1; + } + + present = _fetch_present_idx(bptr, + specs->pres_offset, specs->pres_size); + + if(present <= 0 && (unsigned)present > td->elements_count) return -1; + --present; + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + amembp = (void **)((char *)st + elm->memb_offset); + bmemb = *(const void* const*)((const char*)bptr + elm->memb_offset); + } else { + amemb = (char *)st + elm->memb_offset; + amembp = &amemb; + bmemb = (const void*)((const char*)bptr + elm->memb_offset); + } + ret = elm->type->op->copy_struct(elm->type, amembp, bmemb); + if (ret != 0) return ret; + + _set_present_idx(st, + specs->pres_offset, + specs->pres_size, present + 1); + + return 0; +} + /* * Return the 1-based choice variant presence index. * Returns 0 in case of error. diff --git a/lib/asn1c/common/constr_CHOICE.h b/lib/asn1c/common/constr_CHOICE.h index 03d606c88c..1bec3cab88 100644 --- a/lib/asn1c/common/constr_CHOICE.h +++ b/lib/asn1c/common/constr_CHOICE.h @@ -46,6 +46,7 @@ asn_struct_print_f CHOICE_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f CHOICE_compare; +asn_struct_copy_f CHOICE_copy; asn_constr_check_f CHOICE_constraint; @@ -60,6 +61,7 @@ xer_type_encoder_f CHOICE_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f CHOICE_decode_jer; jer_type_encoder_f CHOICE_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/constr_CHOICE_aper.c b/lib/asn1c/common/constr_CHOICE_aper.c index 0d356f7f9f..0f07423339 100644 --- a/lib/asn1c/common/constr_CHOICE_aper.c +++ b/lib/asn1c/common/constr_CHOICE_aper.c @@ -55,8 +55,8 @@ CHOICE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, if(specs->ext_start == -1) ASN__DECODE_FAILED; - if(specs && specs->tag2el_count > specs->ext_start) { - value = aper_get_nsnnwn(pd, specs->tag2el_count - specs->ext_start); /* extension elements range */ + if(specs && specs->tag2el_count > (unsigned)specs->ext_start) { + value = aper_get_nsnnwn(pd); /* extension elements range */ if(value < 0) ASN__DECODE_STARVED; value += specs->ext_start; if((unsigned)value >= td->elements_count) @@ -168,11 +168,7 @@ CHOICE_encode_aper(const asn_TYPE_descriptor_t *td, asn_enc_rval_t rval = {0,0,0}; if(specs->ext_start == -1) ASN__ENCODE_FAILED; - int n = present - specs->ext_start; - if(n <= 63) { - if(n < 0) ASN__ENCODE_FAILED; - if(per_put_few_bits(po, n, 7)) ASN__ENCODE_FAILED; - } else + if(aper_put_nsnnwn(po, present - specs->ext_start)) ASN__ENCODE_FAILED; if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po)) diff --git a/lib/asn1c/common/constr_SEQUENCE.c b/lib/asn1c/common/constr_SEQUENCE.c index 8397d0c1bd..a77b68faca 100644 --- a/lib/asn1c/common/constr_SEQUENCE.c +++ b/lib/asn1c/common/constr_SEQUENCE.c @@ -14,6 +14,7 @@ asn_TYPE_operation_t asn_OP_SEQUENCE = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ SEQUENCE_compare, + SEQUENCE_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) SEQUENCE_decode_ber, SEQUENCE_encode_der, @@ -29,9 +30,11 @@ asn_TYPE_operation_t asn_OP_SEQUENCE = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_decode_jer, SEQUENCE_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) SEQUENCE_decode_oer, @@ -66,13 +69,14 @@ void SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, enum asn_struct_free_method method) { size_t edx; - const asn_SEQUENCE_specifics_t *specs = - (const asn_SEQUENCE_specifics_t *)td->specifics; + const asn_SEQUENCE_specifics_t *specs; asn_struct_ctx_t *ctx; /* Decoder context */ if(!td || !sptr) return; + specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); for(edx = 0; edx < td->elements_count; edx++) { @@ -195,3 +199,53 @@ SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, return 0; } + +int +SEQUENCE_copy(const asn_TYPE_descriptor_t *td, void **aptr, + const void *bptr) { + if(!td) return -1; + + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + size_t edx; + void *st = *aptr; /* Target structure */ + + if(!bptr) { + if(st) { + SEQUENCE_free(td, st, 0); + *aptr = 0; + } + return 0; + } + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *aptr = CALLOC(1, specs->struct_size); + if(st == 0) return -1; + } + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *amemb; + void **amembp; + const void *bmemb; + int ret; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + amembp = (void **)((char *)st + elm->memb_offset); + bmemb = *(const void* const*)((const char*)bptr + elm->memb_offset); + } else { + amemb = (char *)st + elm->memb_offset; + amembp = &amemb; + bmemb = (const void*)((const char*)bptr + elm->memb_offset); + } + + ret = elm->type->op->copy_struct(elm->type, amembp, bmemb); + if(ret != 0) return ret; + } + + return 0; +} diff --git a/lib/asn1c/common/constr_SEQUENCE.h b/lib/asn1c/common/constr_SEQUENCE.h index 5ecfd8f22f..a3f50d1126 100644 --- a/lib/asn1c/common/constr_SEQUENCE.h +++ b/lib/asn1c/common/constr_SEQUENCE.h @@ -51,6 +51,7 @@ asn_struct_print_f SEQUENCE_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f SEQUENCE_compare; +asn_struct_copy_f SEQUENCE_copy; asn_constr_check_f SEQUENCE_constraint; @@ -65,6 +66,7 @@ xer_type_encoder_f SEQUENCE_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f SEQUENCE_decode_jer; jer_type_encoder_f SEQUENCE_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/constr_SEQUENCE_OF.c b/lib/asn1c/common/constr_SEQUENCE_OF.c index 9c5d6cded3..6ec3888579 100644 --- a/lib/asn1c/common/constr_SEQUENCE_OF.c +++ b/lib/asn1c/common/constr_SEQUENCE_OF.c @@ -15,6 +15,7 @@ asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ SEQUENCE_OF_compare, + SEQUENCE_OF_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, @@ -30,9 +31,11 @@ asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_OF_decode_jer, SEQUENCE_OF_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ diff --git a/lib/asn1c/common/constr_SEQUENCE_OF.h b/lib/asn1c/common/constr_SEQUENCE_OF.h index 1768582bf1..978ad8e2a3 100644 --- a/lib/asn1c/common/constr_SEQUENCE_OF.h +++ b/lib/asn1c/common/constr_SEQUENCE_OF.h @@ -23,6 +23,7 @@ extern "C" { #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f SEQUENCE_OF_compare; +#define SEQUENCE_OF_copy SET_OF_copy #define SEQUENCE_OF_constraint SET_OF_constraint @@ -37,6 +38,7 @@ xer_type_encoder_f SEQUENCE_OF_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#define SEQUENCE_OF_decode_jer SET_OF_decode_jer jer_type_encoder_f SEQUENCE_OF_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/constr_SET_OF.c b/lib/asn1c/common/constr_SET_OF.c index 97a7cac0cc..f5cc3bac99 100644 --- a/lib/asn1c/common/constr_SET_OF.c +++ b/lib/asn1c/common/constr_SET_OF.c @@ -14,6 +14,7 @@ asn_TYPE_operation_t asn_OP_SET_OF = { 0, #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ SET_OF_compare, + SET_OF_copy, #if !defined(ASN_DISABLE_BER_SUPPORT) SET_OF_decode_ber, SET_OF_encode_der, @@ -29,9 +30,11 @@ asn_TYPE_operation_t asn_OP_SET_OF = { 0, #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) + SET_OF_decode_jer, SET_OF_encode_jer, #else 0, + 0, #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ #if !defined(ASN_DISABLE_OER_SUPPORT) SET_OF_decode_oer, @@ -369,3 +372,58 @@ SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, return 0; } + +int +SET_OF_copy(const asn_TYPE_descriptor_t *td, void **aptr, + const void *bptr) { + if(!td) return -1; + + const asn_SET_OF_specifics_t *specs = + (const asn_SET_OF_specifics_t *)td->specifics; + void *st = *aptr; + + if(!bptr) { + if(*aptr) { + asn_set_empty(_A_SET_FROM_VOID(*aptr)); + *aptr = 0; + } + return 0; + } + + if(st == 0) { + st = *aptr = CALLOC(1, specs->struct_size); + if(st == 0) return -1; + } + + asn_anonymous_set_ *a = _A_SET_FROM_VOID(*aptr); + const asn_anonymous_set_ *b = _A_CSET_FROM_VOID(bptr); + + if(b->size) { + void *_new_arr; + _new_arr = REALLOC(a->array, b->size * sizeof(b->array[0])); + if(_new_arr) { + a->array = (void **)_new_arr; + a->size = b->size; + } else { + return -1; + } + a->count = b->count; + + for(int i = 0; i < b->count; i++) { + void *bmemb = b->array[i]; + if(bmemb) { + void *amemb = 0; + int ret; + ret = td->elements->type->op->copy_struct( + td->elements->type, + &amemb, bmemb); + if(ret != 0) return ret; + a->array[i] = amemb; + } else { + a->array[i] = 0; + } + } + } + + return 0; +} diff --git a/lib/asn1c/common/constr_SET_OF.h b/lib/asn1c/common/constr_SET_OF.h index 0e9dd39a19..82ead586b6 100644 --- a/lib/asn1c/common/constr_SET_OF.h +++ b/lib/asn1c/common/constr_SET_OF.h @@ -33,6 +33,7 @@ asn_struct_print_f SET_OF_print; #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ asn_struct_compare_f SET_OF_compare; +asn_struct_copy_f SET_OF_copy; asn_constr_check_f SET_OF_constraint; @@ -47,6 +48,7 @@ xer_type_encoder_f SET_OF_encode_xer; #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_decoder_f SET_OF_decode_jer; jer_type_encoder_f SET_OF_encode_jer; #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ diff --git a/lib/asn1c/common/constr_SET_OF_aper.c b/lib/asn1c/common/constr_SET_OF_aper.c index 87c341e0f0..f959b1735c 100644 --- a/lib/asn1c/common/constr_SET_OF_aper.c +++ b/lib/asn1c/common/constr_SET_OF_aper.c @@ -129,13 +129,12 @@ SET_OF_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, if(value) ct = 0; /* Not restricted! */ } - if(ct && ct->effective_bits >= 0) { + if(ct && ct->upper_bound >= 1 && ct->upper_bound <= 65535 + && ct->upper_bound == ct->lower_bound) { /* X.691, #19.5: No length determinant */ - nelems = aper_get_nsnnwn(pd, ct->upper_bound - ct->lower_bound + 1); - ASN_DEBUG("Preparing to fetch %ld+%lld elements from %s", - (long)nelems, (long long int)ct->lower_bound, td->name); - if(nelems < 0) ASN__DECODE_STARVED; - nelems += ct->lower_bound; + nelems = ct->upper_bound; + ASN_DEBUG("Preparing to fetch %ld elements from %s", + (long)nelems, td->name); } else { nelems = -1; } diff --git a/lib/asn1c/common/constr_TYPE.c b/lib/asn1c/common/constr_TYPE.c index e634e750fd..a9e6d0974d 100644 --- a/lib/asn1c/common/constr_TYPE.c +++ b/lib/asn1c/common/constr_TYPE.c @@ -54,6 +54,26 @@ asn_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, return fflush(stream); } +/* + * Copy a structuture. + */ +int +asn_copy(const asn_TYPE_descriptor_t *td, + void **struct_dst, const void *struct_src) { + + if(!td || !struct_dst || !struct_src) { + errno = EINVAL; + return -1; + } + + if(!td->op) { + errno = ENOSYS; + return -1; + } + + return td->op->copy_struct(td, struct_dst, struct_src); +} + /* Dump the data into the specified stdio stream */ static int _print2fp(const void *buffer, size_t size, void *app_key) { diff --git a/lib/asn1c/common/constr_TYPE.h b/lib/asn1c/common/constr_TYPE.h index 55c2574a19..b64d5b5ea1 100644 --- a/lib/asn1c/common/constr_TYPE.h +++ b/lib/asn1c/common/constr_TYPE.h @@ -51,8 +51,10 @@ typedef void (xer_type_encoder_f)(void); #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #if !defined(ASN_DISABLE_JER_SUPPORT) +#include <jer_decoder.h> /* Decoder of JER (JSON, text) */ #include <jer_encoder.h> /* Encoder into JER (JSON, text) */ #else +typedef void (jer_type_decoder_f)(void); typedef void (jer_type_encoder_f)(void); #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ @@ -141,6 +143,16 @@ typedef int (asn_struct_compare_f)( const void *struct_A, const void *struct_B); +/* + * Copies struct B into struct A. + * Allocates memory for struct A, if necessary. + */ +typedef int (asn_struct_copy_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_A, + const void *struct_B + ); + /* * Return the outmost tag of the type. * If the type is untagged CHOICE, the dynamic operation is performed. @@ -173,10 +185,12 @@ typedef struct asn_TYPE_operation_s { asn_struct_free_f *free_struct; /* Free the structure */ asn_struct_print_f *print_struct; /* Human readable output */ asn_struct_compare_f *compare_struct; /* Compare two structures */ + asn_struct_copy_f *copy_struct; /* Copy method */ ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + jer_type_decoder_f *jer_decoder; /* Generic JER encoder */ jer_type_encoder_f *jer_encoder; /* Generic JER encoder */ oer_type_decoder_f *oer_decoder; /* Generic OER decoder */ oer_type_encoder_f *oer_encoder; /* Canonical OER encoder */ @@ -288,6 +302,17 @@ int asn_fprint(FILE *stream, /* Destination stream descriptor */ const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ const void *struct_ptr); /* Structure to be printed */ +/* + * Copies a source structure (struct_src) into destination structure + * (struct_dst). Allocates memory for the destination structure, if necessary. + * RETURN VALUES: + * 0: Copy OK. + * -1: Problem copying the structure. + */ +int asn_copy(const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + void **struct_dst, /* Structure to be populated */ + const void *struct_src); /* Structure to be copied */ + #ifdef __cplusplus } #endif diff --git a/lib/asn1c/common/meson.build b/lib/asn1c/common/meson.build index c984ecd6ba..a695df6782 100644 --- a/lib/asn1c/common/meson.build +++ b/lib/asn1c/common/meson.build @@ -22,6 +22,8 @@ libasn1c_common_sources = files(''' OPEN_TYPE.h OPEN_TYPE.c constr_CHOICE.h + ENUMERATED.h + ENUMERATED.c GraphicString.h GraphicString.c INTEGER.h @@ -92,6 +94,7 @@ libasn1c_common_sources = files(''' aper_support.c aper_opentype.c ANY_aper.c + ENUMERATED_aper.c INTEGER_aper.c NULL_aper.c NativeEnumerated_aper.c @@ -124,26 +127,13 @@ libasn1c_common_sources = files(''' constr_CHOICE_rfill.c constr_SEQUENCE_rfill.c constr_SET_OF_rfill.c - ANY_jer.c - BIT_STRING_jer.c - INTEGER_jer.c - NULL_jer.c - NativeEnumerated_jer.c - NativeInteger_jer.c - OBJECT_IDENTIFIER_jer.c - OCTET_STRING_jer.c - jer_encoder.c - jer_encoder.h - constr_CHOICE_jer.c - constr_SEQUENCE_OF_jer.c - constr_SEQUENCE_jer.c - constr_SET_OF_jer.c '''.split()) libasn1c_common_cc_flags = ['-DASN_DISABLE_BER_SUPPORT', '-DASN_DISABLE_XER_SUPPORT', '-DASN_DISABLE_OER_SUPPORT', - '-DASN_DISABLE_UPER_SUPPORT'] + '-DASN_DISABLE_UPER_SUPPORT', + '-DASN_DISABLE_JER_SUPPORT'] #libasn1c_common_cc_flags += cc.get_supported_arguments([ # '-Wno-parentheses-equality', diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.c index 61cc0c3f66..b5bb6137dd 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationSetupItem.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.h index 766004889d..7dd86fb4c9 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationSetupItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.c index 9e2d3ed3b3..bd485aa390 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationSetupList.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.h index bbc62a3fe6..af2fc66d48 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationSetupList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationSetupList_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.c index 757d218f4e..d524a17f76 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToAddItem.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.h index ed31a73711..26acb87224 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToAddItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.c index 2dd5d4c812..8e4b529043 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToAddList.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.h index 672ceea855..ce1a7a9ad3 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToAddList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToAddList_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.c index 3dac81e870..e7c814a58e 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToRemoveItem.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.h index 92f1711b73..d4b89b7bcc 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToRemoveItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.c index f60887d2fb..2216d64b94 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToRemoveList.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.h index f24544333b..1153f9ec1c 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToRemoveList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToRemoveList_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.c index 075e98d53f..190c9c9e9a 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToUpdateItem.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.h index 9a7b3eefe0..5e3eb35ecd 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToUpdateItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.c b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.c index 5a2166b6b3..61ad8c0ccc 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.c +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-TNLAssociationToUpdateList.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.h b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.h index 4313de62b8..692908c865 100644 --- a/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.h +++ b/lib/asn1c/ngap/NGAP_AMF-TNLAssociationToUpdateList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_TNLAssociationToUpdateList_H_ diff --git a/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.c b/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.c index ed44159850..21defbe31e 100644 --- a/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.c +++ b/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMF-UE-NGAP-ID.h" diff --git a/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.h b/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.h index b9712407c9..abb0b488a3 100644 --- a/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.h +++ b/lib/asn1c/ngap/NGAP_AMF-UE-NGAP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMF_UE_NGAP_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMF_UE_NGAP_ID; asn_struct_free_f NGAP_AMF_UE_NGAP_ID_free; asn_struct_print_f NGAP_AMF_UE_NGAP_ID_print; asn_constr_check_f NGAP_AMF_UE_NGAP_ID_constraint; -jer_type_encoder_f NGAP_AMF_UE_NGAP_ID_encode_jer; per_type_decoder_f NGAP_AMF_UE_NGAP_ID_decode_aper; per_type_encoder_f NGAP_AMF_UE_NGAP_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.c b/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.c index 3a2ee4652c..1ded81d1a2 100644 --- a/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.c +++ b/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFCPRelocationIndication.h" diff --git a/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.h b/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.h index 0d8ebd4ada..2ffcfb0711 100644 --- a/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.h +++ b/lib/asn1c/ngap/NGAP_AMFCPRelocationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFCPRelocationIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.c b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.c index 5d9f7a0d8e..77e480644b 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.c +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFConfigurationUpdate.h" diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.h b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.h index b46963a29f..9dc15707a4 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.h +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFConfigurationUpdate_H_ diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.c b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.c index 78d549141e..1a8be0dedf 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFConfigurationUpdateAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.h b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.h index 8f117b1e8e..a6c6006b9c 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFConfigurationUpdateAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.c b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.c index f027e8c50a..7e27596217 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.c +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFConfigurationUpdateFailure.h" diff --git a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.h b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.h index 0329d7b0a2..d433f52553 100644 --- a/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.h +++ b/lib/asn1c/ngap/NGAP_AMFConfigurationUpdateFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFConfigurationUpdateFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_AMFName.c b/lib/asn1c/ngap/NGAP_AMFName.c index 6c135a9d04..603e5999a8 100644 --- a/lib/asn1c/ngap/NGAP_AMFName.c +++ b/lib/asn1c/ngap/NGAP_AMFName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFName.h" diff --git a/lib/asn1c/ngap/NGAP_AMFName.h b/lib/asn1c/ngap/NGAP_AMFName.h index 68f508ff8b..115cf602d5 100644 --- a/lib/asn1c/ngap/NGAP_AMFName.h +++ b/lib/asn1c/ngap/NGAP_AMFName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFName; asn_struct_free_f NGAP_AMFName_free; asn_struct_print_f NGAP_AMFName_print; asn_constr_check_f NGAP_AMFName_constraint; -jer_type_encoder_f NGAP_AMFName_encode_jer; per_type_decoder_f NGAP_AMFName_decode_aper; per_type_encoder_f NGAP_AMFName_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFNameUTF8String.c b/lib/asn1c/ngap/NGAP_AMFNameUTF8String.c index 1cea5b5fbb..077e4dd465 100644 --- a/lib/asn1c/ngap/NGAP_AMFNameUTF8String.c +++ b/lib/asn1c/ngap/NGAP_AMFNameUTF8String.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFNameUTF8String.h" diff --git a/lib/asn1c/ngap/NGAP_AMFNameUTF8String.h b/lib/asn1c/ngap/NGAP_AMFNameUTF8String.h index 2395559003..a4341f1798 100644 --- a/lib/asn1c/ngap/NGAP_AMFNameUTF8String.h +++ b/lib/asn1c/ngap/NGAP_AMFNameUTF8String.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFNameUTF8String_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFNameUTF8String; asn_struct_free_f NGAP_AMFNameUTF8String_free; asn_struct_print_f NGAP_AMFNameUTF8String_print; asn_constr_check_f NGAP_AMFNameUTF8String_constraint; -jer_type_encoder_f NGAP_AMFNameUTF8String_encode_jer; per_type_decoder_f NGAP_AMFNameUTF8String_decode_aper; per_type_encoder_f NGAP_AMFNameUTF8String_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFNameVisibleString.c b/lib/asn1c/ngap/NGAP_AMFNameVisibleString.c index 00116ef0f9..7206f1f27a 100644 --- a/lib/asn1c/ngap/NGAP_AMFNameVisibleString.c +++ b/lib/asn1c/ngap/NGAP_AMFNameVisibleString.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFNameVisibleString.h" diff --git a/lib/asn1c/ngap/NGAP_AMFNameVisibleString.h b/lib/asn1c/ngap/NGAP_AMFNameVisibleString.h index 04323248f0..b6205f52ee 100644 --- a/lib/asn1c/ngap/NGAP_AMFNameVisibleString.h +++ b/lib/asn1c/ngap/NGAP_AMFNameVisibleString.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFNameVisibleString_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFNameVisibleString; asn_struct_free_f NGAP_AMFNameVisibleString_free; asn_struct_print_f NGAP_AMFNameVisibleString_print; asn_constr_check_f NGAP_AMFNameVisibleString_constraint; -jer_type_encoder_f NGAP_AMFNameVisibleString_encode_jer; per_type_decoder_f NGAP_AMFNameVisibleString_decode_aper; per_type_encoder_f NGAP_AMFNameVisibleString_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFPagingTarget.c b/lib/asn1c/ngap/NGAP_AMFPagingTarget.c index c9437c3541..ba4e5ee982 100644 --- a/lib/asn1c/ngap/NGAP_AMFPagingTarget.c +++ b/lib/asn1c/ngap/NGAP_AMFPagingTarget.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFPagingTarget.h" diff --git a/lib/asn1c/ngap/NGAP_AMFPagingTarget.h b/lib/asn1c/ngap/NGAP_AMFPagingTarget.h index 44c97c422f..a8eba29d49 100644 --- a/lib/asn1c/ngap/NGAP_AMFPagingTarget.h +++ b/lib/asn1c/ngap/NGAP_AMFPagingTarget.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFPagingTarget_H_ diff --git a/lib/asn1c/ngap/NGAP_AMFPointer.c b/lib/asn1c/ngap/NGAP_AMFPointer.c index 5b43062d0e..5f56026ed4 100644 --- a/lib/asn1c/ngap/NGAP_AMFPointer.c +++ b/lib/asn1c/ngap/NGAP_AMFPointer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFPointer.h" diff --git a/lib/asn1c/ngap/NGAP_AMFPointer.h b/lib/asn1c/ngap/NGAP_AMFPointer.h index 428ee0c72a..764154a157 100644 --- a/lib/asn1c/ngap/NGAP_AMFPointer.h +++ b/lib/asn1c/ngap/NGAP_AMFPointer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFPointer_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFPointer; asn_struct_free_f NGAP_AMFPointer_free; asn_struct_print_f NGAP_AMFPointer_print; asn_constr_check_f NGAP_AMFPointer_constraint; -jer_type_encoder_f NGAP_AMFPointer_encode_jer; per_type_decoder_f NGAP_AMFPointer_decode_aper; per_type_encoder_f NGAP_AMFPointer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFRegionID.c b/lib/asn1c/ngap/NGAP_AMFRegionID.c index b9524fc67c..967e59366c 100644 --- a/lib/asn1c/ngap/NGAP_AMFRegionID.c +++ b/lib/asn1c/ngap/NGAP_AMFRegionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFRegionID.h" diff --git a/lib/asn1c/ngap/NGAP_AMFRegionID.h b/lib/asn1c/ngap/NGAP_AMFRegionID.h index 17409da65e..0a5a0c3330 100644 --- a/lib/asn1c/ngap/NGAP_AMFRegionID.h +++ b/lib/asn1c/ngap/NGAP_AMFRegionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFRegionID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFRegionID; asn_struct_free_f NGAP_AMFRegionID_free; asn_struct_print_f NGAP_AMFRegionID_print; asn_constr_check_f NGAP_AMFRegionID_constraint; -jer_type_encoder_f NGAP_AMFRegionID_encode_jer; per_type_decoder_f NGAP_AMFRegionID_decode_aper; per_type_encoder_f NGAP_AMFRegionID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFSetID.c b/lib/asn1c/ngap/NGAP_AMFSetID.c index 0ba54503a7..e7a550d7d1 100644 --- a/lib/asn1c/ngap/NGAP_AMFSetID.c +++ b/lib/asn1c/ngap/NGAP_AMFSetID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFSetID.h" diff --git a/lib/asn1c/ngap/NGAP_AMFSetID.h b/lib/asn1c/ngap/NGAP_AMFSetID.h index 7daf0d0033..64b9367632 100644 --- a/lib/asn1c/ngap/NGAP_AMFSetID.h +++ b/lib/asn1c/ngap/NGAP_AMFSetID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFSetID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AMFSetID; asn_struct_free_f NGAP_AMFSetID_free; asn_struct_print_f NGAP_AMFSetID_print; asn_constr_check_f NGAP_AMFSetID_constraint; -jer_type_encoder_f NGAP_AMFSetID_encode_jer; per_type_decoder_f NGAP_AMFSetID_decode_aper; per_type_encoder_f NGAP_AMFSetID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AMFStatusIndication.c b/lib/asn1c/ngap/NGAP_AMFStatusIndication.c index d3a6cb1aa4..8e332c6228 100644 --- a/lib/asn1c/ngap/NGAP_AMFStatusIndication.c +++ b/lib/asn1c/ngap/NGAP_AMFStatusIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AMFStatusIndication.h" diff --git a/lib/asn1c/ngap/NGAP_AMFStatusIndication.h b/lib/asn1c/ngap/NGAP_AMFStatusIndication.h index 8679b32b07..1071d4564a 100644 --- a/lib/asn1c/ngap/NGAP_AMFStatusIndication.h +++ b/lib/asn1c/ngap/NGAP_AMFStatusIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AMFStatusIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_ActivatedCellList.c b/lib/asn1c/ngap/NGAP_ActivatedCellList.c index 5dd0a1df81..635651c1d5 100644 --- a/lib/asn1c/ngap/NGAP_ActivatedCellList.c +++ b/lib/asn1c/ngap/NGAP_ActivatedCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ActivatedCellList.h" diff --git a/lib/asn1c/ngap/NGAP_ActivatedCellList.h b/lib/asn1c/ngap/NGAP_ActivatedCellList.h index 37179c57f6..a3e1cda759 100644 --- a/lib/asn1c/ngap/NGAP_ActivatedCellList.h +++ b/lib/asn1c/ngap/NGAP_ActivatedCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ActivatedCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.c b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.c index cd7ff4537b..6b8ae4737e 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.c +++ b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AdditionalDLUPTNLInformationForHOItem.h" diff --git a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.h b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.h index e45b57f88c..f75846a1ef 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.h +++ b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AdditionalDLUPTNLInformationForHOItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.c b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.c index 3bcb6b2d7f..c8b63ba6b6 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.c +++ b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AdditionalDLUPTNLInformationForHOList.h" diff --git a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.h b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.h index fcaf4a02c3..fb889de4db 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.h +++ b/lib/asn1c/ngap/NGAP_AdditionalDLUPTNLInformationForHOList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AdditionalDLUPTNLInformationForHOList_H_ diff --git a/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.c b/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.c index fafacb0b87..3ff337c815 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.c +++ b/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AdditionalQosFlowInformation.h" diff --git a/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.h b/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.h index 6d7513de59..ca3e4d534a 100644 --- a/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.h +++ b/lib/asn1c/ngap/NGAP_AdditionalQosFlowInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AdditionalQosFlowInformation_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_AdditionalQosFlowInformation_s asn_struct_free_f NGAP_AdditionalQosFlowInformation_free; asn_struct_print_f NGAP_AdditionalQosFlowInformation_print; asn_constr_check_f NGAP_AdditionalQosFlowInformation_constraint; -jer_type_encoder_f NGAP_AdditionalQosFlowInformation_encode_jer; per_type_decoder_f NGAP_AdditionalQosFlowInformation_decode_aper; per_type_encoder_f NGAP_AdditionalQosFlowInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.c b/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.c index dc474c36d8..4427fc1c97 100644 --- a/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.c +++ b/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AllocationAndRetentionPriority.h" diff --git a/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.h b/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.h index 3031c6ea9b..79e802cc4f 100644 --- a/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.h +++ b/lib/asn1c/ngap/NGAP_AllocationAndRetentionPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AllocationAndRetentionPriority_H_ diff --git a/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.c b/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.c index bec56c096f..a4733d31ad 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.c +++ b/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Allowed-CAG-List-per-PLMN.h" diff --git a/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.h b/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.h index fad9539d24..39908ed913 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.h +++ b/lib/asn1c/ngap/NGAP_Allowed-CAG-List-per-PLMN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Allowed_CAG_List_per_PLMN_H_ diff --git a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.c b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.c index 2b83b4f1ee..17e048131a 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.c +++ b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Allowed-PNI-NPN-Item.h" diff --git a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.h b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.h index e0be24e2ae..1ff273b90b 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.h +++ b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Allowed_PNI_NPN_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.c b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.c index 87f896263d..bcc0111c49 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.c +++ b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Allowed-PNI-NPN-List.h" diff --git a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.h b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.h index 78058b6d19..fc01c63246 100644 --- a/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.h +++ b/lib/asn1c/ngap/NGAP_Allowed-PNI-NPN-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Allowed_PNI_NPN_List_H_ diff --git a/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.c b/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.c index 6053d6289c..315c219003 100644 --- a/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.c +++ b/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AllowedNSSAI-Item.h" diff --git a/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.h b/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.h index cd9afbcfef..784d46c945 100644 --- a/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.h +++ b/lib/asn1c/ngap/NGAP_AllowedNSSAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AllowedNSSAI_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_AllowedNSSAI.c b/lib/asn1c/ngap/NGAP_AllowedNSSAI.c index c1272391b2..7bc02d1eed 100644 --- a/lib/asn1c/ngap/NGAP_AllowedNSSAI.c +++ b/lib/asn1c/ngap/NGAP_AllowedNSSAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AllowedNSSAI.h" diff --git a/lib/asn1c/ngap/NGAP_AllowedNSSAI.h b/lib/asn1c/ngap/NGAP_AllowedNSSAI.h index 299ddcf801..d49752d8ee 100644 --- a/lib/asn1c/ngap/NGAP_AllowedNSSAI.h +++ b/lib/asn1c/ngap/NGAP_AllowedNSSAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AllowedNSSAI_H_ diff --git a/lib/asn1c/ngap/NGAP_AllowedTACs.c b/lib/asn1c/ngap/NGAP_AllowedTACs.c index 6081b9859f..c84c5077c9 100644 --- a/lib/asn1c/ngap/NGAP_AllowedTACs.c +++ b/lib/asn1c/ngap/NGAP_AllowedTACs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AllowedTACs.h" diff --git a/lib/asn1c/ngap/NGAP_AllowedTACs.h b/lib/asn1c/ngap/NGAP_AllowedTACs.h index 2a845d310f..56dbc5980c 100644 --- a/lib/asn1c/ngap/NGAP_AllowedTACs.h +++ b/lib/asn1c/ngap/NGAP_AllowedTACs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AllowedTACs_H_ diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.c b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.c index d80f75ac57..bdc9fe80ac 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.c +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AlternativeQoSParaSetIndex.h" diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.h b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.h index 4dd5d8d597..8c7f275715 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.h +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetIndex.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AlternativeQoSParaSetIndex_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AlternativeQoSParaSetIndex; asn_struct_free_f NGAP_AlternativeQoSParaSetIndex_free; asn_struct_print_f NGAP_AlternativeQoSParaSetIndex_print; asn_constr_check_f NGAP_AlternativeQoSParaSetIndex_constraint; -jer_type_encoder_f NGAP_AlternativeQoSParaSetIndex_encode_jer; per_type_decoder_f NGAP_AlternativeQoSParaSetIndex_decode_aper; per_type_encoder_f NGAP_AlternativeQoSParaSetIndex_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.c b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.c index 3c7f25d963..4d51c7aecf 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.c +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AlternativeQoSParaSetItem.h" diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.h b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.h index a57d3d2ccd..fc3a59d1a6 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.h +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AlternativeQoSParaSetItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.c b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.c index f88fe393eb..8665c7c142 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.c +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AlternativeQoSParaSetList.h" diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.h b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.h index 4644559be4..b7a8049162 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.h +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AlternativeQoSParaSetList_H_ diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.c b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.c index 77609e5163..5e0f00c814 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.c +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AlternativeQoSParaSetNotifyIndex.h" diff --git a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.h b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.h index a5fa9c6f00..ad2f922877 100644 --- a/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.h +++ b/lib/asn1c/ngap/NGAP_AlternativeQoSParaSetNotifyIndex.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AlternativeQoSParaSetNotifyIndex_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AlternativeQoSParaSetNotifyIndex; asn_struct_free_f NGAP_AlternativeQoSParaSetNotifyIndex_free; asn_struct_print_f NGAP_AlternativeQoSParaSetNotifyIndex_print; asn_constr_check_f NGAP_AlternativeQoSParaSetNotifyIndex_constraint; -jer_type_encoder_f NGAP_AlternativeQoSParaSetNotifyIndex_encode_jer; per_type_decoder_f NGAP_AlternativeQoSParaSetNotifyIndex_decode_aper; per_type_encoder_f NGAP_AlternativeQoSParaSetNotifyIndex_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterest.c b/lib/asn1c/ngap/NGAP_AreaOfInterest.c index b9b16a08d3..b10d31aa12 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterest.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterest.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterest.h b/lib/asn1c/ngap/NGAP_AreaOfInterest.h index 52a8d47a82..b1dfafb91d 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterest.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterest_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.c b/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.c index d9d1e8297c..73d3d83185 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestCellItem.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.h b/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.h index 4230882b0e..71b42af7be 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestCellItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestCellItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.c b/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.c index 0733f8ee19..af133b854c 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestCellList.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.h b/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.h index ba4666de43..100f393502 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestItem.c b/lib/asn1c/ngap/NGAP_AreaOfInterestItem.c index 8de51c0c6f..6918df790c 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestItem.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestItem.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestItem.h b/lib/asn1c/ngap/NGAP_AreaOfInterestItem.h index da30244e09..f096eda46d 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestItem.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestList.c b/lib/asn1c/ngap/NGAP_AreaOfInterestList.c index 378c41ec78..d38ff24551 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestList.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestList.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestList.h b/lib/asn1c/ngap/NGAP_AreaOfInterestList.h index 485874a2c9..9b73c64f96 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestList.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestList_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.c b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.c index 6c87e9baec..40a95ad9b1 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestRANNodeItem.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.h b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.h index 79873d27fe..aa7e0df408 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestRANNodeItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.c b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.c index c38cf1d0c1..f456bf8cce 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestRANNodeList.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.h b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.h index 6cc13a44a4..bdb6fe3bb5 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestRANNodeList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestRANNodeList_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.c b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.c index 86b25f9661..e05f4bc683 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestTAIItem.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.h b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.h index 6e5a170b23..f934edb355 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestTAIItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.c b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.c index ace5aa857c..dee5a3ecaa 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.c +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaOfInterestTAIList.h" diff --git a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.h b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.h index e6d6bed1ae..24cec33f2e 100644 --- a/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.h +++ b/lib/asn1c/ngap/NGAP_AreaOfInterestTAIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaOfInterestTAIList_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.c b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.c index d1595c5246..bed02b0ac0 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaScopeOfMDT-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.h b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.h index 33a3e32b07..559f30cdc4 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaScopeOfMDT_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.c b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.c index 869cb36c8c..251f2a5952 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.c +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaScopeOfMDT-NR.h" diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.h b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.h index 5ba3294e59..91c18e2b2e 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.h +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfMDT-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaScopeOfMDT_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.c b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.c index 892f92a244..8c5cffe01a 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.c +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaScopeOfNeighCellsItem.h" diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.h b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.h index 2b7067fa52..da10071813 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.h +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaScopeOfNeighCellsItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.c b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.c index 7e2c88aa3d..a6cefb2b64 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.c +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaScopeOfNeighCellsList.h" diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.h b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.h index 080ff60094..d25e92c951 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.h +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfNeighCellsList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaScopeOfNeighCellsList_H_ diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.c b/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.c index 1197676827..c771071984 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.c +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AreaScopeOfQMC.h" diff --git a/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.h b/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.h index 32fb0724b5..100b24da48 100644 --- a/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.h +++ b/lib/asn1c/ngap/NGAP_AreaScopeOfQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AreaScopeOfQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.c b/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.c index d04d2b4cf2..120f5ccbc2 100644 --- a/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.c +++ b/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssistanceDataForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.h b/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.h index b2bf8e0d28..00ebc6f41a 100644 --- a/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.h +++ b/lib/asn1c/ngap/NGAP_AssistanceDataForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssistanceDataForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.c b/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.c index ac17ef4c18..856c0cce69 100644 --- a/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.c +++ b/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssistanceDataForRecommendedCells.h" diff --git a/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.h b/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.h index 8243160c85..7de03ef79e 100644 --- a/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.h +++ b/lib/asn1c/ngap/NGAP_AssistanceDataForRecommendedCells.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssistanceDataForRecommendedCells_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.c b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.c index 95f765ccae..e20686eca0 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.c +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedMBSQosFlowSetupRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.h b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.h index a373d98903..0e0ea32730 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.h +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedMBSQosFlowSetupRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.c b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.c index 1697efa9d1..d5e6134263 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.c +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedMBSQosFlowSetupRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.h b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.h index b8c7cfc155..1286a08647 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.h +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetupRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedMBSQosFlowSetupRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.c b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.c index 3aeb147922..6dae42a05a 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.c +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.h b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.h index 3b179b54e6..bd342a0fc3 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.h +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedMBSQosFlowSetuporModifyRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.c b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.c index 1af8a42893..4dcad15329 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.c +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.h b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.h index 966b3e7559..9494a3f9b1 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.h +++ b/lib/asn1c/ngap/NGAP_AssociatedMBSQosFlowSetuporModifyRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedMBSQosFlowSetuporModifyRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.c b/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.c index e59d1371fa..77c735f35a 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.c +++ b/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedQosFlowItem.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.h b/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.h index a128adb24d..9d951938b2 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.h +++ b/lib/asn1c/ngap/NGAP_AssociatedQosFlowItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedQosFlowItem_H_ diff --git a/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.c b/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.c index 469ca4c28b..153be3ac0f 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.c +++ b/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AssociatedQosFlowList.h" diff --git a/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.h b/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.h index 6778e93a50..f610a1554c 100644 --- a/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.h +++ b/lib/asn1c/ngap/NGAP_AssociatedQosFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AssociatedQosFlowList_H_ diff --git a/lib/asn1c/ngap/NGAP_AuthenticatedIndication.c b/lib/asn1c/ngap/NGAP_AuthenticatedIndication.c index fd12dabbc7..72d8902d70 100644 --- a/lib/asn1c/ngap/NGAP_AuthenticatedIndication.c +++ b/lib/asn1c/ngap/NGAP_AuthenticatedIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AuthenticatedIndication.h" diff --git a/lib/asn1c/ngap/NGAP_AuthenticatedIndication.h b/lib/asn1c/ngap/NGAP_AuthenticatedIndication.h index b1c35918c9..e7197382fe 100644 --- a/lib/asn1c/ngap/NGAP_AuthenticatedIndication.h +++ b/lib/asn1c/ngap/NGAP_AuthenticatedIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AuthenticatedIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_AuthenticatedIndication_specs_ asn_struct_free_f NGAP_AuthenticatedIndication_free; asn_struct_print_f NGAP_AuthenticatedIndication_print; asn_constr_check_f NGAP_AuthenticatedIndication_constraint; -jer_type_encoder_f NGAP_AuthenticatedIndication_encode_jer; per_type_decoder_f NGAP_AuthenticatedIndication_decode_aper; per_type_encoder_f NGAP_AuthenticatedIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.c b/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.c index 053ea6e3b8..fb7d3efaf8 100644 --- a/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.c +++ b/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AvailableRANVisibleQoEMetrics.h" diff --git a/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.h b/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.h index ddfb08eaf8..b01385a505 100644 --- a/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.h +++ b/lib/asn1c/ngap/NGAP_AvailableRANVisibleQoEMetrics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AvailableRANVisibleQoEMetrics_H_ diff --git a/lib/asn1c/ngap/NGAP_AveragingWindow.c b/lib/asn1c/ngap/NGAP_AveragingWindow.c index ae1c60daca..861523614c 100644 --- a/lib/asn1c/ngap/NGAP_AveragingWindow.c +++ b/lib/asn1c/ngap/NGAP_AveragingWindow.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_AveragingWindow.h" diff --git a/lib/asn1c/ngap/NGAP_AveragingWindow.h b/lib/asn1c/ngap/NGAP_AveragingWindow.h index a099809edb..81df5b4558 100644 --- a/lib/asn1c/ngap/NGAP_AveragingWindow.h +++ b/lib/asn1c/ngap/NGAP_AveragingWindow.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_AveragingWindow_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_AveragingWindow; asn_struct_free_f NGAP_AveragingWindow_free; asn_struct_print_f NGAP_AveragingWindow_print; asn_constr_check_f NGAP_AveragingWindow_constraint; -jer_type_encoder_f NGAP_AveragingWindow_encode_jer; per_type_decoder_f NGAP_AveragingWindow_decode_aper; per_type_encoder_f NGAP_AveragingWindow_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.c b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.c index 62aaa2d592..9e43dc3ba7 100644 --- a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.c +++ b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BeamMeasurementsReportConfiguration.h" diff --git a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.h b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.h index c47f2e73b7..e8011e9026 100644 --- a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.h +++ b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BeamMeasurementsReportConfiguration_H_ diff --git a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.c b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.c index 33a1b485aa..2739cadce8 100644 --- a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.c +++ b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BeamMeasurementsReportQuantity.h" diff --git a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.h b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.h index 67d7119bb7..04306c7adc 100644 --- a/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.h +++ b/lib/asn1c/ngap/NGAP_BeamMeasurementsReportQuantity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BeamMeasurementsReportQuantity_H_ diff --git a/lib/asn1c/ngap/NGAP_BitRate.c b/lib/asn1c/ngap/NGAP_BitRate.c index 379e9b4670..3f06cf7bfc 100644 --- a/lib/asn1c/ngap/NGAP_BitRate.c +++ b/lib/asn1c/ngap/NGAP_BitRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BitRate.h" diff --git a/lib/asn1c/ngap/NGAP_BitRate.h b/lib/asn1c/ngap/NGAP_BitRate.h index 8af2ab1d08..a2acb56a13 100644 --- a/lib/asn1c/ngap/NGAP_BitRate.h +++ b/lib/asn1c/ngap/NGAP_BitRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BitRate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_BitRate; asn_struct_free_f NGAP_BitRate_free; asn_struct_print_f NGAP_BitRate_print; asn_constr_check_f NGAP_BitRate_constraint; -jer_type_encoder_f NGAP_BitRate_encode_jer; per_type_decoder_f NGAP_BitRate_decode_aper; per_type_encoder_f NGAP_BitRate_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.c b/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.c index d5a7783b23..f65ef35ff4 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.c +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BluetoothMeasConfig.h" diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.h b/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.h index 64cda2f5d8..8dea8f3311 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.h +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BluetoothMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_BluetoothMeasConfig_specs_1; asn_struct_free_f NGAP_BluetoothMeasConfig_free; asn_struct_print_f NGAP_BluetoothMeasConfig_print; asn_constr_check_f NGAP_BluetoothMeasConfig_constraint; -jer_type_encoder_f NGAP_BluetoothMeasConfig_encode_jer; per_type_decoder_f NGAP_BluetoothMeasConfig_decode_aper; per_type_encoder_f NGAP_BluetoothMeasConfig_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.c b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.c index 4efcc8a58b..dd8aff58c5 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.c +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BluetoothMeasConfigNameItem.h" diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.h b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.h index a815d2486c..4bcb61bbfb 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.h +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BluetoothMeasConfigNameItem_H_ diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.c b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.c index b01c4c0085..af4b986c8f 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.c +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BluetoothMeasConfigNameList.h" diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.h b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.h index 3b5606e71d..f1a838e622 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.h +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BluetoothMeasConfigNameList_H_ diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.c b/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.c index de6f7bf241..c85ffdeda1 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.c +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BluetoothMeasurementConfiguration.h" diff --git a/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.h b/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.h index f54b705f22..8a37ba5ef0 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.h +++ b/lib/asn1c/ngap/NGAP_BluetoothMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BluetoothMeasurementConfiguration_H_ diff --git a/lib/asn1c/ngap/NGAP_BluetoothName.c b/lib/asn1c/ngap/NGAP_BluetoothName.c index 94ae44f3d1..2c884c341f 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothName.c +++ b/lib/asn1c/ngap/NGAP_BluetoothName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BluetoothName.h" diff --git a/lib/asn1c/ngap/NGAP_BluetoothName.h b/lib/asn1c/ngap/NGAP_BluetoothName.h index c4ebf18832..1e65b4c6e1 100644 --- a/lib/asn1c/ngap/NGAP_BluetoothName.h +++ b/lib/asn1c/ngap/NGAP_BluetoothName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BluetoothName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_BluetoothName; asn_struct_free_f NGAP_BluetoothName_free; asn_struct_print_f NGAP_BluetoothName_print; asn_constr_check_f NGAP_BluetoothName_constraint; -jer_type_encoder_f NGAP_BluetoothName_encode_jer; per_type_decoder_f NGAP_BluetoothName_decode_aper; per_type_encoder_f NGAP_BluetoothName_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.c b/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.c index ff423ebc90..fa44659500 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.c +++ b/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastCancelledAreaList.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.h b/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.h index d5eccbdd8c..97509e0ae5 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.h +++ b/lib/asn1c/ngap/NGAP_BroadcastCancelledAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastCancelledAreaList_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.c b/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.c index 0d234efd33..810111c3f6 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.c +++ b/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastCompletedAreaList.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.h b/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.h index d92c8760f8..bc77568684 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.h +++ b/lib/asn1c/ngap/NGAP_BroadcastCompletedAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastCompletedAreaList_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.c b/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.c index ba513a881e..a59293ad69 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.c +++ b/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastPLMNItem.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.h b/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.h index fd6f1197f0..b9811fbd35 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.h +++ b/lib/asn1c/ngap/NGAP_BroadcastPLMNItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastPLMNItem_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastPLMNList.c b/lib/asn1c/ngap/NGAP_BroadcastPLMNList.c index d971709824..dd3f7f17b1 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastPLMNList.c +++ b/lib/asn1c/ngap/NGAP_BroadcastPLMNList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastPLMNList.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastPLMNList.h b/lib/asn1c/ngap/NGAP_BroadcastPLMNList.h index 120f31ee98..cdaa8397af 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastPLMNList.h +++ b/lib/asn1c/ngap/NGAP_BroadcastPLMNList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastPLMNList_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.c b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.c index 9482dde45a..da360670ec 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionModificationFailure.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.h b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.h index eead253e43..a24c90de1d 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionModificationFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.c b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.c index 19c1f4446e..5c68c0af95 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionModificationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.h b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.h index f28ca8b331..117227a292 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionModificationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.c b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.c index 823f28d51f..d989d0c39c 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionModificationResponse.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.h b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.h index bc56f4bd61..d1f4bda232 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionModificationResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionModificationResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.c b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.c index f234fbe176..0c26ea41fc 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionReleaseRequest.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.h b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.h index 59a1d36039..dc9347920d 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionReleaseRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.c b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.c index a7bc71ae3a..de15da6fbb 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionReleaseRequired.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.h b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.h index 8438db1653..e44f0b07d2 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseRequired.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionReleaseRequired_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.c b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.c index 7d538208c7..b6237afd01 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionReleaseResponse.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.h b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.h index 2749f4b231..5b7a585b17 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionReleaseResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionReleaseResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.c b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.c index 2c3fb71edf..05bbd5116e 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionSetupFailure.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.h b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.h index 2b1ede5823..1f4eeeadac 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionSetupFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.c b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.c index 10eccafbb0..ff20dffa3e 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionSetupRequest.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.h b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.h index 8854427765..82a74c09ec 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionSetupRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.c b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.c index e4fc72c7a1..52a498390c 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.c +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BroadcastSessionSetupResponse.h" diff --git a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.h b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.h index 1d16c730ae..8a08d4eb4a 100644 --- a/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.h +++ b/lib/asn1c/ngap/NGAP_BroadcastSessionSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BroadcastSessionSetupResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_BurstArrivalTime.c b/lib/asn1c/ngap/NGAP_BurstArrivalTime.c index 106d47f52e..340972b42a 100644 --- a/lib/asn1c/ngap/NGAP_BurstArrivalTime.c +++ b/lib/asn1c/ngap/NGAP_BurstArrivalTime.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_BurstArrivalTime.h" diff --git a/lib/asn1c/ngap/NGAP_BurstArrivalTime.h b/lib/asn1c/ngap/NGAP_BurstArrivalTime.h index 3fb8c76259..df37f41735 100644 --- a/lib/asn1c/ngap/NGAP_BurstArrivalTime.h +++ b/lib/asn1c/ngap/NGAP_BurstArrivalTime.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_BurstArrivalTime_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_BurstArrivalTime; asn_struct_free_f NGAP_BurstArrivalTime_free; asn_struct_print_f NGAP_BurstArrivalTime_print; asn_constr_check_f NGAP_BurstArrivalTime_constraint; -jer_type_encoder_f NGAP_BurstArrivalTime_encode_jer; per_type_decoder_f NGAP_BurstArrivalTime_decode_aper; per_type_encoder_f NGAP_BurstArrivalTime_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CAG-ID.c b/lib/asn1c/ngap/NGAP_CAG-ID.c index 25ac4b1b2a..66149ff3d4 100644 --- a/lib/asn1c/ngap/NGAP_CAG-ID.c +++ b/lib/asn1c/ngap/NGAP_CAG-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CAG-ID.h" diff --git a/lib/asn1c/ngap/NGAP_CAG-ID.h b/lib/asn1c/ngap/NGAP_CAG-ID.h index 8d04d0d476..40eda73f69 100644 --- a/lib/asn1c/ngap/NGAP_CAG-ID.h +++ b/lib/asn1c/ngap/NGAP_CAG-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CAG_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_CAG_ID; asn_struct_free_f NGAP_CAG_ID_free; asn_struct_print_f NGAP_CAG_ID_print; asn_constr_check_f NGAP_CAG_ID_constraint; -jer_type_encoder_f NGAP_CAG_ID_encode_jer; per_type_decoder_f NGAP_CAG_ID_decode_aper; per_type_encoder_f NGAP_CAG_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.c b/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.c index 069e32298f..5e64770ca1 100644 --- a/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.c +++ b/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CEmodeBSupport-Indicator.h" diff --git a/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.h b/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.h index 9f3a1d5afd..42da41e936 100644 --- a/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.h +++ b/lib/asn1c/ngap/NGAP_CEmodeBSupport-Indicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CEmodeBSupport_Indicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CEmodeBSupport_Indicator_specs asn_struct_free_f NGAP_CEmodeBSupport_Indicator_free; asn_struct_print_f NGAP_CEmodeBSupport_Indicator_print; asn_constr_check_f NGAP_CEmodeBSupport_Indicator_constraint; -jer_type_encoder_f NGAP_CEmodeBSupport_Indicator_encode_jer; per_type_decoder_f NGAP_CEmodeBSupport_Indicator_decode_aper; per_type_encoder_f NGAP_CEmodeBSupport_Indicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CEmodeBrestricted.c b/lib/asn1c/ngap/NGAP_CEmodeBrestricted.c index a5f6084697..e520edad81 100644 --- a/lib/asn1c/ngap/NGAP_CEmodeBrestricted.c +++ b/lib/asn1c/ngap/NGAP_CEmodeBrestricted.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CEmodeBrestricted.h" diff --git a/lib/asn1c/ngap/NGAP_CEmodeBrestricted.h b/lib/asn1c/ngap/NGAP_CEmodeBrestricted.h index 1769d80b6b..d839abbeb2 100644 --- a/lib/asn1c/ngap/NGAP_CEmodeBrestricted.h +++ b/lib/asn1c/ngap/NGAP_CEmodeBrestricted.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CEmodeBrestricted_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CEmodeBrestricted_specs_1; asn_struct_free_f NGAP_CEmodeBrestricted_free; asn_struct_print_f NGAP_CEmodeBrestricted_print; asn_constr_check_f NGAP_CEmodeBrestricted_constraint; -jer_type_encoder_f NGAP_CEmodeBrestricted_encode_jer; per_type_decoder_f NGAP_CEmodeBrestricted_decode_aper; per_type_encoder_f NGAP_CEmodeBrestricted_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.c b/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.c index d5d059b152..ebf2320682 100644 --- a/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.c +++ b/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CNAssistedRANTuning.h" diff --git a/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.h b/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.h index b562b3c7a6..f720691865 100644 --- a/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.h +++ b/lib/asn1c/ngap/NGAP_CNAssistedRANTuning.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CNAssistedRANTuning_H_ diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.c b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.c index 33529a9eb2..8789436359 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.c +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CNTypeRestrictionsForEquivalent.h" diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.h b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.h index dfbfec7f53..251c8bbb92 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.h +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalent.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CNTypeRestrictionsForEquivalent_H_ diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.c b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.c index 3bc52e6bff..9d692586d1 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.c +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CNTypeRestrictionsForEquivalentItem.h" diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.h b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.h index 187f67a6c0..f673d17430 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.h +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForEquivalentItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CNTypeRestrictionsForEquivalentItem_H_ diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.c b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.c index 7064a0ff41..2058dc310d 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.c +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CNTypeRestrictionsForServing.h" diff --git a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.h b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.h index 5d7c69f27b..4494f3991c 100644 --- a/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.h +++ b/lib/asn1c/ngap/NGAP_CNTypeRestrictionsForServing.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CNTypeRestrictionsForServing_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CNTypeRestrictionsForServing_s asn_struct_free_f NGAP_CNTypeRestrictionsForServing_free; asn_struct_print_f NGAP_CNTypeRestrictionsForServing_print; asn_constr_check_f NGAP_CNTypeRestrictionsForServing_constraint; -jer_type_encoder_f NGAP_CNTypeRestrictionsForServing_encode_jer; per_type_decoder_f NGAP_CNTypeRestrictionsForServing_decode_aper; per_type_encoder_f NGAP_CNTypeRestrictionsForServing_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CNsubgroupID.c b/lib/asn1c/ngap/NGAP_CNsubgroupID.c index f83c6ef2f3..1efff8bfcd 100644 --- a/lib/asn1c/ngap/NGAP_CNsubgroupID.c +++ b/lib/asn1c/ngap/NGAP_CNsubgroupID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CNsubgroupID.h" diff --git a/lib/asn1c/ngap/NGAP_CNsubgroupID.h b/lib/asn1c/ngap/NGAP_CNsubgroupID.h index 9db8771bb0..d91342e032 100644 --- a/lib/asn1c/ngap/NGAP_CNsubgroupID.h +++ b/lib/asn1c/ngap/NGAP_CNsubgroupID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CNsubgroupID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_CNsubgroupID; asn_struct_free_f NGAP_CNsubgroupID_free; asn_struct_print_f NGAP_CNsubgroupID_print; asn_constr_check_f NGAP_CNsubgroupID_constraint; -jer_type_encoder_f NGAP_CNsubgroupID_encode_jer; per_type_decoder_f NGAP_CNsubgroupID_decode_aper; per_type_encoder_f NGAP_CNsubgroupID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.c b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.c index 124bcf686e..c2af6a3f7b 100644 --- a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.c +++ b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_COUNTValueForPDCP-SN12.h" diff --git a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.h b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.h index 11e4d9e5b9..a6d268f4dc 100644 --- a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.h +++ b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN12.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_COUNTValueForPDCP_SN12_H_ diff --git a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.c b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.c index c01e70fd38..0bcdce6ba8 100644 --- a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.c +++ b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_COUNTValueForPDCP-SN18.h" diff --git a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.h b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.h index b03e6ace81..086e2c87bc 100644 --- a/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.h +++ b/lib/asn1c/ngap/NGAP_COUNTValueForPDCP-SN18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_COUNTValueForPDCP_SN18_H_ diff --git a/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.c b/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.c index 79aa6ad491..af37219f44 100644 --- a/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.c +++ b/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CPTransportLayerInformation.h" diff --git a/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.h b/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.h index f6711f4cdb..d26dddcf6b 100644 --- a/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.h +++ b/lib/asn1c/ngap/NGAP_CPTransportLayerInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CPTransportLayerInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.c b/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.c index ed9c1be15c..c7c1fb0681 100644 --- a/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.c +++ b/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelAllWarningMessages.h" diff --git a/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.h b/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.h index 31c9b55f14..8815f0a34e 100644 --- a/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.h +++ b/lib/asn1c/ngap/NGAP_CancelAllWarningMessages.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelAllWarningMessages_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CancelAllWarningMessages_specs asn_struct_free_f NGAP_CancelAllWarningMessages_free; asn_struct_print_f NGAP_CancelAllWarningMessages_print; asn_constr_check_f NGAP_CancelAllWarningMessages_constraint; -jer_type_encoder_f NGAP_CancelAllWarningMessages_encode_jer; per_type_decoder_f NGAP_CancelAllWarningMessages_decode_aper; per_type_encoder_f NGAP_CancelAllWarningMessages_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.c b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.c index 81a2db6889..49effb51f6 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInEAI-EUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.h b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.h index 47e4c4923f..a639146f77 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInEAI_EUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.c b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.c index b0f900f884..70446404f5 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInEAI-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.h b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.h index 432d3fd6b5..787237f9fe 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInEAI_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.c b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.c index 281826cf89..64de778c02 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInEAI-NR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.h b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.h index 451c7aa619..749ca585b3 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInEAI_NR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.c b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.c index fad6e8e9dd..8f74513f84 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInEAI-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.h b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.h index cd4c3b4f81..a3e8a88d40 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInEAI-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInEAI_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.c b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.c index 2e5a03bdf2..2a33d40518 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInTAI-EUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.h b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.h index 12aaeefbe3..a5e86f8919 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInTAI_EUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.c b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.c index 1742eecd71..97923577f3 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInTAI-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.h b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.h index 41dc6aec12..9a899dd32b 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInTAI_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.c b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.c index 293ed4f5e3..dd824cb1c4 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInTAI-NR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.h b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.h index 32ff006d2b..6252fd5aef 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInTAI_NR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.c b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.c index 5021b5dad0..63aba6b645 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.c +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CancelledCellsInTAI-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.h b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.h index 20e76aa6c2..d8db293ca8 100644 --- a/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.h +++ b/lib/asn1c/ngap/NGAP_CancelledCellsInTAI-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CancelledCellsInTAI_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CandidateCell.c b/lib/asn1c/ngap/NGAP_CandidateCell.c index ef7fa5fbd2..d83a1cae73 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCell.c +++ b/lib/asn1c/ngap/NGAP_CandidateCell.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CandidateCell.h" diff --git a/lib/asn1c/ngap/NGAP_CandidateCell.h b/lib/asn1c/ngap/NGAP_CandidateCell.h index 329cfd8690..6eee28a580 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCell.h +++ b/lib/asn1c/ngap/NGAP_CandidateCell.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CandidateCell_H_ diff --git a/lib/asn1c/ngap/NGAP_CandidateCellID.c b/lib/asn1c/ngap/NGAP_CandidateCellID.c index c7c85a56a7..b085f1866d 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellID.c +++ b/lib/asn1c/ngap/NGAP_CandidateCellID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CandidateCellID.h" diff --git a/lib/asn1c/ngap/NGAP_CandidateCellID.h b/lib/asn1c/ngap/NGAP_CandidateCellID.h index 3d2ebb7e05..ac074ce7cb 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellID.h +++ b/lib/asn1c/ngap/NGAP_CandidateCellID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CandidateCellID_H_ diff --git a/lib/asn1c/ngap/NGAP_CandidateCellItem.c b/lib/asn1c/ngap/NGAP_CandidateCellItem.c index ff0391e859..e3bd5e5036 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellItem.c +++ b/lib/asn1c/ngap/NGAP_CandidateCellItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CandidateCellItem.h" diff --git a/lib/asn1c/ngap/NGAP_CandidateCellItem.h b/lib/asn1c/ngap/NGAP_CandidateCellItem.h index 6fd5ca0141..30d6a48359 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellItem.h +++ b/lib/asn1c/ngap/NGAP_CandidateCellItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CandidateCellItem_H_ diff --git a/lib/asn1c/ngap/NGAP_CandidateCellList.c b/lib/asn1c/ngap/NGAP_CandidateCellList.c index 3d45f6050c..3dae7cc650 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellList.c +++ b/lib/asn1c/ngap/NGAP_CandidateCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CandidateCellList.h" diff --git a/lib/asn1c/ngap/NGAP_CandidateCellList.h b/lib/asn1c/ngap/NGAP_CandidateCellList.h index e7106fd8c5..b8352ac692 100644 --- a/lib/asn1c/ngap/NGAP_CandidateCellList.h +++ b/lib/asn1c/ngap/NGAP_CandidateCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CandidateCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_CandidatePCI.c b/lib/asn1c/ngap/NGAP_CandidatePCI.c index 68012a2233..04a232f547 100644 --- a/lib/asn1c/ngap/NGAP_CandidatePCI.c +++ b/lib/asn1c/ngap/NGAP_CandidatePCI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CandidatePCI.h" diff --git a/lib/asn1c/ngap/NGAP_CandidatePCI.h b/lib/asn1c/ngap/NGAP_CandidatePCI.h index fd465413c6..3f4298ac24 100644 --- a/lib/asn1c/ngap/NGAP_CandidatePCI.h +++ b/lib/asn1c/ngap/NGAP_CandidatePCI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CandidatePCI_H_ diff --git a/lib/asn1c/ngap/NGAP_Cause.c b/lib/asn1c/ngap/NGAP_Cause.c index c3fcad9577..9f9d91010c 100644 --- a/lib/asn1c/ngap/NGAP_Cause.c +++ b/lib/asn1c/ngap/NGAP_Cause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Cause.h" diff --git a/lib/asn1c/ngap/NGAP_Cause.h b/lib/asn1c/ngap/NGAP_Cause.h index 0e708d22ea..e7ef694c25 100644 --- a/lib/asn1c/ngap/NGAP_Cause.h +++ b/lib/asn1c/ngap/NGAP_Cause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Cause_H_ diff --git a/lib/asn1c/ngap/NGAP_CauseMisc.c b/lib/asn1c/ngap/NGAP_CauseMisc.c index e44f827e57..13f91be17e 100644 --- a/lib/asn1c/ngap/NGAP_CauseMisc.c +++ b/lib/asn1c/ngap/NGAP_CauseMisc.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CauseMisc.h" diff --git a/lib/asn1c/ngap/NGAP_CauseMisc.h b/lib/asn1c/ngap/NGAP_CauseMisc.h index 2e64f8bd9e..0a4f1cca98 100644 --- a/lib/asn1c/ngap/NGAP_CauseMisc.h +++ b/lib/asn1c/ngap/NGAP_CauseMisc.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CauseMisc_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CauseMisc_specs_1; asn_struct_free_f NGAP_CauseMisc_free; asn_struct_print_f NGAP_CauseMisc_print; asn_constr_check_f NGAP_CauseMisc_constraint; -jer_type_encoder_f NGAP_CauseMisc_encode_jer; per_type_decoder_f NGAP_CauseMisc_decode_aper; per_type_encoder_f NGAP_CauseMisc_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CauseNas.c b/lib/asn1c/ngap/NGAP_CauseNas.c index b00df47932..0721f17eb9 100644 --- a/lib/asn1c/ngap/NGAP_CauseNas.c +++ b/lib/asn1c/ngap/NGAP_CauseNas.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CauseNas.h" diff --git a/lib/asn1c/ngap/NGAP_CauseNas.h b/lib/asn1c/ngap/NGAP_CauseNas.h index a7819ff423..bae0949d50 100644 --- a/lib/asn1c/ngap/NGAP_CauseNas.h +++ b/lib/asn1c/ngap/NGAP_CauseNas.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CauseNas_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CauseNas_specs_1; asn_struct_free_f NGAP_CauseNas_free; asn_struct_print_f NGAP_CauseNas_print; asn_constr_check_f NGAP_CauseNas_constraint; -jer_type_encoder_f NGAP_CauseNas_encode_jer; per_type_decoder_f NGAP_CauseNas_decode_aper; per_type_encoder_f NGAP_CauseNas_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CauseProtocol.c b/lib/asn1c/ngap/NGAP_CauseProtocol.c index ecfd154f64..5f46c60386 100644 --- a/lib/asn1c/ngap/NGAP_CauseProtocol.c +++ b/lib/asn1c/ngap/NGAP_CauseProtocol.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CauseProtocol.h" diff --git a/lib/asn1c/ngap/NGAP_CauseProtocol.h b/lib/asn1c/ngap/NGAP_CauseProtocol.h index 5fa01da45c..2b92b97181 100644 --- a/lib/asn1c/ngap/NGAP_CauseProtocol.h +++ b/lib/asn1c/ngap/NGAP_CauseProtocol.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CauseProtocol_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CauseProtocol_specs_1; asn_struct_free_f NGAP_CauseProtocol_free; asn_struct_print_f NGAP_CauseProtocol_print; asn_constr_check_f NGAP_CauseProtocol_constraint; -jer_type_encoder_f NGAP_CauseProtocol_encode_jer; per_type_decoder_f NGAP_CauseProtocol_decode_aper; per_type_encoder_f NGAP_CauseProtocol_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CauseRadioNetwork.c b/lib/asn1c/ngap/NGAP_CauseRadioNetwork.c index 4445a684bd..0397dba238 100644 --- a/lib/asn1c/ngap/NGAP_CauseRadioNetwork.c +++ b/lib/asn1c/ngap/NGAP_CauseRadioNetwork.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CauseRadioNetwork.h" diff --git a/lib/asn1c/ngap/NGAP_CauseRadioNetwork.h b/lib/asn1c/ngap/NGAP_CauseRadioNetwork.h index 87103881c9..cd33d7130b 100644 --- a/lib/asn1c/ngap/NGAP_CauseRadioNetwork.h +++ b/lib/asn1c/ngap/NGAP_CauseRadioNetwork.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CauseRadioNetwork_H_ @@ -92,7 +92,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CauseRadioNetwork_specs_1; asn_struct_free_f NGAP_CauseRadioNetwork_free; asn_struct_print_f NGAP_CauseRadioNetwork_print; asn_constr_check_f NGAP_CauseRadioNetwork_constraint; -jer_type_encoder_f NGAP_CauseRadioNetwork_encode_jer; per_type_decoder_f NGAP_CauseRadioNetwork_decode_aper; per_type_encoder_f NGAP_CauseRadioNetwork_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CauseTransport.c b/lib/asn1c/ngap/NGAP_CauseTransport.c index 436f15ad32..afeaa6a216 100644 --- a/lib/asn1c/ngap/NGAP_CauseTransport.c +++ b/lib/asn1c/ngap/NGAP_CauseTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CauseTransport.h" diff --git a/lib/asn1c/ngap/NGAP_CauseTransport.h b/lib/asn1c/ngap/NGAP_CauseTransport.h index 083273184b..023812ad39 100644 --- a/lib/asn1c/ngap/NGAP_CauseTransport.h +++ b/lib/asn1c/ngap/NGAP_CauseTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CauseTransport_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CauseTransport_specs_1; asn_struct_free_f NGAP_CauseTransport_free; asn_struct_print_f NGAP_CauseTransport_print; asn_constr_check_f NGAP_CauseTransport_constraint; -jer_type_encoder_f NGAP_CauseTransport_encode_jer; per_type_decoder_f NGAP_CauseTransport_decode_aper; per_type_encoder_f NGAP_CauseTransport_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Cell-CAGInformation.c b/lib/asn1c/ngap/NGAP_Cell-CAGInformation.c index 9b0bcd06be..ad2808d42f 100644 --- a/lib/asn1c/ngap/NGAP_Cell-CAGInformation.c +++ b/lib/asn1c/ngap/NGAP_Cell-CAGInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Cell-CAGInformation.h" diff --git a/lib/asn1c/ngap/NGAP_Cell-CAGInformation.h b/lib/asn1c/ngap/NGAP_Cell-CAGInformation.h index 099f58d177..b20eab4752 100644 --- a/lib/asn1c/ngap/NGAP_Cell-CAGInformation.h +++ b/lib/asn1c/ngap/NGAP_Cell-CAGInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Cell_CAGInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.c b/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.c index dacea3c127..788adbbe62 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellBasedMDT-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.h b/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.h index b8b7a77028..773b13cda9 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CellBasedMDT-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellBasedMDT_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.c b/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.c index 2479029e15..54b76ae3e5 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.c +++ b/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellBasedMDT-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.h b/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.h index a6877af82a..fdbfe5b2eb 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.h +++ b/lib/asn1c/ngap/NGAP_CellBasedMDT-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellBasedMDT_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CellBasedQMC.c b/lib/asn1c/ngap/NGAP_CellBasedQMC.c index 7599250b7c..c1d90b18de 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedQMC.c +++ b/lib/asn1c/ngap/NGAP_CellBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellBasedQMC.h" diff --git a/lib/asn1c/ngap/NGAP_CellBasedQMC.h b/lib/asn1c/ngap/NGAP_CellBasedQMC.h index 5612f911ff..2f6f73d9f0 100644 --- a/lib/asn1c/ngap/NGAP_CellBasedQMC.h +++ b/lib/asn1c/ngap/NGAP_CellBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellBasedQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_CellCAGList.c b/lib/asn1c/ngap/NGAP_CellCAGList.c index bc097796ec..5245d6a3f5 100644 --- a/lib/asn1c/ngap/NGAP_CellCAGList.c +++ b/lib/asn1c/ngap/NGAP_CellCAGList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellCAGList.h" diff --git a/lib/asn1c/ngap/NGAP_CellCAGList.h b/lib/asn1c/ngap/NGAP_CellCAGList.h index da56687901..b839b6cc25 100644 --- a/lib/asn1c/ngap/NGAP_CellCAGList.h +++ b/lib/asn1c/ngap/NGAP_CellCAGList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellCAGList_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.c b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.c index c4ad8a55c0..184e93839e 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDBroadcastEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.h b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.h index 83dd2ecdff..ae5ca50c7c 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDBroadcastEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.c b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.c index 3aee83fe75..440647316d 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.c +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDBroadcastEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.h b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.h index e8f4a3f27e..3d7eedd4a6 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.h +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDBroadcastEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.c b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.c index 3f3873e6da..c816a6d30d 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.c +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDBroadcastNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.h b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.h index 141577fc88..3774bbbdb7 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.h +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDBroadcastNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.c b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.c index 079953a1dd..546ba7114a 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.c +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDBroadcastNR.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.h b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.h index 38a5ca06f4..44ff1b8d7c 100644 --- a/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.h +++ b/lib/asn1c/ngap/NGAP_CellIDBroadcastNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDBroadcastNR_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.c b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.c index 1e74c46650..921e94a585 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDCancelledEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.h b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.h index a8edead779..e01d7b4e14 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDCancelledEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.c b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.c index 571fdca102..50906b43b6 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.c +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDCancelledEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.h b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.h index 09316ddf55..88a02d3b6f 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.h +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDCancelledEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.c b/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.c index 9bc1db6ff4..4bfd561176 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.c +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDCancelledNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.h b/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.h index 90fd1d5d9e..6b8f3f76e2 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.h +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDCancelledNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledNR.c b/lib/asn1c/ngap/NGAP_CellIDCancelledNR.c index 0f0bf943a2..59ce409fe4 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledNR.c +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDCancelledNR.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDCancelledNR.h b/lib/asn1c/ngap/NGAP_CellIDCancelledNR.h index fa9f4d8be4..6d147083df 100644 --- a/lib/asn1c/ngap/NGAP_CellIDCancelledNR.h +++ b/lib/asn1c/ngap/NGAP_CellIDCancelledNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDCancelledNR_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIDListForRestart.c b/lib/asn1c/ngap/NGAP_CellIDListForRestart.c index 17ca4ecc84..f455336876 100644 --- a/lib/asn1c/ngap/NGAP_CellIDListForRestart.c +++ b/lib/asn1c/ngap/NGAP_CellIDListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIDListForRestart.h" diff --git a/lib/asn1c/ngap/NGAP_CellIDListForRestart.h b/lib/asn1c/ngap/NGAP_CellIDListForRestart.h index a017657439..6c80bb5746 100644 --- a/lib/asn1c/ngap/NGAP_CellIDListForRestart.h +++ b/lib/asn1c/ngap/NGAP_CellIDListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIDListForRestart_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.c b/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.c index 147c85e79a..a03312dc18 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIdListforMDT-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.h b/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.h index 963aa00a76..c4ad9c3aec 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CellIdListforMDT-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIdListforMDT_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.c b/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.c index eea565d336..d2a152591d 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.c +++ b/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIdListforMDT-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.h b/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.h index ed41de9566..e2f750ae19 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.h +++ b/lib/asn1c/ngap/NGAP_CellIdListforMDT-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIdListforMDT_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CellIdListforQMC.c b/lib/asn1c/ngap/NGAP_CellIdListforQMC.c index fe9212978e..df1d150855 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforQMC.c +++ b/lib/asn1c/ngap/NGAP_CellIdListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellIdListforQMC.h" diff --git a/lib/asn1c/ngap/NGAP_CellIdListforQMC.h b/lib/asn1c/ngap/NGAP_CellIdListforQMC.h index 34c729de9b..cf53633d75 100644 --- a/lib/asn1c/ngap/NGAP_CellIdListforQMC.h +++ b/lib/asn1c/ngap/NGAP_CellIdListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellIdListforQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_CellSize.c b/lib/asn1c/ngap/NGAP_CellSize.c index 3f8ef82f63..34c39d68a2 100644 --- a/lib/asn1c/ngap/NGAP_CellSize.c +++ b/lib/asn1c/ngap/NGAP_CellSize.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellSize.h" diff --git a/lib/asn1c/ngap/NGAP_CellSize.h b/lib/asn1c/ngap/NGAP_CellSize.h index d7f691060c..af7eb0f58e 100644 --- a/lib/asn1c/ngap/NGAP_CellSize.h +++ b/lib/asn1c/ngap/NGAP_CellSize.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellSize_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_CellSize_specs_1; asn_struct_free_f NGAP_CellSize_free; asn_struct_print_f NGAP_CellSize_print; asn_constr_check_f NGAP_CellSize_constraint; -jer_type_encoder_f NGAP_CellSize_encode_jer; per_type_decoder_f NGAP_CellSize_decode_aper; per_type_encoder_f NGAP_CellSize_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CellTrafficTrace.c b/lib/asn1c/ngap/NGAP_CellTrafficTrace.c index 163e562118..c4ed3c18ba 100644 --- a/lib/asn1c/ngap/NGAP_CellTrafficTrace.c +++ b/lib/asn1c/ngap/NGAP_CellTrafficTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellTrafficTrace.h" diff --git a/lib/asn1c/ngap/NGAP_CellTrafficTrace.h b/lib/asn1c/ngap/NGAP_CellTrafficTrace.h index 4a63d6f744..f08b7c362f 100644 --- a/lib/asn1c/ngap/NGAP_CellTrafficTrace.h +++ b/lib/asn1c/ngap/NGAP_CellTrafficTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellTrafficTrace_H_ diff --git a/lib/asn1c/ngap/NGAP_CellType.c b/lib/asn1c/ngap/NGAP_CellType.c index 4abf8d3846..c4f2ed0b73 100644 --- a/lib/asn1c/ngap/NGAP_CellType.c +++ b/lib/asn1c/ngap/NGAP_CellType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellType.h" diff --git a/lib/asn1c/ngap/NGAP_CellType.h b/lib/asn1c/ngap/NGAP_CellType.h index 98d96d5682..b605d4f473 100644 --- a/lib/asn1c/ngap/NGAP_CellType.h +++ b/lib/asn1c/ngap/NGAP_CellType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellType_H_ diff --git a/lib/asn1c/ngap/NGAP_CellsToActivateList.c b/lib/asn1c/ngap/NGAP_CellsToActivateList.c index bd96df461a..f49b3192fa 100644 --- a/lib/asn1c/ngap/NGAP_CellsToActivateList.c +++ b/lib/asn1c/ngap/NGAP_CellsToActivateList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CellsToActivateList.h" diff --git a/lib/asn1c/ngap/NGAP_CellsToActivateList.h b/lib/asn1c/ngap/NGAP_CellsToActivateList.h index e70f1356b2..1f4af5f04e 100644 --- a/lib/asn1c/ngap/NGAP_CellsToActivateList.h +++ b/lib/asn1c/ngap/NGAP_CellsToActivateList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CellsToActivateList_H_ diff --git a/lib/asn1c/ngap/NGAP_CommonNetworkInstance.c b/lib/asn1c/ngap/NGAP_CommonNetworkInstance.c index 6649f623bc..f873ea65aa 100644 --- a/lib/asn1c/ngap/NGAP_CommonNetworkInstance.c +++ b/lib/asn1c/ngap/NGAP_CommonNetworkInstance.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CommonNetworkInstance.h" diff --git a/lib/asn1c/ngap/NGAP_CommonNetworkInstance.h b/lib/asn1c/ngap/NGAP_CommonNetworkInstance.h index c5b5d3e2b8..50757d4857 100644 --- a/lib/asn1c/ngap/NGAP_CommonNetworkInstance.h +++ b/lib/asn1c/ngap/NGAP_CommonNetworkInstance.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CommonNetworkInstance_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_CommonNetworkInstance; asn_struct_free_f NGAP_CommonNetworkInstance_free; asn_struct_print_f NGAP_CommonNetworkInstance_print; asn_constr_check_f NGAP_CommonNetworkInstance_constraint; -jer_type_encoder_f NGAP_CommonNetworkInstance_encode_jer; per_type_decoder_f NGAP_CommonNetworkInstance_decode_aper; per_type_encoder_f NGAP_CommonNetworkInstance_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.c b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.c index db3d04e1a8..341c5e5475 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInEAI-EUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.h b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.h index 9c473695cc..43187f2933 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInEAI_EUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.c b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.c index e9f937b2d4..69916623f9 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInEAI-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.h b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.h index 85cc65075a..8874d0c5d5 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInEAI_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.c b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.c index ab15c6815e..6b57af2fa2 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInEAI-NR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.h b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.h index b48f99fceb..411be428ff 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInEAI_NR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.c b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.c index 2687ea7047..e87df03f63 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInEAI-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.h b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.h index 0c1a1f7ee1..60bce8bc5a 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInEAI-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInEAI_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.c b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.c index 88d596931f..fc02e42acf 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInTAI-EUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.h b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.h index 871fe774f7..c402b79650 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInTAI_EUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.c b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.c index e95bbccd8d..2d0eab472d 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInTAI-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.h b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.h index b7e9413ad8..935c80d49c 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInTAI_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.c b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.c index 13c87a9eef..99cc094ea7 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInTAI-NR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.h b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.h index 7fcb411f7d..34d6fb08fb 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInTAI_NR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.c b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.c index 392bcee99a..6006cdfeaa 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.c +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompletedCellsInTAI-NR.h" diff --git a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.h b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.h index 39ea0f8680..302533ef68 100644 --- a/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.h +++ b/lib/asn1c/ngap/NGAP_CompletedCellsInTAI-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompletedCellsInTAI_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.c b/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.c index c71aa24dcb..b7253bc4c3 100644 --- a/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.c +++ b/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CompositeAvailableCapacity.h" diff --git a/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.h b/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.h index 5e46930548..3b7ca41072 100644 --- a/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.h +++ b/lib/asn1c/ngap/NGAP_CompositeAvailableCapacity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CompositeAvailableCapacity_H_ diff --git a/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.c b/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.c index d168036666..3db3c40df9 100644 --- a/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.c +++ b/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConcurrentWarningMessageInd.h" diff --git a/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.h b/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.h index 85c9140f00..34611865b4 100644 --- a/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.h +++ b/lib/asn1c/ngap/NGAP_ConcurrentWarningMessageInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConcurrentWarningMessageInd_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ConcurrentWarningMessageInd_sp asn_struct_free_f NGAP_ConcurrentWarningMessageInd_free; asn_struct_print_f NGAP_ConcurrentWarningMessageInd_print; asn_constr_check_f NGAP_ConcurrentWarningMessageInd_constraint; -jer_type_encoder_f NGAP_ConcurrentWarningMessageInd_encode_jer; per_type_decoder_f NGAP_ConcurrentWarningMessageInd_decode_aper; per_type_encoder_f NGAP_ConcurrentWarningMessageInd_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.c b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.c index a3d9c6dc9e..bab0d87f8a 100644 --- a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.c +++ b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConfidentialityProtectionIndication.h" diff --git a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.h b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.h index 3d4eea3ce4..6b69d98417 100644 --- a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.h +++ b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConfidentialityProtectionIndication_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ConfidentialityProtectionIndic asn_struct_free_f NGAP_ConfidentialityProtectionIndication_free; asn_struct_print_f NGAP_ConfidentialityProtectionIndication_print; asn_constr_check_f NGAP_ConfidentialityProtectionIndication_constraint; -jer_type_encoder_f NGAP_ConfidentialityProtectionIndication_encode_jer; per_type_decoder_f NGAP_ConfidentialityProtectionIndication_decode_aper; per_type_encoder_f NGAP_ConfidentialityProtectionIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.c b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.c index 55110939f8..12d4aadd44 100644 --- a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.c +++ b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConfidentialityProtectionResult.h" diff --git a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.h b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.h index 628bcc70a5..0fc041631e 100644 --- a/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.h +++ b/lib/asn1c/ngap/NGAP_ConfidentialityProtectionResult.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConfidentialityProtectionResult_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ConfidentialityProtectionResul asn_struct_free_f NGAP_ConfidentialityProtectionResult_free; asn_struct_print_f NGAP_ConfidentialityProtectionResult_print; asn_constr_check_f NGAP_ConfidentialityProtectionResult_constraint; -jer_type_encoder_f NGAP_ConfidentialityProtectionResult_encode_jer; per_type_decoder_f NGAP_ConfidentialityProtectionResult_decode_aper; per_type_encoder_f NGAP_ConfidentialityProtectionResult_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.c b/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.c index 612ad59f26..f15bbe145c 100644 --- a/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.c +++ b/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConfiguredNSSAI.h" diff --git a/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.h b/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.h index 9fcb64f8db..6becdf2adb 100644 --- a/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.h +++ b/lib/asn1c/ngap/NGAP_ConfiguredNSSAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConfiguredNSSAI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ConfiguredNSSAI; asn_struct_free_f NGAP_ConfiguredNSSAI_free; asn_struct_print_f NGAP_ConfiguredNSSAI_print; asn_constr_check_f NGAP_ConfiguredNSSAI_constraint; -jer_type_encoder_f NGAP_ConfiguredNSSAI_encode_jer; per_type_decoder_f NGAP_ConfiguredNSSAI_decode_aper; per_type_encoder_f NGAP_ConfiguredNSSAI_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.c b/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.c index 0cf2d708d0..c0e3d9f6bc 100644 --- a/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.c +++ b/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConfiguredTACIndication.h" diff --git a/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.h b/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.h index 27a1d00f8d..c11c764925 100644 --- a/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.h +++ b/lib/asn1c/ngap/NGAP_ConfiguredTACIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConfiguredTACIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ConfiguredTACIndication_specs_ asn_struct_free_f NGAP_ConfiguredTACIndication_free; asn_struct_print_f NGAP_ConfiguredTACIndication_print; asn_constr_check_f NGAP_ConfiguredTACIndication_constraint; -jer_type_encoder_f NGAP_ConfiguredTACIndication_encode_jer; per_type_decoder_f NGAP_ConfiguredTACIndication_decode_aper; per_type_encoder_f NGAP_ConfiguredTACIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.c b/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.c index f0e7fabd69..ad4dd60bd5 100644 --- a/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.c +++ b/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ConnectionEstablishmentIndication.h" diff --git a/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.h b/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.h index f6680aa2f3..e740c1e65f 100644 --- a/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.h +++ b/lib/asn1c/ngap/NGAP_ConnectionEstablishmentIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ConnectionEstablishmentIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.c b/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.c index 7489207e62..19e8b0f20d 100644 --- a/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.c +++ b/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CoreNetworkAssistanceInformationForInactive.h" diff --git a/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.h b/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.h index 520311562f..5769883f27 100644 --- a/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.h +++ b/lib/asn1c/ngap/NGAP_CoreNetworkAssistanceInformationForInactive.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CoreNetworkAssistanceInformationForInactive_H_ diff --git a/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.c b/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.c index 34b982781c..9af9c280a5 100644 --- a/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.c +++ b/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CoverageEnhancementLevel.h" diff --git a/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.h b/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.h index 3f19247c62..96e67f6c5a 100644 --- a/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.h +++ b/lib/asn1c/ngap/NGAP_CoverageEnhancementLevel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CoverageEnhancementLevel_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_CoverageEnhancementLevel; asn_struct_free_f NGAP_CoverageEnhancementLevel_free; asn_struct_print_f NGAP_CoverageEnhancementLevel_print; asn_constr_check_f NGAP_CoverageEnhancementLevel_constraint; -jer_type_encoder_f NGAP_CoverageEnhancementLevel_encode_jer; per_type_decoder_f NGAP_CoverageEnhancementLevel_decode_aper; per_type_encoder_f NGAP_CoverageEnhancementLevel_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Criticality.c b/lib/asn1c/ngap/NGAP_Criticality.c index 40da795898..cbf38ff418 100644 --- a/lib/asn1c/ngap/NGAP_Criticality.c +++ b/lib/asn1c/ngap/NGAP_Criticality.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Criticality.h" diff --git a/lib/asn1c/ngap/NGAP_Criticality.h b/lib/asn1c/ngap/NGAP_Criticality.h index 623e17c56f..1d363b2ae4 100644 --- a/lib/asn1c/ngap/NGAP_Criticality.h +++ b/lib/asn1c/ngap/NGAP_Criticality.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Criticality_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Criticality_specs_1; asn_struct_free_f NGAP_Criticality_free; asn_struct_print_f NGAP_Criticality_print; asn_constr_check_f NGAP_Criticality_constraint; -jer_type_encoder_f NGAP_Criticality_encode_jer; per_type_decoder_f NGAP_Criticality_decode_aper; per_type_encoder_f NGAP_Criticality_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.c b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.c index 91678a3a65..0d29770c28 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.c +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CriticalityDiagnostics-IE-Item.h" diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.h b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.h index b57816c2cd..8c6450c476 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.h +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CriticalityDiagnostics_IE_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.c b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.c index 0d0f445ecc..66e30ad238 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.c +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CriticalityDiagnostics-IE-List.h" diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.h b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.h index 30579e7374..33ac59d6cb 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.h +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics-IE-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CriticalityDiagnostics_IE_List_H_ diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.c b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.c index 9f488c5ba7..8848048bd6 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.c +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_CriticalityDiagnostics.h" diff --git a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.h b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.h index cdd2ffd06c..1fdd2dc72d 100644 --- a/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.h +++ b/lib/asn1c/ngap/NGAP_CriticalityDiagnostics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_CriticalityDiagnostics_H_ diff --git a/lib/asn1c/ngap/NGAP_DAPSRequestInfo.c b/lib/asn1c/ngap/NGAP_DAPSRequestInfo.c index 6c3dc1f300..0cbcbae776 100644 --- a/lib/asn1c/ngap/NGAP_DAPSRequestInfo.c +++ b/lib/asn1c/ngap/NGAP_DAPSRequestInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DAPSRequestInfo.h" diff --git a/lib/asn1c/ngap/NGAP_DAPSRequestInfo.h b/lib/asn1c/ngap/NGAP_DAPSRequestInfo.h index b71a246609..2cb21f23bb 100644 --- a/lib/asn1c/ngap/NGAP_DAPSRequestInfo.h +++ b/lib/asn1c/ngap/NGAP_DAPSRequestInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DAPSRequestInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfo.c b/lib/asn1c/ngap/NGAP_DAPSResponseInfo.c index cca68b0839..053065a323 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfo.c +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DAPSResponseInfo.h" diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfo.h b/lib/asn1c/ngap/NGAP_DAPSResponseInfo.h index 0a286dfdbb..7c1325662d 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfo.h +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DAPSResponseInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.c b/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.c index c10e26a003..6e6d91ec6d 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.c +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DAPSResponseInfoItem.h" diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.h b/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.h index 0cb5bb8d15..1efdb8b5e0 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.h +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfoItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DAPSResponseInfoItem_H_ diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.c b/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.c index 2ae2536092..d8c97bc776 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.c +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DAPSResponseInfoList.h" diff --git a/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.h b/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.h index 4d23d7bc11..dba651df52 100644 --- a/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.h +++ b/lib/asn1c/ngap/NGAP_DAPSResponseInfoList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DAPSResponseInfoList_H_ diff --git a/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.c b/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.c index 6b9af2817c..9899139521 100644 --- a/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.c +++ b/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DL-CP-SecurityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.h b/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.h index e3bad80939..85ab29e948 100644 --- a/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.h +++ b/lib/asn1c/ngap/NGAP_DL-CP-SecurityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DL_CP_SecurityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_DL-NAS-MAC.c b/lib/asn1c/ngap/NGAP_DL-NAS-MAC.c index f4b78612c5..6a656b8be5 100644 --- a/lib/asn1c/ngap/NGAP_DL-NAS-MAC.c +++ b/lib/asn1c/ngap/NGAP_DL-NAS-MAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DL-NAS-MAC.h" diff --git a/lib/asn1c/ngap/NGAP_DL-NAS-MAC.h b/lib/asn1c/ngap/NGAP_DL-NAS-MAC.h index 8bc28e883c..21ad0ca82f 100644 --- a/lib/asn1c/ngap/NGAP_DL-NAS-MAC.h +++ b/lib/asn1c/ngap/NGAP_DL-NAS-MAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DL_NAS_MAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_DL_NAS_MAC; asn_struct_free_f NGAP_DL_NAS_MAC_free; asn_struct_print_f NGAP_DL_NAS_MAC_print; asn_constr_check_f NGAP_DL_NAS_MAC_constraint; -jer_type_encoder_f NGAP_DL_NAS_MAC_encode_jer; per_type_decoder_f NGAP_DL_NAS_MAC_decode_aper; per_type_encoder_f NGAP_DL_NAS_MAC_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.c b/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.c index f428c3fed9..8941b939bf 100644 --- a/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.c +++ b/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DL-NGU-TNLInformationReused.h" diff --git a/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.h b/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.h index 2d521923b3..64fb18ab93 100644 --- a/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.h +++ b/lib/asn1c/ngap/NGAP_DL-NGU-TNLInformationReused.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DL_NGU_TNLInformationReused_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DL_NGU_TNLInformationReused_sp asn_struct_free_f NGAP_DL_NGU_TNLInformationReused_free; asn_struct_print_f NGAP_DL_NGU_TNLInformationReused_print; asn_constr_check_f NGAP_DL_NGU_TNLInformationReused_constraint; -jer_type_encoder_f NGAP_DL_NGU_TNLInformationReused_encode_jer; per_type_decoder_f NGAP_DL_NGU_TNLInformationReused_decode_aper; per_type_encoder_f NGAP_DL_NGU_TNLInformationReused_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DLForwarding.c b/lib/asn1c/ngap/NGAP_DLForwarding.c index 4000c59586..0a9cff1d23 100644 --- a/lib/asn1c/ngap/NGAP_DLForwarding.c +++ b/lib/asn1c/ngap/NGAP_DLForwarding.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DLForwarding.h" diff --git a/lib/asn1c/ngap/NGAP_DLForwarding.h b/lib/asn1c/ngap/NGAP_DLForwarding.h index 48c8e17cc0..a1df32d6a3 100644 --- a/lib/asn1c/ngap/NGAP_DLForwarding.h +++ b/lib/asn1c/ngap/NGAP_DLForwarding.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DLForwarding_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DLForwarding_specs_1; asn_struct_free_f NGAP_DLForwarding_free; asn_struct_print_f NGAP_DLForwarding_print; asn_constr_check_f NGAP_DLForwarding_constraint; -jer_type_encoder_f NGAP_DLForwarding_encode_jer; per_type_decoder_f NGAP_DLForwarding_decode_aper; per_type_encoder_f NGAP_DLForwarding_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DRB-ID.c b/lib/asn1c/ngap/NGAP_DRB-ID.c index 6ef11cfbbf..7a75ddc406 100644 --- a/lib/asn1c/ngap/NGAP_DRB-ID.c +++ b/lib/asn1c/ngap/NGAP_DRB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_DRB-ID.h b/lib/asn1c/ngap/NGAP_DRB-ID.h index deec953516..5a2bcaccef 100644 --- a/lib/asn1c/ngap/NGAP_DRB-ID.h +++ b/lib/asn1c/ngap/NGAP_DRB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_DRB_ID; asn_struct_free_f NGAP_DRB_ID_free; asn_struct_print_f NGAP_DRB_ID_print; asn_constr_check_f NGAP_DRB_ID_constraint; -jer_type_encoder_f NGAP_DRB_ID_encode_jer; per_type_decoder_f NGAP_DRB_ID_decode_aper; per_type_encoder_f NGAP_DRB_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL.c b/lib/asn1c/ngap/NGAP_DRBStatusDL.c index 2ecfc44af2..4170930a15 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusDL.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL.h b/lib/asn1c/ngap/NGAP_DRBStatusDL.h index a2a4d82a0b..5bd2be2853 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusDL_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL12.c b/lib/asn1c/ngap/NGAP_DRBStatusDL12.c index 7df9d07bd5..fc0dd785db 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL12.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL12.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusDL12.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL12.h b/lib/asn1c/ngap/NGAP_DRBStatusDL12.h index befe90a712..0726d5a73b 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL12.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL12.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusDL12_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL18.c b/lib/asn1c/ngap/NGAP_DRBStatusDL18.c index 9eead3bde5..905d8431b2 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL18.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusDL18.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusDL18.h b/lib/asn1c/ngap/NGAP_DRBStatusDL18.h index 558026393b..4bcc8730a9 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusDL18.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusDL18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusDL18_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL.c b/lib/asn1c/ngap/NGAP_DRBStatusUL.c index 619001ce27..c46ae606a5 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusUL.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL.h b/lib/asn1c/ngap/NGAP_DRBStatusUL.h index 95fbc73e90..28d5baea8f 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusUL_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL12.c b/lib/asn1c/ngap/NGAP_DRBStatusUL12.c index 9ddfcb6a44..a4e90d0f33 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL12.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL12.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusUL12.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL12.h b/lib/asn1c/ngap/NGAP_DRBStatusUL12.h index 5154e93474..5d21c69bfa 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL12.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL12.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusUL12_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL18.c b/lib/asn1c/ngap/NGAP_DRBStatusUL18.c index 0cab3a9ae9..5bf18b221c 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL18.c +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBStatusUL18.h" diff --git a/lib/asn1c/ngap/NGAP_DRBStatusUL18.h b/lib/asn1c/ngap/NGAP_DRBStatusUL18.h index f2c9ca25fd..103bdd5f53 100644 --- a/lib/asn1c/ngap/NGAP_DRBStatusUL18.h +++ b/lib/asn1c/ngap/NGAP_DRBStatusUL18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBStatusUL18_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.c b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.c index e069a17f3d..766c27b997 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.c +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsSubjectToEarlyStatusTransfer-Item.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.h b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.h index f0456efef3..df7e9fc57a 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.h +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsSubjectToEarlyStatusTransfer_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.c b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.c index 889852099d..38145a027d 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.c +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsSubjectToEarlyStatusTransfer-List.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.h b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.h index 9e788a3919..d98f996eb4 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.h +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToEarlyStatusTransfer-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsSubjectToEarlyStatusTransfer_List_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.c b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.c index 9ab6a385a0..49e1630537 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.c +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsSubjectToStatusTransferItem.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.h b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.h index 494debd4ad..5261a49ff0 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.h +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsSubjectToStatusTransferItem_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.c b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.c index 1cd8a8bb2c..0ffb69d4c8 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.c +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsSubjectToStatusTransferList.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.h b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.h index c9b6316108..f1b9afc169 100644 --- a/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.h +++ b/lib/asn1c/ngap/NGAP_DRBsSubjectToStatusTransferList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsSubjectToStatusTransferList_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.c b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.c index a4a7646c2a..486000ff3f 100644 --- a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.c +++ b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsToQosFlowsMappingItem.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.h b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.h index 79a4f9c3d2..ec87b3a4de 100644 --- a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.h +++ b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsToQosFlowsMappingItem_H_ diff --git a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.c b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.c index f7bcf7b660..db61c285d5 100644 --- a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.c +++ b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DRBsToQosFlowsMappingList.h" diff --git a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.h b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.h index c1632df06b..bd6ceecc15 100644 --- a/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.h +++ b/lib/asn1c/ngap/NGAP_DRBsToQosFlowsMappingList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DRBsToQosFlowsMappingList_H_ diff --git a/lib/asn1c/ngap/NGAP_DataCodingScheme.c b/lib/asn1c/ngap/NGAP_DataCodingScheme.c index 503bc8182b..9efe488c07 100644 --- a/lib/asn1c/ngap/NGAP_DataCodingScheme.c +++ b/lib/asn1c/ngap/NGAP_DataCodingScheme.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataCodingScheme.h" diff --git a/lib/asn1c/ngap/NGAP_DataCodingScheme.h b/lib/asn1c/ngap/NGAP_DataCodingScheme.h index b2e3ad8414..bb1770f64f 100644 --- a/lib/asn1c/ngap/NGAP_DataCodingScheme.h +++ b/lib/asn1c/ngap/NGAP_DataCodingScheme.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataCodingScheme_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_DataCodingScheme; asn_struct_free_f NGAP_DataCodingScheme_free; asn_struct_print_f NGAP_DataCodingScheme_print; asn_constr_check_f NGAP_DataCodingScheme_constraint; -jer_type_encoder_f NGAP_DataCodingScheme_encode_jer; per_type_decoder_f NGAP_DataCodingScheme_decode_aper; per_type_encoder_f NGAP_DataCodingScheme_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DataForwardingAccepted.c b/lib/asn1c/ngap/NGAP_DataForwardingAccepted.c index f3d6973851..d77d755ecf 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingAccepted.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingAccepted.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingAccepted.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingAccepted.h b/lib/asn1c/ngap/NGAP_DataForwardingAccepted.h index 5ebe0e39d3..cd730186e0 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingAccepted.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingAccepted.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingAccepted_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DataForwardingAccepted_specs_1 asn_struct_free_f NGAP_DataForwardingAccepted_free; asn_struct_print_f NGAP_DataForwardingAccepted_print; asn_constr_check_f NGAP_DataForwardingAccepted_constraint; -jer_type_encoder_f NGAP_DataForwardingAccepted_encode_jer; per_type_decoder_f NGAP_DataForwardingAccepted_decode_aper; per_type_encoder_f NGAP_DataForwardingAccepted_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.c b/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.c index ad4ba539c3..43c29395f8 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingNotPossible.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.h b/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.h index 4c82fb9d6f..fb3420b475 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingNotPossible.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingNotPossible_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DataForwardingNotPossible_spec asn_struct_free_f NGAP_DataForwardingNotPossible_free; asn_struct_print_f NGAP_DataForwardingNotPossible_print; asn_constr_check_f NGAP_DataForwardingNotPossible_constraint; -jer_type_encoder_f NGAP_DataForwardingNotPossible_encode_jer; per_type_decoder_f NGAP_DataForwardingNotPossible_decode_aper; per_type_encoder_f NGAP_DataForwardingNotPossible_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.c b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.c index f4d26e2a4a..cdcf010851 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingResponseDRBItem.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.h b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.h index 5c40ec156e..ddf620b5e7 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingResponseDRBItem_H_ diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.c b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.c index 103345e410..fa91e9fec6 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingResponseDRBList.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.h b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.h index bcd531e757..cb60cf21d7 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseDRBList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingResponseDRBList_H_ diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.c b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.c index 12ddc7469e..735a765b6e 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingResponseERABList.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.h b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.h index 4afacf074b..d67a56c601 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingResponseERABList_H_ diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.c b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.c index efe07bd376..3bbde887a0 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.c +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DataForwardingResponseERABListItem.h" diff --git a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.h b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.h index c66d579a7a..68f4fedd1b 100644 --- a/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.h +++ b/lib/asn1c/ngap/NGAP_DataForwardingResponseERABListItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DataForwardingResponseERABListItem_H_ diff --git a/lib/asn1c/ngap/NGAP_DeactivateTrace.c b/lib/asn1c/ngap/NGAP_DeactivateTrace.c index 0d41370b0c..f23a9080bb 100644 --- a/lib/asn1c/ngap/NGAP_DeactivateTrace.c +++ b/lib/asn1c/ngap/NGAP_DeactivateTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DeactivateTrace.h" diff --git a/lib/asn1c/ngap/NGAP_DeactivateTrace.h b/lib/asn1c/ngap/NGAP_DeactivateTrace.h index 37ee0c3de4..b9f294cb43 100644 --- a/lib/asn1c/ngap/NGAP_DeactivateTrace.h +++ b/lib/asn1c/ngap/NGAP_DeactivateTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DeactivateTrace_H_ diff --git a/lib/asn1c/ngap/NGAP_DelayCritical.c b/lib/asn1c/ngap/NGAP_DelayCritical.c index 8823e7e573..02e826b503 100644 --- a/lib/asn1c/ngap/NGAP_DelayCritical.c +++ b/lib/asn1c/ngap/NGAP_DelayCritical.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DelayCritical.h" diff --git a/lib/asn1c/ngap/NGAP_DelayCritical.h b/lib/asn1c/ngap/NGAP_DelayCritical.h index 5e9ad96728..7d364f9382 100644 --- a/lib/asn1c/ngap/NGAP_DelayCritical.h +++ b/lib/asn1c/ngap/NGAP_DelayCritical.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DelayCritical_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DelayCritical_specs_1; asn_struct_free_f NGAP_DelayCritical_free; asn_struct_print_f NGAP_DelayCritical_print; asn_constr_check_f NGAP_DelayCritical_constraint; -jer_type_encoder_f NGAP_DelayCritical_encode_jer; per_type_decoder_f NGAP_DelayCritical_decode_aper; per_type_encoder_f NGAP_DelayCritical_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.c b/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.c index 261e37da9e..87fac0931f 100644 --- a/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.c +++ b/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DirectForwardingPathAvailability.h" diff --git a/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.h b/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.h index d598f2f9e0..b6b779e240 100644 --- a/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.h +++ b/lib/asn1c/ngap/NGAP_DirectForwardingPathAvailability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DirectForwardingPathAvailability_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_DirectForwardingPathAvailabili asn_struct_free_f NGAP_DirectForwardingPathAvailability_free; asn_struct_print_f NGAP_DirectForwardingPathAvailability_print; asn_constr_check_f NGAP_DirectForwardingPathAvailability_constraint; -jer_type_encoder_f NGAP_DirectForwardingPathAvailability_encode_jer; per_type_decoder_f NGAP_DirectForwardingPathAvailability_decode_aper; per_type_encoder_f NGAP_DirectForwardingPathAvailability_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.c b/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.c index 14169922e3..31407cbd42 100644 --- a/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.c +++ b/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DistributionReleaseRequest.h" diff --git a/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.h b/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.h index 0ff79f2932..371ea7d78a 100644 --- a/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.h +++ b/lib/asn1c/ngap/NGAP_DistributionReleaseRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DistributionReleaseRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.c b/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.c index df0f3d924a..1061a0758c 100644 --- a/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.c +++ b/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DistributionReleaseResponse.h" diff --git a/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.h b/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.h index d4c7eeccc5..31754c3daf 100644 --- a/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.h +++ b/lib/asn1c/ngap/NGAP_DistributionReleaseResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DistributionReleaseResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupFailure.c b/lib/asn1c/ngap/NGAP_DistributionSetupFailure.c index 08ca76949f..96a39940cc 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupFailure.c +++ b/lib/asn1c/ngap/NGAP_DistributionSetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DistributionSetupFailure.h" diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupFailure.h b/lib/asn1c/ngap/NGAP_DistributionSetupFailure.h index fb16087588..7533a649ea 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupFailure.h +++ b/lib/asn1c/ngap/NGAP_DistributionSetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DistributionSetupFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupRequest.c b/lib/asn1c/ngap/NGAP_DistributionSetupRequest.c index a31e9e5850..365d0d9d1a 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupRequest.c +++ b/lib/asn1c/ngap/NGAP_DistributionSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DistributionSetupRequest.h" diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupRequest.h b/lib/asn1c/ngap/NGAP_DistributionSetupRequest.h index e346741018..4438299923 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupRequest.h +++ b/lib/asn1c/ngap/NGAP_DistributionSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DistributionSetupRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupResponse.c b/lib/asn1c/ngap/NGAP_DistributionSetupResponse.c index 1895183230..cabbd4f66d 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupResponse.c +++ b/lib/asn1c/ngap/NGAP_DistributionSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DistributionSetupResponse.h" diff --git a/lib/asn1c/ngap/NGAP_DistributionSetupResponse.h b/lib/asn1c/ngap/NGAP_DistributionSetupResponse.h index bd5316fe2b..835b5b953c 100644 --- a/lib/asn1c/ngap/NGAP_DistributionSetupResponse.h +++ b/lib/asn1c/ngap/NGAP_DistributionSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DistributionSetupResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkNASTransport.c b/lib/asn1c/ngap/NGAP_DownlinkNASTransport.c index 0b97962f77..fa3504b45b 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkNASTransport.c +++ b/lib/asn1c/ngap/NGAP_DownlinkNASTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkNASTransport.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkNASTransport.h b/lib/asn1c/ngap/NGAP_DownlinkNASTransport.h index b3483397d5..9e9252f97e 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkNASTransport.h +++ b/lib/asn1c/ngap/NGAP_DownlinkNASTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkNASTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.c b/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.c index 4de1ef1d4a..d2d4d0704d 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.c +++ b/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkNonUEAssociatedNRPPaTransport.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.h b/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.h index 5c047ed569..3d628dddaa 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.h +++ b/lib/asn1c/ngap/NGAP_DownlinkNonUEAssociatedNRPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkNonUEAssociatedNRPPaTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.c b/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.c index 48c12945d7..ac149c3cf0 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.c +++ b/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkRANConfigurationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.h b/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.h index 64df7005b8..a756b22e1e 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.h +++ b/lib/asn1c/ngap/NGAP_DownlinkRANConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkRANConfigurationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.c b/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.c index 29ee37f146..20ac061a4b 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.c +++ b/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkRANEarlyStatusTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.h b/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.h index 305112f5ba..3e441f8de2 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.h +++ b/lib/asn1c/ngap/NGAP_DownlinkRANEarlyStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkRANEarlyStatusTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.c b/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.c index 499985ef3e..4d1025ec0a 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.c +++ b/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkRANStatusTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.h b/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.h index a844848de4..df8f9643d6 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.h +++ b/lib/asn1c/ngap/NGAP_DownlinkRANStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkRANStatusTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.c b/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.c index 9219d94a84..0032d5c8e7 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.c +++ b/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkRIMInformationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.h b/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.h index bb93d34759..73ae152286 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.h +++ b/lib/asn1c/ngap/NGAP_DownlinkRIMInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkRIMInformationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.c b/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.c index 2816e6f5ca..4dc0553438 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.c +++ b/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_DownlinkUEAssociatedNRPPaTransport.h" diff --git a/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.h b/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.h index ca99b6ca83..293bb1ff8d 100644 --- a/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.h +++ b/lib/asn1c/ngap/NGAP_DownlinkUEAssociatedNRPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_DownlinkUEAssociatedNRPPaTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.c b/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.c index 62c8574ee5..75738d0a33 100644 --- a/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.c +++ b/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Dynamic5QIDescriptor.h" diff --git a/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.h b/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.h index 9ffc2a868b..185b0a8783 100644 --- a/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.h +++ b/lib/asn1c/ngap/NGAP_Dynamic5QIDescriptor.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Dynamic5QIDescriptor_H_ diff --git a/lib/asn1c/ngap/NGAP_E-RAB-ID.c b/lib/asn1c/ngap/NGAP_E-RAB-ID.c index 2e6e9e6a16..1b5110225e 100644 --- a/lib/asn1c/ngap/NGAP_E-RAB-ID.c +++ b/lib/asn1c/ngap/NGAP_E-RAB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_E-RAB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_E-RAB-ID.h b/lib/asn1c/ngap/NGAP_E-RAB-ID.h index bc5a5a1bf7..80b7cba371 100644 --- a/lib/asn1c/ngap/NGAP_E-RAB-ID.h +++ b/lib/asn1c/ngap/NGAP_E-RAB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_E_RAB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_E_RAB_ID; asn_struct_free_f NGAP_E_RAB_ID_free; asn_struct_print_f NGAP_E_RAB_ID_print; asn_constr_check_f NGAP_E_RAB_ID_constraint; -jer_type_encoder_f NGAP_E_RAB_ID_encode_jer; per_type_decoder_f NGAP_E_RAB_ID_decode_aper; per_type_encoder_f NGAP_E_RAB_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_E-RABInformationItem.c b/lib/asn1c/ngap/NGAP_E-RABInformationItem.c index e369a0632b..c9c65c8456 100644 --- a/lib/asn1c/ngap/NGAP_E-RABInformationItem.c +++ b/lib/asn1c/ngap/NGAP_E-RABInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_E-RABInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_E-RABInformationItem.h b/lib/asn1c/ngap/NGAP_E-RABInformationItem.h index f11b41ddda..c438fc0b70 100644 --- a/lib/asn1c/ngap/NGAP_E-RABInformationItem.h +++ b/lib/asn1c/ngap/NGAP_E-RABInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_E_RABInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_E-RABInformationList.c b/lib/asn1c/ngap/NGAP_E-RABInformationList.c index 71e7baf69e..681232e4cd 100644 --- a/lib/asn1c/ngap/NGAP_E-RABInformationList.c +++ b/lib/asn1c/ngap/NGAP_E-RABInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_E-RABInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_E-RABInformationList.h b/lib/asn1c/ngap/NGAP_E-RABInformationList.h index 8de8449092..0d1e02e9f9 100644 --- a/lib/asn1c/ngap/NGAP_E-RABInformationList.h +++ b/lib/asn1c/ngap/NGAP_E-RABInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_E_RABInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_EDT-Session.c b/lib/asn1c/ngap/NGAP_EDT-Session.c index 8b065e74ed..6f8d63cc65 100644 --- a/lib/asn1c/ngap/NGAP_EDT-Session.c +++ b/lib/asn1c/ngap/NGAP_EDT-Session.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EDT-Session.h" diff --git a/lib/asn1c/ngap/NGAP_EDT-Session.h b/lib/asn1c/ngap/NGAP_EDT-Session.h index 79577af16a..9a161f75bb 100644 --- a/lib/asn1c/ngap/NGAP_EDT-Session.h +++ b/lib/asn1c/ngap/NGAP_EDT-Session.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EDT_Session_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EDT_Session_specs_1; asn_struct_free_f NGAP_EDT_Session_free; asn_struct_print_f NGAP_EDT_Session_print; asn_constr_check_f NGAP_EDT_Session_constraint; -jer_type_encoder_f NGAP_EDT_Session_encode_jer; per_type_decoder_f NGAP_EDT_Session_decode_aper; per_type_encoder_f NGAP_EDT_Session_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.c b/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.c index 09396f4bcf..90db9b5032 100644 --- a/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.c +++ b/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EN-DCSONConfigurationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.h b/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.h index cecbbde9d1..8b2fff8674 100644 --- a/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.h +++ b/lib/asn1c/ngap/NGAP_EN-DCSONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EN_DCSONConfigurationTransfer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EN_DCSONConfigurationTransfer; asn_struct_free_f NGAP_EN_DCSONConfigurationTransfer_free; asn_struct_print_f NGAP_EN_DCSONConfigurationTransfer_print; asn_constr_check_f NGAP_EN_DCSONConfigurationTransfer_constraint; -jer_type_encoder_f NGAP_EN_DCSONConfigurationTransfer_encode_jer; per_type_decoder_f NGAP_EN_DCSONConfigurationTransfer_decode_aper; per_type_encoder_f NGAP_EN_DCSONConfigurationTransfer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ENB-ID.c b/lib/asn1c/ngap/NGAP_ENB-ID.c index 019cbc6801..80f2e33e48 100644 --- a/lib/asn1c/ngap/NGAP_ENB-ID.c +++ b/lib/asn1c/ngap/NGAP_ENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ENB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_ENB-ID.h b/lib/asn1c/ngap/NGAP_ENB-ID.h index 9173bcce51..074860e3ac 100644 --- a/lib/asn1c/ngap/NGAP_ENB-ID.h +++ b/lib/asn1c/ngap/NGAP_ENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ENB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_EPS-TAC.c b/lib/asn1c/ngap/NGAP_EPS-TAC.c index 69b521e8a0..b360a3e8be 100644 --- a/lib/asn1c/ngap/NGAP_EPS-TAC.c +++ b/lib/asn1c/ngap/NGAP_EPS-TAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EPS-TAC.h" diff --git a/lib/asn1c/ngap/NGAP_EPS-TAC.h b/lib/asn1c/ngap/NGAP_EPS-TAC.h index 10074fd87e..1a08634336 100644 --- a/lib/asn1c/ngap/NGAP_EPS-TAC.h +++ b/lib/asn1c/ngap/NGAP_EPS-TAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EPS_TAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EPS_TAC; asn_struct_free_f NGAP_EPS_TAC_free; asn_struct_print_f NGAP_EPS_TAC_print; asn_constr_check_f NGAP_EPS_TAC_constraint; -jer_type_encoder_f NGAP_EPS_TAC_encode_jer; per_type_decoder_f NGAP_EPS_TAC_decode_aper; per_type_encoder_f NGAP_EPS_TAC_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EPS-TAI.c b/lib/asn1c/ngap/NGAP_EPS-TAI.c index 4f8f9cd05c..b732b724f1 100644 --- a/lib/asn1c/ngap/NGAP_EPS-TAI.c +++ b/lib/asn1c/ngap/NGAP_EPS-TAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EPS-TAI.h" diff --git a/lib/asn1c/ngap/NGAP_EPS-TAI.h b/lib/asn1c/ngap/NGAP_EPS-TAI.h index 6daa5ea8e5..c6b1719097 100644 --- a/lib/asn1c/ngap/NGAP_EPS-TAI.h +++ b/lib/asn1c/ngap/NGAP_EPS-TAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EPS_TAI_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGI.c b/lib/asn1c/ngap/NGAP_EUTRA-CGI.c index 03b8b5c189..b762219d9e 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGI.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-CGI.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGI.h b/lib/asn1c/ngap/NGAP_EUTRA-CGI.h index bd0835a337..2d6e17eb52 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGI.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_CGI_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGIList.c b/lib/asn1c/ngap/NGAP_EUTRA-CGIList.c index 8bfe3e9511..9156f25383 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGIList.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-CGIList.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGIList.h b/lib/asn1c/ngap/NGAP_EUTRA-CGIList.h index 12be907dd9..d6d3cdbbeb 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGIList.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_CGIList_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.c b/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.c index 26ae59b86c..e52e5f9d16 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-CGIListForWarning.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.h b/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.h index d1f8a61343..6a1daa3b0c 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-CGIListForWarning.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_CGIListForWarning_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.c b/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.c index dba2ac12ae..d7e0547797 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-Paging-Time-Window.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.h b/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.h index ace82b84ce..4430d4762b 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-Paging-Time-Window.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_Paging_Time_Window_H_ @@ -51,7 +51,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EUTRA_Paging_Time_Window_specs asn_struct_free_f NGAP_EUTRA_Paging_Time_Window_free; asn_struct_print_f NGAP_EUTRA_Paging_Time_Window_print; asn_constr_check_f NGAP_EUTRA_Paging_Time_Window_constraint; -jer_type_encoder_f NGAP_EUTRA_Paging_Time_Window_encode_jer; per_type_decoder_f NGAP_EUTRA_Paging_Time_Window_decode_aper; per_type_encoder_f NGAP_EUTRA_Paging_Time_Window_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.c b/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.c index 8ca5626dfb..32ea6f33a5 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-Paging-eDRX-Cycle.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.h b/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.h index 2d9c246a9c..2682398bbe 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-Paging-eDRX-Cycle.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_Paging_eDRX_Cycle_H_ @@ -49,7 +49,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EUTRA_Paging_eDRX_Cycle_specs_ asn_struct_free_f NGAP_EUTRA_Paging_eDRX_Cycle_free; asn_struct_print_f NGAP_EUTRA_Paging_eDRX_Cycle_print; asn_constr_check_f NGAP_EUTRA_Paging_eDRX_Cycle_constraint; -jer_type_encoder_f NGAP_EUTRA_Paging_eDRX_Cycle_encode_jer; per_type_decoder_f NGAP_EUTRA_Paging_eDRX_Cycle_decode_aper; per_type_encoder_f NGAP_EUTRA_Paging_eDRX_Cycle_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.c b/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.c index df859f30c4..46e75f8a39 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.c +++ b/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRA-PagingeDRXInformation.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.h b/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.h index b323b6f9ac..1e8855b39a 100644 --- a/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.h +++ b/lib/asn1c/ngap/NGAP_EUTRA-PagingeDRXInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRA_PagingeDRXInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRACellIdentity.c b/lib/asn1c/ngap/NGAP_EUTRACellIdentity.c index a4d817737e..d634fb5fce 100644 --- a/lib/asn1c/ngap/NGAP_EUTRACellIdentity.c +++ b/lib/asn1c/ngap/NGAP_EUTRACellIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRACellIdentity.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRACellIdentity.h b/lib/asn1c/ngap/NGAP_EUTRACellIdentity.h index bb4b948db0..969a0278c5 100644 --- a/lib/asn1c/ngap/NGAP_EUTRACellIdentity.h +++ b/lib/asn1c/ngap/NGAP_EUTRACellIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRACellIdentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EUTRACellIdentity; asn_struct_free_f NGAP_EUTRACellIdentity_free; asn_struct_print_f NGAP_EUTRACellIdentity_print; asn_constr_check_f NGAP_EUTRACellIdentity_constraint; -jer_type_encoder_f NGAP_EUTRACellIdentity_encode_jer; per_type_decoder_f NGAP_EUTRACellIdentity_decode_aper; per_type_encoder_f NGAP_EUTRACellIdentity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.c b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.c index a997b39617..8b9e7f0485 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-CellReportItem.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.h b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.h index cde4168ad8..2385bb5121 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_CellReportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.c b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.c index 4ed415f302..4076e963cb 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-CellReportList.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.h b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.h index 57e37a5506..fe4ca19ff7 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_CellReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.c b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.c index 94c3d2415a..c1ad18fa86 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-CellToReportItem.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.h b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.h index 0f78ded8f8..69f1adc830 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_CellToReportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.c b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.c index e637572271..6d6d2b50e6 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-CellToReportList.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.h b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.h index 0d93e579c0..7fc1fca440 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CellToReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_CellToReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.c b/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.c index d75c820d09..a36d442fdc 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-CompositeAvailableCapacityGroup.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.h b/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.h index 05289100b1..c8d9cd58c1 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-CompositeAvailableCapacityGroup.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_CompositeAvailableCapacityGroup_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.c b/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.c index 34488173df..e0d584faba 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-NumberOfActiveUEs.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.h b/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.h index b0425e60d2..bdefea7299 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-NumberOfActiveUEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_NumberOfActiveUEs_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EUTRAN_NumberOfActiveUEs; asn_struct_free_f NGAP_EUTRAN_NumberOfActiveUEs_free; asn_struct_print_f NGAP_EUTRAN_NumberOfActiveUEs_print; asn_constr_check_f NGAP_EUTRAN_NumberOfActiveUEs_constraint; -jer_type_encoder_f NGAP_EUTRAN_NumberOfActiveUEs_encode_jer; per_type_decoder_f NGAP_EUTRAN_NumberOfActiveUEs_decode_aper; per_type_encoder_f NGAP_EUTRAN_NumberOfActiveUEs_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.c b/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.c index d3a43643e2..718d582274 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-RadioResourceStatus.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.h b/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.h index af5907eb1c..a52d8c7adc 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-RadioResourceStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_RadioResourceStatus_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.c b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.c index 33e899bf28..8214ce56e2 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-ReportingStatusIEs.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.h b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.h index 04c2cca3cc..8a07389f14 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingStatusIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_ReportingStatusIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.c b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.c index dff211c4bf..d10252c271 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.c +++ b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAN-ReportingSystemIEs.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.h b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.h index 4105b1afd4..7d6bbd153d 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.h +++ b/lib/asn1c/ngap/NGAP_EUTRAN-ReportingSystemIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAN_ReportingSystemIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.c b/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.c index 502e8081d5..c557444080 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.c +++ b/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAencryptionAlgorithms.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.h b/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.h index 19eddde0cc..e80377ab4d 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.h +++ b/lib/asn1c/ngap/NGAP_EUTRAencryptionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAencryptionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EUTRAencryptionAlgorithms; asn_struct_free_f NGAP_EUTRAencryptionAlgorithms_free; asn_struct_print_f NGAP_EUTRAencryptionAlgorithms_print; asn_constr_check_f NGAP_EUTRAencryptionAlgorithms_constraint; -jer_type_encoder_f NGAP_EUTRAencryptionAlgorithms_encode_jer; per_type_decoder_f NGAP_EUTRAencryptionAlgorithms_decode_aper; per_type_encoder_f NGAP_EUTRAencryptionAlgorithms_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.c b/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.c index f5b88a7fa5..1be869ef75 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.c +++ b/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EUTRAintegrityProtectionAlgorithms.h" diff --git a/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.h b/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.h index aa497e1b8a..30fe39c501 100644 --- a/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.h +++ b/lib/asn1c/ngap/NGAP_EUTRAintegrityProtectionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EUTRAintegrityProtectionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EUTRAintegrityProtectionAlgorithms; asn_struct_free_f NGAP_EUTRAintegrityProtectionAlgorithms_free; asn_struct_print_f NGAP_EUTRAintegrityProtectionAlgorithms_print; asn_constr_check_f NGAP_EUTRAintegrityProtectionAlgorithms_constraint; -jer_type_encoder_f NGAP_EUTRAintegrityProtectionAlgorithms_encode_jer; per_type_decoder_f NGAP_EUTRAintegrityProtectionAlgorithms_decode_aper; per_type_encoder_f NGAP_EUTRAintegrityProtectionAlgorithms_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EXTERNAL.c b/lib/asn1c/ngap/NGAP_EXTERNAL.c index 43143af99f..5844eea5bc 100644 --- a/lib/asn1c/ngap/NGAP_EXTERNAL.c +++ b/lib/asn1c/ngap/NGAP_EXTERNAL.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" * found in "../../../../my/asn1c/asn1c/../skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EXTERNAL.h" diff --git a/lib/asn1c/ngap/NGAP_EXTERNAL.h b/lib/asn1c/ngap/NGAP_EXTERNAL.h index cb3063c288..dad8d0acd1 100644 --- a/lib/asn1c/ngap/NGAP_EXTERNAL.h +++ b/lib/asn1c/ngap/NGAP_EXTERNAL.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" * found in "../../../../my/asn1c/asn1c/../skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EXTERNAL_H_ diff --git a/lib/asn1c/ngap/NGAP_EarlyMeasurement.c b/lib/asn1c/ngap/NGAP_EarlyMeasurement.c index 2678d0a606..22c9df19ca 100644 --- a/lib/asn1c/ngap/NGAP_EarlyMeasurement.c +++ b/lib/asn1c/ngap/NGAP_EarlyMeasurement.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EarlyMeasurement.h" diff --git a/lib/asn1c/ngap/NGAP_EarlyMeasurement.h b/lib/asn1c/ngap/NGAP_EarlyMeasurement.h index fa06338751..55f30361e1 100644 --- a/lib/asn1c/ngap/NGAP_EarlyMeasurement.h +++ b/lib/asn1c/ngap/NGAP_EarlyMeasurement.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EarlyMeasurement_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EarlyMeasurement_specs_1; asn_struct_free_f NGAP_EarlyMeasurement_free; asn_struct_print_f NGAP_EarlyMeasurement_print; asn_constr_check_f NGAP_EarlyMeasurement_constraint; -jer_type_encoder_f NGAP_EarlyMeasurement_encode_jer; per_type_decoder_f NGAP_EarlyMeasurement_decode_aper; per_type_encoder_f NGAP_EarlyMeasurement_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.c b/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.c index 592eb29d88..a86e0ef4a1 100644 --- a/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EarlyStatusTransfer-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.h b/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.h index a8e3e740ab..51fe4dbb4d 100644 --- a/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_EarlyStatusTransfer-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EarlyStatusTransfer_TransparentContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaID.c b/lib/asn1c/ngap/NGAP_EmergencyAreaID.c index 2e872c48eb..a80869061a 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaID.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaID.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaID.h b/lib/asn1c/ngap/NGAP_EmergencyAreaID.h index 6c341bb09f..4f68b14a37 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaID.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_EmergencyAreaID; asn_struct_free_f NGAP_EmergencyAreaID_free; asn_struct_print_f NGAP_EmergencyAreaID_print; asn_constr_check_f NGAP_EmergencyAreaID_constraint; -jer_type_encoder_f NGAP_EmergencyAreaID_encode_jer; per_type_decoder_f NGAP_EmergencyAreaID_decode_aper; per_type_encoder_f NGAP_EmergencyAreaID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.c index c77a83bf44..5a777724c4 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h index 480ffefc41..36982b1052 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDBroadcastEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.c index fd6d8b5b74..597acd5851 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDBroadcastEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.h index d5eaa32ea8..ccdd91a791 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDBroadcastEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.c index c410a7f508..cc761064b6 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDBroadcastNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.h index 65dfb1453e..d0fe4ecf51 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDBroadcastNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.c index fae3cf61e4..10532ccb5a 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDBroadcastNR.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.h index 294d0d28c0..0f4e1904ff 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDBroadcastNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDBroadcastNR_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.c index c229a03185..b340c7ecc9 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDCancelledEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.h index a479ddb403..f35005345a 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDCancelledEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.c index f3e1eeafa5..684d0bc879 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDCancelledEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.h index 26f3475602..83990213da 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDCancelledEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.c index d8f8d94dec..21a20921bc 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDCancelledNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.h index b2b8a5bdc6..3b43570171 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDCancelledNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.c index 3aa9a26e5c..a934dea95e 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDCancelledNR.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.h index c3e2740a4b..f03450100a 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDCancelledNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDCancelledNR_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.c index 818037a42c..8e75fa2c63 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDList.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.h index f32f93e609..8fceb2f057 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDList_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.c b/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.c index 5b1c036b6c..eb121d3753 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.c +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyAreaIDListForRestart.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.h b/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.h index 54c0d37c29..1bd4d56885 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.h +++ b/lib/asn1c/ngap/NGAP_EmergencyAreaIDListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyAreaIDListForRestart_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.c b/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.c index cd7115e180..30dce0f086 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.c +++ b/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyFallbackIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.h b/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.h index 235bf594fc..c62837a33e 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.h +++ b/lib/asn1c/ngap/NGAP_EmergencyFallbackIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyFallbackIndicator_H_ diff --git a/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.c b/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.c index 0c70e1b2f8..5f58608367 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.c +++ b/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyFallbackRequestIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.h b/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.h index 2a16a747b1..8473c8b8aa 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.h +++ b/lib/asn1c/ngap/NGAP_EmergencyFallbackRequestIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyFallbackRequestIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EmergencyFallbackRequestIndica asn_struct_free_f NGAP_EmergencyFallbackRequestIndicator_free; asn_struct_print_f NGAP_EmergencyFallbackRequestIndicator_print; asn_constr_check_f NGAP_EmergencyFallbackRequestIndicator_constraint; -jer_type_encoder_f NGAP_EmergencyFallbackRequestIndicator_encode_jer; per_type_decoder_f NGAP_EmergencyFallbackRequestIndicator_decode_aper; per_type_encoder_f NGAP_EmergencyFallbackRequestIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.c b/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.c index fdf1516eba..3272edc6ea 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.c +++ b/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EmergencyServiceTargetCN.h" diff --git a/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.h b/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.h index 5b58f64b3b..9cb22e5fa9 100644 --- a/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.h +++ b/lib/asn1c/ngap/NGAP_EmergencyServiceTargetCN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EmergencyServiceTargetCN_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EmergencyServiceTargetCN_specs asn_struct_free_f NGAP_EmergencyServiceTargetCN_free; asn_struct_print_f NGAP_EmergencyServiceTargetCN_print; asn_constr_check_f NGAP_EmergencyServiceTargetCN_constraint; -jer_type_encoder_f NGAP_EmergencyServiceTargetCN_encode_jer; per_type_decoder_f NGAP_EmergencyServiceTargetCN_decode_aper; per_type_encoder_f NGAP_EmergencyServiceTargetCN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EndIndication.c b/lib/asn1c/ngap/NGAP_EndIndication.c index 50fffeecdd..7d9b8ffc2a 100644 --- a/lib/asn1c/ngap/NGAP_EndIndication.c +++ b/lib/asn1c/ngap/NGAP_EndIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EndIndication.h" diff --git a/lib/asn1c/ngap/NGAP_EndIndication.h b/lib/asn1c/ngap/NGAP_EndIndication.h index 30cfc35aa3..be4ca8fc57 100644 --- a/lib/asn1c/ngap/NGAP_EndIndication.h +++ b/lib/asn1c/ngap/NGAP_EndIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EndIndication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EndIndication_specs_1; asn_struct_free_f NGAP_EndIndication_free; asn_struct_print_f NGAP_EndIndication_print; asn_constr_check_f NGAP_EndIndication_constraint; -jer_type_encoder_f NGAP_EndIndication_encode_jer; per_type_decoder_f NGAP_EndIndication_decode_aper; per_type_encoder_f NGAP_EndIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.c b/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.c index 7d7cbfd6aa..4cc3e7ee7c 100644 --- a/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.c +++ b/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EndpointIPAddressAndPort.h" diff --git a/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.h b/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.h index 36fe18b6b5..db0be0e180 100644 --- a/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.h +++ b/lib/asn1c/ngap/NGAP_EndpointIPAddressAndPort.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EndpointIPAddressAndPort_H_ diff --git a/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.c b/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.c index cadf6e77e6..7ecd2ecd34 100644 --- a/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.c +++ b/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Enhanced-CoverageRestriction.h" diff --git a/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.h b/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.h index 0f16258501..80727d8913 100644 --- a/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.h +++ b/lib/asn1c/ngap/NGAP_Enhanced-CoverageRestriction.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Enhanced_CoverageRestriction_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Enhanced_CoverageRestriction_s asn_struct_free_f NGAP_Enhanced_CoverageRestriction_free; asn_struct_print_f NGAP_Enhanced_CoverageRestriction_print; asn_constr_check_f NGAP_Enhanced_CoverageRestriction_constraint; -jer_type_encoder_f NGAP_Enhanced_CoverageRestriction_encode_jer; per_type_decoder_f NGAP_Enhanced_CoverageRestriction_decode_aper; per_type_encoder_f NGAP_Enhanced_CoverageRestriction_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_EquivalentPLMNs.c b/lib/asn1c/ngap/NGAP_EquivalentPLMNs.c index 367d6da3a0..a24124231c 100644 --- a/lib/asn1c/ngap/NGAP_EquivalentPLMNs.c +++ b/lib/asn1c/ngap/NGAP_EquivalentPLMNs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EquivalentPLMNs.h" diff --git a/lib/asn1c/ngap/NGAP_EquivalentPLMNs.h b/lib/asn1c/ngap/NGAP_EquivalentPLMNs.h index 0336693018..1588aa5660 100644 --- a/lib/asn1c/ngap/NGAP_EquivalentPLMNs.h +++ b/lib/asn1c/ngap/NGAP_EquivalentPLMNs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EquivalentPLMNs_H_ diff --git a/lib/asn1c/ngap/NGAP_ErrorIndication.c b/lib/asn1c/ngap/NGAP_ErrorIndication.c index 4947bbe1f3..1b5eb4f566 100644 --- a/lib/asn1c/ngap/NGAP_ErrorIndication.c +++ b/lib/asn1c/ngap/NGAP_ErrorIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ErrorIndication.h" diff --git a/lib/asn1c/ngap/NGAP_ErrorIndication.h b/lib/asn1c/ngap/NGAP_ErrorIndication.h index 9fc5431acb..34c9663358 100644 --- a/lib/asn1c/ngap/NGAP_ErrorIndication.h +++ b/lib/asn1c/ngap/NGAP_ErrorIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ErrorIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.c b/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.c index f1fa02be71..a17fc15991 100644 --- a/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.c +++ b/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EventBasedReportingIEs.h" diff --git a/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.h b/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.h index 49b73dbaf1..2561081191 100644 --- a/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.h +++ b/lib/asn1c/ngap/NGAP_EventBasedReportingIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EventBasedReportingIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.c b/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.c index c7cda2b883..a26ffa9114 100644 --- a/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.c +++ b/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EventL1LoggedMDTConfig.h" diff --git a/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.h b/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.h index 72bbeaa41e..1d1461b9f4 100644 --- a/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.h +++ b/lib/asn1c/ngap/NGAP_EventL1LoggedMDTConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EventL1LoggedMDTConfig_H_ diff --git a/lib/asn1c/ngap/NGAP_EventTrigger.c b/lib/asn1c/ngap/NGAP_EventTrigger.c index e4a1473965..57c664ce52 100644 --- a/lib/asn1c/ngap/NGAP_EventTrigger.c +++ b/lib/asn1c/ngap/NGAP_EventTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EventTrigger.h" diff --git a/lib/asn1c/ngap/NGAP_EventTrigger.h b/lib/asn1c/ngap/NGAP_EventTrigger.h index 993245de82..eb3401df9c 100644 --- a/lib/asn1c/ngap/NGAP_EventTrigger.h +++ b/lib/asn1c/ngap/NGAP_EventTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EventTrigger_H_ diff --git a/lib/asn1c/ngap/NGAP_EventType.c b/lib/asn1c/ngap/NGAP_EventType.c index a70bbd5680..6dbaea2fad 100644 --- a/lib/asn1c/ngap/NGAP_EventType.c +++ b/lib/asn1c/ngap/NGAP_EventType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_EventType.h" diff --git a/lib/asn1c/ngap/NGAP_EventType.h b/lib/asn1c/ngap/NGAP_EventType.h index ad87fda67b..8fc760ddc5 100644 --- a/lib/asn1c/ngap/NGAP_EventType.h +++ b/lib/asn1c/ngap/NGAP_EventType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_EventType_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_EventType_specs_1; asn_struct_free_f NGAP_EventType_free; asn_struct_print_f NGAP_EventType_print; asn_constr_check_f NGAP_EventType_constraint; -jer_type_encoder_f NGAP_EventType_encode_jer; per_type_decoder_f NGAP_EventType_decode_aper; per_type_encoder_f NGAP_EventType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.c b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.c index 6ad4a6d093..ff0b45c2d6 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.c +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExcessPacketDelayThresholdConfiguration.h" diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.h b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.h index 35a825caf6..7e2cc0e4dd 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.h +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExcessPacketDelayThresholdConfiguration_H_ diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.c b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.c index 7df64bb624..7a05971b9b 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.c +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExcessPacketDelayThresholdItem.h" diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.h b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.h index dcb6d4aa69..174601cfdc 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.h +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExcessPacketDelayThresholdItem_H_ diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.c b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.c index 8944236e1d..3583c10e45 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.c +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExcessPacketDelayThresholdValue.h" diff --git a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.h b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.h index 67cc123883..7d958b1833 100644 --- a/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.h +++ b/lib/asn1c/ngap/NGAP_ExcessPacketDelayThresholdValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExcessPacketDelayThresholdValue_H_ @@ -54,7 +54,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ExcessPacketDelayThresholdValu asn_struct_free_f NGAP_ExcessPacketDelayThresholdValue_free; asn_struct_print_f NGAP_ExcessPacketDelayThresholdValue_print; asn_constr_check_f NGAP_ExcessPacketDelayThresholdValue_constraint; -jer_type_encoder_f NGAP_ExcessPacketDelayThresholdValue_encode_jer; per_type_decoder_f NGAP_ExcessPacketDelayThresholdValue_decode_aper; per_type_encoder_f NGAP_ExcessPacketDelayThresholdValue_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.c b/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.c index ad7fc98ab1..bd69913512 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.c +++ b/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedActivityPeriod.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.h b/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.h index 6e1dc94927..4f05227f70 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.h +++ b/lib/asn1c/ngap/NGAP_ExpectedActivityPeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedActivityPeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ExpectedActivityPeriod; asn_struct_free_f NGAP_ExpectedActivityPeriod_free; asn_struct_print_f NGAP_ExpectedActivityPeriod_print; asn_constr_check_f NGAP_ExpectedActivityPeriod_constraint; -jer_type_encoder_f NGAP_ExpectedActivityPeriod_encode_jer; per_type_decoder_f NGAP_ExpectedActivityPeriod_decode_aper; per_type_encoder_f NGAP_ExpectedActivityPeriod_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExpectedHOInterval.c b/lib/asn1c/ngap/NGAP_ExpectedHOInterval.c index 9cf2ca724c..cd6587f761 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedHOInterval.c +++ b/lib/asn1c/ngap/NGAP_ExpectedHOInterval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedHOInterval.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedHOInterval.h b/lib/asn1c/ngap/NGAP_ExpectedHOInterval.h index f331c45d7a..ea03f5cbaa 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedHOInterval.h +++ b/lib/asn1c/ngap/NGAP_ExpectedHOInterval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedHOInterval_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ExpectedHOInterval_specs_1; asn_struct_free_f NGAP_ExpectedHOInterval_free; asn_struct_print_f NGAP_ExpectedHOInterval_print; asn_constr_check_f NGAP_ExpectedHOInterval_constraint; -jer_type_encoder_f NGAP_ExpectedHOInterval_encode_jer; per_type_decoder_f NGAP_ExpectedHOInterval_decode_aper; per_type_encoder_f NGAP_ExpectedHOInterval_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.c b/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.c index fbda5afcf6..3113fe21d1 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.c +++ b/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedIdlePeriod.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.h b/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.h index 0b4f116107..0ab4c0ed85 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.h +++ b/lib/asn1c/ngap/NGAP_ExpectedIdlePeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedIdlePeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ExpectedIdlePeriod; asn_struct_free_f NGAP_ExpectedIdlePeriod_free; asn_struct_print_f NGAP_ExpectedIdlePeriod_print; asn_constr_check_f NGAP_ExpectedIdlePeriod_constraint; -jer_type_encoder_f NGAP_ExpectedIdlePeriod_encode_jer; per_type_decoder_f NGAP_ExpectedIdlePeriod_decode_aper; per_type_encoder_f NGAP_ExpectedIdlePeriod_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.c b/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.c index 9654d17565..d2c39b022d 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.c +++ b/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedUEActivityBehaviour.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.h b/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.h index dc7f4d1610..33f05f35e8 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.h +++ b/lib/asn1c/ngap/NGAP_ExpectedUEActivityBehaviour.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedUEActivityBehaviour_H_ diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.c b/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.c index 6bf7f23e82..a5ee288f90 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.c +++ b/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedUEBehaviour.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.h b/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.h index 91246d19a7..4c82582cd7 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.h +++ b/lib/asn1c/ngap/NGAP_ExpectedUEBehaviour.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedUEBehaviour_H_ diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMobility.c b/lib/asn1c/ngap/NGAP_ExpectedUEMobility.c index 32166a764c..d5776393d7 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMobility.c +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMobility.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedUEMobility.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMobility.h b/lib/asn1c/ngap/NGAP_ExpectedUEMobility.h index 42bdda5012..dafd994106 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMobility.h +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMobility.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedUEMobility_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ExpectedUEMobility_specs_1; asn_struct_free_f NGAP_ExpectedUEMobility_free; asn_struct_print_f NGAP_ExpectedUEMobility_print; asn_constr_check_f NGAP_ExpectedUEMobility_constraint; -jer_type_encoder_f NGAP_ExpectedUEMobility_encode_jer; per_type_decoder_f NGAP_ExpectedUEMobility_decode_aper; per_type_encoder_f NGAP_ExpectedUEMobility_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.c b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.c index f4eefa230b..89d8b248d5 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.c +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedUEMovingTrajectory.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.h b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.h index b8704f5b1b..0ff2ad7cb6 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.h +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectory.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedUEMovingTrajectory_H_ diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.c b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.c index 78460c16ef..8b722cca35 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.c +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExpectedUEMovingTrajectoryItem.h" diff --git a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.h b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.h index a5d2c9d3a3..ab837c9b43 100644 --- a/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.h +++ b/lib/asn1c/ngap/NGAP_ExpectedUEMovingTrajectoryItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExpectedUEMovingTrajectoryItem_H_ diff --git a/lib/asn1c/ngap/NGAP_Extended-AMFName.c b/lib/asn1c/ngap/NGAP_Extended-AMFName.c index e1792e4670..c215b8fb42 100644 --- a/lib/asn1c/ngap/NGAP_Extended-AMFName.c +++ b/lib/asn1c/ngap/NGAP_Extended-AMFName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Extended-AMFName.h" diff --git a/lib/asn1c/ngap/NGAP_Extended-AMFName.h b/lib/asn1c/ngap/NGAP_Extended-AMFName.h index e6a12fe810..6b4c510618 100644 --- a/lib/asn1c/ngap/NGAP_Extended-AMFName.h +++ b/lib/asn1c/ngap/NGAP_Extended-AMFName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Extended_AMFName_H_ diff --git a/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.c b/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.c index d0aba8d0e8..5c1b3a8e46 100644 --- a/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.c +++ b/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Extended-ConnectedTime.h" diff --git a/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.h b/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.h index d1b45462e9..3c7d1a18a3 100644 --- a/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.h +++ b/lib/asn1c/ngap/NGAP_Extended-ConnectedTime.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Extended_ConnectedTime_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Extended_ConnectedTime; asn_struct_free_f NGAP_Extended_ConnectedTime_free; asn_struct_print_f NGAP_Extended_ConnectedTime_print; asn_constr_check_f NGAP_Extended_ConnectedTime_constraint; -jer_type_encoder_f NGAP_Extended_ConnectedTime_encode_jer; per_type_decoder_f NGAP_Extended_ConnectedTime_decode_aper; per_type_encoder_f NGAP_Extended_ConnectedTime_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Extended-RANNodeName.c b/lib/asn1c/ngap/NGAP_Extended-RANNodeName.c index 04ec013518..caf75dc26e 100644 --- a/lib/asn1c/ngap/NGAP_Extended-RANNodeName.c +++ b/lib/asn1c/ngap/NGAP_Extended-RANNodeName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Extended-RANNodeName.h" diff --git a/lib/asn1c/ngap/NGAP_Extended-RANNodeName.h b/lib/asn1c/ngap/NGAP_Extended-RANNodeName.h index 1e6a390cf0..9b8a3dc0db 100644 --- a/lib/asn1c/ngap/NGAP_Extended-RANNodeName.h +++ b/lib/asn1c/ngap/NGAP_Extended-RANNodeName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Extended_RANNodeName_H_ diff --git a/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.c b/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.c index c13049bbe8..9d8b8d9323 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.c +++ b/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedPacketDelayBudget.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.h b/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.h index 81b98eb6b0..5432fc7b2a 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.h +++ b/lib/asn1c/ngap/NGAP_ExtendedPacketDelayBudget.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedPacketDelayBudget_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ExtendedPacketDelayBudget; asn_struct_free_f NGAP_ExtendedPacketDelayBudget_free; asn_struct_print_f NGAP_ExtendedPacketDelayBudget_print; asn_constr_check_f NGAP_ExtendedPacketDelayBudget_constraint; -jer_type_encoder_f NGAP_ExtendedPacketDelayBudget_encode_jer; per_type_decoder_f NGAP_ExtendedPacketDelayBudget_decode_aper; per_type_encoder_f NGAP_ExtendedPacketDelayBudget_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.c b/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.c index 509f50ac21..76b9d88314 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.c +++ b/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedRATRestrictionInformation.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.h b/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.h index 430060b8ae..1e3e039866 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.h +++ b/lib/asn1c/ngap/NGAP_ExtendedRATRestrictionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedRATRestrictionInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.c b/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.c index c9e3c8bf6a..34ab8d49d8 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.c +++ b/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedRNC-ID.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.h b/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.h index 3e2046cbc4..c9bd8b5308 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.h +++ b/lib/asn1c/ngap/NGAP_ExtendedRNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedRNC_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ExtendedRNC_ID; asn_struct_free_f NGAP_ExtendedRNC_ID_free; asn_struct_print_f NGAP_ExtendedRNC_ID_print; asn_constr_check_f NGAP_ExtendedRNC_ID_constraint; -jer_type_encoder_f NGAP_ExtendedRNC_ID_encode_jer; per_type_decoder_f NGAP_ExtendedRNC_ID_decode_aper; per_type_encoder_f NGAP_ExtendedRNC_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.c b/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.c index 272b0cf123..d9afc73db9 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.c +++ b/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedReportIntervalMDT.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.h b/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.h index 44f9011691..26f36d2f67 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.h +++ b/lib/asn1c/ngap/NGAP_ExtendedReportIntervalMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedReportIntervalMDT_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ExtendedReportIntervalMDT_spec asn_struct_free_f NGAP_ExtendedReportIntervalMDT_free; asn_struct_print_f NGAP_ExtendedReportIntervalMDT_print; asn_constr_check_f NGAP_ExtendedReportIntervalMDT_constraint; -jer_type_encoder_f NGAP_ExtendedReportIntervalMDT_encode_jer; per_type_decoder_f NGAP_ExtendedReportIntervalMDT_decode_aper; per_type_encoder_f NGAP_ExtendedReportIntervalMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.c b/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.c index d56547c2fa..1bad66ada2 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.c +++ b/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedSliceSupportList.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.h b/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.h index ba03af1ff4..eb28ae9ce1 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.h +++ b/lib/asn1c/ngap/NGAP_ExtendedSliceSupportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedSliceSupportList_H_ diff --git a/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.c b/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.c index 9ab593fdcd..860d697c72 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.c +++ b/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ExtendedUEIdentityIndexValue.h" diff --git a/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.h b/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.h index c391c7f271..1829c33a22 100644 --- a/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.h +++ b/lib/asn1c/ngap/NGAP_ExtendedUEIdentityIndexValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ExtendedUEIdentityIndexValue_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ExtendedUEIdentityIndexValue; asn_struct_free_f NGAP_ExtendedUEIdentityIndexValue_free; asn_struct_print_f NGAP_ExtendedUEIdentityIndexValue_print; asn_constr_check_f NGAP_ExtendedUEIdentityIndexValue_constraint; -jer_type_encoder_f NGAP_ExtendedUEIdentityIndexValue_encode_jer; per_type_decoder_f NGAP_ExtendedUEIdentityIndexValue_decode_aper; per_type_encoder_f NGAP_ExtendedUEIdentityIndexValue_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FailureIndication.c b/lib/asn1c/ngap/NGAP_FailureIndication.c index ca1b59113e..3032cb984f 100644 --- a/lib/asn1c/ngap/NGAP_FailureIndication.c +++ b/lib/asn1c/ngap/NGAP_FailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FailureIndication.h" diff --git a/lib/asn1c/ngap/NGAP_FailureIndication.h b/lib/asn1c/ngap/NGAP_FailureIndication.h index 39db0cdf41..e81c6b394c 100644 --- a/lib/asn1c/ngap/NGAP_FailureIndication.h +++ b/lib/asn1c/ngap/NGAP_FailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FailureIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_FirstDLCount.c b/lib/asn1c/ngap/NGAP_FirstDLCount.c index e1e3a53fd9..a3fb3544a8 100644 --- a/lib/asn1c/ngap/NGAP_FirstDLCount.c +++ b/lib/asn1c/ngap/NGAP_FirstDLCount.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FirstDLCount.h" diff --git a/lib/asn1c/ngap/NGAP_FirstDLCount.h b/lib/asn1c/ngap/NGAP_FirstDLCount.h index 60f41776fe..ee736c8c33 100644 --- a/lib/asn1c/ngap/NGAP_FirstDLCount.h +++ b/lib/asn1c/ngap/NGAP_FirstDLCount.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FirstDLCount_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.c b/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.c index 209b82dda4..1573c0fad5 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.c +++ b/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveG-ProSeAuthorized.h" diff --git a/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.h b/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.h index 978647de04..e57b0b0fcb 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.h +++ b/lib/asn1c/ngap/NGAP_FiveG-ProSeAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveG_ProSeAuthorized_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.c b/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.c index aa8ef16d12..b7a45f1a11 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.c +++ b/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveG-ProSePC5QoSParameters.h" diff --git a/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.h b/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.h index 87f4fe5f50..160cecdea6 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.h +++ b/lib/asn1c/ngap/NGAP_FiveG-ProSePC5QoSParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveG_ProSePC5QoSParameters_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.c b/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.c index 6f029e346d..fd6b95f59a 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.c +++ b/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveG-S-TMSI.h" diff --git a/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.h b/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.h index bac04eef6d..a75e18b018 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.h +++ b/lib/asn1c/ngap/NGAP_FiveG-S-TMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveG_S_TMSI_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveG-TMSI.c b/lib/asn1c/ngap/NGAP_FiveG-TMSI.c index d7e320d3d8..ed40df7f32 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-TMSI.c +++ b/lib/asn1c/ngap/NGAP_FiveG-TMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveG-TMSI.h" diff --git a/lib/asn1c/ngap/NGAP_FiveG-TMSI.h b/lib/asn1c/ngap/NGAP_FiveG-TMSI.h index cfade20819..6ebfb7491b 100644 --- a/lib/asn1c/ngap/NGAP_FiveG-TMSI.h +++ b/lib/asn1c/ngap/NGAP_FiveG-TMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveG_TMSI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_FiveG_TMSI; asn_struct_free_f NGAP_FiveG_TMSI_free; asn_struct_print_f NGAP_FiveG_TMSI_print; asn_constr_check_f NGAP_FiveG_TMSI_constraint; -jer_type_encoder_f NGAP_FiveG_TMSI_encode_jer; per_type_decoder_f NGAP_FiveG_TMSI_decode_aper; per_type_encoder_f NGAP_FiveG_TMSI_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.c b/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.c index 684a66fd71..227621762e 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSeDirectCommunication.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.h b/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.h index 3846e52f87..b5ad4e2cbc 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSeDirectCommunication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSeDirectCommunication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_FiveGProSeDirectCommunication_ asn_struct_free_f NGAP_FiveGProSeDirectCommunication_free; asn_struct_print_f NGAP_FiveGProSeDirectCommunication_print; asn_constr_check_f NGAP_FiveGProSeDirectCommunication_constraint; -jer_type_encoder_f NGAP_FiveGProSeDirectCommunication_encode_jer; per_type_decoder_f NGAP_FiveGProSeDirectCommunication_decode_aper; per_type_encoder_f NGAP_FiveGProSeDirectCommunication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.c b/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.c index dead88dbd8..9b1ca97b41 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSeDirectDiscovery.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.h b/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.h index 17655729e8..bc452c232d 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSeDirectDiscovery.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSeDirectDiscovery_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_FiveGProSeDirectDiscovery_spec asn_struct_free_f NGAP_FiveGProSeDirectDiscovery_free; asn_struct_print_f NGAP_FiveGProSeDirectDiscovery_print; asn_constr_check_f NGAP_FiveGProSeDirectDiscovery_constraint; -jer_type_encoder_f NGAP_FiveGProSeDirectDiscovery_encode_jer; per_type_decoder_f NGAP_FiveGProSeDirectDiscovery_decode_aper; per_type_encoder_f NGAP_FiveGProSeDirectDiscovery_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.c b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.c index c05bd7476c..8f8e4bd256 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSeLayer2RemoteUE.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.h b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.h index 990a7e8a91..a40bf88b7c 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2RemoteUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSeLayer2RemoteUE_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_FiveGProSeLayer2RemoteUE_specs asn_struct_free_f NGAP_FiveGProSeLayer2RemoteUE_free; asn_struct_print_f NGAP_FiveGProSeLayer2RemoteUE_print; asn_constr_check_f NGAP_FiveGProSeLayer2RemoteUE_constraint; -jer_type_encoder_f NGAP_FiveGProSeLayer2RemoteUE_encode_jer; per_type_decoder_f NGAP_FiveGProSeLayer2RemoteUE_decode_aper; per_type_encoder_f NGAP_FiveGProSeLayer2RemoteUE_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.c b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.c index d4e6b1e0d4..543ee325c0 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSeLayer2UEtoNetworkRelay.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.h b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.h index 8eb4cf325a..51f2d37345 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer2UEtoNetworkRelay.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSeLayer2UEtoNetworkRelay_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_FiveGProSeLayer2UEtoNetworkRel asn_struct_free_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_free; asn_struct_print_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_print; asn_constr_check_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_constraint; -jer_type_encoder_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_encode_jer; per_type_decoder_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_decode_aper; per_type_encoder_f NGAP_FiveGProSeLayer2UEtoNetworkRelay_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.c b/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.c index d8b1543623..7f683ac158 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSeLayer3UEtoNetworkRelay.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.h b/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.h index 42561ba300..fad59d6d68 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSeLayer3UEtoNetworkRelay.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSeLayer3UEtoNetworkRelay_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_FiveGProSeLayer3UEtoNetworkRel asn_struct_free_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_free; asn_struct_print_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_print; asn_constr_check_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_constraint; -jer_type_encoder_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_encode_jer; per_type_decoder_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_decode_aper; per_type_encoder_f NGAP_FiveGProSeLayer3UEtoNetworkRelay_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.c b/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.c index eb947b41d4..bdea8d6d96 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSePC5FlowBitRates.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.h b/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.h index 69f24ed89d..b03d364093 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5FlowBitRates.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSePC5FlowBitRates_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.c b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.c index b856ac84f8..98011e68aa 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSePC5QoSFlowItem.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.h b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.h index 6b077ab315..352c0a3b69 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSePC5QoSFlowItem_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.c b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.c index 2a11ebcf23..338ee6c48d 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.c +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveGProSePC5QoSFlowList.h" diff --git a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.h b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.h index e8cf17e67b..394c19bbf0 100644 --- a/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.h +++ b/lib/asn1c/ngap/NGAP_FiveGProSePC5QoSFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveGProSePC5QoSFlowList_H_ diff --git a/lib/asn1c/ngap/NGAP_FiveQI.c b/lib/asn1c/ngap/NGAP_FiveQI.c index b2bc32e6df..325f20d54f 100644 --- a/lib/asn1c/ngap/NGAP_FiveQI.c +++ b/lib/asn1c/ngap/NGAP_FiveQI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FiveQI.h" diff --git a/lib/asn1c/ngap/NGAP_FiveQI.h b/lib/asn1c/ngap/NGAP_FiveQI.h index 539ed42012..9425e5dee7 100644 --- a/lib/asn1c/ngap/NGAP_FiveQI.h +++ b/lib/asn1c/ngap/NGAP_FiveQI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FiveQI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_FiveQI; asn_struct_free_f NGAP_FiveQI_free; asn_struct_print_f NGAP_FiveQI_print; asn_constr_check_f NGAP_FiveQI_constraint; -jer_type_encoder_f NGAP_FiveQI_encode_jer; per_type_decoder_f NGAP_FiveQI_decode_aper; per_type_encoder_f NGAP_FiveQI_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.c b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.c index 9ca12d56e6..ccf511c47e 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.c +++ b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ForbiddenAreaInformation-Item.h" diff --git a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.h b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.h index a189031432..a9b66524cf 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.h +++ b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ForbiddenAreaInformation_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.c b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.c index d199f58202..d0e480109a 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.c +++ b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ForbiddenAreaInformation.h" diff --git a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.h b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.h index 1561f8070f..4ebd61b84d 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.h +++ b/lib/asn1c/ngap/NGAP_ForbiddenAreaInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ForbiddenAreaInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_ForbiddenTACs.c b/lib/asn1c/ngap/NGAP_ForbiddenTACs.c index b32943666b..eabc2e4126 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenTACs.c +++ b/lib/asn1c/ngap/NGAP_ForbiddenTACs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ForbiddenTACs.h" diff --git a/lib/asn1c/ngap/NGAP_ForbiddenTACs.h b/lib/asn1c/ngap/NGAP_ForbiddenTACs.h index 4eecee66bb..0494d79aac 100644 --- a/lib/asn1c/ngap/NGAP_ForbiddenTACs.h +++ b/lib/asn1c/ngap/NGAP_ForbiddenTACs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ForbiddenTACs_H_ diff --git a/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.c b/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.c index af86677a3d..3524a1733d 100644 --- a/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.c +++ b/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FromEUTRANtoNGRAN.h" diff --git a/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.h b/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.h index f36550c5ea..69f74e2b5c 100644 --- a/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.h +++ b/lib/asn1c/ngap/NGAP_FromEUTRANtoNGRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FromEUTRANtoNGRAN_H_ diff --git a/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.c b/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.c index 5705adfbc7..9225215019 100644 --- a/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.c +++ b/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_FromNGRANtoEUTRAN.h" diff --git a/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.h b/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.h index 63cf223c2e..34cb6f213b 100644 --- a/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.h +++ b/lib/asn1c/ngap/NGAP_FromNGRANtoEUTRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_FromNGRANtoEUTRAN_H_ diff --git a/lib/asn1c/ngap/NGAP_GBR-QosInformation.c b/lib/asn1c/ngap/NGAP_GBR-QosInformation.c index 0d7343679b..f7e4e845e2 100644 --- a/lib/asn1c/ngap/NGAP_GBR-QosInformation.c +++ b/lib/asn1c/ngap/NGAP_GBR-QosInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GBR-QosInformation.h" diff --git a/lib/asn1c/ngap/NGAP_GBR-QosInformation.h b/lib/asn1c/ngap/NGAP_GBR-QosInformation.h index 93e43bb55f..18e4735a0f 100644 --- a/lib/asn1c/ngap/NGAP_GBR-QosInformation.h +++ b/lib/asn1c/ngap/NGAP_GBR-QosInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GBR_QosInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_GNB-ID.c b/lib/asn1c/ngap/NGAP_GNB-ID.c index 329b211986..97e9335269 100644 --- a/lib/asn1c/ngap/NGAP_GNB-ID.c +++ b/lib/asn1c/ngap/NGAP_GNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GNB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GNB-ID.h b/lib/asn1c/ngap/NGAP_GNB-ID.h index 8bcf2327af..03185ef78a 100644 --- a/lib/asn1c/ngap/NGAP_GNB-ID.h +++ b/lib/asn1c/ngap/NGAP_GNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GNB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GNBSetID.c b/lib/asn1c/ngap/NGAP_GNBSetID.c index 820cdd19eb..e84bee935e 100644 --- a/lib/asn1c/ngap/NGAP_GNBSetID.c +++ b/lib/asn1c/ngap/NGAP_GNBSetID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GNBSetID.h" diff --git a/lib/asn1c/ngap/NGAP_GNBSetID.h b/lib/asn1c/ngap/NGAP_GNBSetID.h index c836638cba..e0bedf0e59 100644 --- a/lib/asn1c/ngap/NGAP_GNBSetID.h +++ b/lib/asn1c/ngap/NGAP_GNBSetID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GNBSetID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_GNBSetID; asn_struct_free_f NGAP_GNBSetID_free; asn_struct_print_f NGAP_GNBSetID_print; asn_constr_check_f NGAP_GNBSetID_constraint; -jer_type_encoder_f NGAP_GNBSetID_encode_jer; per_type_decoder_f NGAP_GNBSetID_decode_aper; per_type_encoder_f NGAP_GNBSetID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_GTP-TEID.c b/lib/asn1c/ngap/NGAP_GTP-TEID.c index 0647a41893..1a0064160e 100644 --- a/lib/asn1c/ngap/NGAP_GTP-TEID.c +++ b/lib/asn1c/ngap/NGAP_GTP-TEID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GTP-TEID.h" diff --git a/lib/asn1c/ngap/NGAP_GTP-TEID.h b/lib/asn1c/ngap/NGAP_GTP-TEID.h index e31ebe4e2e..7b747d97d9 100644 --- a/lib/asn1c/ngap/NGAP_GTP-TEID.h +++ b/lib/asn1c/ngap/NGAP_GTP-TEID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GTP_TEID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_GTP_TEID; asn_struct_free_f NGAP_GTP_TEID_free; asn_struct_print_f NGAP_GTP_TEID_print; asn_constr_check_f NGAP_GTP_TEID_constraint; -jer_type_encoder_f NGAP_GTP_TEID_encode_jer; per_type_decoder_f NGAP_GTP_TEID_decode_aper; per_type_encoder_f NGAP_GTP_TEID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_GTPTunnel.c b/lib/asn1c/ngap/NGAP_GTPTunnel.c index 782944e401..388cf3e790 100644 --- a/lib/asn1c/ngap/NGAP_GTPTunnel.c +++ b/lib/asn1c/ngap/NGAP_GTPTunnel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GTPTunnel.h" diff --git a/lib/asn1c/ngap/NGAP_GTPTunnel.h b/lib/asn1c/ngap/NGAP_GTPTunnel.h index 2d7b13def0..9c675cb9b2 100644 --- a/lib/asn1c/ngap/NGAP_GTPTunnel.h +++ b/lib/asn1c/ngap/NGAP_GTPTunnel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GTPTunnel_H_ diff --git a/lib/asn1c/ngap/NGAP_GUAMI.c b/lib/asn1c/ngap/NGAP_GUAMI.c index a5c42cf9c3..eb76493940 100644 --- a/lib/asn1c/ngap/NGAP_GUAMI.c +++ b/lib/asn1c/ngap/NGAP_GUAMI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GUAMI.h" diff --git a/lib/asn1c/ngap/NGAP_GUAMI.h b/lib/asn1c/ngap/NGAP_GUAMI.h index aa741ed727..ff6a3a8eef 100644 --- a/lib/asn1c/ngap/NGAP_GUAMI.h +++ b/lib/asn1c/ngap/NGAP_GUAMI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GUAMI_H_ diff --git a/lib/asn1c/ngap/NGAP_GUAMIType.c b/lib/asn1c/ngap/NGAP_GUAMIType.c index 3c1660f326..2e043c4ec6 100644 --- a/lib/asn1c/ngap/NGAP_GUAMIType.c +++ b/lib/asn1c/ngap/NGAP_GUAMIType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GUAMIType.h" diff --git a/lib/asn1c/ngap/NGAP_GUAMIType.h b/lib/asn1c/ngap/NGAP_GUAMIType.h index 6fb710069a..61d63516ef 100644 --- a/lib/asn1c/ngap/NGAP_GUAMIType.h +++ b/lib/asn1c/ngap/NGAP_GUAMIType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GUAMIType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_GUAMIType_specs_1; asn_struct_free_f NGAP_GUAMIType_free; asn_struct_print_f NGAP_GUAMIType_print; asn_constr_check_f NGAP_GUAMIType_constraint; -jer_type_encoder_f NGAP_GUAMIType_encode_jer; per_type_decoder_f NGAP_GUAMIType_decode_aper; per_type_encoder_f NGAP_GUAMIType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_GlobalCable-ID.c b/lib/asn1c/ngap/NGAP_GlobalCable-ID.c index a1782ad27b..c2d6a04f2a 100644 --- a/lib/asn1c/ngap/NGAP_GlobalCable-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalCable-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalCable-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalCable-ID.h b/lib/asn1c/ngap/NGAP_GlobalCable-ID.h index eccd4915e8..23b90f98a1 100644 --- a/lib/asn1c/ngap/NGAP_GlobalCable-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalCable-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalCable_ID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_GlobalCable_ID; asn_struct_free_f NGAP_GlobalCable_ID_free; asn_struct_print_f NGAP_GlobalCable_ID_print; asn_constr_check_f NGAP_GlobalCable_ID_constraint; -jer_type_encoder_f NGAP_GlobalCable_ID_encode_jer; per_type_decoder_f NGAP_GlobalCable_ID_decode_aper; per_type_encoder_f NGAP_GlobalCable_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_GlobalENB-ID.c b/lib/asn1c/ngap/NGAP_GlobalENB-ID.c index e1a5921c08..3ac2e96524 100644 --- a/lib/asn1c/ngap/NGAP_GlobalENB-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalENB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalENB-ID.h b/lib/asn1c/ngap/NGAP_GlobalENB-ID.h index 7c0edee09c..35329f8240 100644 --- a/lib/asn1c/ngap/NGAP_GlobalENB-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalENB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalGNB-ID.c b/lib/asn1c/ngap/NGAP_GlobalGNB-ID.c index c2150e1d7d..38b26877f4 100644 --- a/lib/asn1c/ngap/NGAP_GlobalGNB-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalGNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalGNB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalGNB-ID.h b/lib/asn1c/ngap/NGAP_GlobalGNB-ID.h index 9081ce7c94..68984677d3 100644 --- a/lib/asn1c/ngap/NGAP_GlobalGNB-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalGNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalGNB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalLine-ID.c b/lib/asn1c/ngap/NGAP_GlobalLine-ID.c index 7c7f7c0d2e..01a4823c2a 100644 --- a/lib/asn1c/ngap/NGAP_GlobalLine-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalLine-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalLine-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalLine-ID.h b/lib/asn1c/ngap/NGAP_GlobalLine-ID.h index 078318d1dd..a271dab103 100644 --- a/lib/asn1c/ngap/NGAP_GlobalLine-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalLine-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalLine_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalLineIdentity.c b/lib/asn1c/ngap/NGAP_GlobalLineIdentity.c index cb69bf3a3a..16107e1dd0 100644 --- a/lib/asn1c/ngap/NGAP_GlobalLineIdentity.c +++ b/lib/asn1c/ngap/NGAP_GlobalLineIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalLineIdentity.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalLineIdentity.h b/lib/asn1c/ngap/NGAP_GlobalLineIdentity.h index 728f9b2927..d733cf98a6 100644 --- a/lib/asn1c/ngap/NGAP_GlobalLineIdentity.h +++ b/lib/asn1c/ngap/NGAP_GlobalLineIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalLineIdentity_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_GlobalLineIdentity; asn_struct_free_f NGAP_GlobalLineIdentity_free; asn_struct_print_f NGAP_GlobalLineIdentity_print; asn_constr_check_f NGAP_GlobalLineIdentity_constraint; -jer_type_encoder_f NGAP_GlobalLineIdentity_encode_jer; per_type_decoder_f NGAP_GlobalLineIdentity_decode_aper; per_type_encoder_f NGAP_GlobalLineIdentity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.c b/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.c index a49d8bdc4a..1769d46c53 100644 --- a/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalN3IWF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.h b/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.h index 3b4c18a4ab..559b95a53b 100644 --- a/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalN3IWF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalN3IWF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.c b/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.c index a0671049e0..004cd44102 100644 --- a/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalNgENB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.h b/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.h index 6ee4efc550..0b42aa8e94 100644 --- a/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalNgENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalNgENB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalRANNodeID.c b/lib/asn1c/ngap/NGAP_GlobalRANNodeID.c index 6ec1563f01..7d5baa3b6d 100644 --- a/lib/asn1c/ngap/NGAP_GlobalRANNodeID.c +++ b/lib/asn1c/ngap/NGAP_GlobalRANNodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalRANNodeID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalRANNodeID.h b/lib/asn1c/ngap/NGAP_GlobalRANNodeID.h index 2387692b39..77af07c14b 100644 --- a/lib/asn1c/ngap/NGAP_GlobalRANNodeID.h +++ b/lib/asn1c/ngap/NGAP_GlobalRANNodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalRANNodeID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.c b/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.c index 09b5adba87..011d259ffd 100644 --- a/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalTNGF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.h b/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.h index ff711fbf74..658be793e5 100644 --- a/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalTNGF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalTNGF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.c b/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.c index 1db36c173b..e16e08ffe2 100644 --- a/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalTWIF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.h b/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.h index 6a8e17523b..5a756f4a9d 100644 --- a/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalTWIF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalTWIF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.c b/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.c index 6de540e28b..3c924c0b6f 100644 --- a/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.c +++ b/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_GlobalW-AGF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.h b/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.h index 32c9ffcc9c..38dbea2881 100644 --- a/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.h +++ b/lib/asn1c/ngap/NGAP_GlobalW-AGF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_GlobalW_AGF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_HFCNode-ID.c b/lib/asn1c/ngap/NGAP_HFCNode-ID.c index cd4a478cfd..1e9c524448 100644 --- a/lib/asn1c/ngap/NGAP_HFCNode-ID.c +++ b/lib/asn1c/ngap/NGAP_HFCNode-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HFCNode-ID.h" diff --git a/lib/asn1c/ngap/NGAP_HFCNode-ID.h b/lib/asn1c/ngap/NGAP_HFCNode-ID.h index ac6f25e774..1862bc2922 100644 --- a/lib/asn1c/ngap/NGAP_HFCNode-ID.h +++ b/lib/asn1c/ngap/NGAP_HFCNode-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HFCNode_ID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_HFCNode_ID; asn_struct_free_f NGAP_HFCNode_ID_free; asn_struct_print_f NGAP_HFCNode_ID_print; asn_constr_check_f NGAP_HFCNode_ID_constraint; -jer_type_encoder_f NGAP_HFCNode_ID_encode_jer; per_type_decoder_f NGAP_HFCNode_ID_decode_aper; per_type_encoder_f NGAP_HFCNode_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_HOReport.c b/lib/asn1c/ngap/NGAP_HOReport.c index a9e4833f82..f81f58e830 100644 --- a/lib/asn1c/ngap/NGAP_HOReport.c +++ b/lib/asn1c/ngap/NGAP_HOReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HOReport.h" diff --git a/lib/asn1c/ngap/NGAP_HOReport.h b/lib/asn1c/ngap/NGAP_HOReport.h index 8dc0af0240..93fb66722f 100644 --- a/lib/asn1c/ngap/NGAP_HOReport.h +++ b/lib/asn1c/ngap/NGAP_HOReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HOReport_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverCancel.c b/lib/asn1c/ngap/NGAP_HandoverCancel.c index 97fa4df0ef..e648be8b7c 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCancel.c +++ b/lib/asn1c/ngap/NGAP_HandoverCancel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverCancel.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverCancel.h b/lib/asn1c/ngap/NGAP_HandoverCancel.h index cccb9540cb..1932326fd3 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCancel.h +++ b/lib/asn1c/ngap/NGAP_HandoverCancel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverCancel_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.c b/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.c index 33aed8d66c..a9f507cb8a 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverCancelAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.h b/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.h index cff20e9f8b..9d5724a430 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_HandoverCancelAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverCancelAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverCommand.c b/lib/asn1c/ngap/NGAP_HandoverCommand.c index e2f64cdc4f..4bef283d89 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCommand.c +++ b/lib/asn1c/ngap/NGAP_HandoverCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverCommand.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverCommand.h b/lib/asn1c/ngap/NGAP_HandoverCommand.h index aac8c4026c..968c7f5470 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCommand.h +++ b/lib/asn1c/ngap/NGAP_HandoverCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverCommand_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.c b/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.c index 075973b2bd..e5db7d0f67 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.c +++ b/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverCommandTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.h b/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.h index ee999f0e92..9a14791b30 100644 --- a/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.h +++ b/lib/asn1c/ngap/NGAP_HandoverCommandTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverCommandTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverFailure.c b/lib/asn1c/ngap/NGAP_HandoverFailure.c index d819bca85b..c7a244ef47 100644 --- a/lib/asn1c/ngap/NGAP_HandoverFailure.c +++ b/lib/asn1c/ngap/NGAP_HandoverFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverFailure.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverFailure.h b/lib/asn1c/ngap/NGAP_HandoverFailure.h index 153fcf4b2b..7a195e6007 100644 --- a/lib/asn1c/ngap/NGAP_HandoverFailure.h +++ b/lib/asn1c/ngap/NGAP_HandoverFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverFlag.c b/lib/asn1c/ngap/NGAP_HandoverFlag.c index 563a0f7c45..282284a65d 100644 --- a/lib/asn1c/ngap/NGAP_HandoverFlag.c +++ b/lib/asn1c/ngap/NGAP_HandoverFlag.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverFlag.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverFlag.h b/lib/asn1c/ngap/NGAP_HandoverFlag.h index 1e6b7e45db..3a9ad4b41c 100644 --- a/lib/asn1c/ngap/NGAP_HandoverFlag.h +++ b/lib/asn1c/ngap/NGAP_HandoverFlag.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverFlag_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_HandoverFlag_specs_1; asn_struct_free_f NGAP_HandoverFlag_free; asn_struct_print_f NGAP_HandoverFlag_print; asn_constr_check_f NGAP_HandoverFlag_constraint; -jer_type_encoder_f NGAP_HandoverFlag_encode_jer; per_type_decoder_f NGAP_HandoverFlag_decode_aper; per_type_encoder_f NGAP_HandoverFlag_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_HandoverNotify.c b/lib/asn1c/ngap/NGAP_HandoverNotify.c index 6d0c63cbe1..754d82843b 100644 --- a/lib/asn1c/ngap/NGAP_HandoverNotify.c +++ b/lib/asn1c/ngap/NGAP_HandoverNotify.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverNotify.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverNotify.h b/lib/asn1c/ngap/NGAP_HandoverNotify.h index 15da5569b2..f41adfc79c 100644 --- a/lib/asn1c/ngap/NGAP_HandoverNotify.h +++ b/lib/asn1c/ngap/NGAP_HandoverNotify.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverNotify_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.c b/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.c index 0b6c165de1..f3e46ad751 100644 --- a/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.c +++ b/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverPreparationFailure.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.h b/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.h index 5b26fd7c0a..4ed4b69d46 100644 --- a/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.h +++ b/lib/asn1c/ngap/NGAP_HandoverPreparationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverPreparationFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.c index 643eb2ee1c..408b75a066 100644 --- a/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverPreparationUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.h index fe1001000c..c8b5ab1b99 100644 --- a/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_HandoverPreparationUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverPreparationUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverRequest.c b/lib/asn1c/ngap/NGAP_HandoverRequest.c index 62be0b6b40..9b3f5c1341 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequest.c +++ b/lib/asn1c/ngap/NGAP_HandoverRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverRequest.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverRequest.h b/lib/asn1c/ngap/NGAP_HandoverRequest.h index 1cf0b86acd..4c371d5c09 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequest.h +++ b/lib/asn1c/ngap/NGAP_HandoverRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.c b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.c index 6962fc8bd1..7de51d027b 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverRequestAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.h b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.h index 11354b6cc8..013834584a 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverRequestAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.c b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.c index 20790ddd7a..d78c4a03e4 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.c +++ b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverRequestAcknowledgeTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.h b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.h index 6e0520d112..ec9311f639 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.h +++ b/lib/asn1c/ngap/NGAP_HandoverRequestAcknowledgeTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverRequestAcknowledgeTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverRequired.c b/lib/asn1c/ngap/NGAP_HandoverRequired.c index c44613e810..ea1db9f48a 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequired.c +++ b/lib/asn1c/ngap/NGAP_HandoverRequired.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverRequired.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverRequired.h b/lib/asn1c/ngap/NGAP_HandoverRequired.h index 2e4a7558da..073d637e91 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequired.h +++ b/lib/asn1c/ngap/NGAP_HandoverRequired.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverRequired_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.c b/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.c index 00a5ec8751..4a20092062 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.c +++ b/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverRequiredTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.h b/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.h index 6636541e3d..d60154f95d 100644 --- a/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.h +++ b/lib/asn1c/ngap/NGAP_HandoverRequiredTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverRequiredTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c index 1044239cfc..803e084aed 100644 --- a/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h index 8493b5ba24..0c3cc4abae 100644 --- a/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverResourceAllocationUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverSuccess.c b/lib/asn1c/ngap/NGAP_HandoverSuccess.c index 3cf9792cd4..f648800605 100644 --- a/lib/asn1c/ngap/NGAP_HandoverSuccess.c +++ b/lib/asn1c/ngap/NGAP_HandoverSuccess.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverSuccess.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverSuccess.h b/lib/asn1c/ngap/NGAP_HandoverSuccess.h index 551c21566c..b756104854 100644 --- a/lib/asn1c/ngap/NGAP_HandoverSuccess.h +++ b/lib/asn1c/ngap/NGAP_HandoverSuccess.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverSuccess_H_ diff --git a/lib/asn1c/ngap/NGAP_HandoverType.c b/lib/asn1c/ngap/NGAP_HandoverType.c index 356c41e0fa..ba374a3404 100644 --- a/lib/asn1c/ngap/NGAP_HandoverType.c +++ b/lib/asn1c/ngap/NGAP_HandoverType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_HandoverType.h" diff --git a/lib/asn1c/ngap/NGAP_HandoverType.h b/lib/asn1c/ngap/NGAP_HandoverType.h index dbffdc1674..c905e784ec 100644 --- a/lib/asn1c/ngap/NGAP_HandoverType.h +++ b/lib/asn1c/ngap/NGAP_HandoverType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_HandoverType_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_HandoverType_specs_1; asn_struct_free_f NGAP_HandoverType_free; asn_struct_print_f NGAP_HandoverType_print; asn_constr_check_f NGAP_HandoverType_constraint; -jer_type_encoder_f NGAP_HandoverType_encode_jer; per_type_decoder_f NGAP_HandoverType_decode_aper; per_type_encoder_f NGAP_HandoverType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Hysteresis.c b/lib/asn1c/ngap/NGAP_Hysteresis.c index a91c08078a..ec61161186 100644 --- a/lib/asn1c/ngap/NGAP_Hysteresis.c +++ b/lib/asn1c/ngap/NGAP_Hysteresis.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Hysteresis.h" diff --git a/lib/asn1c/ngap/NGAP_Hysteresis.h b/lib/asn1c/ngap/NGAP_Hysteresis.h index 2c62042e94..89e09e1235 100644 --- a/lib/asn1c/ngap/NGAP_Hysteresis.h +++ b/lib/asn1c/ngap/NGAP_Hysteresis.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Hysteresis_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Hysteresis; asn_struct_free_f NGAP_Hysteresis_free; asn_struct_print_f NGAP_Hysteresis_print; asn_constr_check_f NGAP_Hysteresis_constraint; -jer_type_encoder_f NGAP_Hysteresis_encode_jer; per_type_decoder_f NGAP_Hysteresis_decode_aper; per_type_encoder_f NGAP_Hysteresis_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IAB-Authorized.c b/lib/asn1c/ngap/NGAP_IAB-Authorized.c index 3778af2e05..8bc8d41be2 100644 --- a/lib/asn1c/ngap/NGAP_IAB-Authorized.c +++ b/lib/asn1c/ngap/NGAP_IAB-Authorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IAB-Authorized.h" diff --git a/lib/asn1c/ngap/NGAP_IAB-Authorized.h b/lib/asn1c/ngap/NGAP_IAB-Authorized.h index 48d90df618..35634c495b 100644 --- a/lib/asn1c/ngap/NGAP_IAB-Authorized.h +++ b/lib/asn1c/ngap/NGAP_IAB-Authorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IAB_Authorized_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IAB_Authorized_specs_1; asn_struct_free_f NGAP_IAB_Authorized_free; asn_struct_print_f NGAP_IAB_Authorized_print; asn_constr_check_f NGAP_IAB_Authorized_constraint; -jer_type_encoder_f NGAP_IAB_Authorized_encode_jer; per_type_decoder_f NGAP_IAB_Authorized_decode_aper; per_type_encoder_f NGAP_IAB_Authorized_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IAB-Supported.c b/lib/asn1c/ngap/NGAP_IAB-Supported.c index e821804b4d..ab60724fb9 100644 --- a/lib/asn1c/ngap/NGAP_IAB-Supported.c +++ b/lib/asn1c/ngap/NGAP_IAB-Supported.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IAB-Supported.h" diff --git a/lib/asn1c/ngap/NGAP_IAB-Supported.h b/lib/asn1c/ngap/NGAP_IAB-Supported.h index f2315a3a8d..17234af524 100644 --- a/lib/asn1c/ngap/NGAP_IAB-Supported.h +++ b/lib/asn1c/ngap/NGAP_IAB-Supported.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IAB_Supported_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IAB_Supported_specs_1; asn_struct_free_f NGAP_IAB_Supported_free; asn_struct_print_f NGAP_IAB_Supported_print; asn_constr_check_f NGAP_IAB_Supported_constraint; -jer_type_encoder_f NGAP_IAB_Supported_encode_jer; per_type_decoder_f NGAP_IAB_Supported_decode_aper; per_type_encoder_f NGAP_IAB_Supported_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IABNodeIndication.c b/lib/asn1c/ngap/NGAP_IABNodeIndication.c index c651da9946..9497b8bf0d 100644 --- a/lib/asn1c/ngap/NGAP_IABNodeIndication.c +++ b/lib/asn1c/ngap/NGAP_IABNodeIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IABNodeIndication.h" diff --git a/lib/asn1c/ngap/NGAP_IABNodeIndication.h b/lib/asn1c/ngap/NGAP_IABNodeIndication.h index 52699f4b27..261e36c3d0 100644 --- a/lib/asn1c/ngap/NGAP_IABNodeIndication.h +++ b/lib/asn1c/ngap/NGAP_IABNodeIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IABNodeIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IABNodeIndication_specs_1; asn_struct_free_f NGAP_IABNodeIndication_free; asn_struct_print_f NGAP_IABNodeIndication_print; asn_constr_check_f NGAP_IABNodeIndication_constraint; -jer_type_encoder_f NGAP_IABNodeIndication_encode_jer; per_type_decoder_f NGAP_IABNodeIndication_decode_aper; per_type_encoder_f NGAP_IABNodeIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.c b/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.c index 684b9964f3..e2911949d4 100644 --- a/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.c +++ b/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IMSVoiceSupportIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.h b/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.h index 8404844754..a2f3ef4cbb 100644 --- a/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.h +++ b/lib/asn1c/ngap/NGAP_IMSVoiceSupportIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IMSVoiceSupportIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IMSVoiceSupportIndicator_specs asn_struct_free_f NGAP_IMSVoiceSupportIndicator_free; asn_struct_print_f NGAP_IMSVoiceSupportIndicator_print; asn_constr_check_f NGAP_IMSVoiceSupportIndicator_constraint; -jer_type_encoder_f NGAP_IMSVoiceSupportIndicator_encode_jer; per_type_decoder_f NGAP_IMSVoiceSupportIndicator_decode_aper; per_type_encoder_f NGAP_IMSVoiceSupportIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ImmediateMDTNr.c b/lib/asn1c/ngap/NGAP_ImmediateMDTNr.c index 0c48174ae0..d4982a258f 100644 --- a/lib/asn1c/ngap/NGAP_ImmediateMDTNr.c +++ b/lib/asn1c/ngap/NGAP_ImmediateMDTNr.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ImmediateMDTNr.h" diff --git a/lib/asn1c/ngap/NGAP_ImmediateMDTNr.h b/lib/asn1c/ngap/NGAP_ImmediateMDTNr.h index 512d8e32bf..88857cf8e3 100644 --- a/lib/asn1c/ngap/NGAP_ImmediateMDTNr.h +++ b/lib/asn1c/ngap/NGAP_ImmediateMDTNr.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ImmediateMDTNr_H_ diff --git a/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.c b/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.c index 74af52747a..2a72ef063d 100644 --- a/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.c +++ b/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IncludeBeamMeasurementsIndication.h" diff --git a/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.h b/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.h index d7a2d0bef3..ea3f0de0b6 100644 --- a/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.h +++ b/lib/asn1c/ngap/NGAP_IncludeBeamMeasurementsIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IncludeBeamMeasurementsIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IncludeBeamMeasurementsIndicat asn_struct_free_f NGAP_IncludeBeamMeasurementsIndication_free; asn_struct_print_f NGAP_IncludeBeamMeasurementsIndication_print; asn_constr_check_f NGAP_IncludeBeamMeasurementsIndication_constraint; -jer_type_encoder_f NGAP_IncludeBeamMeasurementsIndication_encode_jer; per_type_decoder_f NGAP_IncludeBeamMeasurementsIndication_decode_aper; per_type_encoder_f NGAP_IncludeBeamMeasurementsIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IndexToRFSP.c b/lib/asn1c/ngap/NGAP_IndexToRFSP.c index 81d17e7817..674c160ce9 100644 --- a/lib/asn1c/ngap/NGAP_IndexToRFSP.c +++ b/lib/asn1c/ngap/NGAP_IndexToRFSP.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IndexToRFSP.h" diff --git a/lib/asn1c/ngap/NGAP_IndexToRFSP.h b/lib/asn1c/ngap/NGAP_IndexToRFSP.h index 135b771c32..705d3b696a 100644 --- a/lib/asn1c/ngap/NGAP_IndexToRFSP.h +++ b/lib/asn1c/ngap/NGAP_IndexToRFSP.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IndexToRFSP_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_IndexToRFSP; asn_struct_free_f NGAP_IndexToRFSP_free; asn_struct_print_f NGAP_IndexToRFSP_print; asn_constr_check_f NGAP_IndexToRFSP_constraint; -jer_type_encoder_f NGAP_IndexToRFSP_encode_jer; per_type_decoder_f NGAP_IndexToRFSP_decode_aper; per_type_encoder_f NGAP_IndexToRFSP_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.c b/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.c index eef8293b8d..50a1281e53 100644 --- a/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.c +++ b/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.h b/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.h index 3a6289fcfa..4c8a204e6d 100644 --- a/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.h +++ b/lib/asn1c/ngap/NGAP_InfoOnRecommendedCellsAndRANNodesForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InfoOnRecommendedCellsAndRANNodesForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.c b/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.c index 75d5804c70..20af432216 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.c +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InitialContextSetupFailure.h" diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.h b/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.h index 604e1f141e..de33a29f06 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.h +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InitialContextSetupFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.c b/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.c index 001c153099..6d5fd0a119 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.c +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InitialContextSetupRequest.h" diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.h b/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.h index 356fe62483..63a3e8d692 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.h +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InitialContextSetupRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.c b/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.c index 445bbb236b..1046c4618f 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.c +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InitialContextSetupResponse.h" diff --git a/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.h b/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.h index 182095f980..597f94187f 100644 --- a/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.h +++ b/lib/asn1c/ngap/NGAP_InitialContextSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InitialContextSetupResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_InitialUEMessage.c b/lib/asn1c/ngap/NGAP_InitialUEMessage.c index 256d6801d6..24593ff7f9 100644 --- a/lib/asn1c/ngap/NGAP_InitialUEMessage.c +++ b/lib/asn1c/ngap/NGAP_InitialUEMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InitialUEMessage.h" diff --git a/lib/asn1c/ngap/NGAP_InitialUEMessage.h b/lib/asn1c/ngap/NGAP_InitialUEMessage.h index efd2bbf5a0..6fd9a4d0ca 100644 --- a/lib/asn1c/ngap/NGAP_InitialUEMessage.h +++ b/lib/asn1c/ngap/NGAP_InitialUEMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InitialUEMessage_H_ diff --git a/lib/asn1c/ngap/NGAP_InitiatingMessage.c b/lib/asn1c/ngap/NGAP_InitiatingMessage.c index 9ef07f6345..d620d6e60a 100644 --- a/lib/asn1c/ngap/NGAP_InitiatingMessage.c +++ b/lib/asn1c/ngap/NGAP_InitiatingMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InitiatingMessage.h" diff --git a/lib/asn1c/ngap/NGAP_InitiatingMessage.h b/lib/asn1c/ngap/NGAP_InitiatingMessage.h index 8ba325ce44..838004a0d2 100644 --- a/lib/asn1c/ngap/NGAP_InitiatingMessage.h +++ b/lib/asn1c/ngap/NGAP_InitiatingMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InitiatingMessage_H_ diff --git a/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.c b/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.c index 4914defe9f..781329fa6e 100644 --- a/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.c +++ b/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntegrityProtectionIndication.h" diff --git a/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.h b/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.h index acfae746f9..e77efd026f 100644 --- a/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.h +++ b/lib/asn1c/ngap/NGAP_IntegrityProtectionIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntegrityProtectionIndication_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IntegrityProtectionIndication_ asn_struct_free_f NGAP_IntegrityProtectionIndication_free; asn_struct_print_f NGAP_IntegrityProtectionIndication_print; asn_constr_check_f NGAP_IntegrityProtectionIndication_constraint; -jer_type_encoder_f NGAP_IntegrityProtectionIndication_encode_jer; per_type_decoder_f NGAP_IntegrityProtectionIndication_decode_aper; per_type_encoder_f NGAP_IntegrityProtectionIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.c b/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.c index 128a61a780..25350198a2 100644 --- a/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.c +++ b/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntegrityProtectionResult.h" diff --git a/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.h b/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.h index e1891974f8..d22d0978ed 100644 --- a/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.h +++ b/lib/asn1c/ngap/NGAP_IntegrityProtectionResult.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntegrityProtectionResult_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_IntegrityProtectionResult_spec asn_struct_free_f NGAP_IntegrityProtectionResult_free; asn_struct_print_f NGAP_IntegrityProtectionResult_print; asn_constr_check_f NGAP_IntegrityProtectionResult_constraint; -jer_type_encoder_f NGAP_IntegrityProtectionResult_encode_jer; per_type_decoder_f NGAP_IntegrityProtectionResult_decode_aper; per_type_encoder_f NGAP_IntegrityProtectionResult_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.c b/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.c index 2a02e36444..7d4885bd21 100644 --- a/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.c +++ b/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntendedNumberOfPagingAttempts.h" diff --git a/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.h b/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.h index 5f368903b2..b00c9a1f68 100644 --- a/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.h +++ b/lib/asn1c/ngap/NGAP_IntendedNumberOfPagingAttempts.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntendedNumberOfPagingAttempts_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_IntendedNumberOfPagingAttempts; asn_struct_free_f NGAP_IntendedNumberOfPagingAttempts_free; asn_struct_print_f NGAP_IntendedNumberOfPagingAttempts_print; asn_constr_check_f NGAP_IntendedNumberOfPagingAttempts_constraint; -jer_type_encoder_f NGAP_IntendedNumberOfPagingAttempts_encode_jer; per_type_decoder_f NGAP_IntendedNumberOfPagingAttempts_decode_aper; per_type_encoder_f NGAP_IntendedNumberOfPagingAttempts_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.c b/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.c index a63bd9947c..271b377143 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.c +++ b/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InterSystemFailureIndication.h" diff --git a/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.h b/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.h index d1fe894951..636ab0d41c 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.h +++ b/lib/asn1c/ngap/NGAP_InterSystemFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InterSystemFailureIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_InterSystemHOReport.c b/lib/asn1c/ngap/NGAP_InterSystemHOReport.c index df5e31a47c..d24fa3d0bb 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemHOReport.c +++ b/lib/asn1c/ngap/NGAP_InterSystemHOReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InterSystemHOReport.h" diff --git a/lib/asn1c/ngap/NGAP_InterSystemHOReport.h b/lib/asn1c/ngap/NGAP_InterSystemHOReport.h index 46ecf33840..397f086aae 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemHOReport.h +++ b/lib/asn1c/ngap/NGAP_InterSystemHOReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InterSystemHOReport_H_ diff --git a/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.c b/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.c index 68b4c53138..50339c7232 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.c +++ b/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InterSystemHandoverReportType.h" diff --git a/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.h b/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.h index ab6650f29b..a82865eb21 100644 --- a/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.h +++ b/lib/asn1c/ngap/NGAP_InterSystemHandoverReportType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InterSystemHandoverReportType_H_ diff --git a/lib/asn1c/ngap/NGAP_InterfacesToTrace.c b/lib/asn1c/ngap/NGAP_InterfacesToTrace.c index 8be44725d3..0f288d12fb 100644 --- a/lib/asn1c/ngap/NGAP_InterfacesToTrace.c +++ b/lib/asn1c/ngap/NGAP_InterfacesToTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_InterfacesToTrace.h" diff --git a/lib/asn1c/ngap/NGAP_InterfacesToTrace.h b/lib/asn1c/ngap/NGAP_InterfacesToTrace.h index 13851beb96..1f6280e391 100644 --- a/lib/asn1c/ngap/NGAP_InterfacesToTrace.h +++ b/lib/asn1c/ngap/NGAP_InterfacesToTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_InterfacesToTrace_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_InterfacesToTrace; asn_struct_free_f NGAP_InterfacesToTrace_free; asn_struct_print_f NGAP_InterfacesToTrace_print; asn_constr_check_f NGAP_InterfacesToTrace_constraint; -jer_type_encoder_f NGAP_InterfacesToTrace_encode_jer; per_type_decoder_f NGAP_InterfacesToTrace_decode_aper; per_type_encoder_f NGAP_InterfacesToTrace_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.c b/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.c index 00c41d4ec8..2cf9916518 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.c +++ b/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemCellActivationReply.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.h b/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.h index b9da9ee489..0e39c5e3ed 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.h +++ b/lib/asn1c/ngap/NGAP_IntersystemCellActivationReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemCellActivationReply_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.c b/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.c index 0344d7ab5d..2a108b09fe 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.c +++ b/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemCellActivationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.h b/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.h index 001c9fc245..5920d22c35 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.h +++ b/lib/asn1c/ngap/NGAP_IntersystemCellActivationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemCellActivationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.c b/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.c index 13a6b7fef8..8dcb2457c6 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.c +++ b/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemCellStateIndication.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.h b/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.h index 7788c9d959..e27c601e84 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.h +++ b/lib/asn1c/ngap/NGAP_IntersystemCellStateIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemCellStateIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.c b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.c index 379ff9f7bf..0d3b3759c6 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.c +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemResourceStatusReply.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.h b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.h index 85a77a965d..0ba4ce4ba1 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.h +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemResourceStatusReply_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.c b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.c index dd4afbea69..461fc838f4 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.c +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemResourceStatusReport.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.h b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.h index a726f3eeb5..65ea117b22 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.h +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemResourceStatusReport_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.c b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.c index de15f408c7..239f62cd47 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.c +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemResourceStatusRequest.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.h b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.h index f6861a048b..8689dc9022 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.h +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceStatusRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemResourceStatusRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.c b/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.c index 2b9e95de5f..bf38f5e867 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.c +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemResourceThreshold.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.h b/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.h index ef4f343731..215d32e048 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.h +++ b/lib/asn1c/ngap/NGAP_IntersystemResourceThreshold.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemResourceThreshold_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_IntersystemResourceThreshold; asn_struct_free_f NGAP_IntersystemResourceThreshold_free; asn_struct_print_f NGAP_IntersystemResourceThreshold_print; asn_constr_check_f NGAP_IntersystemResourceThreshold_constraint; -jer_type_encoder_f NGAP_IntersystemResourceThreshold_encode_jer; per_type_decoder_f NGAP_IntersystemResourceThreshold_decode_aper; per_type_encoder_f NGAP_IntersystemResourceThreshold_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.c b/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.c index 07223f5e93..215d131861 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONConfigurationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.h b/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.h index 0fa2e0d65a..3763548953 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONConfigurationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformation.c b/lib/asn1c/ngap/NGAP_IntersystemSONInformation.c index ad03ed4590..6626a55dab 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformation.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONInformation.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformation.h b/lib/asn1c/ngap/NGAP_IntersystemSONInformation.h index b0e7c37db6..e6816b3c00 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformation.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.c b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.c index d3b0902261..aefb55a4b3 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONInformationReply.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.h b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.h index 835a379878..89ca6d30bb 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONInformationReply_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.c b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.c index 85d4cd8f6d..418420dcd3 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONInformationReport.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.h b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.h index a092e1d5e6..dc23cc3008 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONInformationReport_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.c b/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.c index 77bec774d4..34c139715e 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONInformationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.h b/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.h index e29ecc7ae6..bce2f77b0f 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONInformationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONInformationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.c b/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.c index 639487ea05..c8068d61fb 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONNGRANnodeID.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.h b/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.h index 80a604a8c2..303394eb89 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONNGRANnodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONNGRANnodeID_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.c b/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.c index c300920759..5b025e5257 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONTransferType.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.h b/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.h index b415ca2cfc..1257da6b56 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONTransferType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONTransferType_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.c b/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.c index 30e97d96bc..a4bd6367e5 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.c +++ b/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemSONeNBID.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.h b/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.h index a9844ed50a..95082f3ab8 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.h +++ b/lib/asn1c/ngap/NGAP_IntersystemSONeNBID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemSONeNBID_H_ diff --git a/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.c b/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.c index eb186c4001..223db080bb 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.c +++ b/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_IntersystemUnnecessaryHO.h" diff --git a/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.h b/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.h index 93f2571006..2149b70552 100644 --- a/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.h +++ b/lib/asn1c/ngap/NGAP_IntersystemUnnecessaryHO.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_IntersystemUnnecessaryHO_H_ diff --git a/lib/asn1c/ngap/NGAP_LAC.c b/lib/asn1c/ngap/NGAP_LAC.c index bbe34efb53..197d99dafc 100644 --- a/lib/asn1c/ngap/NGAP_LAC.c +++ b/lib/asn1c/ngap/NGAP_LAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LAC.h" diff --git a/lib/asn1c/ngap/NGAP_LAC.h b/lib/asn1c/ngap/NGAP_LAC.h index 3efc47126a..d6c1c0cfc1 100644 --- a/lib/asn1c/ngap/NGAP_LAC.h +++ b/lib/asn1c/ngap/NGAP_LAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LAC; asn_struct_free_f NGAP_LAC_free; asn_struct_print_f NGAP_LAC_print; asn_constr_check_f NGAP_LAC_constraint; -jer_type_encoder_f NGAP_LAC_encode_jer; per_type_decoder_f NGAP_LAC_decode_aper; per_type_encoder_f NGAP_LAC_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LAI.c b/lib/asn1c/ngap/NGAP_LAI.c index 5f8f323174..8f9586f6aa 100644 --- a/lib/asn1c/ngap/NGAP_LAI.c +++ b/lib/asn1c/ngap/NGAP_LAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LAI.h" diff --git a/lib/asn1c/ngap/NGAP_LAI.h b/lib/asn1c/ngap/NGAP_LAI.h index 7989b4e85c..b016e73bbc 100644 --- a/lib/asn1c/ngap/NGAP_LAI.h +++ b/lib/asn1c/ngap/NGAP_LAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LAI_H_ diff --git a/lib/asn1c/ngap/NGAP_LTEM-Indication.c b/lib/asn1c/ngap/NGAP_LTEM-Indication.c index 7adebc0080..165f2ea23e 100644 --- a/lib/asn1c/ngap/NGAP_LTEM-Indication.c +++ b/lib/asn1c/ngap/NGAP_LTEM-Indication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LTEM-Indication.h" diff --git a/lib/asn1c/ngap/NGAP_LTEM-Indication.h b/lib/asn1c/ngap/NGAP_LTEM-Indication.h index 971d4301ca..667ec09408 100644 --- a/lib/asn1c/ngap/NGAP_LTEM-Indication.h +++ b/lib/asn1c/ngap/NGAP_LTEM-Indication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LTEM_Indication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_LTEM_Indication_specs_1; asn_struct_free_f NGAP_LTEM_Indication_free; asn_struct_print_f NGAP_LTEM_Indication_print; asn_constr_check_f NGAP_LTEM_Indication_constraint; -jer_type_encoder_f NGAP_LTEM_Indication_encode_jer; per_type_decoder_f NGAP_LTEM_Indication_decode_aper; per_type_encoder_f NGAP_LTEM_Indication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.c b/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.c index ca2229b7ec..04bc3ad1b2 100644 --- a/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.c +++ b/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LTEUERLFReportContainer.h" diff --git a/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.h b/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.h index 1307035be2..76c1258ae4 100644 --- a/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.h +++ b/lib/asn1c/ngap/NGAP_LTEUERLFReportContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LTEUERLFReportContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LTEUERLFReportContainer; asn_struct_free_f NGAP_LTEUERLFReportContainer_free; asn_struct_print_f NGAP_LTEUERLFReportContainer_print; asn_constr_check_f NGAP_LTEUERLFReportContainer_constraint; -jer_type_encoder_f NGAP_LTEUERLFReportContainer_encode_jer; per_type_decoder_f NGAP_LTEUERLFReportContainer_decode_aper; per_type_encoder_f NGAP_LTEUERLFReportContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.c b/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.c index 75d8b0e312..8d7969dae1 100644 --- a/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.c +++ b/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LTEUESidelinkAggregateMaximumBitrate.h" diff --git a/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.h b/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.h index 093f8ed369..c2c7078f1e 100644 --- a/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.h +++ b/lib/asn1c/ngap/NGAP_LTEUESidelinkAggregateMaximumBitrate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LTEUESidelinkAggregateMaximumBitrate_H_ diff --git a/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.c b/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.c index d31cf7a96f..20a6744876 100644 --- a/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.c +++ b/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LTEV2XServicesAuthorized.h" diff --git a/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.h b/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.h index cfd6d22cea..f4ffdd7568 100644 --- a/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.h +++ b/lib/asn1c/ngap/NGAP_LTEV2XServicesAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LTEV2XServicesAuthorized_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.c index 89fa271c8e..a456bd2e46 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.h index 4c47c247f4..d98615a630 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedCellInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedCellItem.c b/lib/asn1c/ngap/NGAP_LastVisitedCellItem.c index b47930dd7a..162ed13a63 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedCellItem.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedCellItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedCellItem.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedCellItem.h b/lib/asn1c/ngap/NGAP_LastVisitedCellItem.h index 7d2f1a2cd1..21ef33d509 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedCellItem.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedCellItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedCellItem_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.c index e3ed3e9b4f..d8b505fb8f 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedEUTRANCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.h index f1c038955d..9fd29a17f3 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedEUTRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedEUTRANCellInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LastVisitedEUTRANCellInformation; asn_struct_free_f NGAP_LastVisitedEUTRANCellInformation_free; asn_struct_print_f NGAP_LastVisitedEUTRANCellInformation_print; asn_constr_check_f NGAP_LastVisitedEUTRANCellInformation_constraint; -jer_type_encoder_f NGAP_LastVisitedEUTRANCellInformation_encode_jer; per_type_decoder_f NGAP_LastVisitedEUTRANCellInformation_decode_aper; per_type_encoder_f NGAP_LastVisitedEUTRANCellInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.c index f44ea46ca1..f02df4aa9f 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedGERANCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.h index d38f730ba1..f176444def 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedGERANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedGERANCellInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LastVisitedGERANCellInformation; asn_struct_free_f NGAP_LastVisitedGERANCellInformation_free; asn_struct_print_f NGAP_LastVisitedGERANCellInformation_print; asn_constr_check_f NGAP_LastVisitedGERANCellInformation_constraint; -jer_type_encoder_f NGAP_LastVisitedGERANCellInformation_encode_jer; per_type_decoder_f NGAP_LastVisitedGERANCellInformation_decode_aper; per_type_encoder_f NGAP_LastVisitedGERANCellInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.c index c965b8d42b..766bdd67da 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedNGRANCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.h index 83eca25473..6a2d9ed196 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedNGRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedNGRANCellInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.c index 4670eec412..a03efc1cf6 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedPSCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.h index 6b2f4eba4d..bbd67f55f7 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedPSCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedPSCellInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.c b/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.c index eff6e40ea2..379741fd09 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedPSCellList.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.h b/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.h index e731375fd3..f8a0990627 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedPSCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedPSCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.c b/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.c index fec6d9f857..7b7877bc38 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.c +++ b/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LastVisitedUTRANCellInformation.h" diff --git a/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.h b/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.h index a48a48dd95..4fbb01de75 100644 --- a/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.h +++ b/lib/asn1c/ngap/NGAP_LastVisitedUTRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LastVisitedUTRANCellInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LastVisitedUTRANCellInformation; asn_struct_free_f NGAP_LastVisitedUTRANCellInformation_free; asn_struct_print_f NGAP_LastVisitedUTRANCellInformation_print; asn_constr_check_f NGAP_LastVisitedUTRANCellInformation_constraint; -jer_type_encoder_f NGAP_LastVisitedUTRANCellInformation_encode_jer; per_type_decoder_f NGAP_LastVisitedUTRANCellInformation_decode_aper; per_type_encoder_f NGAP_LastVisitedUTRANCellInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LineType.c b/lib/asn1c/ngap/NGAP_LineType.c index 12145bb62c..08bf46f5cc 100644 --- a/lib/asn1c/ngap/NGAP_LineType.c +++ b/lib/asn1c/ngap/NGAP_LineType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LineType.h" diff --git a/lib/asn1c/ngap/NGAP_LineType.h b/lib/asn1c/ngap/NGAP_LineType.h index bede91f90a..45f2f4b762 100644 --- a/lib/asn1c/ngap/NGAP_LineType.h +++ b/lib/asn1c/ngap/NGAP_LineType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LineType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_LineType_specs_1; asn_struct_free_f NGAP_LineType_free; asn_struct_print_f NGAP_LineType_print; asn_constr_check_f NGAP_LineType_constraint; -jer_type_encoder_f NGAP_LineType_encode_jer; per_type_decoder_f NGAP_LineType_decode_aper; per_type_encoder_f NGAP_LineType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Links-to-log.c b/lib/asn1c/ngap/NGAP_Links-to-log.c index a40d4e8302..026f8470ea 100644 --- a/lib/asn1c/ngap/NGAP_Links-to-log.c +++ b/lib/asn1c/ngap/NGAP_Links-to-log.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Links-to-log.h" diff --git a/lib/asn1c/ngap/NGAP_Links-to-log.h b/lib/asn1c/ngap/NGAP_Links-to-log.h index 8afb8683ec..0588ed7773 100644 --- a/lib/asn1c/ngap/NGAP_Links-to-log.h +++ b/lib/asn1c/ngap/NGAP_Links-to-log.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Links_to_log_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Links_to_log_specs_1; asn_struct_free_f NGAP_Links_to_log_free; asn_struct_print_f NGAP_Links_to_log_print; asn_constr_check_f NGAP_Links_to_log_constraint; -jer_type_encoder_f NGAP_Links_to_log_encode_jer; per_type_decoder_f NGAP_Links_to_log_decode_aper; per_type_encoder_f NGAP_Links_to_log_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LocationReport.c b/lib/asn1c/ngap/NGAP_LocationReport.c index d2abb64f3c..d0710ebded 100644 --- a/lib/asn1c/ngap/NGAP_LocationReport.c +++ b/lib/asn1c/ngap/NGAP_LocationReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReport.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReport.h b/lib/asn1c/ngap/NGAP_LocationReport.h index 02cba4a854..dfe3043e56 100644 --- a/lib/asn1c/ngap/NGAP_LocationReport.h +++ b/lib/asn1c/ngap/NGAP_LocationReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReport_H_ diff --git a/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.c b/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.c index 874c35ee2c..2d63f106aa 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.c +++ b/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReportingAdditionalInfo.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.h b/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.h index af8f35a2bd..ee20fc39e0 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.h +++ b/lib/asn1c/ngap/NGAP_LocationReportingAdditionalInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReportingAdditionalInfo_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_LocationReportingAdditionalInf asn_struct_free_f NGAP_LocationReportingAdditionalInfo_free; asn_struct_print_f NGAP_LocationReportingAdditionalInfo_print; asn_constr_check_f NGAP_LocationReportingAdditionalInfo_constraint; -jer_type_encoder_f NGAP_LocationReportingAdditionalInfo_encode_jer; per_type_decoder_f NGAP_LocationReportingAdditionalInfo_decode_aper; per_type_encoder_f NGAP_LocationReportingAdditionalInfo_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LocationReportingControl.c b/lib/asn1c/ngap/NGAP_LocationReportingControl.c index 3c5570805f..5cadb2bbb1 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingControl.c +++ b/lib/asn1c/ngap/NGAP_LocationReportingControl.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReportingControl.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReportingControl.h b/lib/asn1c/ngap/NGAP_LocationReportingControl.h index 6f701b3227..df423b7b93 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingControl.h +++ b/lib/asn1c/ngap/NGAP_LocationReportingControl.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReportingControl_H_ diff --git a/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.c b/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.c index 9941ea4622..735b3936c1 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.c +++ b/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReportingFailureIndication.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.h b/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.h index 461d7347b5..c3e814b70e 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.h +++ b/lib/asn1c/ngap/NGAP_LocationReportingFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReportingFailureIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.c b/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.c index 74c16272f9..0293c10bca 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.c +++ b/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReportingReferenceID.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.h b/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.h index 11463c2b1f..aa58a5d6b0 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.h +++ b/lib/asn1c/ngap/NGAP_LocationReportingReferenceID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReportingReferenceID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_LocationReportingReferenceID; asn_struct_free_f NGAP_LocationReportingReferenceID_free; asn_struct_print_f NGAP_LocationReportingReferenceID_print; asn_constr_check_f NGAP_LocationReportingReferenceID_constraint; -jer_type_encoder_f NGAP_LocationReportingReferenceID_encode_jer; per_type_decoder_f NGAP_LocationReportingReferenceID_decode_aper; per_type_encoder_f NGAP_LocationReportingReferenceID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LocationReportingRequestType.c b/lib/asn1c/ngap/NGAP_LocationReportingRequestType.c index 71d92ef3d1..6c7dbbb952 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingRequestType.c +++ b/lib/asn1c/ngap/NGAP_LocationReportingRequestType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LocationReportingRequestType.h" diff --git a/lib/asn1c/ngap/NGAP_LocationReportingRequestType.h b/lib/asn1c/ngap/NGAP_LocationReportingRequestType.h index 6be447a6c6..bf08246962 100644 --- a/lib/asn1c/ngap/NGAP_LocationReportingRequestType.h +++ b/lib/asn1c/ngap/NGAP_LocationReportingRequestType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LocationReportingRequestType_H_ diff --git a/lib/asn1c/ngap/NGAP_LoggedMDTNr.c b/lib/asn1c/ngap/NGAP_LoggedMDTNr.c index e3439de56b..7002978667 100644 --- a/lib/asn1c/ngap/NGAP_LoggedMDTNr.c +++ b/lib/asn1c/ngap/NGAP_LoggedMDTNr.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LoggedMDTNr.h" diff --git a/lib/asn1c/ngap/NGAP_LoggedMDTNr.h b/lib/asn1c/ngap/NGAP_LoggedMDTNr.h index 234e850c49..a52913b588 100644 --- a/lib/asn1c/ngap/NGAP_LoggedMDTNr.h +++ b/lib/asn1c/ngap/NGAP_LoggedMDTNr.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LoggedMDTNr_H_ diff --git a/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.c b/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.c index d8f9467082..c3b5e0dc1d 100644 --- a/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.c +++ b/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LoggedMDTTrigger.h" diff --git a/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.h b/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.h index a11a811908..a395c9bef4 100644 --- a/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.h +++ b/lib/asn1c/ngap/NGAP_LoggedMDTTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LoggedMDTTrigger_H_ diff --git a/lib/asn1c/ngap/NGAP_LoggingDuration.c b/lib/asn1c/ngap/NGAP_LoggingDuration.c index bf9b92e50b..85e1ed840e 100644 --- a/lib/asn1c/ngap/NGAP_LoggingDuration.c +++ b/lib/asn1c/ngap/NGAP_LoggingDuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LoggingDuration.h" diff --git a/lib/asn1c/ngap/NGAP_LoggingDuration.h b/lib/asn1c/ngap/NGAP_LoggingDuration.h index fed4153c9a..f432c246be 100644 --- a/lib/asn1c/ngap/NGAP_LoggingDuration.h +++ b/lib/asn1c/ngap/NGAP_LoggingDuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LoggingDuration_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_LoggingDuration_specs_1; asn_struct_free_f NGAP_LoggingDuration_free; asn_struct_print_f NGAP_LoggingDuration_print; asn_constr_check_f NGAP_LoggingDuration_constraint; -jer_type_encoder_f NGAP_LoggingDuration_encode_jer; per_type_decoder_f NGAP_LoggingDuration_decode_aper; per_type_encoder_f NGAP_LoggingDuration_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_LoggingInterval.c b/lib/asn1c/ngap/NGAP_LoggingInterval.c index 1b0f55696c..6129abec9d 100644 --- a/lib/asn1c/ngap/NGAP_LoggingInterval.c +++ b/lib/asn1c/ngap/NGAP_LoggingInterval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_LoggingInterval.h" diff --git a/lib/asn1c/ngap/NGAP_LoggingInterval.h b/lib/asn1c/ngap/NGAP_LoggingInterval.h index 0b1cd42131..d5c58423c9 100644 --- a/lib/asn1c/ngap/NGAP_LoggingInterval.h +++ b/lib/asn1c/ngap/NGAP_LoggingInterval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_LoggingInterval_H_ @@ -46,7 +46,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_LoggingInterval_specs_1; asn_struct_free_f NGAP_LoggingInterval_free; asn_struct_print_f NGAP_LoggingInterval_print; asn_constr_check_f NGAP_LoggingInterval_constraint; -jer_type_encoder_f NGAP_LoggingInterval_encode_jer; per_type_decoder_f NGAP_LoggingInterval_decode_aper; per_type_encoder_f NGAP_LoggingInterval_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M1Configuration.c b/lib/asn1c/ngap/NGAP_M1Configuration.c index 91fed92df0..9ae1d20e58 100644 --- a/lib/asn1c/ngap/NGAP_M1Configuration.c +++ b/lib/asn1c/ngap/NGAP_M1Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M1Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_M1Configuration.h b/lib/asn1c/ngap/NGAP_M1Configuration.h index ad8bcabdfd..9403ed0865 100644 --- a/lib/asn1c/ngap/NGAP_M1Configuration.h +++ b/lib/asn1c/ngap/NGAP_M1Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M1Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_M1PeriodicReporting.c b/lib/asn1c/ngap/NGAP_M1PeriodicReporting.c index 3048114002..bdb57d6a35 100644 --- a/lib/asn1c/ngap/NGAP_M1PeriodicReporting.c +++ b/lib/asn1c/ngap/NGAP_M1PeriodicReporting.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M1PeriodicReporting.h" diff --git a/lib/asn1c/ngap/NGAP_M1PeriodicReporting.h b/lib/asn1c/ngap/NGAP_M1PeriodicReporting.h index 0a7ea4edf8..8ea51f7ed6 100644 --- a/lib/asn1c/ngap/NGAP_M1PeriodicReporting.h +++ b/lib/asn1c/ngap/NGAP_M1PeriodicReporting.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M1PeriodicReporting_H_ diff --git a/lib/asn1c/ngap/NGAP_M1ReportingTrigger.c b/lib/asn1c/ngap/NGAP_M1ReportingTrigger.c index 751de64a47..93562140f9 100644 --- a/lib/asn1c/ngap/NGAP_M1ReportingTrigger.c +++ b/lib/asn1c/ngap/NGAP_M1ReportingTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M1ReportingTrigger.h" diff --git a/lib/asn1c/ngap/NGAP_M1ReportingTrigger.h b/lib/asn1c/ngap/NGAP_M1ReportingTrigger.h index d5a95ecd09..d854164f62 100644 --- a/lib/asn1c/ngap/NGAP_M1ReportingTrigger.h +++ b/lib/asn1c/ngap/NGAP_M1ReportingTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M1ReportingTrigger_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M1ReportingTrigger_specs_1; asn_struct_free_f NGAP_M1ReportingTrigger_free; asn_struct_print_f NGAP_M1ReportingTrigger_print; asn_constr_check_f NGAP_M1ReportingTrigger_constraint; -jer_type_encoder_f NGAP_M1ReportingTrigger_encode_jer; per_type_decoder_f NGAP_M1ReportingTrigger_decode_aper; per_type_encoder_f NGAP_M1ReportingTrigger_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.c b/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.c index a1f1b42597..30aa12f4d3 100644 --- a/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.c +++ b/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M1ThresholdEventA2.h" diff --git a/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.h b/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.h index 8d9bd75d8e..488cf31655 100644 --- a/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.h +++ b/lib/asn1c/ngap/NGAP_M1ThresholdEventA2.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M1ThresholdEventA2_H_ diff --git a/lib/asn1c/ngap/NGAP_M1ThresholdType.c b/lib/asn1c/ngap/NGAP_M1ThresholdType.c index b2e9c6a244..0c3a717ecd 100644 --- a/lib/asn1c/ngap/NGAP_M1ThresholdType.c +++ b/lib/asn1c/ngap/NGAP_M1ThresholdType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M1ThresholdType.h" diff --git a/lib/asn1c/ngap/NGAP_M1ThresholdType.h b/lib/asn1c/ngap/NGAP_M1ThresholdType.h index b5d3a4f8c7..8f0500398f 100644 --- a/lib/asn1c/ngap/NGAP_M1ThresholdType.h +++ b/lib/asn1c/ngap/NGAP_M1ThresholdType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M1ThresholdType_H_ diff --git a/lib/asn1c/ngap/NGAP_M4Configuration.c b/lib/asn1c/ngap/NGAP_M4Configuration.c index 698c1733c7..e90bee60b2 100644 --- a/lib/asn1c/ngap/NGAP_M4Configuration.c +++ b/lib/asn1c/ngap/NGAP_M4Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M4Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_M4Configuration.h b/lib/asn1c/ngap/NGAP_M4Configuration.h index 4cfff72597..d41c76a713 100644 --- a/lib/asn1c/ngap/NGAP_M4Configuration.h +++ b/lib/asn1c/ngap/NGAP_M4Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M4Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.c b/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.c index fc6c5c089f..cc9482f6de 100644 --- a/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.c +++ b/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M4ReportAmountMDT.h" diff --git a/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.h b/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.h index 93ed809c9e..1b58b2c934 100644 --- a/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.h +++ b/lib/asn1c/ngap/NGAP_M4ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M4ReportAmountMDT_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M4ReportAmountMDT_specs_1; asn_struct_free_f NGAP_M4ReportAmountMDT_free; asn_struct_print_f NGAP_M4ReportAmountMDT_print; asn_constr_check_f NGAP_M4ReportAmountMDT_constraint; -jer_type_encoder_f NGAP_M4ReportAmountMDT_encode_jer; per_type_decoder_f NGAP_M4ReportAmountMDT_decode_aper; per_type_encoder_f NGAP_M4ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M4period.c b/lib/asn1c/ngap/NGAP_M4period.c index c64eb7cc7c..ba87d29275 100644 --- a/lib/asn1c/ngap/NGAP_M4period.c +++ b/lib/asn1c/ngap/NGAP_M4period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M4period.h" diff --git a/lib/asn1c/ngap/NGAP_M4period.h b/lib/asn1c/ngap/NGAP_M4period.h index b6ef85161c..5ce24c133e 100644 --- a/lib/asn1c/ngap/NGAP_M4period.h +++ b/lib/asn1c/ngap/NGAP_M4period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M4period_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M4period_specs_1; asn_struct_free_f NGAP_M4period_free; asn_struct_print_f NGAP_M4period_print; asn_constr_check_f NGAP_M4period_constraint; -jer_type_encoder_f NGAP_M4period_encode_jer; per_type_decoder_f NGAP_M4period_decode_aper; per_type_encoder_f NGAP_M4period_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M5Configuration.c b/lib/asn1c/ngap/NGAP_M5Configuration.c index d86de42777..ef9b44a43b 100644 --- a/lib/asn1c/ngap/NGAP_M5Configuration.c +++ b/lib/asn1c/ngap/NGAP_M5Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M5Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_M5Configuration.h b/lib/asn1c/ngap/NGAP_M5Configuration.h index 495ed1d1af..d00b15491b 100644 --- a/lib/asn1c/ngap/NGAP_M5Configuration.h +++ b/lib/asn1c/ngap/NGAP_M5Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M5Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.c b/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.c index f620fab99c..870b4840c3 100644 --- a/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.c +++ b/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M5ReportAmountMDT.h" diff --git a/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.h b/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.h index 8594b14d2f..d0a7246ffa 100644 --- a/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.h +++ b/lib/asn1c/ngap/NGAP_M5ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M5ReportAmountMDT_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M5ReportAmountMDT_specs_1; asn_struct_free_f NGAP_M5ReportAmountMDT_free; asn_struct_print_f NGAP_M5ReportAmountMDT_print; asn_constr_check_f NGAP_M5ReportAmountMDT_constraint; -jer_type_encoder_f NGAP_M5ReportAmountMDT_encode_jer; per_type_decoder_f NGAP_M5ReportAmountMDT_decode_aper; per_type_encoder_f NGAP_M5ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M5period.c b/lib/asn1c/ngap/NGAP_M5period.c index 9a8bfce3b5..465ea88717 100644 --- a/lib/asn1c/ngap/NGAP_M5period.c +++ b/lib/asn1c/ngap/NGAP_M5period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M5period.h" diff --git a/lib/asn1c/ngap/NGAP_M5period.h b/lib/asn1c/ngap/NGAP_M5period.h index d94e1c4414..29803458be 100644 --- a/lib/asn1c/ngap/NGAP_M5period.h +++ b/lib/asn1c/ngap/NGAP_M5period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M5period_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M5period_specs_1; asn_struct_free_f NGAP_M5period_free; asn_struct_print_f NGAP_M5period_print; asn_constr_check_f NGAP_M5period_constraint; -jer_type_encoder_f NGAP_M5period_encode_jer; per_type_decoder_f NGAP_M5period_decode_aper; per_type_encoder_f NGAP_M5period_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M6Configuration.c b/lib/asn1c/ngap/NGAP_M6Configuration.c index e1fc94dd47..ce125ca27e 100644 --- a/lib/asn1c/ngap/NGAP_M6Configuration.c +++ b/lib/asn1c/ngap/NGAP_M6Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M6Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_M6Configuration.h b/lib/asn1c/ngap/NGAP_M6Configuration.h index bf4e332f2d..35488bec14 100644 --- a/lib/asn1c/ngap/NGAP_M6Configuration.h +++ b/lib/asn1c/ngap/NGAP_M6Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M6Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.c b/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.c index 4019b8e6d1..fab8f523de 100644 --- a/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.c +++ b/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M6ReportAmountMDT.h" diff --git a/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.h b/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.h index 3fd0d85ce4..4e632ed894 100644 --- a/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.h +++ b/lib/asn1c/ngap/NGAP_M6ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M6ReportAmountMDT_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M6ReportAmountMDT_specs_1; asn_struct_free_f NGAP_M6ReportAmountMDT_free; asn_struct_print_f NGAP_M6ReportAmountMDT_print; asn_constr_check_f NGAP_M6ReportAmountMDT_constraint; -jer_type_encoder_f NGAP_M6ReportAmountMDT_encode_jer; per_type_decoder_f NGAP_M6ReportAmountMDT_decode_aper; per_type_encoder_f NGAP_M6ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M6report-Interval.c b/lib/asn1c/ngap/NGAP_M6report-Interval.c index f4b7ee4c1d..de4f0dbbef 100644 --- a/lib/asn1c/ngap/NGAP_M6report-Interval.c +++ b/lib/asn1c/ngap/NGAP_M6report-Interval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M6report-Interval.h" diff --git a/lib/asn1c/ngap/NGAP_M6report-Interval.h b/lib/asn1c/ngap/NGAP_M6report-Interval.h index e76bd269b3..27f7515868 100644 --- a/lib/asn1c/ngap/NGAP_M6report-Interval.h +++ b/lib/asn1c/ngap/NGAP_M6report-Interval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M6report_Interval_H_ @@ -49,7 +49,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M6report_Interval_specs_1; asn_struct_free_f NGAP_M6report_Interval_free; asn_struct_print_f NGAP_M6report_Interval_print; asn_constr_check_f NGAP_M6report_Interval_constraint; -jer_type_encoder_f NGAP_M6report_Interval_encode_jer; per_type_decoder_f NGAP_M6report_Interval_decode_aper; per_type_encoder_f NGAP_M6report_Interval_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M7Configuration.c b/lib/asn1c/ngap/NGAP_M7Configuration.c index 8576bbe9e1..da4cbacfa5 100644 --- a/lib/asn1c/ngap/NGAP_M7Configuration.c +++ b/lib/asn1c/ngap/NGAP_M7Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M7Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_M7Configuration.h b/lib/asn1c/ngap/NGAP_M7Configuration.h index a92cad20f8..e62567ef62 100644 --- a/lib/asn1c/ngap/NGAP_M7Configuration.h +++ b/lib/asn1c/ngap/NGAP_M7Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M7Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.c b/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.c index 4290ba42aa..0bc1dc824b 100644 --- a/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.c +++ b/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M7ReportAmountMDT.h" diff --git a/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.h b/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.h index 334aeba35c..5a44df2a4e 100644 --- a/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.h +++ b/lib/asn1c/ngap/NGAP_M7ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M7ReportAmountMDT_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_M7ReportAmountMDT_specs_1; asn_struct_free_f NGAP_M7ReportAmountMDT_free; asn_struct_print_f NGAP_M7ReportAmountMDT_print; asn_constr_check_f NGAP_M7ReportAmountMDT_constraint; -jer_type_encoder_f NGAP_M7ReportAmountMDT_encode_jer; per_type_decoder_f NGAP_M7ReportAmountMDT_decode_aper; per_type_encoder_f NGAP_M7ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_M7period.c b/lib/asn1c/ngap/NGAP_M7period.c index be92a89459..0c7b30555f 100644 --- a/lib/asn1c/ngap/NGAP_M7period.c +++ b/lib/asn1c/ngap/NGAP_M7period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_M7period.h" diff --git a/lib/asn1c/ngap/NGAP_M7period.h b/lib/asn1c/ngap/NGAP_M7period.h index e4ba184203..b849f790bd 100644 --- a/lib/asn1c/ngap/NGAP_M7period.h +++ b/lib/asn1c/ngap/NGAP_M7period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_M7period_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_M7period; asn_struct_free_f NGAP_M7period_free; asn_struct_print_f NGAP_M7period_print; asn_constr_check_f NGAP_M7period_constraint; -jer_type_encoder_f NGAP_M7period_encode_jer; per_type_decoder_f NGAP_M7period_decode_aper; per_type_encoder_f NGAP_M7period_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.c b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.c index ec8ea83a2d..fbdcece7fb 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.h b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.h index 9684b67260..40b58e3877 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ActiveSessionInformation_SourcetoTargetItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.c b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.c index fb458da153..7ece5ea3fb 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.c +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.h b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.h index 69129e64bd..257aa4ece2 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.h +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-SourcetoTargetList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ActiveSessionInformation_SourcetoTargetList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.c b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.c index f63c76dda2..ccffff0521 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.h b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.h index f83ea4c346..4a1486b273 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ActiveSessionInformation_TargettoSourceItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.c b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.c index 70ae3c46ec..26c1d4ac09 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.c +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ActiveSessionInformation-TargettoSourceList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.h b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.h index 1b2c734f2a..411ef09318 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.h +++ b/lib/asn1c/ngap/NGAP_MBS-ActiveSessionInformation-TargettoSourceList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ActiveSessionInformation_TargettoSourceList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.c b/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.c index 3246d58b7a..8ada331c23 100644 --- a/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.c +++ b/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-AreaSessionID.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.h b/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.h index 72abe7fb90..9b7b3a5dc1 100644 --- a/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.h +++ b/lib/asn1c/ngap/NGAP_MBS-AreaSessionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_AreaSessionID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MBS_AreaSessionID; asn_struct_free_f NGAP_MBS_AreaSessionID_free; asn_struct_print_f NGAP_MBS_AreaSessionID_print; asn_constr_check_f NGAP_MBS_AreaSessionID_constraint; -jer_type_encoder_f NGAP_MBS_AreaSessionID_encode_jer; per_type_decoder_f NGAP_MBS_AreaSessionID_decode_aper; per_type_encoder_f NGAP_MBS_AreaSessionID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.c b/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.c index 7c24954d87..b68e7cc88f 100644 --- a/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.c +++ b/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-AreaTAIList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.h b/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.h index f1cb8f664f..a8e00a7dca 100644 --- a/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.h +++ b/lib/asn1c/ngap/NGAP_MBS-AreaTAIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_AreaTAIList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.c b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.c index fb0090da29..0add649410 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DataForwardingResponseMRBItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.h b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.h index 476d418d9e..e44ab56fc1 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DataForwardingResponseMRBItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.c b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.c index f8799f43c5..89c4f97de5 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.c +++ b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DataForwardingResponseMRBList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.h b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.h index c67c165e00..07e367ab62 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.h +++ b/lib/asn1c/ngap/NGAP_MBS-DataForwardingResponseMRBList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DataForwardingResponseMRBList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.c b/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.c index 381d9634db..2843430d1b 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DistributionReleaseRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.h b/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.h index 0b8d7f4736..03c94faa99 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionReleaseRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DistributionReleaseRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.c b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.c index a11377f62f..141dd68f47 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DistributionSetupRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.h b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.h index 7c2d154ec2..416fc37960 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DistributionSetupRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.c b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.c index f9c7e9842f..3bd05d88fb 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DistributionSetupResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.h b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.h index 8269f1d0d6..5ebf31eee7 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DistributionSetupResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.c index ba249e5698..1633a15614 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-DistributionSetupUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.h index 6b916fce3f..c9bca5dc2e 100644 --- a/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBS-DistributionSetupUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_DistributionSetupUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.c b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.c index 056ddeb865..7a3eef878e 100644 --- a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-MappingandDataForwardingRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.h b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.h index 48b8f81bea..7cce4906f8 100644 --- a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_MappingandDataForwardingRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.c b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.c index 87707fe8be..d46057f504 100644 --- a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.c +++ b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-MappingandDataForwardingRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.h b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.h index f77bfeb64c..6b27a29360 100644 --- a/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.h +++ b/lib/asn1c/ngap/NGAP_MBS-MappingandDataForwardingRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_MappingandDataForwardingRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.c b/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.c index eaf32333ba..3579391b35 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.c +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-QoSFlowList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.h b/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.h index 041e4a899e..345a5c22fe 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.h +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_QoSFlowList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.c b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.c index c9c2807cf4..2daafcb621 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-QoSFlowsToBeSetupItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.h b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.h index 98cdf7d244..9e7cd13dee 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_QoSFlowsToBeSetupItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.c b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.c index e3779da3ce..282e022bf2 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.c +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-QoSFlowsToBeSetupList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.h b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.h index 3555ad5af8..bdbb7bd69d 100644 --- a/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.h +++ b/lib/asn1c/ngap/NGAP_MBS-QoSFlowsToBeSetupList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_QoSFlowsToBeSetupList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceArea.c b/lib/asn1c/ngap/NGAP_MBS-ServiceArea.c index 5b52a0d300..115e26cdca 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceArea.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceArea.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceArea.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceArea.h b/lib/asn1c/ngap/NGAP_MBS-ServiceArea.h index 6d3fdec3d1..5aadb909c7 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceArea.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceArea.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceArea_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.c b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.c index e56a8a4183..b377839ab4 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceAreaCellList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.h b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.h index ebdcdd31e9..9ca0ef6793 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceAreaCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.c b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.c index e2fee39586..a5ca54fd89 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceAreaInformation.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.h b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.h index a8dfda4ac2..18f0e0fe55 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceAreaInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.c b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.c index 5ccb342986..cc14d7ea96 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceAreaInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.h b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.h index 5eb58504d1..22e6b1603d 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceAreaInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.c b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.c index d8dfa1a78e..dcb8650564 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceAreaInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.h b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.h index b186702887..1be7762f57 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceAreaInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.c b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.c index f6c832d9fa..97b0451867 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.c +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-ServiceAreaTAIList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.h b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.h index fe3d3f0e3a..d37e1f7266 100644 --- a/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.h +++ b/lib/asn1c/ngap/NGAP_MBS-ServiceAreaTAIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_ServiceAreaTAIList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.c b/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.c index 2e3e9b048e..d8b7dab40f 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionFSAID.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.h b/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.h index bb37e4a580..1335509e4b 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionFSAID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionFSAID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MBS_SessionFSAID; asn_struct_free_f NGAP_MBS_SessionFSAID_free; asn_struct_print_f NGAP_MBS_SessionFSAID_print; asn_constr_check_f NGAP_MBS_SessionFSAID_constraint; -jer_type_encoder_f NGAP_MBS_SessionFSAID_encode_jer; per_type_decoder_f NGAP_MBS_SessionFSAID_decode_aper; per_type_encoder_f NGAP_MBS_SessionFSAID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.c b/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.c index 72158ef054..5fa555d02c 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionFSAIDList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.h b/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.h index 2bf4c20a60..9ca6552f98 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionFSAIDList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionFSAIDList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionID.c b/lib/asn1c/ngap/NGAP_MBS-SessionID.c index 12e265e16b..2738ca4fe4 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionID.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionID.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionID.h b/lib/asn1c/ngap/NGAP_MBS-SessionID.h index 4ddda78897..8804104b31 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionID.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionID_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.c index 3843088b2a..31f53dc2f9 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfo5GC.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.h index 829ed1772a..6d4e3c66c5 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfo5GC_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.c index 5dd0b8c623..fd25cdc67f 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfo5GCItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.h index 407e6e93f3..13ae09ee5d 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfo5GCItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.c index db176da4c7..6572112228 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfo5GCList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.h index e4b6fa0423..23a9aa1aac 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfo5GCList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfo5GCList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.c index 8091e725be..f5affec394 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfoNGRAN.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.h index dd00428f54..af9fe73ed7 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfoNGRAN_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.c index 5aa982d298..414eab3ecf 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfoNGRANItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.h index d10804d0bc..fd78fc80df 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfoNGRANItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.c b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.c index a07e2e5b04..4271c7d817 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.c +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SessionTNLInfoNGRANList.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.h b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.h index d83b25fe1e..ba7820b1f8 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.h +++ b/lib/asn1c/ngap/NGAP_MBS-SessionTNLInfoNGRANList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SessionTNLInfoNGRANList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.c b/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.c index 54872bd5b0..e596a1fc13 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.c +++ b/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBS-SupportIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.h b/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.h index 2386b747b7..ae66cbb7f5 100644 --- a/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.h +++ b/lib/asn1c/ngap/NGAP_MBS-SupportIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBS_SupportIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MBS_SupportIndicator_specs_1; asn_struct_free_f NGAP_MBS_SupportIndicator_free; asn_struct_print_f NGAP_MBS_SupportIndicator_print; asn_constr_check_f NGAP_MBS_SupportIndicator_constraint; -jer_type_encoder_f NGAP_MBS_SupportIndicator_encode_jer; per_type_decoder_f NGAP_MBS_SupportIndicator_decode_aper; per_type_encoder_f NGAP_MBS_SupportIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.c b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.c index 454b4a2f0c..b644dd6493 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionFailedtoSetupItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.h b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.h index 090ab94e80..00d484e69d 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionFailedtoSetupItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.c b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.c index 8682737775..f058be305a 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionFailedtoSetupList.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.h b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.h index fd849c1ffb..b484ee76e3 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionFailedtoSetupList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionFailedtoSetupList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.c b/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.c index 2c799f09d4..4ce87ae0b8 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionReleaseResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.h b/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.h index cda6696d2e..0e414bb138 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionReleaseResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionReleaseResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.c index 0a7df02338..26cdc4dd69 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupOrModFailureTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.h index e1e6405045..f167bb4c39 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModFailureTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupOrModFailureTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.c index dd0dfb3e8b..5af62f99e8 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupOrModRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.h index aa127493c5..5b3c3807e1 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupOrModRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.c index 4c9eab9518..9e0868e10d 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupOrModResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.h index 65eb697715..27099da42d 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupOrModResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupOrModResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.c index 046fd2435f..e378a24fb5 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.h index c7fa7339d2..3dcdfffdc0 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.c index 424afdb527..83f706db0b 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.h index 72bccedb87..ed1dff8854 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.c index acd5edc414..12e72b5a08 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupResponseItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.h index eb5a3ec334..d3516387c7 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupResponseItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.c b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.c index 07cbb2cccc..0ed5ac3a5a 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetupResponseList.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.h b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.h index ef9e99f29f..e473261a84 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetupResponseList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetupResponseList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.c b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.c index fe8c8c2d73..356ce4d342 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetuporModifyRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.h b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.h index 1710020098..b1f4a226bc 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetuporModifyRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.c b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.c index 983412575c..4968e96165 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionSetuporModifyRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.h b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.h index 54b06c53bc..c31f6ab350 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionSetuporModifyRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionSetuporModifyRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionStatus.c b/lib/asn1c/ngap/NGAP_MBSSessionStatus.c index c494b76935..5d68e81198 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionStatus.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionStatus.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionStatus.h b/lib/asn1c/ngap/NGAP_MBSSessionStatus.h index 558493efe7..815d32add6 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionStatus.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionStatus_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MBSSessionStatus_specs_1; asn_struct_free_f NGAP_MBSSessionStatus_free; asn_struct_print_f NGAP_MBSSessionStatus_print; asn_constr_check_f NGAP_MBSSessionStatus_constraint; -jer_type_encoder_f NGAP_MBSSessionStatus_encode_jer; per_type_decoder_f NGAP_MBSSessionStatus_decode_aper; per_type_encoder_f NGAP_MBSSessionStatus_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.c b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.c index 850ac1d61a..09f952841f 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionToReleaseItem.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.h b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.h index 3922536217..94fa886a7c 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionToReleaseItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.c b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.c index 365c44cf61..b738bc4259 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.c +++ b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MBSSessionToReleaseList.h" diff --git a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.h b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.h index ace7907b71..0c0ea4505c 100644 --- a/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.h +++ b/lib/asn1c/ngap/NGAP_MBSSessionToReleaseList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MBSSessionToReleaseList_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Activation.c b/lib/asn1c/ngap/NGAP_MDT-Activation.c index a449e94725..4e3344a23c 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Activation.c +++ b/lib/asn1c/ngap/NGAP_MDT-Activation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Activation.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Activation.h b/lib/asn1c/ngap/NGAP_MDT-Activation.h index 6ca783b1a1..ca2d1a398a 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Activation.h +++ b/lib/asn1c/ngap/NGAP_MDT-Activation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Activation_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MDT_Activation_specs_1; asn_struct_free_f NGAP_MDT_Activation_free; asn_struct_print_f NGAP_MDT_Activation_print; asn_constr_check_f NGAP_MDT_Activation_constraint; -jer_type_encoder_f NGAP_MDT_Activation_encode_jer; per_type_decoder_f NGAP_MDT_Activation_decode_aper; per_type_encoder_f NGAP_MDT_Activation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.c b/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.c index 876683c681..3c0e598acc 100644 --- a/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.c +++ b/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-AlignmentInfo.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.h b/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.h index 4b5de56c23..5b9fb8c77e 100644 --- a/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.h +++ b/lib/asn1c/ngap/NGAP_MDT-AlignmentInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_AlignmentInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.c b/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.c index 2919a98e4b..5daa5dd488 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.c +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Configuration-EUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.h b/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.h index aa6d94498a..375a22ab84 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.h +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration-EUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Configuration_EUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.c b/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.c index 528ae763aa..d0d7c497cb 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.c +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Configuration-NR.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.h b/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.h index 22eaaa23c0..6f02d296df 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.h +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration-NR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Configuration_NR_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration.c b/lib/asn1c/ngap/NGAP_MDT-Configuration.c index 66dedb8a2b..0013aa7f99 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration.c +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Configuration.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Configuration.h b/lib/asn1c/ngap/NGAP_MDT-Configuration.h index b5ef9c5334..316956e37e 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Configuration.h +++ b/lib/asn1c/ngap/NGAP_MDT-Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Configuration_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Location-Info.c b/lib/asn1c/ngap/NGAP_MDT-Location-Info.c index 4f668a78d4..9bb3c9cf72 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Location-Info.c +++ b/lib/asn1c/ngap/NGAP_MDT-Location-Info.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Location-Info.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Location-Info.h b/lib/asn1c/ngap/NGAP_MDT-Location-Info.h index 0407048c0f..f45315bb75 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Location-Info.h +++ b/lib/asn1c/ngap/NGAP_MDT-Location-Info.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Location_Info_H_ diff --git a/lib/asn1c/ngap/NGAP_MDT-Location-Information.c b/lib/asn1c/ngap/NGAP_MDT-Location-Information.c index 1c9cba1615..6ce80b3281 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Location-Information.c +++ b/lib/asn1c/ngap/NGAP_MDT-Location-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDT-Location-Information.h" diff --git a/lib/asn1c/ngap/NGAP_MDT-Location-Information.h b/lib/asn1c/ngap/NGAP_MDT-Location-Information.h index f2fc74e2c0..e0b31b57d9 100644 --- a/lib/asn1c/ngap/NGAP_MDT-Location-Information.h +++ b/lib/asn1c/ngap/NGAP_MDT-Location-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDT_Location_Information_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MDT_Location_Information; asn_struct_free_f NGAP_MDT_Location_Information_free; asn_struct_print_f NGAP_MDT_Location_Information_print; asn_constr_check_f NGAP_MDT_Location_Information_constraint; -jer_type_encoder_f NGAP_MDT_Location_Information_encode_jer; per_type_decoder_f NGAP_MDT_Location_Information_decode_aper; per_type_encoder_f NGAP_MDT_Location_Information_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MDTModeEutra.c b/lib/asn1c/ngap/NGAP_MDTModeEutra.c index 0c2861d3b7..fcdbc46e53 100644 --- a/lib/asn1c/ngap/NGAP_MDTModeEutra.c +++ b/lib/asn1c/ngap/NGAP_MDTModeEutra.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDTModeEutra.h" diff --git a/lib/asn1c/ngap/NGAP_MDTModeEutra.h b/lib/asn1c/ngap/NGAP_MDTModeEutra.h index 0fbcd21348..46ae1acd38 100644 --- a/lib/asn1c/ngap/NGAP_MDTModeEutra.h +++ b/lib/asn1c/ngap/NGAP_MDTModeEutra.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDTModeEutra_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MDTModeEutra; asn_struct_free_f NGAP_MDTModeEutra_free; asn_struct_print_f NGAP_MDTModeEutra_print; asn_constr_check_f NGAP_MDTModeEutra_constraint; -jer_type_encoder_f NGAP_MDTModeEutra_encode_jer; per_type_decoder_f NGAP_MDTModeEutra_decode_aper; per_type_encoder_f NGAP_MDTModeEutra_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MDTModeNr.c b/lib/asn1c/ngap/NGAP_MDTModeNr.c index f66e43a4d3..d1cbd06ada 100644 --- a/lib/asn1c/ngap/NGAP_MDTModeNr.c +++ b/lib/asn1c/ngap/NGAP_MDTModeNr.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDTModeNr.h" diff --git a/lib/asn1c/ngap/NGAP_MDTModeNr.h b/lib/asn1c/ngap/NGAP_MDTModeNr.h index 8f40f21645..e94516078d 100644 --- a/lib/asn1c/ngap/NGAP_MDTModeNr.h +++ b/lib/asn1c/ngap/NGAP_MDTModeNr.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDTModeNr_H_ diff --git a/lib/asn1c/ngap/NGAP_MDTPLMNList.c b/lib/asn1c/ngap/NGAP_MDTPLMNList.c index 9cd0dc4f96..4ae532d9f8 100644 --- a/lib/asn1c/ngap/NGAP_MDTPLMNList.c +++ b/lib/asn1c/ngap/NGAP_MDTPLMNList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDTPLMNList.h" diff --git a/lib/asn1c/ngap/NGAP_MDTPLMNList.h b/lib/asn1c/ngap/NGAP_MDTPLMNList.h index c3d18700e0..f97cd73060 100644 --- a/lib/asn1c/ngap/NGAP_MDTPLMNList.h +++ b/lib/asn1c/ngap/NGAP_MDTPLMNList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDTPLMNList_H_ diff --git a/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.c b/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.c index 4d8e11fa59..47dd6d2f08 100644 --- a/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.c +++ b/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MDTPLMNModificationList.h" diff --git a/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.h b/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.h index 257b7ffbf7..c024bbca11 100644 --- a/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.h +++ b/lib/asn1c/ngap/NGAP_MDTPLMNModificationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MDTPLMNModificationList_H_ diff --git a/lib/asn1c/ngap/NGAP_MICOModeIndication.c b/lib/asn1c/ngap/NGAP_MICOModeIndication.c index 98bb1d6880..1f52e2c70c 100644 --- a/lib/asn1c/ngap/NGAP_MICOModeIndication.c +++ b/lib/asn1c/ngap/NGAP_MICOModeIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MICOModeIndication.h" diff --git a/lib/asn1c/ngap/NGAP_MICOModeIndication.h b/lib/asn1c/ngap/NGAP_MICOModeIndication.h index b6611a3312..a5b28be7c9 100644 --- a/lib/asn1c/ngap/NGAP_MICOModeIndication.h +++ b/lib/asn1c/ngap/NGAP_MICOModeIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MICOModeIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MICOModeIndication_specs_1; asn_struct_free_f NGAP_MICOModeIndication_free; asn_struct_print_f NGAP_MICOModeIndication_print; asn_constr_check_f NGAP_MICOModeIndication_constraint; -jer_type_encoder_f NGAP_MICOModeIndication_encode_jer; per_type_decoder_f NGAP_MICOModeIndication_decode_aper; per_type_encoder_f NGAP_MICOModeIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MRB-ID.c b/lib/asn1c/ngap/NGAP_MRB-ID.c index c7ce0b706c..14b8c25a15 100644 --- a/lib/asn1c/ngap/NGAP_MRB-ID.c +++ b/lib/asn1c/ngap/NGAP_MRB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MRB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_MRB-ID.h b/lib/asn1c/ngap/NGAP_MRB-ID.h index 6096a5efa0..51987de5c7 100644 --- a/lib/asn1c/ngap/NGAP_MRB-ID.h +++ b/lib/asn1c/ngap/NGAP_MRB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MRB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MRB_ID; asn_struct_free_f NGAP_MRB_ID_free; asn_struct_print_f NGAP_MRB_ID_print; asn_constr_check_f NGAP_MRB_ID_constraint; -jer_type_encoder_f NGAP_MRB_ID_encode_jer; per_type_decoder_f NGAP_MRB_ID_decode_aper; per_type_encoder_f NGAP_MRB_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.c b/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.c index a35aae205b..be4affa7c4 100644 --- a/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.c +++ b/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MRB-ProgressInformation.h" diff --git a/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.h b/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.h index 90d2d33bf9..a23546bf88 100644 --- a/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.h +++ b/lib/asn1c/ngap/NGAP_MRB-ProgressInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MRB_ProgressInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_MaskedIMEISV.c b/lib/asn1c/ngap/NGAP_MaskedIMEISV.c index 54fa9cb5a9..f2fa63abc1 100644 --- a/lib/asn1c/ngap/NGAP_MaskedIMEISV.c +++ b/lib/asn1c/ngap/NGAP_MaskedIMEISV.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MaskedIMEISV.h" diff --git a/lib/asn1c/ngap/NGAP_MaskedIMEISV.h b/lib/asn1c/ngap/NGAP_MaskedIMEISV.h index b484d5521b..79be000a0b 100644 --- a/lib/asn1c/ngap/NGAP_MaskedIMEISV.h +++ b/lib/asn1c/ngap/NGAP_MaskedIMEISV.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MaskedIMEISV_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MaskedIMEISV; asn_struct_free_f NGAP_MaskedIMEISV_free; asn_struct_print_f NGAP_MaskedIMEISV_print; asn_constr_check_f NGAP_MaskedIMEISV_constraint; -jer_type_encoder_f NGAP_MaskedIMEISV_encode_jer; per_type_decoder_f NGAP_MaskedIMEISV_decode_aper; per_type_encoder_f NGAP_MaskedIMEISV_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.c b/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.c index 2e1bc7f0e3..ce16179d7c 100644 --- a/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.c +++ b/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MaxNrofRS-IndexesToReport.h" diff --git a/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.h b/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.h index 8fe5c1f04f..1ac85ff0db 100644 --- a/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.h +++ b/lib/asn1c/ngap/NGAP_MaxNrofRS-IndexesToReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MaxNrofRS_IndexesToReport_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MaxNrofRS_IndexesToReport; asn_struct_free_f NGAP_MaxNrofRS_IndexesToReport_free; asn_struct_print_f NGAP_MaxNrofRS_IndexesToReport_print; asn_constr_check_f NGAP_MaxNrofRS_IndexesToReport_constraint; -jer_type_encoder_f NGAP_MaxNrofRS_IndexesToReport_encode_jer; per_type_decoder_f NGAP_MaxNrofRS_IndexesToReport_decode_aper; per_type_encoder_f NGAP_MaxNrofRS_IndexesToReport_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.c b/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.c index fcaf593b65..4d467d117f 100644 --- a/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.c +++ b/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MaximumDataBurstVolume.h" diff --git a/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.h b/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.h index 507b7b832f..32dc5009d1 100644 --- a/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.h +++ b/lib/asn1c/ngap/NGAP_MaximumDataBurstVolume.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MaximumDataBurstVolume_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MaximumDataBurstVolume; asn_struct_free_f NGAP_MaximumDataBurstVolume_free; asn_struct_print_f NGAP_MaximumDataBurstVolume_print; asn_constr_check_f NGAP_MaximumDataBurstVolume_constraint; -jer_type_encoder_f NGAP_MaximumDataBurstVolume_encode_jer; per_type_decoder_f NGAP_MaximumDataBurstVolume_decode_aper; per_type_encoder_f NGAP_MaximumDataBurstVolume_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.c b/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.c index a79808be00..27e20cd202 100644 --- a/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.c +++ b/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MaximumIntegrityProtectedDataRate.h" diff --git a/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.h b/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.h index d3cdd0a7e2..5efbaf4372 100644 --- a/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.h +++ b/lib/asn1c/ngap/NGAP_MaximumIntegrityProtectedDataRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MaximumIntegrityProtectedDataRate_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MaximumIntegrityProtectedDataR asn_struct_free_f NGAP_MaximumIntegrityProtectedDataRate_free; asn_struct_print_f NGAP_MaximumIntegrityProtectedDataRate_print; asn_constr_check_f NGAP_MaximumIntegrityProtectedDataRate_constraint; -jer_type_encoder_f NGAP_MaximumIntegrityProtectedDataRate_encode_jer; per_type_decoder_f NGAP_MaximumIntegrityProtectedDataRate_decode_aper; per_type_encoder_f NGAP_MaximumIntegrityProtectedDataRate_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.c b/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.c index cd25e719c4..63402da9e4 100644 --- a/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.c +++ b/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MeasurementThresholdL1LoggedMDT.h" diff --git a/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.h b/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.h index 8db9b7b3da..4492e3f2a8 100644 --- a/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.h +++ b/lib/asn1c/ngap/NGAP_MeasurementThresholdL1LoggedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MeasurementThresholdL1LoggedMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_MeasurementsToActivate.c b/lib/asn1c/ngap/NGAP_MeasurementsToActivate.c index e388120172..0544df68cf 100644 --- a/lib/asn1c/ngap/NGAP_MeasurementsToActivate.c +++ b/lib/asn1c/ngap/NGAP_MeasurementsToActivate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MeasurementsToActivate.h" diff --git a/lib/asn1c/ngap/NGAP_MeasurementsToActivate.h b/lib/asn1c/ngap/NGAP_MeasurementsToActivate.h index bd9a186b82..c1c22c513a 100644 --- a/lib/asn1c/ngap/NGAP_MeasurementsToActivate.h +++ b/lib/asn1c/ngap/NGAP_MeasurementsToActivate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MeasurementsToActivate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MeasurementsToActivate; asn_struct_free_f NGAP_MeasurementsToActivate_free; asn_struct_print_f NGAP_MeasurementsToActivate_print; asn_constr_check_f NGAP_MeasurementsToActivate_constraint; -jer_type_encoder_f NGAP_MeasurementsToActivate_encode_jer; per_type_decoder_f NGAP_MeasurementsToActivate_decode_aper; per_type_encoder_f NGAP_MeasurementsToActivate_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MessageIdentifier.c b/lib/asn1c/ngap/NGAP_MessageIdentifier.c index 34fe29eae3..7fd4c44d41 100644 --- a/lib/asn1c/ngap/NGAP_MessageIdentifier.c +++ b/lib/asn1c/ngap/NGAP_MessageIdentifier.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MessageIdentifier.h" diff --git a/lib/asn1c/ngap/NGAP_MessageIdentifier.h b/lib/asn1c/ngap/NGAP_MessageIdentifier.h index 9a554f1fe9..e571c13f5a 100644 --- a/lib/asn1c/ngap/NGAP_MessageIdentifier.h +++ b/lib/asn1c/ngap/NGAP_MessageIdentifier.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MessageIdentifier_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MessageIdentifier; asn_struct_free_f NGAP_MessageIdentifier_free; asn_struct_print_f NGAP_MessageIdentifier_print; asn_constr_check_f NGAP_MessageIdentifier_constraint; -jer_type_encoder_f NGAP_MessageIdentifier_encode_jer; per_type_decoder_f NGAP_MessageIdentifier_decode_aper; per_type_encoder_f NGAP_MessageIdentifier_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MicoAllPLMN.c b/lib/asn1c/ngap/NGAP_MicoAllPLMN.c index a538c07964..9098fc8831 100644 --- a/lib/asn1c/ngap/NGAP_MicoAllPLMN.c +++ b/lib/asn1c/ngap/NGAP_MicoAllPLMN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MicoAllPLMN.h" diff --git a/lib/asn1c/ngap/NGAP_MicoAllPLMN.h b/lib/asn1c/ngap/NGAP_MicoAllPLMN.h index 49cd6c54ea..d77feffadd 100644 --- a/lib/asn1c/ngap/NGAP_MicoAllPLMN.h +++ b/lib/asn1c/ngap/NGAP_MicoAllPLMN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MicoAllPLMN_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_MicoAllPLMN_specs_1; asn_struct_free_f NGAP_MicoAllPLMN_free; asn_struct_print_f NGAP_MicoAllPLMN_print; asn_constr_check_f NGAP_MicoAllPLMN_constraint; -jer_type_encoder_f NGAP_MicoAllPLMN_encode_jer; per_type_decoder_f NGAP_MicoAllPLMN_decode_aper; per_type_encoder_f NGAP_MicoAllPLMN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MobilityInformation.c b/lib/asn1c/ngap/NGAP_MobilityInformation.c index dc405ecd4b..b63a1d3a7e 100644 --- a/lib/asn1c/ngap/NGAP_MobilityInformation.c +++ b/lib/asn1c/ngap/NGAP_MobilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MobilityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_MobilityInformation.h b/lib/asn1c/ngap/NGAP_MobilityInformation.h index a6b2b01a3d..41e984206a 100644 --- a/lib/asn1c/ngap/NGAP_MobilityInformation.h +++ b/lib/asn1c/ngap/NGAP_MobilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MobilityInformation_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_MobilityInformation; asn_struct_free_f NGAP_MobilityInformation_free; asn_struct_print_f NGAP_MobilityInformation_print; asn_constr_check_f NGAP_MobilityInformation_constraint; -jer_type_encoder_f NGAP_MobilityInformation_encode_jer; per_type_decoder_f NGAP_MobilityInformation_decode_aper; per_type_encoder_f NGAP_MobilityInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_MobilityRestrictionList.c b/lib/asn1c/ngap/NGAP_MobilityRestrictionList.c index dceb25bd91..6d2baa8845 100644 --- a/lib/asn1c/ngap/NGAP_MobilityRestrictionList.c +++ b/lib/asn1c/ngap/NGAP_MobilityRestrictionList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MobilityRestrictionList.h" diff --git a/lib/asn1c/ngap/NGAP_MobilityRestrictionList.h b/lib/asn1c/ngap/NGAP_MobilityRestrictionList.h index 3fdf26799c..9d5706f1df 100644 --- a/lib/asn1c/ngap/NGAP_MobilityRestrictionList.h +++ b/lib/asn1c/ngap/NGAP_MobilityRestrictionList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MobilityRestrictionList_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPaging.c b/lib/asn1c/ngap/NGAP_MulticastGroupPaging.c index d009537cc2..f26953c04f 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPaging.c +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastGroupPaging.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPaging.h b/lib/asn1c/ngap/NGAP_MulticastGroupPaging.h index 91a59b1e64..609d79f540 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPaging.h +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastGroupPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.c b/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.c index 3047e8d242..97a4421dca 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.c +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastGroupPagingArea.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.h b/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.h index 85e51323ba..ba59516b31 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.h +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingArea.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastGroupPagingArea_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.c b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.c index 5e019be516..a876ddb1f0 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.c +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastGroupPagingAreaItem.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.h b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.h index 2cd67ac5f2..0853ad8e7c 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.h +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastGroupPagingAreaItem_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.c b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.c index bc1b21e40f..4e4d0e8ed2 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.c +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastGroupPagingAreaList.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.h b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.h index 9cf4a39179..271d851523 100644 --- a/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.h +++ b/lib/asn1c/ngap/NGAP_MulticastGroupPagingAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastGroupPagingAreaList_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.c b/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.c index b9f79b0820..04fa108b53 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionActivationFailure.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.h b/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.h index e303b45737..390821888a 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionActivationFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.c b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.c index baabdae157..64b8e3d8b2 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionActivationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.h b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.h index 49ce6a2c0e..ea29966acc 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionActivationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.c b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.c index 0966797e74..69ba04809e 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionActivationRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.h b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.h index 73798bbb37..b732d4efae 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionActivationRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.c b/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.c index bf4532f622..adcf53ab5b 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionActivationResponse.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.h b/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.h index 9a2d101af6..b4fd7e352a 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionActivationResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionActivationResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.c b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.c index de7c26127e..ee9c61c168 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionDeactivationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.h b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.h index dc62426fcf..e11442672b 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionDeactivationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.c b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.c index b4ecc425c9..2ea0fd5bae 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionDeactivationRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.h b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.h index 77c5e56e3b..d572009fbf 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionDeactivationRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.c b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.c index 8b08cf438a..3ff0604ee2 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionDeactivationResponse.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.h b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.h index 640f140061..bbd49e7871 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionDeactivationResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionDeactivationResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.c b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.c index 7383530c5c..63a2465a40 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionUpdateFailure.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.h b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.h index 99cb40c55d..1f81362b4f 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionUpdateFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.c b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.c index b40582328e..958b3dc368 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionUpdateRequest.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.h b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.h index 5add9aa070..7329aca95e 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionUpdateRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.c b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.c index 27d321ce11..b542f456eb 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionUpdateRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.h b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.h index 60e6e2342e..696cf26bee 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionUpdateRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.c b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.c index 79f20e8e14..3d205413c6 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.c +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_MulticastSessionUpdateResponse.h" diff --git a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.h b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.h index b147fb6354..35d0858a9c 100644 --- a/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.h +++ b/lib/asn1c/ngap/NGAP_MulticastSessionUpdateResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_MulticastSessionUpdateResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_N3IWF-ID.c b/lib/asn1c/ngap/NGAP_N3IWF-ID.c index e27d1a1423..4342de5a54 100644 --- a/lib/asn1c/ngap/NGAP_N3IWF-ID.c +++ b/lib/asn1c/ngap/NGAP_N3IWF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_N3IWF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_N3IWF-ID.h b/lib/asn1c/ngap/NGAP_N3IWF-ID.h index be20e193a9..75135c647d 100644 --- a/lib/asn1c/ngap/NGAP_N3IWF-ID.h +++ b/lib/asn1c/ngap/NGAP_N3IWF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_N3IWF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_NAS-PDU.c b/lib/asn1c/ngap/NGAP_NAS-PDU.c index 817008aeeb..2a4bbbdcfe 100644 --- a/lib/asn1c/ngap/NGAP_NAS-PDU.c +++ b/lib/asn1c/ngap/NGAP_NAS-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NAS-PDU.h" diff --git a/lib/asn1c/ngap/NGAP_NAS-PDU.h b/lib/asn1c/ngap/NGAP_NAS-PDU.h index 3489ab2f90..0ccf2380a1 100644 --- a/lib/asn1c/ngap/NGAP_NAS-PDU.h +++ b/lib/asn1c/ngap/NGAP_NAS-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NAS_PDU_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NAS_PDU; asn_struct_free_f NGAP_NAS_PDU_free; asn_struct_print_f NGAP_NAS_PDU_print; asn_constr_check_f NGAP_NAS_PDU_constraint; -jer_type_encoder_f NGAP_NAS_PDU_encode_jer; per_type_decoder_f NGAP_NAS_PDU_decode_aper; per_type_encoder_f NGAP_NAS_PDU_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.c b/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.c index b8b28126df..5e06ba3912 100644 --- a/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.c +++ b/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NASNonDeliveryIndication.h" diff --git a/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.h b/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.h index eb44456f6b..567f911bd6 100644 --- a/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.h +++ b/lib/asn1c/ngap/NGAP_NASNonDeliveryIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NASNonDeliveryIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.c b/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.c index 3292065738..73075b4286 100644 --- a/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.c +++ b/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NASSecurityParametersFromNGRAN.h" diff --git a/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.h b/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.h index 6513b0fe88..dc7df5f0d0 100644 --- a/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.h +++ b/lib/asn1c/ngap/NGAP_NASSecurityParametersFromNGRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NASSecurityParametersFromNGRAN_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NASSecurityParametersFromNGRAN; asn_struct_free_f NGAP_NASSecurityParametersFromNGRAN_free; asn_struct_print_f NGAP_NASSecurityParametersFromNGRAN_print; asn_constr_check_f NGAP_NASSecurityParametersFromNGRAN_constraint; -jer_type_encoder_f NGAP_NASSecurityParametersFromNGRAN_encode_jer; per_type_decoder_f NGAP_NASSecurityParametersFromNGRAN_decode_aper; per_type_encoder_f NGAP_NASSecurityParametersFromNGRAN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.c b/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.c index fd14559645..e839ed4024 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-DefaultPagingDRX.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.h b/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.h index 336b5bae9b..05cb2306d2 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-DefaultPagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_DefaultPagingDRX_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NB_IoT_DefaultPagingDRX_specs_ asn_struct_free_f NGAP_NB_IoT_DefaultPagingDRX_free; asn_struct_print_f NGAP_NB_IoT_DefaultPagingDRX_print; asn_constr_check_f NGAP_NB_IoT_DefaultPagingDRX_constraint; -jer_type_encoder_f NGAP_NB_IoT_DefaultPagingDRX_encode_jer; per_type_decoder_f NGAP_NB_IoT_DefaultPagingDRX_decode_aper; per_type_encoder_f NGAP_NB_IoT_DefaultPagingDRX_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.c b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.c index c53c4a47a3..4b55613fa5 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-Paging-TimeWindow.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.h b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.h index 6419b2179c..a9f792f4c7 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-TimeWindow.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_Paging_TimeWindow_H_ @@ -51,7 +51,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NB_IoT_Paging_TimeWindow_specs asn_struct_free_f NGAP_NB_IoT_Paging_TimeWindow_free; asn_struct_print_f NGAP_NB_IoT_Paging_TimeWindow_print; asn_constr_check_f NGAP_NB_IoT_Paging_TimeWindow_constraint; -jer_type_encoder_f NGAP_NB_IoT_Paging_TimeWindow_encode_jer; per_type_decoder_f NGAP_NB_IoT_Paging_TimeWindow_decode_aper; per_type_encoder_f NGAP_NB_IoT_Paging_TimeWindow_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.c b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.c index 13e453a1a8..4423c8225f 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-Paging-eDRXCycle.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.h b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.h index 4d2b6c2b48..5fac174fee 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXCycle.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_Paging_eDRXCycle_H_ @@ -49,7 +49,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NB_IoT_Paging_eDRXCycle_specs_ asn_struct_free_f NGAP_NB_IoT_Paging_eDRXCycle_free; asn_struct_print_f NGAP_NB_IoT_Paging_eDRXCycle_print; asn_constr_check_f NGAP_NB_IoT_Paging_eDRXCycle_constraint; -jer_type_encoder_f NGAP_NB_IoT_Paging_eDRXCycle_encode_jer; per_type_decoder_f NGAP_NB_IoT_Paging_eDRXCycle_decode_aper; per_type_encoder_f NGAP_NB_IoT_Paging_eDRXCycle_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.c b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.c index 109f433d86..0fa8078dfc 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-Paging-eDRXInfo.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.h b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.h index 4d2838654b..476a80ddea 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-Paging-eDRXInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_Paging_eDRXInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.c b/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.c index d08012b467..6cd2d71821 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-PagingDRX.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.h b/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.h index 8e42da7359..2f251fa9ed 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-PagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_PagingDRX_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NB_IoT_PagingDRX_specs_1; asn_struct_free_f NGAP_NB_IoT_PagingDRX_free; asn_struct_print_f NGAP_NB_IoT_PagingDRX_print; asn_constr_check_f NGAP_NB_IoT_PagingDRX_constraint; -jer_type_encoder_f NGAP_NB_IoT_PagingDRX_encode_jer; per_type_decoder_f NGAP_NB_IoT_PagingDRX_decode_aper; per_type_encoder_f NGAP_NB_IoT_PagingDRX_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.c b/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.c index a20e81c88f..c9a2d39c1a 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.c +++ b/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NB-IoT-UEPriority.h" diff --git a/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.h b/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.h index eebed39a6f..bb0bb8bb14 100644 --- a/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.h +++ b/lib/asn1c/ngap/NGAP_NB-IoT-UEPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NB_IoT_UEPriority_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NB_IoT_UEPriority; asn_struct_free_f NGAP_NB_IoT_UEPriority_free; asn_struct_print_f NGAP_NB_IoT_UEPriority_print; asn_constr_check_f NGAP_NB_IoT_UEPriority_constraint; -jer_type_encoder_f NGAP_NB_IoT_UEPriority_encode_jer; per_type_decoder_f NGAP_NB_IoT_UEPriority_decode_aper; per_type_encoder_f NGAP_NB_IoT_UEPriority_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NGAP-PDU.c b/lib/asn1c/ngap/NGAP_NGAP-PDU.c index 02f6e4e295..7929f5a6bc 100644 --- a/lib/asn1c/ngap/NGAP_NGAP-PDU.c +++ b/lib/asn1c/ngap/NGAP_NGAP-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGAP-PDU.h" diff --git a/lib/asn1c/ngap/NGAP_NGAP-PDU.h b/lib/asn1c/ngap/NGAP_NGAP-PDU.h index dad3aebba5..260899d44c 100644 --- a/lib/asn1c/ngap/NGAP_NGAP-PDU.h +++ b/lib/asn1c/ngap/NGAP_NGAP-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGAP_PDU_H_ diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.c b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.c index 23de89c4c0..c51c0e34bc 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.c +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGAPIESupportInformationRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.h b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.h index 31cebdcfe9..8230089fcf 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.h +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGAPIESupportInformationRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.c b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.c index 3d68df4595..2df52cc3b4 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.c +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGAPIESupportInformationRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.h b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.h index 92f8b35677..cc3ff764d0 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.h +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGAPIESupportInformationRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.c b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.c index dd677e3186..2a13e42b77 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.c +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGAPIESupportInformationResponseItem.h" diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.h b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.h index b695594620..775f474e63 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.h +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGAPIESupportInformationResponseItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.c b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.c index b5962455a1..81f847f7e4 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.c +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGAPIESupportInformationResponseList.h" diff --git a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.h b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.h index 9b1827089d..95280b72f4 100644 --- a/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.h +++ b/lib/asn1c/ngap/NGAP_NGAPIESupportInformationResponseList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGAPIESupportInformationResponseList_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CGI.c b/lib/asn1c/ngap/NGAP_NGRAN-CGI.c index c40e64407b..6754c0955f 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CGI.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-CGI.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CGI.h b/lib/asn1c/ngap/NGAP_NGRAN-CGI.h index 87aa207a09..5830bc6223 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CGI.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_CGI_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.c b/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.c index b1cae79718..89902183bc 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-CellReportItem.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.h b/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.h index da482e8553..89ebeddb92 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_CellReportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.c b/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.c index e6f8e61e1e..de27576510 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-CellReportList.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.h b/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.h index 70131f240c..2c528cc3ef 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_CellReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.c b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.c index 50e2af943a..1c88614825 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-CellToReportItem.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.h b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.h index 60ff6e5422..cf0934c051 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_CellToReportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.c b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.c index 1da413ecc3..8e4cc31a4f 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-CellToReportList.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.h b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.h index 3944ee8f77..85c4987960 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-CellToReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_CellToReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.c b/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.c index fd96d6d159..47ee853f6e 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-NoofRRCConnections.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.h b/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.h index 7f904393e1..f8467502be 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-NoofRRCConnections.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_NoofRRCConnections_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NGRAN_NoofRRCConnections; asn_struct_free_f NGAP_NGRAN_NoofRRCConnections_free; asn_struct_print_f NGAP_NGRAN_NoofRRCConnections_print; asn_constr_check_f NGAP_NGRAN_NoofRRCConnections_constraint; -jer_type_encoder_f NGAP_NGRAN_NoofRRCConnections_encode_jer; per_type_decoder_f NGAP_NGRAN_NoofRRCConnections_decode_aper; per_type_encoder_f NGAP_NGRAN_NoofRRCConnections_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.c b/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.c index bb2dd02c15..2b86eabe07 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-NumberOfActiveUEs.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.h b/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.h index d3c25ed10e..45a7186abe 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-NumberOfActiveUEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_NumberOfActiveUEs_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NGRAN_NumberOfActiveUEs; asn_struct_free_f NGAP_NGRAN_NumberOfActiveUEs_free; asn_struct_print_f NGAP_NGRAN_NumberOfActiveUEs_print; asn_constr_check_f NGAP_NGRAN_NumberOfActiveUEs_constraint; -jer_type_encoder_f NGAP_NGRAN_NumberOfActiveUEs_encode_jer; per_type_decoder_f NGAP_NGRAN_NumberOfActiveUEs_decode_aper; per_type_encoder_f NGAP_NGRAN_NumberOfActiveUEs_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.c b/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.c index c81e7c2f00..990b3117e1 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-RadioResourceStatus.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.h b/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.h index cd14e41c93..52b659b87d 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-RadioResourceStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_RadioResourceStatus_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.c b/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.c index 937e5fbbc0..7f9e9b2c38 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-ReportingStatusIEs.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.h b/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.h index d9300835cb..2218816529 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-ReportingStatusIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_ReportingStatusIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.c b/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.c index 44bd113eb7..c264e7bbd7 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-ReportingSystemIEs.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.h b/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.h index b3441b9d08..b830be1ee1 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-ReportingSystemIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_ReportingSystemIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.c b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.c index abd9761c9d..d8483a9841 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-TNLAssociationToRemoveItem.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.h b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.h index 5214fb732f..470fc52986 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_TNLAssociationToRemoveItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.c b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.c index 564eb0379e..3dd1e46b40 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.c +++ b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRAN-TNLAssociationToRemoveList.h" diff --git a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.h b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.h index 1c31dcfcb2..73dd045b9e 100644 --- a/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.h +++ b/lib/asn1c/ngap/NGAP_NGRAN-TNLAssociationToRemoveList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRAN_TNLAssociationToRemoveList_H_ diff --git a/lib/asn1c/ngap/NGAP_NGRANTraceID.c b/lib/asn1c/ngap/NGAP_NGRANTraceID.c index a0dacf803b..5bd7732087 100644 --- a/lib/asn1c/ngap/NGAP_NGRANTraceID.c +++ b/lib/asn1c/ngap/NGAP_NGRANTraceID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGRANTraceID.h" diff --git a/lib/asn1c/ngap/NGAP_NGRANTraceID.h b/lib/asn1c/ngap/NGAP_NGRANTraceID.h index 2db783a4f8..b7fb56f06a 100644 --- a/lib/asn1c/ngap/NGAP_NGRANTraceID.h +++ b/lib/asn1c/ngap/NGAP_NGRANTraceID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGRANTraceID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NGRANTraceID; asn_struct_free_f NGAP_NGRANTraceID_free; asn_struct_print_f NGAP_NGRANTraceID_print; asn_constr_check_f NGAP_NGRANTraceID_constraint; -jer_type_encoder_f NGAP_NGRANTraceID_encode_jer; per_type_decoder_f NGAP_NGRANTraceID_decode_aper; per_type_encoder_f NGAP_NGRANTraceID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NGReset.c b/lib/asn1c/ngap/NGAP_NGReset.c index bb6b4e7c22..c4dda7f9d1 100644 --- a/lib/asn1c/ngap/NGAP_NGReset.c +++ b/lib/asn1c/ngap/NGAP_NGReset.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGReset.h" diff --git a/lib/asn1c/ngap/NGAP_NGReset.h b/lib/asn1c/ngap/NGAP_NGReset.h index 7ece3b1902..833715394c 100644 --- a/lib/asn1c/ngap/NGAP_NGReset.h +++ b/lib/asn1c/ngap/NGAP_NGReset.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGReset_H_ diff --git a/lib/asn1c/ngap/NGAP_NGResetAcknowledge.c b/lib/asn1c/ngap/NGAP_NGResetAcknowledge.c index 8008e33bf0..9af6918144 100644 --- a/lib/asn1c/ngap/NGAP_NGResetAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_NGResetAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGResetAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_NGResetAcknowledge.h b/lib/asn1c/ngap/NGAP_NGResetAcknowledge.h index 8eed00f74c..6b1cfb967d 100644 --- a/lib/asn1c/ngap/NGAP_NGResetAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_NGResetAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGResetAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_NGSetupFailure.c b/lib/asn1c/ngap/NGAP_NGSetupFailure.c index 4b0bb54207..d5252b7f3e 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupFailure.c +++ b/lib/asn1c/ngap/NGAP_NGSetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGSetupFailure.h" diff --git a/lib/asn1c/ngap/NGAP_NGSetupFailure.h b/lib/asn1c/ngap/NGAP_NGSetupFailure.h index 8d0eb6c51d..1b513b466f 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupFailure.h +++ b/lib/asn1c/ngap/NGAP_NGSetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGSetupFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_NGSetupRequest.c b/lib/asn1c/ngap/NGAP_NGSetupRequest.c index 2eb3da5215..d6881038ad 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupRequest.c +++ b/lib/asn1c/ngap/NGAP_NGSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGSetupRequest.h" diff --git a/lib/asn1c/ngap/NGAP_NGSetupRequest.h b/lib/asn1c/ngap/NGAP_NGSetupRequest.h index 3086f7ad3b..65d4531544 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupRequest.h +++ b/lib/asn1c/ngap/NGAP_NGSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGSetupRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_NGSetupResponse.c b/lib/asn1c/ngap/NGAP_NGSetupResponse.c index c621e0d9e3..a70033227c 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupResponse.c +++ b/lib/asn1c/ngap/NGAP_NGSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NGSetupResponse.h" diff --git a/lib/asn1c/ngap/NGAP_NGSetupResponse.h b/lib/asn1c/ngap/NGAP_NGSetupResponse.h index 1f4765a587..b700e8f486 100644 --- a/lib/asn1c/ngap/NGAP_NGSetupResponse.h +++ b/lib/asn1c/ngap/NGAP_NGSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NGSetupResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_NID.c b/lib/asn1c/ngap/NGAP_NID.c index ad16a61b60..64b6d07409 100644 --- a/lib/asn1c/ngap/NGAP_NID.c +++ b/lib/asn1c/ngap/NGAP_NID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NID.h" diff --git a/lib/asn1c/ngap/NGAP_NID.h b/lib/asn1c/ngap/NGAP_NID.h index c7fe80e46a..4410b9894a 100644 --- a/lib/asn1c/ngap/NGAP_NID.h +++ b/lib/asn1c/ngap/NGAP_NID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NID; asn_struct_free_f NGAP_NID_free; asn_struct_print_f NGAP_NID_print; asn_constr_check_f NGAP_NID_constraint; -jer_type_encoder_f NGAP_NID_encode_jer; per_type_decoder_f NGAP_NID_decode_aper; per_type_encoder_f NGAP_NID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NPN-AccessInformation.c b/lib/asn1c/ngap/NGAP_NPN-AccessInformation.c index 339825c47e..bea6939c18 100644 --- a/lib/asn1c/ngap/NGAP_NPN-AccessInformation.c +++ b/lib/asn1c/ngap/NGAP_NPN-AccessInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NPN-AccessInformation.h" diff --git a/lib/asn1c/ngap/NGAP_NPN-AccessInformation.h b/lib/asn1c/ngap/NGAP_NPN-AccessInformation.h index 390d4ef92b..0203b09052 100644 --- a/lib/asn1c/ngap/NGAP_NPN-AccessInformation.h +++ b/lib/asn1c/ngap/NGAP_NPN-AccessInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NPN_AccessInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.c b/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.c index 61c3f8196e..07b3b9ce61 100644 --- a/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.c +++ b/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NPN-MobilityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.h b/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.h index b78d3d433b..a7828c7e81 100644 --- a/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.h +++ b/lib/asn1c/ngap/NGAP_NPN-MobilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NPN_MobilityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.c b/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.c index 664d942223..61004dab15 100644 --- a/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.c +++ b/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NPN-PagingAssistanceInformation.h" diff --git a/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.h b/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.h index 6b60560fa8..10e747f5c3 100644 --- a/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.h +++ b/lib/asn1c/ngap/NGAP_NPN-PagingAssistanceInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NPN_PagingAssistanceInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_NPN-Support.c b/lib/asn1c/ngap/NGAP_NPN-Support.c index b7a4507053..33221f0f90 100644 --- a/lib/asn1c/ngap/NGAP_NPN-Support.c +++ b/lib/asn1c/ngap/NGAP_NPN-Support.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NPN-Support.h" diff --git a/lib/asn1c/ngap/NGAP_NPN-Support.h b/lib/asn1c/ngap/NGAP_NPN-Support.h index 3e4d9ecf31..2fcc357259 100644 --- a/lib/asn1c/ngap/NGAP_NPN-Support.h +++ b/lib/asn1c/ngap/NGAP_NPN-Support.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NPN_Support_H_ diff --git a/lib/asn1c/ngap/NGAP_NR-CGI.c b/lib/asn1c/ngap/NGAP_NR-CGI.c index b429736ef1..5c27eda53e 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGI.c +++ b/lib/asn1c/ngap/NGAP_NR-CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-CGI.h" diff --git a/lib/asn1c/ngap/NGAP_NR-CGI.h b/lib/asn1c/ngap/NGAP_NR-CGI.h index 358ebcf725..b32cf021a2 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGI.h +++ b/lib/asn1c/ngap/NGAP_NR-CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_CGI_H_ diff --git a/lib/asn1c/ngap/NGAP_NR-CGIList.c b/lib/asn1c/ngap/NGAP_NR-CGIList.c index 266c964b1f..43c84c63de 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGIList.c +++ b/lib/asn1c/ngap/NGAP_NR-CGIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-CGIList.h" diff --git a/lib/asn1c/ngap/NGAP_NR-CGIList.h b/lib/asn1c/ngap/NGAP_NR-CGIList.h index be2f085c1a..34c781e0cf 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGIList.h +++ b/lib/asn1c/ngap/NGAP_NR-CGIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_CGIList_H_ diff --git a/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.c b/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.c index 2c23904138..f0886e5cee 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.c +++ b/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-CGIListForWarning.h" diff --git a/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.h b/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.h index 5752d3211b..582f2cdb3e 100644 --- a/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.h +++ b/lib/asn1c/ngap/NGAP_NR-CGIListForWarning.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_CGIListForWarning_H_ diff --git a/lib/asn1c/ngap/NGAP_NR-PCI.c b/lib/asn1c/ngap/NGAP_NR-PCI.c index 6d24dbf3f1..6388cb8db8 100644 --- a/lib/asn1c/ngap/NGAP_NR-PCI.c +++ b/lib/asn1c/ngap/NGAP_NR-PCI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-PCI.h" diff --git a/lib/asn1c/ngap/NGAP_NR-PCI.h b/lib/asn1c/ngap/NGAP_NR-PCI.h index 5898546484..1330ac60dc 100644 --- a/lib/asn1c/ngap/NGAP_NR-PCI.h +++ b/lib/asn1c/ngap/NGAP_NR-PCI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_PCI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NR_PCI; asn_struct_free_f NGAP_NR_PCI_free; asn_struct_print_f NGAP_NR_PCI_print; asn_constr_check_f NGAP_NR_PCI_constraint; -jer_type_encoder_f NGAP_NR_PCI_encode_jer; per_type_decoder_f NGAP_NR_PCI_decode_aper; per_type_encoder_f NGAP_NR_PCI_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.c b/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.c index 3c1535ec83..06e5911028 100644 --- a/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.c +++ b/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-Paging-Time-Window.h" diff --git a/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.h b/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.h index 60f6f2f496..b573f7cb67 100644 --- a/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.h +++ b/lib/asn1c/ngap/NGAP_NR-Paging-Time-Window.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_Paging_Time_Window_H_ @@ -67,7 +67,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NR_Paging_Time_Window_specs_1; asn_struct_free_f NGAP_NR_Paging_Time_Window_free; asn_struct_print_f NGAP_NR_Paging_Time_Window_print; asn_constr_check_f NGAP_NR_Paging_Time_Window_constraint; -jer_type_encoder_f NGAP_NR_Paging_Time_Window_encode_jer; per_type_decoder_f NGAP_NR_Paging_Time_Window_decode_aper; per_type_encoder_f NGAP_NR_Paging_Time_Window_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.c b/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.c index 211bc1a939..5303d3fcce 100644 --- a/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.c +++ b/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-Paging-eDRX-Cycle.h" diff --git a/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.h b/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.h index a16118a990..a1755b45ca 100644 --- a/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.h +++ b/lib/asn1c/ngap/NGAP_NR-Paging-eDRX-Cycle.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_Paging_eDRX_Cycle_H_ @@ -48,7 +48,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NR_Paging_eDRX_Cycle_specs_1; asn_struct_free_f NGAP_NR_Paging_eDRX_Cycle_free; asn_struct_print_f NGAP_NR_Paging_eDRX_Cycle_print; asn_constr_check_f NGAP_NR_Paging_eDRX_Cycle_constraint; -jer_type_encoder_f NGAP_NR_Paging_eDRX_Cycle_encode_jer; per_type_decoder_f NGAP_NR_Paging_eDRX_Cycle_decode_aper; per_type_encoder_f NGAP_NR_Paging_eDRX_Cycle_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.c b/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.c index 8db0efd6b5..a41a2bc5b7 100644 --- a/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.c +++ b/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NR-PagingeDRXInformation.h" diff --git a/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.h b/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.h index 583f684212..ad59b26a2b 100644 --- a/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.h +++ b/lib/asn1c/ngap/NGAP_NR-PagingeDRXInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NR_PagingeDRXInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_NRARFCN.c b/lib/asn1c/ngap/NGAP_NRARFCN.c index 3c303ea123..6356708390 100644 --- a/lib/asn1c/ngap/NGAP_NRARFCN.c +++ b/lib/asn1c/ngap/NGAP_NRARFCN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRARFCN.h" diff --git a/lib/asn1c/ngap/NGAP_NRARFCN.h b/lib/asn1c/ngap/NGAP_NRARFCN.h index b4da47c798..afb737499d 100644 --- a/lib/asn1c/ngap/NGAP_NRARFCN.h +++ b/lib/asn1c/ngap/NGAP_NRARFCN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRARFCN_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRARFCN; asn_struct_free_f NGAP_NRARFCN_free; asn_struct_print_f NGAP_NRARFCN_print; asn_constr_check_f NGAP_NRARFCN_constraint; -jer_type_encoder_f NGAP_NRARFCN_encode_jer; per_type_decoder_f NGAP_NRARFCN_decode_aper; per_type_encoder_f NGAP_NRARFCN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRCellIdentity.c b/lib/asn1c/ngap/NGAP_NRCellIdentity.c index 86a039f77c..574bd28aff 100644 --- a/lib/asn1c/ngap/NGAP_NRCellIdentity.c +++ b/lib/asn1c/ngap/NGAP_NRCellIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRCellIdentity.h" diff --git a/lib/asn1c/ngap/NGAP_NRCellIdentity.h b/lib/asn1c/ngap/NGAP_NRCellIdentity.h index 7186602e84..60a510c014 100644 --- a/lib/asn1c/ngap/NGAP_NRCellIdentity.h +++ b/lib/asn1c/ngap/NGAP_NRCellIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRCellIdentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRCellIdentity; asn_struct_free_f NGAP_NRCellIdentity_free; asn_struct_print_f NGAP_NRCellIdentity_print; asn_constr_check_f NGAP_NRCellIdentity_constraint; -jer_type_encoder_f NGAP_NRCellIdentity_encode_jer; per_type_decoder_f NGAP_NRCellIdentity_decode_aper; per_type_encoder_f NGAP_NRCellIdentity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.c b/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.c index 94330879ec..3125f6bd98 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.c +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRFrequencyBand-List.h" diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.h b/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.h index bf56e4c52d..eb4a5bb71e 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.h +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBand-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRFrequencyBand_List_H_ diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBand.c b/lib/asn1c/ngap/NGAP_NRFrequencyBand.c index bc564d4ccb..2a72121461 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBand.c +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRFrequencyBand.h" diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBand.h b/lib/asn1c/ngap/NGAP_NRFrequencyBand.h index 911a8ed108..5f5d10f809 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBand.h +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRFrequencyBand_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRFrequencyBand; asn_struct_free_f NGAP_NRFrequencyBand_free; asn_struct_print_f NGAP_NRFrequencyBand_print; asn_constr_check_f NGAP_NRFrequencyBand_constraint; -jer_type_encoder_f NGAP_NRFrequencyBand_encode_jer; per_type_decoder_f NGAP_NRFrequencyBand_decode_aper; per_type_encoder_f NGAP_NRFrequencyBand_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.c b/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.c index c1059c9db5..20d825101d 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.c +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRFrequencyBandItem.h" diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.h b/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.h index d0d0ad22a4..7d742ccda1 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.h +++ b/lib/asn1c/ngap/NGAP_NRFrequencyBandItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRFrequencyBandItem_H_ diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyInfo.c b/lib/asn1c/ngap/NGAP_NRFrequencyInfo.c index a14f2735bd..e4d49a0a67 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyInfo.c +++ b/lib/asn1c/ngap/NGAP_NRFrequencyInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRFrequencyInfo.h" diff --git a/lib/asn1c/ngap/NGAP_NRFrequencyInfo.h b/lib/asn1c/ngap/NGAP_NRFrequencyInfo.h index a0775cc71f..ba4b24f3d6 100644 --- a/lib/asn1c/ngap/NGAP_NRFrequencyInfo.h +++ b/lib/asn1c/ngap/NGAP_NRFrequencyInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRFrequencyInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.c b/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.c index a3edade7b5..43d5c630aa 100644 --- a/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.c +++ b/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRMobilityHistoryReport.h" diff --git a/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.h b/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.h index 3c43ffa893..15e02e3360 100644 --- a/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.h +++ b/lib/asn1c/ngap/NGAP_NRMobilityHistoryReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRMobilityHistoryReport_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRMobilityHistoryReport; asn_struct_free_f NGAP_NRMobilityHistoryReport_free; asn_struct_print_f NGAP_NRMobilityHistoryReport_print; asn_constr_check_f NGAP_NRMobilityHistoryReport_constraint; -jer_type_encoder_f NGAP_NRMobilityHistoryReport_encode_jer; per_type_decoder_f NGAP_NRMobilityHistoryReport_decode_aper; per_type_encoder_f NGAP_NRMobilityHistoryReport_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.c b/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.c index 34e9d5e250..09914c8d53 100644 --- a/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.c +++ b/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRNTNTAIInformation.h" diff --git a/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.h b/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.h index 6412cd40ee..862101ab2d 100644 --- a/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.h +++ b/lib/asn1c/ngap/NGAP_NRNTNTAIInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRNTNTAIInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_NRPPa-PDU.c b/lib/asn1c/ngap/NGAP_NRPPa-PDU.c index 9b70c097a1..37ed70697e 100644 --- a/lib/asn1c/ngap/NGAP_NRPPa-PDU.c +++ b/lib/asn1c/ngap/NGAP_NRPPa-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRPPa-PDU.h" diff --git a/lib/asn1c/ngap/NGAP_NRPPa-PDU.h b/lib/asn1c/ngap/NGAP_NRPPa-PDU.h index 966052ca2f..d6d9811f8a 100644 --- a/lib/asn1c/ngap/NGAP_NRPPa-PDU.h +++ b/lib/asn1c/ngap/NGAP_NRPPa-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRPPa_PDU_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRPPa_PDU; asn_struct_free_f NGAP_NRPPa_PDU_free; asn_struct_print_f NGAP_NRPPa_PDU_print; asn_constr_check_f NGAP_NRPPa_PDU_constraint; -jer_type_encoder_f NGAP_NRPPa_PDU_encode_jer; per_type_decoder_f NGAP_NRPPa_PDU_decode_aper; per_type_encoder_f NGAP_NRPPa_PDU_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.c b/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.c index 5a9e2193ef..31ef68de1a 100644 --- a/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.c +++ b/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRUERLFReportContainer.h" diff --git a/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.h b/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.h index e6e98be354..e0398149dd 100644 --- a/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.h +++ b/lib/asn1c/ngap/NGAP_NRUERLFReportContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRUERLFReportContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRUERLFReportContainer; asn_struct_free_f NGAP_NRUERLFReportContainer_free; asn_struct_print_f NGAP_NRUERLFReportContainer_print; asn_constr_check_f NGAP_NRUERLFReportContainer_constraint; -jer_type_encoder_f NGAP_NRUERLFReportContainer_encode_jer; per_type_decoder_f NGAP_NRUERLFReportContainer_decode_aper; per_type_encoder_f NGAP_NRUERLFReportContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.c b/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.c index 69001f7e89..440f1305f3 100644 --- a/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.c +++ b/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRUESidelinkAggregateMaximumBitrate.h" diff --git a/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.h b/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.h index 88bce21141..dbedf1d323 100644 --- a/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.h +++ b/lib/asn1c/ngap/NGAP_NRUESidelinkAggregateMaximumBitrate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRUESidelinkAggregateMaximumBitrate_H_ diff --git a/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.c b/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.c index 0f2950a36e..1002c92b50 100644 --- a/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.c +++ b/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRV2XServicesAuthorized.h" diff --git a/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.h b/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.h index 12d214e911..aa661b613b 100644 --- a/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.h +++ b/lib/asn1c/ngap/NGAP_NRV2XServicesAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRV2XServicesAuthorized_H_ diff --git a/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.c b/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.c index cd86de3d9d..a4dfc8c063 100644 --- a/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.c +++ b/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRencryptionAlgorithms.h" diff --git a/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.h b/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.h index ff09f2705d..f8cd1e46b6 100644 --- a/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.h +++ b/lib/asn1c/ngap/NGAP_NRencryptionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRencryptionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRencryptionAlgorithms; asn_struct_free_f NGAP_NRencryptionAlgorithms_free; asn_struct_print_f NGAP_NRencryptionAlgorithms_print; asn_constr_check_f NGAP_NRencryptionAlgorithms_constraint; -jer_type_encoder_f NGAP_NRencryptionAlgorithms_encode_jer; per_type_decoder_f NGAP_NRencryptionAlgorithms_decode_aper; per_type_encoder_f NGAP_NRencryptionAlgorithms_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.c b/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.c index 2aafca7693..f493c9bb13 100644 --- a/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.c +++ b/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NRintegrityProtectionAlgorithms.h" diff --git a/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.h b/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.h index 43730e6d74..510311b06a 100644 --- a/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.h +++ b/lib/asn1c/ngap/NGAP_NRintegrityProtectionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NRintegrityProtectionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NRintegrityProtectionAlgorithms; asn_struct_free_f NGAP_NRintegrityProtectionAlgorithms_free; asn_struct_print_f NGAP_NRintegrityProtectionAlgorithms_print; asn_constr_check_f NGAP_NRintegrityProtectionAlgorithms_constraint; -jer_type_encoder_f NGAP_NRintegrityProtectionAlgorithms_encode_jer; per_type_decoder_f NGAP_NRintegrityProtectionAlgorithms_decode_aper; per_type_encoder_f NGAP_NRintegrityProtectionAlgorithms_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NSAG-ID.c b/lib/asn1c/ngap/NGAP_NSAG-ID.c index 3539890f5c..805680b8ab 100644 --- a/lib/asn1c/ngap/NGAP_NSAG-ID.c +++ b/lib/asn1c/ngap/NGAP_NSAG-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NSAG-ID.h" diff --git a/lib/asn1c/ngap/NGAP_NSAG-ID.h b/lib/asn1c/ngap/NGAP_NSAG-ID.h index d412be2879..cf01907df9 100644 --- a/lib/asn1c/ngap/NGAP_NSAG-ID.h +++ b/lib/asn1c/ngap/NGAP_NSAG-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NSAG_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NSAG_ID; asn_struct_free_f NGAP_NSAG_ID_free; asn_struct_print_f NGAP_NSAG_ID_print; asn_constr_check_f NGAP_NSAG_ID_constraint; -jer_type_encoder_f NGAP_NSAG_ID_encode_jer; per_type_decoder_f NGAP_NSAG_ID_decode_aper; per_type_encoder_f NGAP_NSAG_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NetworkInstance.c b/lib/asn1c/ngap/NGAP_NetworkInstance.c index 1c1689a572..c594e76e03 100644 --- a/lib/asn1c/ngap/NGAP_NetworkInstance.c +++ b/lib/asn1c/ngap/NGAP_NetworkInstance.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NetworkInstance.h" diff --git a/lib/asn1c/ngap/NGAP_NetworkInstance.h b/lib/asn1c/ngap/NGAP_NetworkInstance.h index a1e07b308d..e097ab68ca 100644 --- a/lib/asn1c/ngap/NGAP_NetworkInstance.h +++ b/lib/asn1c/ngap/NGAP_NetworkInstance.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NetworkInstance_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NetworkInstance; asn_struct_free_f NGAP_NetworkInstance_free; asn_struct_print_f NGAP_NetworkInstance_print; asn_constr_check_f NGAP_NetworkInstance_constraint; -jer_type_encoder_f NGAP_NetworkInstance_encode_jer; per_type_decoder_f NGAP_NetworkInstance_decode_aper; per_type_encoder_f NGAP_NetworkInstance_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NewSecurityContextInd.c b/lib/asn1c/ngap/NGAP_NewSecurityContextInd.c index abb8a90433..e313b34aa7 100644 --- a/lib/asn1c/ngap/NGAP_NewSecurityContextInd.c +++ b/lib/asn1c/ngap/NGAP_NewSecurityContextInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NewSecurityContextInd.h" diff --git a/lib/asn1c/ngap/NGAP_NewSecurityContextInd.h b/lib/asn1c/ngap/NGAP_NewSecurityContextInd.h index 4b1abd24d8..92570219a5 100644 --- a/lib/asn1c/ngap/NGAP_NewSecurityContextInd.h +++ b/lib/asn1c/ngap/NGAP_NewSecurityContextInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NewSecurityContextInd_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NewSecurityContextInd_specs_1; asn_struct_free_f NGAP_NewSecurityContextInd_free; asn_struct_print_f NGAP_NewSecurityContextInd_print; asn_constr_check_f NGAP_NewSecurityContextInd_constraint; -jer_type_encoder_f NGAP_NewSecurityContextInd_encode_jer; per_type_decoder_f NGAP_NewSecurityContextInd_decode_aper; per_type_encoder_f NGAP_NewSecurityContextInd_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NextHopChainingCount.c b/lib/asn1c/ngap/NGAP_NextHopChainingCount.c index c3e10282bc..aae102e51e 100644 --- a/lib/asn1c/ngap/NGAP_NextHopChainingCount.c +++ b/lib/asn1c/ngap/NGAP_NextHopChainingCount.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NextHopChainingCount.h" diff --git a/lib/asn1c/ngap/NGAP_NextHopChainingCount.h b/lib/asn1c/ngap/NGAP_NextHopChainingCount.h index ee1a032430..08aac541e0 100644 --- a/lib/asn1c/ngap/NGAP_NextHopChainingCount.h +++ b/lib/asn1c/ngap/NGAP_NextHopChainingCount.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NextHopChainingCount_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NextHopChainingCount; asn_struct_free_f NGAP_NextHopChainingCount_free; asn_struct_print_f NGAP_NextHopChainingCount_print; asn_constr_check_f NGAP_NextHopChainingCount_constraint; -jer_type_encoder_f NGAP_NextHopChainingCount_encode_jer; per_type_decoder_f NGAP_NextHopChainingCount_decode_aper; per_type_encoder_f NGAP_NextHopChainingCount_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NextPagingAreaScope.c b/lib/asn1c/ngap/NGAP_NextPagingAreaScope.c index 5284fbe9cb..a4f69ebb11 100644 --- a/lib/asn1c/ngap/NGAP_NextPagingAreaScope.c +++ b/lib/asn1c/ngap/NGAP_NextPagingAreaScope.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NextPagingAreaScope.h" diff --git a/lib/asn1c/ngap/NGAP_NextPagingAreaScope.h b/lib/asn1c/ngap/NGAP_NextPagingAreaScope.h index 224184fdc3..5633963572 100644 --- a/lib/asn1c/ngap/NGAP_NextPagingAreaScope.h +++ b/lib/asn1c/ngap/NGAP_NextPagingAreaScope.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NextPagingAreaScope_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NextPagingAreaScope_specs_1; asn_struct_free_f NGAP_NextPagingAreaScope_free; asn_struct_print_f NGAP_NextPagingAreaScope_print; asn_constr_check_f NGAP_NextPagingAreaScope_constraint; -jer_type_encoder_f NGAP_NextPagingAreaScope_encode_jer; per_type_decoder_f NGAP_NextPagingAreaScope_decode_aper; per_type_encoder_f NGAP_NextPagingAreaScope_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NgENB-ID.c b/lib/asn1c/ngap/NGAP_NgENB-ID.c index 73f6cae5e3..8b57db6d9e 100644 --- a/lib/asn1c/ngap/NGAP_NgENB-ID.c +++ b/lib/asn1c/ngap/NGAP_NgENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NgENB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_NgENB-ID.h b/lib/asn1c/ngap/NGAP_NgENB-ID.h index 45ccd3c72c..e7836fa0e4 100644 --- a/lib/asn1c/ngap/NGAP_NgENB-ID.h +++ b/lib/asn1c/ngap/NGAP_NgENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NgENB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.c b/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.c index 9bc9d51346..652670f663 100644 --- a/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.c +++ b/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NonDynamic5QIDescriptor.h" diff --git a/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.h b/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.h index 58f724bc42..008d64f423 100644 --- a/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.h +++ b/lib/asn1c/ngap/NGAP_NonDynamic5QIDescriptor.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NonDynamic5QIDescriptor_H_ diff --git a/lib/asn1c/ngap/NGAP_NotAllowedTACs.c b/lib/asn1c/ngap/NGAP_NotAllowedTACs.c index edcd9befcd..e3a2b0da8d 100644 --- a/lib/asn1c/ngap/NGAP_NotAllowedTACs.c +++ b/lib/asn1c/ngap/NGAP_NotAllowedTACs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotAllowedTACs.h" diff --git a/lib/asn1c/ngap/NGAP_NotAllowedTACs.h b/lib/asn1c/ngap/NGAP_NotAllowedTACs.h index 3ed78a0b75..2eb3170b30 100644 --- a/lib/asn1c/ngap/NGAP_NotAllowedTACs.h +++ b/lib/asn1c/ngap/NGAP_NotAllowedTACs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotAllowedTACs_H_ diff --git a/lib/asn1c/ngap/NGAP_NotificationCause.c b/lib/asn1c/ngap/NGAP_NotificationCause.c index 46e07b2181..5bd962ca33 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCause.c +++ b/lib/asn1c/ngap/NGAP_NotificationCause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotificationCause.h" diff --git a/lib/asn1c/ngap/NGAP_NotificationCause.h b/lib/asn1c/ngap/NGAP_NotificationCause.h index a4100ffe17..f4b9ddcf6f 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCause.h +++ b/lib/asn1c/ngap/NGAP_NotificationCause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotificationCause_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NotificationCause_specs_1; asn_struct_free_f NGAP_NotificationCause_free; asn_struct_print_f NGAP_NotificationCause_print; asn_constr_check_f NGAP_NotificationCause_constraint; -jer_type_encoder_f NGAP_NotificationCause_encode_jer; per_type_decoder_f NGAP_NotificationCause_decode_aper; per_type_encoder_f NGAP_NotificationCause_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NotificationCell-Item.c b/lib/asn1c/ngap/NGAP_NotificationCell-Item.c index 3c18a2f4d9..150afd38d8 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCell-Item.c +++ b/lib/asn1c/ngap/NGAP_NotificationCell-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotificationCell-Item.h" diff --git a/lib/asn1c/ngap/NGAP_NotificationCell-Item.h b/lib/asn1c/ngap/NGAP_NotificationCell-Item.h index 0cce0a579c..c82cd3f94f 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCell-Item.h +++ b/lib/asn1c/ngap/NGAP_NotificationCell-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotificationCell_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_NotificationCellList.c b/lib/asn1c/ngap/NGAP_NotificationCellList.c index 6eafaeacfc..28cb9586a0 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCellList.c +++ b/lib/asn1c/ngap/NGAP_NotificationCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotificationCellList.h" diff --git a/lib/asn1c/ngap/NGAP_NotificationCellList.h b/lib/asn1c/ngap/NGAP_NotificationCellList.h index cefcdea8e2..3e122d1131 100644 --- a/lib/asn1c/ngap/NGAP_NotificationCellList.h +++ b/lib/asn1c/ngap/NGAP_NotificationCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotificationCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_NotificationControl.c b/lib/asn1c/ngap/NGAP_NotificationControl.c index 063e10ad39..7836947d9a 100644 --- a/lib/asn1c/ngap/NGAP_NotificationControl.c +++ b/lib/asn1c/ngap/NGAP_NotificationControl.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotificationControl.h" diff --git a/lib/asn1c/ngap/NGAP_NotificationControl.h b/lib/asn1c/ngap/NGAP_NotificationControl.h index c22c92cafc..19b33d7656 100644 --- a/lib/asn1c/ngap/NGAP_NotificationControl.h +++ b/lib/asn1c/ngap/NGAP_NotificationControl.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotificationControl_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NotificationControl_specs_1; asn_struct_free_f NGAP_NotificationControl_free; asn_struct_print_f NGAP_NotificationControl_print; asn_constr_check_f NGAP_NotificationControl_constraint; -jer_type_encoder_f NGAP_NotificationControl_encode_jer; per_type_decoder_f NGAP_NotificationControl_decode_aper; per_type_encoder_f NGAP_NotificationControl_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.c b/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.c index ab41532b0a..6299a8b595 100644 --- a/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.c +++ b/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NotifySourceNGRANNode.h" diff --git a/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.h b/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.h index b62ad1b284..ac4c9877d4 100644 --- a/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.h +++ b/lib/asn1c/ngap/NGAP_NotifySourceNGRANNode.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NotifySourceNGRANNode_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NotifySourceNGRANNode_specs_1; asn_struct_free_f NGAP_NotifySourceNGRANNode_free; asn_struct_print_f NGAP_NotifySourceNGRANNode_print; asn_constr_check_f NGAP_NotifySourceNGRANNode_constraint; -jer_type_encoder_f NGAP_NotifySourceNGRANNode_encode_jer; per_type_decoder_f NGAP_NotifySourceNGRANNode_decode_aper; per_type_encoder_f NGAP_NotifySourceNGRANNode_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.c b/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.c index 611aeb5cbc..3b122ed92f 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.c +++ b/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NumberOfBroadcasts.h" diff --git a/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.h b/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.h index 8eef484e33..e24744c4a1 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.h +++ b/lib/asn1c/ngap/NGAP_NumberOfBroadcasts.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NumberOfBroadcasts_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NumberOfBroadcasts; asn_struct_free_f NGAP_NumberOfBroadcasts_free; asn_struct_print_f NGAP_NumberOfBroadcasts_print; asn_constr_check_f NGAP_NumberOfBroadcasts_constraint; -jer_type_encoder_f NGAP_NumberOfBroadcasts_encode_jer; per_type_decoder_f NGAP_NumberOfBroadcasts_decode_aper; per_type_encoder_f NGAP_NumberOfBroadcasts_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.c b/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.c index e6d4ff94a8..8f406726e1 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.c +++ b/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NumberOfBroadcastsRequested.h" diff --git a/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.h b/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.h index 3caa1c0945..d9ab4526b2 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.h +++ b/lib/asn1c/ngap/NGAP_NumberOfBroadcastsRequested.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NumberOfBroadcastsRequested_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_NumberOfBroadcastsRequested; asn_struct_free_f NGAP_NumberOfBroadcastsRequested_free; asn_struct_print_f NGAP_NumberOfBroadcastsRequested_print; asn_constr_check_f NGAP_NumberOfBroadcastsRequested_constraint; -jer_type_encoder_f NGAP_NumberOfBroadcastsRequested_encode_jer; per_type_decoder_f NGAP_NumberOfBroadcastsRequested_decode_aper; per_type_encoder_f NGAP_NumberOfBroadcastsRequested_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.c b/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.c index b981e3b240..72fefb107a 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.c +++ b/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_NumberOfMeasurementReportingLevels.h" diff --git a/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.h b/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.h index 4a7db4a4e9..e854bc0cd5 100644 --- a/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.h +++ b/lib/asn1c/ngap/NGAP_NumberOfMeasurementReportingLevels.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_NumberOfMeasurementReportingLevels_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_NumberOfMeasurementReportingLe asn_struct_free_f NGAP_NumberOfMeasurementReportingLevels_free; asn_struct_print_f NGAP_NumberOfMeasurementReportingLevels_print; asn_constr_check_f NGAP_NumberOfMeasurementReportingLevels_constraint; -jer_type_encoder_f NGAP_NumberOfMeasurementReportingLevels_encode_jer; per_type_decoder_f NGAP_NumberOfMeasurementReportingLevels_decode_aper; per_type_encoder_f NGAP_NumberOfMeasurementReportingLevels_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_OnboardingSupport.c b/lib/asn1c/ngap/NGAP_OnboardingSupport.c index 3ecb4e82d0..3d494af591 100644 --- a/lib/asn1c/ngap/NGAP_OnboardingSupport.c +++ b/lib/asn1c/ngap/NGAP_OnboardingSupport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OnboardingSupport.h" diff --git a/lib/asn1c/ngap/NGAP_OnboardingSupport.h b/lib/asn1c/ngap/NGAP_OnboardingSupport.h index 78a55b51e3..8507f3eb0c 100644 --- a/lib/asn1c/ngap/NGAP_OnboardingSupport.h +++ b/lib/asn1c/ngap/NGAP_OnboardingSupport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OnboardingSupport_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_OnboardingSupport_specs_1; asn_struct_free_f NGAP_OnboardingSupport_free; asn_struct_print_f NGAP_OnboardingSupport_print; asn_constr_check_f NGAP_OnboardingSupport_constraint; -jer_type_encoder_f NGAP_OnboardingSupport_encode_jer; per_type_decoder_f NGAP_OnboardingSupport_decode_aper; per_type_encoder_f NGAP_OnboardingSupport_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_OverloadAction.c b/lib/asn1c/ngap/NGAP_OverloadAction.c index 1d3c7e464f..9f5f94d59c 100644 --- a/lib/asn1c/ngap/NGAP_OverloadAction.c +++ b/lib/asn1c/ngap/NGAP_OverloadAction.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadAction.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadAction.h b/lib/asn1c/ngap/NGAP_OverloadAction.h index 121f6b349a..467ac0d442 100644 --- a/lib/asn1c/ngap/NGAP_OverloadAction.h +++ b/lib/asn1c/ngap/NGAP_OverloadAction.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadAction_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_OverloadAction_specs_1; asn_struct_free_f NGAP_OverloadAction_free; asn_struct_print_f NGAP_OverloadAction_print; asn_constr_check_f NGAP_OverloadAction_constraint; -jer_type_encoder_f NGAP_OverloadAction_encode_jer; per_type_decoder_f NGAP_OverloadAction_decode_aper; per_type_encoder_f NGAP_OverloadAction_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_OverloadResponse.c b/lib/asn1c/ngap/NGAP_OverloadResponse.c index 1b9f9f5662..22b4fcc890 100644 --- a/lib/asn1c/ngap/NGAP_OverloadResponse.c +++ b/lib/asn1c/ngap/NGAP_OverloadResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadResponse.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadResponse.h b/lib/asn1c/ngap/NGAP_OverloadResponse.h index 35a8e11273..2568dc91b2 100644 --- a/lib/asn1c/ngap/NGAP_OverloadResponse.h +++ b/lib/asn1c/ngap/NGAP_OverloadResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_OverloadStart.c b/lib/asn1c/ngap/NGAP_OverloadStart.c index 16e8805b0d..a8491fd792 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStart.c +++ b/lib/asn1c/ngap/NGAP_OverloadStart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadStart.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadStart.h b/lib/asn1c/ngap/NGAP_OverloadStart.h index ce432f5de8..8a70f0b206 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStart.h +++ b/lib/asn1c/ngap/NGAP_OverloadStart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadStart_H_ diff --git a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.c b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.c index afc6cef78d..9c0ed639e7 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.c +++ b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadStartNSSAIItem.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.h b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.h index 3408da93ac..60eacc36d2 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.h +++ b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadStartNSSAIItem_H_ diff --git a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.c b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.c index 99c298d27e..fabd7ae2ff 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.c +++ b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadStartNSSAIList.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.h b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.h index 9dacb9f7d5..bdbd0b61ed 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.h +++ b/lib/asn1c/ngap/NGAP_OverloadStartNSSAIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadStartNSSAIList_H_ diff --git a/lib/asn1c/ngap/NGAP_OverloadStop.c b/lib/asn1c/ngap/NGAP_OverloadStop.c index b9890acc20..d160b901e2 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStop.c +++ b/lib/asn1c/ngap/NGAP_OverloadStop.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_OverloadStop.h" diff --git a/lib/asn1c/ngap/NGAP_OverloadStop.h b/lib/asn1c/ngap/NGAP_OverloadStop.h index 850dac1dfa..0b451e3852 100644 --- a/lib/asn1c/ngap/NGAP_OverloadStop.h +++ b/lib/asn1c/ngap/NGAP_OverloadStop.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_OverloadStop_H_ diff --git a/lib/asn1c/ngap/NGAP_PC5FlowBitRates.c b/lib/asn1c/ngap/NGAP_PC5FlowBitRates.c index 1a26301a49..7419ad2043 100644 --- a/lib/asn1c/ngap/NGAP_PC5FlowBitRates.c +++ b/lib/asn1c/ngap/NGAP_PC5FlowBitRates.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PC5FlowBitRates.h" diff --git a/lib/asn1c/ngap/NGAP_PC5FlowBitRates.h b/lib/asn1c/ngap/NGAP_PC5FlowBitRates.h index fbf494ad83..45b70e684d 100644 --- a/lib/asn1c/ngap/NGAP_PC5FlowBitRates.h +++ b/lib/asn1c/ngap/NGAP_PC5FlowBitRates.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PC5FlowBitRates_H_ diff --git a/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.c b/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.c index f424b7c256..18a6001232 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.c +++ b/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PC5QoSFlowItem.h" diff --git a/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.h b/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.h index bf941aa396..c487b26ec1 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.h +++ b/lib/asn1c/ngap/NGAP_PC5QoSFlowItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PC5QoSFlowItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PC5QoSFlowList.c b/lib/asn1c/ngap/NGAP_PC5QoSFlowList.c index 26f44fa6a6..bcbf5bae30 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSFlowList.c +++ b/lib/asn1c/ngap/NGAP_PC5QoSFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PC5QoSFlowList.h" diff --git a/lib/asn1c/ngap/NGAP_PC5QoSFlowList.h b/lib/asn1c/ngap/NGAP_PC5QoSFlowList.h index bcc8f68b30..5227de9560 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSFlowList.h +++ b/lib/asn1c/ngap/NGAP_PC5QoSFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PC5QoSFlowList_H_ diff --git a/lib/asn1c/ngap/NGAP_PC5QoSParameters.c b/lib/asn1c/ngap/NGAP_PC5QoSParameters.c index ef0a7f3e81..4c3e04d7f3 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSParameters.c +++ b/lib/asn1c/ngap/NGAP_PC5QoSParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PC5QoSParameters.h" diff --git a/lib/asn1c/ngap/NGAP_PC5QoSParameters.h b/lib/asn1c/ngap/NGAP_PC5QoSParameters.h index 5c833ff5e0..ee6c302709 100644 --- a/lib/asn1c/ngap/NGAP_PC5QoSParameters.h +++ b/lib/asn1c/ngap/NGAP_PC5QoSParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PC5QoSParameters_H_ diff --git a/lib/asn1c/ngap/NGAP_PCIListForMDT.c b/lib/asn1c/ngap/NGAP_PCIListForMDT.c index db87125fa1..e2d46ed40a 100644 --- a/lib/asn1c/ngap/NGAP_PCIListForMDT.c +++ b/lib/asn1c/ngap/NGAP_PCIListForMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PCIListForMDT.h" diff --git a/lib/asn1c/ngap/NGAP_PCIListForMDT.h b/lib/asn1c/ngap/NGAP_PCIListForMDT.h index 49564b90a4..1e599d7bed 100644 --- a/lib/asn1c/ngap/NGAP_PCIListForMDT.h +++ b/lib/asn1c/ngap/NGAP_PCIListForMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PCIListForMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.c b/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.c index 3870cd3291..21ea37447d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionAggregateMaximumBitRate.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.h b/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.h index 270aea6c3e..40ff7afc9d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionAggregateMaximumBitRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionAggregateMaximumBitRate_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionID.c b/lib/asn1c/ngap/NGAP_PDUSessionID.c index dbef1c7c37..8e518d1b48 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionID.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionID.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionID.h b/lib/asn1c/ngap/NGAP_PDUSessionID.h index 86d61b9d09..9ec78570df 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionID.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PDUSessionID; asn_struct_free_f NGAP_PDUSessionID_free; asn_struct_print_f NGAP_PDUSessionID_print; asn_constr_check_f NGAP_PDUSessionID_constraint; -jer_type_encoder_f NGAP_PDUSessionID_encode_jer; per_type_decoder_f NGAP_PDUSessionID_decode_aper; per_type_encoder_f NGAP_PDUSessionID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PDUSessionPairID.c b/lib/asn1c/ngap/NGAP_PDUSessionPairID.c index 13ad58373d..2d07429434 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionPairID.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionPairID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionPairID.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionPairID.h b/lib/asn1c/ngap/NGAP_PDUSessionPairID.h index 060e21a8dd..235f471561 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionPairID.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionPairID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionPairID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PDUSessionPairID; asn_struct_free_f NGAP_PDUSessionPairID_free; asn_struct_print_f NGAP_PDUSessionPairID_print; asn_constr_check_f NGAP_PDUSessionPairID_constraint; -jer_type_encoder_f NGAP_PDUSessionPairID_encode_jer; per_type_decoder_f NGAP_PDUSessionPairID_decode_aper; per_type_encoder_f NGAP_PDUSessionPairID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.c index e148c87340..e7bb088a56 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceAdmittedItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.h index bdacc506be..85a24fa2a3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceAdmittedItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.c index c4627912b5..0762df95af 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceAdmittedList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.h index 3e60fd2597..d8271f4992 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceAdmittedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceAdmittedList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.c index d69b753fec..bc34134d56 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToModifyItemModCfm.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.h index 0657fd0182..fab36f3733 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModCfm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToModifyItemModCfm_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.c index 12fd360769..e2eafbfe1d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToModifyItemModRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.h index 656af9f95a..8c3805b71b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyItemModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToModifyItemModRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.c index 0a3a1c451c..4eaa0d6272 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToModifyListModCfm.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.h index 6f7001281b..c60ba1673d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModCfm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToModifyListModCfm_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.c index 69c3724890..b59c350d15 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToModifyListModRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.h index 4bb489d7c9..1a70cc4d6c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToModifyListModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToModifyListModRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.c index 3100941521..f3cca30479 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToResumeItemRESReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.h index 68b39f9c67..d055c7c065 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToResumeItemRESReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.c index 33cba36390..b7307778e4 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToResumeItemRESRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.h index f2fb6b7adf..8d315ddcda 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeItemRESRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToResumeItemRESRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.c index 68b1305ba6..366e8bbcca 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToResumeListRESReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.h index d1d3ab6f99..91dcaa02c6 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToResumeListRESReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.c index f099ae698c..a8c9a05d1a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToResumeListRESRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.h index 6cb72431ad..1420ec5310 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToResumeListRESRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToResumeListRESRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.c index 6a366eff08..6d71e5c2ed 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupItemCxtFail.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.h index 6271f3b0c1..8abfd5867a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtFail.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupItemCxtFail_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.c index d2f2f3d4d7..e62c98bb2b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h index 4d9d64430c..e51f238016 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupItemCxtRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.c index 8004599fc2..2cccb8708d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupItemHOAck.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.h index fb9d7f6b8c..922c661e5b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemHOAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupItemHOAck_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.c index 8e246b515b..d903cbbaa9 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupItemPSReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.h index 0921d56d6d..2c2209663f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemPSReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupItemPSReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.c index 3a9776d35f..2b0ca4acd0 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupItemSURes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.h index c6d89288a5..2e2793702c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupItemSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupItemSURes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.c index 66e283748f..8418a8c147 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupListCxtFail.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.h index 28056a2924..ecee9041fe 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtFail.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupListCxtFail_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.c index 645d7de573..52a6c534d8 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupListCxtRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.h index 2be9425d55..8be85e4dc2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListCxtRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupListCxtRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.c index 317ba655a8..4c0d62c498 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupListHOAck.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.h index 9eddcc17f8..cc3f0e86b3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListHOAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupListHOAck_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.c index b3a393e0ca..f66101fab5 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupListPSReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.h index 8979c24e0b..0fd08d42eb 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListPSReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupListPSReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.c index 5d9cd6ae50..ccebbaaf8e 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceFailedToSetupListSURes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.h index eb287f2d13..34f38c532f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceFailedToSetupListSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceFailedToSetupListSURes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.c index b6912bf995..35a19a46f5 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceHandoverItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.h index 2c4174f0e0..97f5ab3113 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceHandoverItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.c index 2021c7b5ba..366d0e2088 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceHandoverList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.h index 1da91b1c3f..a09c3dfee0 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceHandoverList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceHandoverList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.c index f3bc3374b0..06e3652368 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.h index cff45dffe8..7ca367bc26 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.c index ae7a62a955..17f97dcb49 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.h index e1f11f1f63..4172eabcca 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.c index 08495b4c41..0eda45ba29 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceItemCxtRelCpl.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.h index b231e44813..d4fe5bc142 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelCpl.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceItemCxtRelCpl_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.c index 75239f30b4..430309c714 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceItemCxtRelReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.h index af29a45dc2..fbc5a76107 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemCxtRelReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceItemCxtRelReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.c index 06a091439f..2b62e88092 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceItemHORqd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.h index 874660292d..6a6a225b31 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceItemHORqd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceItemHORqd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.c index 5fce3b0cb6..f8c3a6b880 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceListCxtRelCpl.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.h index 138873899c..b03a8d4382 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelCpl.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceListCxtRelCpl_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.c index a74098962d..40896b1ec6 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceListCxtRelReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.h index de8e4c125d..0788d442df 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListCxtRelReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceListCxtRelReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.c index e03bc545ed..6585a63683 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceListHORqd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.h index f52a478488..8c6bbada30 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceListHORqd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceListHORqd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.c index b740757a63..f560b8a07a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyConfirm.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.h index 34809c5852..f4194f3465 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyConfirm_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.c index 10f02b681f..0088086497 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyConfirmTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.h index 6ecbdf5262..0ecf831a6f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyConfirmTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyConfirmTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.c index 7723ecbca3..4c3df4e576 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyIndication.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.h index ed290d5e31..b97bd141b2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.c index b3cc49c37a..94f9b3d228 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyIndicationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.h index 76dd028d73..7438187c5a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyIndicationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c index e4117d0205..49f03f2b98 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h index f53d4daf85..8b707daa53 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.c index a14c8ca076..8da98b0aa9 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyItemModCfm.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.h index f483b962e9..883ef17ed7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModCfm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyItemModCfm_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.c index 589c3018d4..61ded96c53 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyItemModInd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.h index 9787836b8e..ebe520e770 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyItemModInd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.c index d7fa1fed50..c503520402 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyItemModReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.h index a090c48eee..5ce3dbd187 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyItemModReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.c index 1e93960b18..f5551077a3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyItemModRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.h index af64736014..0b23f91e44 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyItemModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyItemModRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.c index 33ea96e55b..1b8b045455 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyListModCfm.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.h index 81ba357bbc..ba65606fb2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModCfm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyListModCfm_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.c index 46e54a61d9..53d9748880 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyListModInd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.h index 2ffb0520f3..6bb1e29fa7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyListModInd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.c index 804df2424c..80497ba03f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyListModReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.h index be3ff07732..e58351f595 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyListModReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.c index 2c48fcc9a6..8670bca227 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyListModRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.h index 75a1e5bc9b..a188b878eb 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyListModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyListModRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.c index 501402f99e..9a813c10fb 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyRequest.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.h index 2b5c975a49..53f4416302 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.c index da68e1e754..beacb27d6c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.h index e125098123..6b9aad7487 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.c index cf6f7008ea..f21ee42491 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyResponse.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.h index d691b0bb11..65cfe45eae 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.c index 4f65150209..34018cd41f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.h index dea005a576..e9df8f0128 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c index 14955b68d3..51092e07a3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h index 8b7832b858..ef30f6f1d7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.c index 6d2930fb6e..7eb4e4668f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceNotify.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.h index d662c37fff..e74ff04682 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotify.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceNotify_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.c index 7aea6f23db..aa8bd32d69 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceNotifyItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.h index 14b3ddce34..4d13b7a5c1 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceNotifyItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.c index ca52d93fc2..739e888c50 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceNotifyList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.h index f980f39efc..15eae2e622 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceNotifyList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.c index b8e4ca9b74..d1b995733b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceNotifyReleasedTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.h index 8bafdf5f72..1809e61fd7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyReleasedTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceNotifyReleasedTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.c index e6546d4597..0a51434c47 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceNotifyTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.h index 283c31666d..cdaed2e532 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceNotifyTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceNotifyTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.c index 280f919689..46f6c9ea29 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleaseCommand.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.h index e1054a2cb1..aca5306082 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleaseCommand_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.c index cea1a01776..1884f0ae7f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleaseCommandTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.h index 28f8fda76e..4aef02b167 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseCommandTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleaseCommandTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.c index 262cabc869..2dccd4c7d2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleaseResponse.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.h index 4b799824e6..54db50d08b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleaseResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.c index adb5d4138f..8cff08a22b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleaseResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.h index 388bdb172b..ee96df2181 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleaseResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleaseResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.c index 74a9e0ea79..0742b05b10 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedItemNot.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.h index f1649e5c35..42d1691a09 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemNot.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedItemNot_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.c index 6c79e66283..8b19c253d2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedItemPSAck.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.h index e9fbeee2aa..961bef02b8 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedItemPSAck_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.c index a5e774d9ab..f65be6f997 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedItemPSFail.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.h index 7603ea3349..0aaec3cdf2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemPSFail.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedItemPSFail_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.c index c647ee04b8..1b2b7eca49 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedItemRelRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.h index 1858600209..1b584e99c7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedItemRelRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedItemRelRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.c index ef09f9607e..19c1db6f62 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedListNot.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.h index 570dd295e4..4c02ab887b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListNot.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedListNot_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.c index 202bde101d..4c1c44272f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedListPSAck.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.h index c562ebe2d8..6ca9eca6da 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedListPSAck_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.c index f20a37d283..f08f757bda 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedListPSFail.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.h index 5d29724481..cc8d38e039 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListPSFail.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedListPSFail_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.c index ae4af2a239..125c6ecdd9 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceReleasedListRelRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.h index cf57a52474..2ae9f104bd 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceReleasedListRelRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceReleasedListRelRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.c index cc2d57028d..998e57740c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceResumeItemRESReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.h index 9a36a32516..e1f34628fb 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceResumeItemRESReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.c index d4591f6212..7d0b2d97f8 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceResumeItemRESRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.h index 3ecbd5007f..58b7e30205 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeItemRESRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceResumeItemRESRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.c index 9f0b4a07a5..3d5f04b1d9 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceResumeListRESReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.h index bb85599d46..14ab1bf78b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceResumeListRESReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.c index b021fff426..ad82faf71b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceResumeListRESRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.h index deb4f42d1e..e51fb0547c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceResumeListRESRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceResumeListRESRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.c index 5ceaa8ac76..324005fbb3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSecondaryRATUsageItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.h index 05d1d021f2..105e12a836 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSecondaryRATUsageItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.c index 5c670c07ea..8742ffd7ab 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSecondaryRATUsageList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.h index a80e0e1d72..4988220ace 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSecondaryRATUsageList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSecondaryRATUsageList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.c index 4a2363f205..9d2d67455e 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupItemCxtReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.h index bd3ea3ef5e..fa0bdb46f2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupItemCxtReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.c index b79530b7bf..3fa5c80d02 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupItemCxtRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.h index 80e0aeaca1..d2b088be3d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemCxtRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupItemCxtRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.c index ae3f006d12..071f0c9fb2 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupItemHOReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.h index 6b63f6e43e..4240a19a2d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemHOReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupItemHOReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.c index 0b8fcea8fd..2a6b260e57 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupItemSUReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.h index 8635018a92..f2d38c68af 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupItemSUReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.c index b407440fbc..21a732a1ba 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupItemSURes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.h index 745a8542fb..23ab3f1594 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupItemSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupItemSURes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.c index 8a518a7d64..ec645a6140 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupListCxtReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.h index a9720e59bd..2afbc518c5 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupListCxtReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.c index e720ff2c3d..6682b042a7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupListCxtRes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.h index 0e01954328..15d8307531 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListCxtRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupListCxtRes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.c index e9d202e4db..d784881a2f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupListHOReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.h index 189862c4bd..0b9544d3c8 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListHOReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupListHOReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.c index 0a2989066b..7d64712e91 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupListSUReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.h index 71dcaaed4c..6abbbca4d7 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupListSUReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.c index ca8353c55b..1d0e8b8ff3 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupListSURes.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.h index a1a01802e3..d97b9d49a4 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupListSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupListSURes_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.c index 1e967709ff..1dec84647c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupRequest.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.h index 0e65258d7b..50fc751f23 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.c index b9b6475dca..97bfd3f39b 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.h index f8d1ddc260..6527251c99 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.c index c3b0f7be89..86d33272f9 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupResponse.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.h index 4de7ea2c5e..2fa5f2c917 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.c index 1ab70ed6e4..a448438c8f 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.h index a998891c71..2be0b94e61 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c index 852176cfd7..2fc5878627 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h index 05d4ce32cf..82139b937a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.c index 3edcb82799..889e224c7c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSuspendItemSUSReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.h index f96c20ff0a..bc78e495c4 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendItemSUSReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSuspendItemSUSReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.c index 6ec4df07af..cccac3f423 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSuspendListSUSReq.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.h index 69b19d1257..ede8113685 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSuspendListSUSReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSuspendListSUSReq_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.c index f972a46f28..d161573695 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSwitchedItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.h index d400879a47..d94f3db935 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSwitchedItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.c index 98342f6965..22eea3df14 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceSwitchedList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.h index f125090d65..0655df110c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceSwitchedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceSwitchedList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.c index 0786a1f940..b622b01ff6 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToBeSwitchedDLItem.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.h index 610f290191..f42b70c83a 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToBeSwitchedDLItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.c index 70c38f235f..118eaa3fdf 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToBeSwitchedDLList.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.h index 604308918d..833c8b69bf 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToBeSwitchedDLList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToBeSwitchedDLList_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.c index 3f34438647..56dad6994d 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToReleaseItemHOCmd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.h index 5872a862ef..3807233a1e 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemHOCmd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToReleaseItemHOCmd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.c index 3eb4618545..20674c4635 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToReleaseItemRelCmd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.h index 3d0d42f17a..c4626cb788 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseItemRelCmd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToReleaseItemRelCmd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.c index cf18bffb60..c34d470e73 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToReleaseListHOCmd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.h index af1b1b413f..684aea1c41 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListHOCmd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToReleaseListHOCmd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.c b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.c index b263a4b2f7..734aee3434 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionResourceToReleaseListRelCmd.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.h b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.h index b3c5221719..3679c976a8 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionResourceToReleaseListRelCmd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionResourceToReleaseListRelCmd_H_ diff --git a/lib/asn1c/ngap/NGAP_PDUSessionType.c b/lib/asn1c/ngap/NGAP_PDUSessionType.c index 77d8a8f05e..c59622b57e 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionType.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionType.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionType.h b/lib/asn1c/ngap/NGAP_PDUSessionType.h index f872cb33b8..b68e44d714 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionType.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionType_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PDUSessionType_specs_1; asn_struct_free_f NGAP_PDUSessionType_free; asn_struct_print_f NGAP_PDUSessionType_print; asn_constr_check_f NGAP_PDUSessionType_constraint; -jer_type_encoder_f NGAP_PDUSessionType_encode_jer; per_type_decoder_f NGAP_PDUSessionType_decode_aper; per_type_encoder_f NGAP_PDUSessionType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.c b/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.c index 42c0b2f70a..c0f210393c 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.c +++ b/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PDUSessionUsageReport.h" diff --git a/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.h b/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.h index f0e5990799..6070f9e36e 100644 --- a/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.h +++ b/lib/asn1c/ngap/NGAP_PDUSessionUsageReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PDUSessionUsageReport_H_ diff --git a/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.c b/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.c index 3a923b24cd..9b99507c92 100644 --- a/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.c +++ b/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PEIPSassistanceInformation.h" diff --git a/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.h b/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.h index a202a31af4..8ed6530744 100644 --- a/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.h +++ b/lib/asn1c/ngap/NGAP_PEIPSassistanceInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PEIPSassistanceInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.c b/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.c index f8364d07ae..a810fef132 100644 --- a/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.c +++ b/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PLMNAreaBasedQMC.h" diff --git a/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.h b/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.h index db584d4759..425f662621 100644 --- a/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.h +++ b/lib/asn1c/ngap/NGAP_PLMNAreaBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PLMNAreaBasedQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_PLMNIdentity.c b/lib/asn1c/ngap/NGAP_PLMNIdentity.c index 97e4a6a5d1..fdaa43d142 100644 --- a/lib/asn1c/ngap/NGAP_PLMNIdentity.c +++ b/lib/asn1c/ngap/NGAP_PLMNIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PLMNIdentity.h" diff --git a/lib/asn1c/ngap/NGAP_PLMNIdentity.h b/lib/asn1c/ngap/NGAP_PLMNIdentity.h index 99ef10e290..ec739c8daf 100644 --- a/lib/asn1c/ngap/NGAP_PLMNIdentity.h +++ b/lib/asn1c/ngap/NGAP_PLMNIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PLMNIdentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PLMNIdentity; asn_struct_free_f NGAP_PLMNIdentity_free; asn_struct_print_f NGAP_PLMNIdentity_print; asn_constr_check_f NGAP_PLMNIdentity_constraint; -jer_type_encoder_f NGAP_PLMNIdentity_encode_jer; per_type_decoder_f NGAP_PLMNIdentity_decode_aper; per_type_encoder_f NGAP_PLMNIdentity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PLMNListforQMC.c b/lib/asn1c/ngap/NGAP_PLMNListforQMC.c index ea670627c8..0896caf405 100644 --- a/lib/asn1c/ngap/NGAP_PLMNListforQMC.c +++ b/lib/asn1c/ngap/NGAP_PLMNListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PLMNListforQMC.h" diff --git a/lib/asn1c/ngap/NGAP_PLMNListforQMC.h b/lib/asn1c/ngap/NGAP_PLMNListforQMC.h index fc7fa3520e..77bc7b0971 100644 --- a/lib/asn1c/ngap/NGAP_PLMNListforQMC.h +++ b/lib/asn1c/ngap/NGAP_PLMNListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PLMNListforQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_PLMNSupportItem.c b/lib/asn1c/ngap/NGAP_PLMNSupportItem.c index 7c2594ca74..70db097236 100644 --- a/lib/asn1c/ngap/NGAP_PLMNSupportItem.c +++ b/lib/asn1c/ngap/NGAP_PLMNSupportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PLMNSupportItem.h" diff --git a/lib/asn1c/ngap/NGAP_PLMNSupportItem.h b/lib/asn1c/ngap/NGAP_PLMNSupportItem.h index 76d71f8cc7..a3668e3f2a 100644 --- a/lib/asn1c/ngap/NGAP_PLMNSupportItem.h +++ b/lib/asn1c/ngap/NGAP_PLMNSupportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PLMNSupportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_PLMNSupportList.c b/lib/asn1c/ngap/NGAP_PLMNSupportList.c index c5e8dcbee8..4368068a1b 100644 --- a/lib/asn1c/ngap/NGAP_PLMNSupportList.c +++ b/lib/asn1c/ngap/NGAP_PLMNSupportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PLMNSupportList.h" diff --git a/lib/asn1c/ngap/NGAP_PLMNSupportList.h b/lib/asn1c/ngap/NGAP_PLMNSupportList.h index bdd4836624..937da8b500 100644 --- a/lib/asn1c/ngap/NGAP_PLMNSupportList.h +++ b/lib/asn1c/ngap/NGAP_PLMNSupportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PLMNSupportList_H_ diff --git a/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.c b/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.c index cdf618b6aa..b066d57297 100644 --- a/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.c +++ b/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PNI-NPN-MobilityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.h b/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.h index c11af62715..6d315d1a3f 100644 --- a/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.h +++ b/lib/asn1c/ngap/NGAP_PNI-NPN-MobilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PNI_NPN_MobilityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_PWSCancelRequest.c b/lib/asn1c/ngap/NGAP_PWSCancelRequest.c index 28935db253..176fdbf81d 100644 --- a/lib/asn1c/ngap/NGAP_PWSCancelRequest.c +++ b/lib/asn1c/ngap/NGAP_PWSCancelRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PWSCancelRequest.h" diff --git a/lib/asn1c/ngap/NGAP_PWSCancelRequest.h b/lib/asn1c/ngap/NGAP_PWSCancelRequest.h index c8f7ff5020..ebd93fd940 100644 --- a/lib/asn1c/ngap/NGAP_PWSCancelRequest.h +++ b/lib/asn1c/ngap/NGAP_PWSCancelRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PWSCancelRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_PWSCancelResponse.c b/lib/asn1c/ngap/NGAP_PWSCancelResponse.c index 39ea24ec4e..49f1802d76 100644 --- a/lib/asn1c/ngap/NGAP_PWSCancelResponse.c +++ b/lib/asn1c/ngap/NGAP_PWSCancelResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PWSCancelResponse.h" diff --git a/lib/asn1c/ngap/NGAP_PWSCancelResponse.h b/lib/asn1c/ngap/NGAP_PWSCancelResponse.h index 5594817d2b..6ca313b06d 100644 --- a/lib/asn1c/ngap/NGAP_PWSCancelResponse.h +++ b/lib/asn1c/ngap/NGAP_PWSCancelResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PWSCancelResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.c b/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.c index 18a6d03b56..a588a65c7b 100644 --- a/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.c +++ b/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PWSFailedCellIDList.h" diff --git a/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.h b/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.h index e65e420114..4dba6f641e 100644 --- a/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.h +++ b/lib/asn1c/ngap/NGAP_PWSFailedCellIDList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PWSFailedCellIDList_H_ diff --git a/lib/asn1c/ngap/NGAP_PWSFailureIndication.c b/lib/asn1c/ngap/NGAP_PWSFailureIndication.c index a1210d729a..d247204e25 100644 --- a/lib/asn1c/ngap/NGAP_PWSFailureIndication.c +++ b/lib/asn1c/ngap/NGAP_PWSFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PWSFailureIndication.h" diff --git a/lib/asn1c/ngap/NGAP_PWSFailureIndication.h b/lib/asn1c/ngap/NGAP_PWSFailureIndication.h index 04ee737b82..05ca5bb198 100644 --- a/lib/asn1c/ngap/NGAP_PWSFailureIndication.h +++ b/lib/asn1c/ngap/NGAP_PWSFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PWSFailureIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_PWSRestartIndication.c b/lib/asn1c/ngap/NGAP_PWSRestartIndication.c index fe72e16918..3af2a6392f 100644 --- a/lib/asn1c/ngap/NGAP_PWSRestartIndication.c +++ b/lib/asn1c/ngap/NGAP_PWSRestartIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PWSRestartIndication.h" diff --git a/lib/asn1c/ngap/NGAP_PWSRestartIndication.h b/lib/asn1c/ngap/NGAP_PWSRestartIndication.h index 8bda3810a0..895f718e5f 100644 --- a/lib/asn1c/ngap/NGAP_PWSRestartIndication.h +++ b/lib/asn1c/ngap/NGAP_PWSRestartIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PWSRestartIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_PacketDelayBudget.c b/lib/asn1c/ngap/NGAP_PacketDelayBudget.c index f813c5c5e9..2c34e4f5d4 100644 --- a/lib/asn1c/ngap/NGAP_PacketDelayBudget.c +++ b/lib/asn1c/ngap/NGAP_PacketDelayBudget.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PacketDelayBudget.h" diff --git a/lib/asn1c/ngap/NGAP_PacketDelayBudget.h b/lib/asn1c/ngap/NGAP_PacketDelayBudget.h index 325bd0d603..28d695e864 100644 --- a/lib/asn1c/ngap/NGAP_PacketDelayBudget.h +++ b/lib/asn1c/ngap/NGAP_PacketDelayBudget.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PacketDelayBudget_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PacketDelayBudget; asn_struct_free_f NGAP_PacketDelayBudget_free; asn_struct_print_f NGAP_PacketDelayBudget_print; asn_constr_check_f NGAP_PacketDelayBudget_constraint; -jer_type_encoder_f NGAP_PacketDelayBudget_encode_jer; per_type_decoder_f NGAP_PacketDelayBudget_decode_aper; per_type_encoder_f NGAP_PacketDelayBudget_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PacketErrorRate.c b/lib/asn1c/ngap/NGAP_PacketErrorRate.c index 6a0097f420..5421fbd922 100644 --- a/lib/asn1c/ngap/NGAP_PacketErrorRate.c +++ b/lib/asn1c/ngap/NGAP_PacketErrorRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PacketErrorRate.h" diff --git a/lib/asn1c/ngap/NGAP_PacketErrorRate.h b/lib/asn1c/ngap/NGAP_PacketErrorRate.h index 19b901f92f..17e95a2da7 100644 --- a/lib/asn1c/ngap/NGAP_PacketErrorRate.h +++ b/lib/asn1c/ngap/NGAP_PacketErrorRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PacketErrorRate_H_ diff --git a/lib/asn1c/ngap/NGAP_PacketLossRate.c b/lib/asn1c/ngap/NGAP_PacketLossRate.c index c2adb3869f..60749af319 100644 --- a/lib/asn1c/ngap/NGAP_PacketLossRate.c +++ b/lib/asn1c/ngap/NGAP_PacketLossRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PacketLossRate.h" diff --git a/lib/asn1c/ngap/NGAP_PacketLossRate.h b/lib/asn1c/ngap/NGAP_PacketLossRate.h index c528bd965c..56582b42e7 100644 --- a/lib/asn1c/ngap/NGAP_PacketLossRate.h +++ b/lib/asn1c/ngap/NGAP_PacketLossRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PacketLossRate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PacketLossRate; asn_struct_free_f NGAP_PacketLossRate_free; asn_struct_print_f NGAP_PacketLossRate_print; asn_constr_check_f NGAP_PacketLossRate_constraint; -jer_type_encoder_f NGAP_PacketLossRate_encode_jer; per_type_decoder_f NGAP_PacketLossRate_decode_aper; per_type_encoder_f NGAP_PacketLossRate_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Paging.c b/lib/asn1c/ngap/NGAP_Paging.c index 7fbd6d0ae1..73437e2cd7 100644 --- a/lib/asn1c/ngap/NGAP_Paging.c +++ b/lib/asn1c/ngap/NGAP_Paging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Paging.h" diff --git a/lib/asn1c/ngap/NGAP_Paging.h b/lib/asn1c/ngap/NGAP_Paging.h index 399bef6c71..e0571d4551 100644 --- a/lib/asn1c/ngap/NGAP_Paging.h +++ b/lib/asn1c/ngap/NGAP_Paging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Paging_H_ diff --git a/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.c b/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.c index 6ee7411bde..89c684669d 100644 --- a/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.c +++ b/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingAssisDataforCEcapabUE.h" diff --git a/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.h b/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.h index e47d7993c9..4b7dee9d40 100644 --- a/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.h +++ b/lib/asn1c/ngap/NGAP_PagingAssisDataforCEcapabUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingAssisDataforCEcapabUE_H_ diff --git a/lib/asn1c/ngap/NGAP_PagingAttemptCount.c b/lib/asn1c/ngap/NGAP_PagingAttemptCount.c index 796e1af721..4fab5ebf12 100644 --- a/lib/asn1c/ngap/NGAP_PagingAttemptCount.c +++ b/lib/asn1c/ngap/NGAP_PagingAttemptCount.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingAttemptCount.h" diff --git a/lib/asn1c/ngap/NGAP_PagingAttemptCount.h b/lib/asn1c/ngap/NGAP_PagingAttemptCount.h index ebc5340bd4..cea2c539a5 100644 --- a/lib/asn1c/ngap/NGAP_PagingAttemptCount.h +++ b/lib/asn1c/ngap/NGAP_PagingAttemptCount.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingAttemptCount_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PagingAttemptCount; asn_struct_free_f NGAP_PagingAttemptCount_free; asn_struct_print_f NGAP_PagingAttemptCount_print; asn_constr_check_f NGAP_PagingAttemptCount_constraint; -jer_type_encoder_f NGAP_PagingAttemptCount_encode_jer; per_type_decoder_f NGAP_PagingAttemptCount_decode_aper; per_type_encoder_f NGAP_PagingAttemptCount_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingAttemptInformation.c b/lib/asn1c/ngap/NGAP_PagingAttemptInformation.c index e0b074a9ed..971545d97e 100644 --- a/lib/asn1c/ngap/NGAP_PagingAttemptInformation.c +++ b/lib/asn1c/ngap/NGAP_PagingAttemptInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingAttemptInformation.h" diff --git a/lib/asn1c/ngap/NGAP_PagingAttemptInformation.h b/lib/asn1c/ngap/NGAP_PagingAttemptInformation.h index 1c2370eb48..d6e7f0c5c4 100644 --- a/lib/asn1c/ngap/NGAP_PagingAttemptInformation.h +++ b/lib/asn1c/ngap/NGAP_PagingAttemptInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingAttemptInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_PagingCause.c b/lib/asn1c/ngap/NGAP_PagingCause.c index e43df75ad9..787e829d22 100644 --- a/lib/asn1c/ngap/NGAP_PagingCause.c +++ b/lib/asn1c/ngap/NGAP_PagingCause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingCause.h" diff --git a/lib/asn1c/ngap/NGAP_PagingCause.h b/lib/asn1c/ngap/NGAP_PagingCause.h index d24dc18220..a61d10cb2e 100644 --- a/lib/asn1c/ngap/NGAP_PagingCause.h +++ b/lib/asn1c/ngap/NGAP_PagingCause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingCause_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingCause_specs_1; asn_struct_free_f NGAP_PagingCause_free; asn_struct_print_f NGAP_PagingCause_print; asn_constr_check_f NGAP_PagingCause_constraint; -jer_type_encoder_f NGAP_PagingCause_encode_jer; per_type_decoder_f NGAP_PagingCause_decode_aper; per_type_encoder_f NGAP_PagingCause_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.c b/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.c index e6e3ae016f..9f94f34468 100644 --- a/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.c +++ b/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingCauseIndicationForVoiceService.h" diff --git a/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.h b/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.h index d291b0af95..cadfdd67ad 100644 --- a/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.h +++ b/lib/asn1c/ngap/NGAP_PagingCauseIndicationForVoiceService.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingCauseIndicationForVoiceService_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingCauseIndicationForVoiceS asn_struct_free_f NGAP_PagingCauseIndicationForVoiceService_free; asn_struct_print_f NGAP_PagingCauseIndicationForVoiceService_print; asn_constr_check_f NGAP_PagingCauseIndicationForVoiceService_constraint; -jer_type_encoder_f NGAP_PagingCauseIndicationForVoiceService_encode_jer; per_type_decoder_f NGAP_PagingCauseIndicationForVoiceService_decode_aper; per_type_encoder_f NGAP_PagingCauseIndicationForVoiceService_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingDRX.c b/lib/asn1c/ngap/NGAP_PagingDRX.c index be82fe14aa..dfc6b1bfde 100644 --- a/lib/asn1c/ngap/NGAP_PagingDRX.c +++ b/lib/asn1c/ngap/NGAP_PagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingDRX.h" diff --git a/lib/asn1c/ngap/NGAP_PagingDRX.h b/lib/asn1c/ngap/NGAP_PagingDRX.h index 7c8fe37550..56a2f9b556 100644 --- a/lib/asn1c/ngap/NGAP_PagingDRX.h +++ b/lib/asn1c/ngap/NGAP_PagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingDRX_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingDRX_specs_1; asn_struct_free_f NGAP_PagingDRX_free; asn_struct_print_f NGAP_PagingDRX_print; asn_constr_check_f NGAP_PagingDRX_constraint; -jer_type_encoder_f NGAP_PagingDRX_encode_jer; per_type_decoder_f NGAP_PagingDRX_decode_aper; per_type_encoder_f NGAP_PagingDRX_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingOrigin.c b/lib/asn1c/ngap/NGAP_PagingOrigin.c index 4ee791559c..053a1918b4 100644 --- a/lib/asn1c/ngap/NGAP_PagingOrigin.c +++ b/lib/asn1c/ngap/NGAP_PagingOrigin.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingOrigin.h" diff --git a/lib/asn1c/ngap/NGAP_PagingOrigin.h b/lib/asn1c/ngap/NGAP_PagingOrigin.h index 4fbbb2688e..0212104e80 100644 --- a/lib/asn1c/ngap/NGAP_PagingOrigin.h +++ b/lib/asn1c/ngap/NGAP_PagingOrigin.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingOrigin_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingOrigin_specs_1; asn_struct_free_f NGAP_PagingOrigin_free; asn_struct_print_f NGAP_PagingOrigin_print; asn_constr_check_f NGAP_PagingOrigin_constraint; -jer_type_encoder_f NGAP_PagingOrigin_encode_jer; per_type_decoder_f NGAP_PagingOrigin_decode_aper; per_type_encoder_f NGAP_PagingOrigin_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingPriority.c b/lib/asn1c/ngap/NGAP_PagingPriority.c index e99317e2d0..b9a6613537 100644 --- a/lib/asn1c/ngap/NGAP_PagingPriority.c +++ b/lib/asn1c/ngap/NGAP_PagingPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingPriority.h" diff --git a/lib/asn1c/ngap/NGAP_PagingPriority.h b/lib/asn1c/ngap/NGAP_PagingPriority.h index 1957ee7cea..aef1238714 100644 --- a/lib/asn1c/ngap/NGAP_PagingPriority.h +++ b/lib/asn1c/ngap/NGAP_PagingPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingPriority_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingPriority_specs_1; asn_struct_free_f NGAP_PagingPriority_free; asn_struct_print_f NGAP_PagingPriority_print; asn_constr_check_f NGAP_PagingPriority_constraint; -jer_type_encoder_f NGAP_PagingPriority_encode_jer; per_type_decoder_f NGAP_PagingPriority_decode_aper; per_type_encoder_f NGAP_PagingPriority_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.c b/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.c index 4fe979f6ab..a4349092de 100644 --- a/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.c +++ b/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PagingProbabilityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.h b/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.h index e6eec31c7f..6f86bd3f7f 100644 --- a/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.h +++ b/lib/asn1c/ngap/NGAP_PagingProbabilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PagingProbabilityInformation_H_ @@ -56,7 +56,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PagingProbabilityInformation_s asn_struct_free_f NGAP_PagingProbabilityInformation_free; asn_struct_print_f NGAP_PagingProbabilityInformation_print; asn_constr_check_f NGAP_PagingProbabilityInformation_constraint; -jer_type_encoder_f NGAP_PagingProbabilityInformation_encode_jer; per_type_decoder_f NGAP_PagingProbabilityInformation_decode_aper; per_type_encoder_f NGAP_PagingProbabilityInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequest.c b/lib/asn1c/ngap/NGAP_PathSwitchRequest.c index 037b139781..d95ce33bfb 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequest.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequest.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequest.h b/lib/asn1c/ngap/NGAP_PathSwitchRequest.h index a419719bde..bd42b0f7be 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequest.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.c index 8a8b5ff766..fa615d40df 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.h index ec042af835..6d43e02212 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.c index 4ead1e1d6b..24e19c9461 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestAcknowledgeTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.h index d8efb22028..5e9c9396e1 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestAcknowledgeTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestAcknowledgeTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.c index abf45a3a36..8d138c40a3 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestFailure.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.h index fcf886081e..58b3f4e010 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.c index ac8f191d2e..9af28544ad 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestSetupFailedTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.h index 82a2b72c79..575b305fdf 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestSetupFailedTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestSetupFailedTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.c index 27cf2ae42f..2baf5b9b1c 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.h index a2e2c6bc7b..4c461960ec 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.c b/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.c index 6232a69f0b..c4353f2d58 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.c +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PathSwitchRequestUnsuccessfulTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.h b/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.h index f981770119..ad30522e5d 100644 --- a/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.h +++ b/lib/asn1c/ngap/NGAP_PathSwitchRequestUnsuccessfulTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PathSwitchRequestUnsuccessfulTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_PedestrianUE.c b/lib/asn1c/ngap/NGAP_PedestrianUE.c index ff71f73285..89be6bbe44 100644 --- a/lib/asn1c/ngap/NGAP_PedestrianUE.c +++ b/lib/asn1c/ngap/NGAP_PedestrianUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PedestrianUE.h" diff --git a/lib/asn1c/ngap/NGAP_PedestrianUE.h b/lib/asn1c/ngap/NGAP_PedestrianUE.h index 4988320404..a178eb1954 100644 --- a/lib/asn1c/ngap/NGAP_PedestrianUE.h +++ b/lib/asn1c/ngap/NGAP_PedestrianUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PedestrianUE_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PedestrianUE_specs_1; asn_struct_free_f NGAP_PedestrianUE_free; asn_struct_print_f NGAP_PedestrianUE_print; asn_constr_check_f NGAP_PedestrianUE_constraint; -jer_type_encoder_f NGAP_PedestrianUE_encode_jer; per_type_decoder_f NGAP_PedestrianUE_decode_aper; per_type_encoder_f NGAP_PedestrianUE_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.c b/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.c index fe34e5a610..c7b0253b35 100644 --- a/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.c +++ b/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PeriodicRegistrationUpdateTimer.h" diff --git a/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.h b/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.h index 438f63a36a..ad8e56202c 100644 --- a/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.h +++ b/lib/asn1c/ngap/NGAP_PeriodicRegistrationUpdateTimer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PeriodicRegistrationUpdateTimer_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PeriodicRegistrationUpdateTimer; asn_struct_free_f NGAP_PeriodicRegistrationUpdateTimer_free; asn_struct_print_f NGAP_PeriodicRegistrationUpdateTimer_print; asn_constr_check_f NGAP_PeriodicRegistrationUpdateTimer_constraint; -jer_type_encoder_f NGAP_PeriodicRegistrationUpdateTimer_encode_jer; per_type_decoder_f NGAP_PeriodicRegistrationUpdateTimer_decode_aper; per_type_encoder_f NGAP_PeriodicRegistrationUpdateTimer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.c b/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.c index c2eb016cc0..ccc6b69c00 100644 --- a/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.c +++ b/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PeriodicReportingIEs.h" diff --git a/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.h b/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.h index 0d28bc65ce..d3e864e687 100644 --- a/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.h +++ b/lib/asn1c/ngap/NGAP_PeriodicReportingIEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PeriodicReportingIEs_H_ diff --git a/lib/asn1c/ngap/NGAP_Periodicity.c b/lib/asn1c/ngap/NGAP_Periodicity.c index 6d9787cd27..b785374951 100644 --- a/lib/asn1c/ngap/NGAP_Periodicity.c +++ b/lib/asn1c/ngap/NGAP_Periodicity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Periodicity.h" diff --git a/lib/asn1c/ngap/NGAP_Periodicity.h b/lib/asn1c/ngap/NGAP_Periodicity.h index 3bf5f4b36a..ccea904c39 100644 --- a/lib/asn1c/ngap/NGAP_Periodicity.h +++ b/lib/asn1c/ngap/NGAP_Periodicity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Periodicity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Periodicity; asn_struct_free_f NGAP_Periodicity_free; asn_struct_print_f NGAP_Periodicity_print; asn_constr_check_f NGAP_Periodicity_constraint; -jer_type_encoder_f NGAP_Periodicity_encode_jer; per_type_decoder_f NGAP_Periodicity_decode_aper; per_type_encoder_f NGAP_Periodicity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PortNumber.c b/lib/asn1c/ngap/NGAP_PortNumber.c index 359e5494c9..2e036c7683 100644 --- a/lib/asn1c/ngap/NGAP_PortNumber.c +++ b/lib/asn1c/ngap/NGAP_PortNumber.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PortNumber.h" diff --git a/lib/asn1c/ngap/NGAP_PortNumber.h b/lib/asn1c/ngap/NGAP_PortNumber.h index 0a868f0c92..49598acf84 100644 --- a/lib/asn1c/ngap/NGAP_PortNumber.h +++ b/lib/asn1c/ngap/NGAP_PortNumber.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PortNumber_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PortNumber; asn_struct_free_f NGAP_PortNumber_free; asn_struct_print_f NGAP_PortNumber_print; asn_constr_check_f NGAP_PortNumber_constraint; -jer_type_encoder_f NGAP_PortNumber_encode_jer; per_type_decoder_f NGAP_PortNumber_decode_aper; per_type_encoder_f NGAP_PortNumber_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Pre-emptionCapability.c b/lib/asn1c/ngap/NGAP_Pre-emptionCapability.c index bcecf5e885..ef2d14fd50 100644 --- a/lib/asn1c/ngap/NGAP_Pre-emptionCapability.c +++ b/lib/asn1c/ngap/NGAP_Pre-emptionCapability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Pre-emptionCapability.h" diff --git a/lib/asn1c/ngap/NGAP_Pre-emptionCapability.h b/lib/asn1c/ngap/NGAP_Pre-emptionCapability.h index 5d997cfa79..022ec4b080 100644 --- a/lib/asn1c/ngap/NGAP_Pre-emptionCapability.h +++ b/lib/asn1c/ngap/NGAP_Pre-emptionCapability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Pre_emptionCapability_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Pre_emptionCapability_specs_1; asn_struct_free_f NGAP_Pre_emptionCapability_free; asn_struct_print_f NGAP_Pre_emptionCapability_print; asn_constr_check_f NGAP_Pre_emptionCapability_constraint; -jer_type_encoder_f NGAP_Pre_emptionCapability_encode_jer; per_type_decoder_f NGAP_Pre_emptionCapability_decode_aper; per_type_encoder_f NGAP_Pre_emptionCapability_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.c b/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.c index bc5d17d525..f549d12e10 100644 --- a/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.c +++ b/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Pre-emptionVulnerability.h" diff --git a/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.h b/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.h index 0925195a6d..2510689513 100644 --- a/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.h +++ b/lib/asn1c/ngap/NGAP_Pre-emptionVulnerability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Pre_emptionVulnerability_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Pre_emptionVulnerability_specs asn_struct_free_f NGAP_Pre_emptionVulnerability_free; asn_struct_print_f NGAP_Pre_emptionVulnerability_print; asn_constr_check_f NGAP_Pre_emptionVulnerability_constraint; -jer_type_encoder_f NGAP_Pre_emptionVulnerability_encode_jer; per_type_decoder_f NGAP_Pre_emptionVulnerability_decode_aper; per_type_encoder_f NGAP_Pre_emptionVulnerability_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Presence.c b/lib/asn1c/ngap/NGAP_Presence.c index 79f91052f2..6f1f890488 100644 --- a/lib/asn1c/ngap/NGAP_Presence.c +++ b/lib/asn1c/ngap/NGAP_Presence.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Presence.h" diff --git a/lib/asn1c/ngap/NGAP_Presence.h b/lib/asn1c/ngap/NGAP_Presence.h index 2e0f8e94e6..50abd7f0b0 100644 --- a/lib/asn1c/ngap/NGAP_Presence.h +++ b/lib/asn1c/ngap/NGAP_Presence.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Presence_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Presence_specs_1; asn_struct_free_f NGAP_Presence_free; asn_struct_print_f NGAP_Presence_print; asn_constr_check_f NGAP_Presence_constraint; -jer_type_encoder_f NGAP_Presence_encode_jer; per_type_decoder_f NGAP_Presence_decode_aper; per_type_encoder_f NGAP_Presence_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PriorityLevelARP.c b/lib/asn1c/ngap/NGAP_PriorityLevelARP.c index d5f4c62a35..edc399857c 100644 --- a/lib/asn1c/ngap/NGAP_PriorityLevelARP.c +++ b/lib/asn1c/ngap/NGAP_PriorityLevelARP.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PriorityLevelARP.h" diff --git a/lib/asn1c/ngap/NGAP_PriorityLevelARP.h b/lib/asn1c/ngap/NGAP_PriorityLevelARP.h index 80de03242b..21fa1a5e83 100644 --- a/lib/asn1c/ngap/NGAP_PriorityLevelARP.h +++ b/lib/asn1c/ngap/NGAP_PriorityLevelARP.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PriorityLevelARP_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PriorityLevelARP; asn_struct_free_f NGAP_PriorityLevelARP_free; asn_struct_print_f NGAP_PriorityLevelARP_print; asn_constr_check_f NGAP_PriorityLevelARP_constraint; -jer_type_encoder_f NGAP_PriorityLevelARP_encode_jer; per_type_decoder_f NGAP_PriorityLevelARP_decode_aper; per_type_encoder_f NGAP_PriorityLevelARP_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PriorityLevelQos.c b/lib/asn1c/ngap/NGAP_PriorityLevelQos.c index 3950e37da0..0c0a4d786a 100644 --- a/lib/asn1c/ngap/NGAP_PriorityLevelQos.c +++ b/lib/asn1c/ngap/NGAP_PriorityLevelQos.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PriorityLevelQos.h" diff --git a/lib/asn1c/ngap/NGAP_PriorityLevelQos.h b/lib/asn1c/ngap/NGAP_PriorityLevelQos.h index 9d0466e9a7..020cada14a 100644 --- a/lib/asn1c/ngap/NGAP_PriorityLevelQos.h +++ b/lib/asn1c/ngap/NGAP_PriorityLevelQos.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PriorityLevelQos_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_PriorityLevelQos; asn_struct_free_f NGAP_PriorityLevelQos_free; asn_struct_print_f NGAP_PriorityLevelQos_print; asn_constr_check_f NGAP_PriorityLevelQos_constraint; -jer_type_encoder_f NGAP_PriorityLevelQos_encode_jer; per_type_decoder_f NGAP_PriorityLevelQos_decode_aper; per_type_encoder_f NGAP_PriorityLevelQos_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PrivacyIndicator.c b/lib/asn1c/ngap/NGAP_PrivacyIndicator.c index 44f3c4fc52..9664890324 100644 --- a/lib/asn1c/ngap/NGAP_PrivacyIndicator.c +++ b/lib/asn1c/ngap/NGAP_PrivacyIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PrivacyIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_PrivacyIndicator.h b/lib/asn1c/ngap/NGAP_PrivacyIndicator.h index 92982045c9..5f31cb9dff 100644 --- a/lib/asn1c/ngap/NGAP_PrivacyIndicator.h +++ b/lib/asn1c/ngap/NGAP_PrivacyIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PrivacyIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_PrivacyIndicator_specs_1; asn_struct_free_f NGAP_PrivacyIndicator_free; asn_struct_print_f NGAP_PrivacyIndicator_print; asn_constr_check_f NGAP_PrivacyIndicator_constraint; -jer_type_encoder_f NGAP_PrivacyIndicator_encode_jer; per_type_decoder_f NGAP_PrivacyIndicator_decode_aper; per_type_encoder_f NGAP_PrivacyIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-Container.c b/lib/asn1c/ngap/NGAP_PrivateIE-Container.c index 78f517250e..e8d1a26abf 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-Container.c +++ b/lib/asn1c/ngap/NGAP_PrivateIE-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PrivateIE-Container.h" diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-Container.h b/lib/asn1c/ngap/NGAP_PrivateIE-Container.h index 4a313d8b27..810f855102 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-Container.h +++ b/lib/asn1c/ngap/NGAP_PrivateIE-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PrivateIE_Container_H_ diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-Field.c b/lib/asn1c/ngap/NGAP_PrivateIE-Field.c index 26947f009f..e1ef632b02 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-Field.c +++ b/lib/asn1c/ngap/NGAP_PrivateIE-Field.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PrivateIE-Field.h" diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-Field.h b/lib/asn1c/ngap/NGAP_PrivateIE-Field.h index dd44aa8f45..49a5baf1e7 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-Field.h +++ b/lib/asn1c/ngap/NGAP_PrivateIE-Field.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PrivateIE_Field_H_ diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-ID.c b/lib/asn1c/ngap/NGAP_PrivateIE-ID.c index 509373275e..065f4c816b 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-ID.c +++ b/lib/asn1c/ngap/NGAP_PrivateIE-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PrivateIE-ID.h" diff --git a/lib/asn1c/ngap/NGAP_PrivateIE-ID.h b/lib/asn1c/ngap/NGAP_PrivateIE-ID.h index d16decc894..05d9345b98 100644 --- a/lib/asn1c/ngap/NGAP_PrivateIE-ID.h +++ b/lib/asn1c/ngap/NGAP_PrivateIE-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PrivateIE_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_PrivateMessage.c b/lib/asn1c/ngap/NGAP_PrivateMessage.c index d66a3308b5..02c5f9cb36 100644 --- a/lib/asn1c/ngap/NGAP_PrivateMessage.c +++ b/lib/asn1c/ngap/NGAP_PrivateMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_PrivateMessage.h" diff --git a/lib/asn1c/ngap/NGAP_PrivateMessage.h b/lib/asn1c/ngap/NGAP_PrivateMessage.h index 27a2824818..ab61293b8b 100644 --- a/lib/asn1c/ngap/NGAP_PrivateMessage.h +++ b/lib/asn1c/ngap/NGAP_PrivateMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_PrivateMessage_H_ diff --git a/lib/asn1c/ngap/NGAP_ProcedureCode.c b/lib/asn1c/ngap/NGAP_ProcedureCode.c index 3d0aa5d7ce..0d185538e4 100644 --- a/lib/asn1c/ngap/NGAP_ProcedureCode.c +++ b/lib/asn1c/ngap/NGAP_ProcedureCode.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProcedureCode.h" diff --git a/lib/asn1c/ngap/NGAP_ProcedureCode.h b/lib/asn1c/ngap/NGAP_ProcedureCode.h index d36b1df99a..331368ce41 100644 --- a/lib/asn1c/ngap/NGAP_ProcedureCode.h +++ b/lib/asn1c/ngap/NGAP_ProcedureCode.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProcedureCode_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProcedureCode; asn_struct_free_f NGAP_ProcedureCode_free; asn_struct_print_f NGAP_ProcedureCode_print; asn_constr_check_f NGAP_ProcedureCode_constraint; -jer_type_encoder_f NGAP_ProcedureCode_encode_jer; per_type_decoder_f NGAP_ProcedureCode_decode_aper; per_type_encoder_f NGAP_ProcedureCode_encode_aper; #define NGAP_ProcedureCode_id_AMFConfigurationUpdate ((NGAP_ProcedureCode_t)0) diff --git a/lib/asn1c/ngap/NGAP_ProcedureStageChoice.c b/lib/asn1c/ngap/NGAP_ProcedureStageChoice.c index 219f79a04c..e627f9aa46 100644 --- a/lib/asn1c/ngap/NGAP_ProcedureStageChoice.c +++ b/lib/asn1c/ngap/NGAP_ProcedureStageChoice.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProcedureStageChoice.h" diff --git a/lib/asn1c/ngap/NGAP_ProcedureStageChoice.h b/lib/asn1c/ngap/NGAP_ProcedureStageChoice.h index 25ebb7597d..a6387ef51f 100644 --- a/lib/asn1c/ngap/NGAP_ProcedureStageChoice.h +++ b/lib/asn1c/ngap/NGAP_ProcedureStageChoice.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProcedureStageChoice_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.c b/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.c index 5e981d7fe6..ff5d49f67e 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.c +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolExtensionContainer.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.h b/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.h index 8bdfe3cff3..053c339950 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.h +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolExtensionContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionField.c b/lib/asn1c/ngap/NGAP_ProtocolExtensionField.c index 7e968807aa..147a4ba832 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionField.c +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionField.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolExtensionField.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionField.h b/lib/asn1c/ngap/NGAP_ProtocolExtensionField.h index ff03981b57..ece52c8a45 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionField.h +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionField.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolExtensionField_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionID.c b/lib/asn1c/ngap/NGAP_ProtocolExtensionID.c index d5f6e5e6b4..0be06dee51 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionID.c +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolExtensionID.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolExtensionID.h b/lib/asn1c/ngap/NGAP_ProtocolExtensionID.h index cc739ac763..f4e79d861a 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolExtensionID.h +++ b/lib/asn1c/ngap/NGAP_ProtocolExtensionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolExtensionID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolExtensionID; asn_struct_free_f NGAP_ProtocolExtensionID_free; asn_struct_print_f NGAP_ProtocolExtensionID_print; asn_constr_check_f NGAP_ProtocolExtensionID_constraint; -jer_type_encoder_f NGAP_ProtocolExtensionID_encode_jer; per_type_decoder_f NGAP_ProtocolExtensionID_decode_aper; per_type_encoder_f NGAP_ProtocolExtensionID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-Container.c b/lib/asn1c/ngap/NGAP_ProtocolIE-Container.c index bbf27aff31..ac7cd8762a 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-Container.c +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolIE-Container.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-Container.h b/lib/asn1c/ngap/NGAP_ProtocolIE-Container.h index e98e9a6c01..299ea005a4 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-Container.h +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolIE_Container_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.c b/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.c index 6b2abcaf71..7a88ffa386 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.c +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolIE-ContainerList.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.h b/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.h index 42fbcd72fd..7bb522c292 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.h +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-ContainerList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolIE_ContainerList_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-Field.c b/lib/asn1c/ngap/NGAP_ProtocolIE-Field.c index 639bd22140..1227fa6b90 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-Field.c +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-Field.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolIE-Field.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-Field.h b/lib/asn1c/ngap/NGAP_ProtocolIE-Field.h index cf940bcaca..44ad4897da 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-Field.h +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-Field.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolIE_Field_H_ diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-ID.c b/lib/asn1c/ngap/NGAP_ProtocolIE-ID.c index 699a1e190d..f59870c636 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-ID.c +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolIE-ID.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-ID.h b/lib/asn1c/ngap/NGAP_ProtocolIE-ID.h index ef6c09d8c8..e74545aa54 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-ID.h +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolIE_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_ID; asn_struct_free_f NGAP_ProtocolIE_ID_free; asn_struct_print_f NGAP_ProtocolIE_ID_print; asn_constr_check_f NGAP_ProtocolIE_ID_constraint; -jer_type_encoder_f NGAP_ProtocolIE_ID_encode_jer; per_type_decoder_f NGAP_ProtocolIE_ID_decode_aper; per_type_encoder_f NGAP_ProtocolIE_ID_encode_aper; #define NGAP_ProtocolIE_ID_id_AllowedNSSAI ((NGAP_ProtocolIE_ID_t)0) diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.c b/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.c index ca84830f18..4d51eb5f92 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.c +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ProtocolIE-SingleContainer.h" diff --git a/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.h b/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.h index a363bbee32..93475359a5 100644 --- a/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.h +++ b/lib/asn1c/ngap/NGAP_ProtocolIE-SingleContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-Containers" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ProtocolIE_SingleContainer_H_ @@ -89,448 +89,384 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P0; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P0_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P0_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P0_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P0_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P0_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P0_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P1; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P1_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P1_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P1_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P1_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P1_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P1_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P2; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P2_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P2_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P2_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P2_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P2_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P2_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P3; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P3_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P3_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P3_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P3_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P3_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P3_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P4; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P4_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P4_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P4_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P4_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P4_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P4_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P5; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P5_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P5_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P5_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P5_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P5_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P5_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P6; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P6_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P6_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P6_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P6_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P6_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P6_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P7; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P7_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P7_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P7_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P7_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P7_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P7_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P8; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P8_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P8_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P8_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P8_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P8_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P8_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P9; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P9_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P9_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P9_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P9_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P9_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P9_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P10; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P10_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P10_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P10_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P10_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P10_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P10_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P11; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P11_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P11_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P11_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P11_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P11_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P11_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P12; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P12_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P12_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P12_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P12_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P12_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P12_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P13; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P13_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P13_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P13_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P13_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P13_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P13_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P14; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P14_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P14_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P14_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P14_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P14_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P14_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P15; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P15_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P15_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P15_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P15_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P15_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P15_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P16; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P16_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P16_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P16_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P16_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P16_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P16_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P17; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P17_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P17_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P17_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P17_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P17_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P17_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P18; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P18_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P18_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P18_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P18_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P18_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P18_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P19; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P19_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P19_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P19_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P19_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P19_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P19_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P20; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P20_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P20_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P20_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P20_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P20_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P20_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P21; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P21_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P21_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P21_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P21_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P21_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P21_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P22; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P22_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P22_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P22_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P22_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P22_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P22_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P23; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P23_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P23_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P23_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P23_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P23_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P23_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P24; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P24_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P24_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P24_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P24_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P24_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P24_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P25; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P25_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P25_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P25_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P25_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P25_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P25_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P26; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P26_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P26_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P26_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P26_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P26_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P26_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P27; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P27_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P27_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P27_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P27_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P27_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P27_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P28; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P28_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P28_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P28_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P28_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P28_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P28_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P29; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P29_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P29_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P29_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P29_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P29_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P29_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P30; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P30_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P30_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P30_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P30_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P30_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P30_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P31; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P31_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P31_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P31_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P31_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P31_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P31_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P32; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P32_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P32_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P32_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P32_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P32_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P32_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P33; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P33_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P33_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P33_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P33_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P33_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P33_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P34; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P34_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P34_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P34_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P34_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P34_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P34_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P35; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P35_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P35_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P35_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P35_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P35_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P35_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P36; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P36_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P36_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P36_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P36_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P36_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P36_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P37; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P37_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P37_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P37_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P37_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P37_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P37_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P38; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P38_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P38_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P38_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P38_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P38_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P38_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P39; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P39_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P39_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P39_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P39_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P39_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P39_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P40; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P40_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P40_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P40_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P40_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P40_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P40_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P41; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P41_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P41_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P41_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P41_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P41_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P41_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P42; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P42_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P42_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P42_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P42_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P42_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P42_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P43; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P43_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P43_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P43_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P43_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P43_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P43_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P44; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P44_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P44_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P44_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P44_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P44_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P44_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P45; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P45_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P45_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P45_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P45_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P45_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P45_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P46; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P46_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P46_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P46_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P46_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P46_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P46_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P47; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P47_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P47_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P47_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P47_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P47_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P47_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P48; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P48_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P48_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P48_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P48_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P48_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P48_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P49; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P49_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P49_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P49_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P49_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P49_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P49_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P50; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P50_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P50_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P50_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P50_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P50_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P50_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P51; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P51_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P51_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P51_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P51_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P51_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P51_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P52; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P52_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P52_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P52_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P52_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P52_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P52_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P53; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P53_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P53_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P53_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P53_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P53_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P53_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P54; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P54_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P54_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P54_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P54_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P54_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P54_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P55; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P55_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P55_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P55_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P55_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P55_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P55_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P56; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P56_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P56_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P56_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P56_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P56_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P56_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P57; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P57_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P57_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P57_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P57_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P57_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P57_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P58; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P58_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P58_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P58_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P58_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P58_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P58_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P59; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P59_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P59_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P59_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P59_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P59_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P59_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P60; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P60_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P60_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P60_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P60_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P60_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P60_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P61; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P61_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P61_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P61_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P61_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P61_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P61_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P62; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P62_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P62_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P62_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P62_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P62_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P62_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_NGAP_ProtocolIE_SingleContainer_11857P63; asn_struct_free_f NGAP_ProtocolIE_SingleContainer_11857P63_free; asn_struct_print_f NGAP_ProtocolIE_SingleContainer_11857P63_print; asn_constr_check_f NGAP_ProtocolIE_SingleContainer_11857P63_constraint; -jer_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P63_encode_jer; per_type_decoder_f NGAP_ProtocolIE_SingleContainer_11857P63_decode_aper; per_type_encoder_f NGAP_ProtocolIE_SingleContainer_11857P63_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_QMCConfigInfo.c b/lib/asn1c/ngap/NGAP_QMCConfigInfo.c index 64c48a77c4..c6ee00ecc9 100644 --- a/lib/asn1c/ngap/NGAP_QMCConfigInfo.c +++ b/lib/asn1c/ngap/NGAP_QMCConfigInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QMCConfigInfo.h" diff --git a/lib/asn1c/ngap/NGAP_QMCConfigInfo.h b/lib/asn1c/ngap/NGAP_QMCConfigInfo.h index 226dc14e82..f86e6bc9a5 100644 --- a/lib/asn1c/ngap/NGAP_QMCConfigInfo.h +++ b/lib/asn1c/ngap/NGAP_QMCConfigInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QMCConfigInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_QMCDeactivation.c b/lib/asn1c/ngap/NGAP_QMCDeactivation.c index 55ebf3997a..150313e666 100644 --- a/lib/asn1c/ngap/NGAP_QMCDeactivation.c +++ b/lib/asn1c/ngap/NGAP_QMCDeactivation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QMCDeactivation.h" diff --git a/lib/asn1c/ngap/NGAP_QMCDeactivation.h b/lib/asn1c/ngap/NGAP_QMCDeactivation.h index db8a408ffa..8040eb422f 100644 --- a/lib/asn1c/ngap/NGAP_QMCDeactivation.h +++ b/lib/asn1c/ngap/NGAP_QMCDeactivation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QMCDeactivation_H_ diff --git a/lib/asn1c/ngap/NGAP_QoEReference.c b/lib/asn1c/ngap/NGAP_QoEReference.c index 702336bf20..161b133bd0 100644 --- a/lib/asn1c/ngap/NGAP_QoEReference.c +++ b/lib/asn1c/ngap/NGAP_QoEReference.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QoEReference.h" diff --git a/lib/asn1c/ngap/NGAP_QoEReference.h b/lib/asn1c/ngap/NGAP_QoEReference.h index cb521a8be6..4132ecf218 100644 --- a/lib/asn1c/ngap/NGAP_QoEReference.h +++ b/lib/asn1c/ngap/NGAP_QoEReference.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QoEReference_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_QoEReference; asn_struct_free_f NGAP_QoEReference_free; asn_struct_print_f NGAP_QoEReference_print; asn_constr_check_f NGAP_QoEReference_constraint; -jer_type_encoder_f NGAP_QoEReference_encode_jer; per_type_decoder_f NGAP_QoEReference_decode_aper; per_type_encoder_f NGAP_QoEReference_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_QoEReferenceList.c b/lib/asn1c/ngap/NGAP_QoEReferenceList.c index 171985ede2..4c61f874ac 100644 --- a/lib/asn1c/ngap/NGAP_QoEReferenceList.c +++ b/lib/asn1c/ngap/NGAP_QoEReferenceList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QoEReferenceList.h" diff --git a/lib/asn1c/ngap/NGAP_QoEReferenceList.h b/lib/asn1c/ngap/NGAP_QoEReferenceList.h index c559ace966..d218ed91df 100644 --- a/lib/asn1c/ngap/NGAP_QoEReferenceList.h +++ b/lib/asn1c/ngap/NGAP_QoEReferenceList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QoEReferenceList_H_ diff --git a/lib/asn1c/ngap/NGAP_QoSFlowList.c b/lib/asn1c/ngap/NGAP_QoSFlowList.c index fd18d2eadb..1cf1bbe366 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowList.c +++ b/lib/asn1c/ngap/NGAP_QoSFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QoSFlowList.h" diff --git a/lib/asn1c/ngap/NGAP_QoSFlowList.h b/lib/asn1c/ngap/NGAP_QoSFlowList.h index 75a5473578..2e4ac76d0f 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowList.h +++ b/lib/asn1c/ngap/NGAP_QoSFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QoSFlowList_H_ diff --git a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.c b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.c index b8f34e8992..216a34db64 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.c +++ b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QoSFlowsUsageReport-Item.h" diff --git a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.h b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.h index 9fd983e733..6b6d5536a3 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.h +++ b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReport-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QoSFlowsUsageReport_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.c b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.c index ca2862385c..98ca8b7aa8 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.c +++ b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QoSFlowsUsageReportList.h" diff --git a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.h b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.h index 9cd7f81d7d..c91f4d3f02 100644 --- a/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.h +++ b/lib/asn1c/ngap/NGAP_QoSFlowsUsageReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QoSFlowsUsageReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosCharacteristics.c b/lib/asn1c/ngap/NGAP_QosCharacteristics.c index f65ce89f22..2d670e044f 100644 --- a/lib/asn1c/ngap/NGAP_QosCharacteristics.c +++ b/lib/asn1c/ngap/NGAP_QosCharacteristics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosCharacteristics.h" diff --git a/lib/asn1c/ngap/NGAP_QosCharacteristics.h b/lib/asn1c/ngap/NGAP_QosCharacteristics.h index a323b37935..ed09835252 100644 --- a/lib/asn1c/ngap/NGAP_QosCharacteristics.h +++ b/lib/asn1c/ngap/NGAP_QosCharacteristics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosCharacteristics_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.c b/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.c index aa9893728f..619e6a21fe 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAcceptedItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.h b/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.h index ce8a0dd787..3458ed2e19 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAcceptedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAcceptedItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.c b/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.c index a9350c5936..adc546fe3c 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAcceptedList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.h b/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.h index f2c423a296..7f3c7e8fae 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAcceptedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAcceptedList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.c b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.c index 8ec0b2b62e..c9dbc1b37b 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAddOrModifyRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.h b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.h index 7d379ee1d2..1339330f56 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAddOrModifyRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.c b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.c index a26b9793fe..5fd49d9121 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAddOrModifyRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.h b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.h index 4e36df832f..2d21b260d8 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAddOrModifyRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.c b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.c index bfa8a63726..f97f5596fd 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAddOrModifyResponseItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.h b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.h index f1eae44e60..6869952fb6 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAddOrModifyResponseItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.c b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.c index 2859c662e3..c82e9f187e 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowAddOrModifyResponseList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.h b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.h index 8a840b887b..34211b86d1 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowAddOrModifyResponseList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowAddOrModifyResponseList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.c b/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.c index 1344e90b1b..aee8d35c25 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowFeedbackItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.h b/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.h index 4449e4ad98..dcf5274042 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowFeedbackItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowFeedbackItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.c b/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.c index 41ea01848c..012d270927 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowFeedbackList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.h b/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.h index 674e6624a8..1cc4e1843c 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowFeedbackList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowFeedbackList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowIdentifier.c b/lib/asn1c/ngap/NGAP_QosFlowIdentifier.c index e1624c0645..04283d7e86 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowIdentifier.c +++ b/lib/asn1c/ngap/NGAP_QosFlowIdentifier.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowIdentifier.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowIdentifier.h b/lib/asn1c/ngap/NGAP_QosFlowIdentifier.h index 623da0b4fc..1d3ad1bed1 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowIdentifier.h +++ b/lib/asn1c/ngap/NGAP_QosFlowIdentifier.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowIdentifier_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_QosFlowIdentifier; asn_struct_free_f NGAP_QosFlowIdentifier_free; asn_struct_print_f NGAP_QosFlowIdentifier_print; asn_constr_check_f NGAP_QosFlowIdentifier_constraint; -jer_type_encoder_f NGAP_QosFlowIdentifier_encode_jer; per_type_decoder_f NGAP_QosFlowIdentifier_decode_aper; per_type_encoder_f NGAP_QosFlowIdentifier_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_QosFlowInformationItem.c b/lib/asn1c/ngap/NGAP_QosFlowInformationItem.c index ad6d060b12..c79f85da90 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowInformationItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowInformationItem.h b/lib/asn1c/ngap/NGAP_QosFlowInformationItem.h index 86722a2941..b74e722c10 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowInformationItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowInformationList.c b/lib/asn1c/ngap/NGAP_QosFlowInformationList.c index 80408cfb99..99cd3365f1 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowInformationList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowInformationList.h b/lib/asn1c/ngap/NGAP_QosFlowInformationList.h index c6a766df4a..dad17afbcd 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowInformationList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.c b/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.c index 0e71dde6ee..37d8e2f1df 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.c +++ b/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowItemWithDataForwarding.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.h b/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.h index d5f21d3eee..34b16b4a33 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.h +++ b/lib/asn1c/ngap/NGAP_QosFlowItemWithDataForwarding.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowItemWithDataForwarding_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.c b/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.c index 7098c118d9..5cdae18349 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.c +++ b/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowLevelQosParameters.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.h b/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.h index 9e286c0dd8..6888a35184 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.h +++ b/lib/asn1c/ngap/NGAP_QosFlowLevelQosParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowLevelQosParameters_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowListWithCause.c b/lib/asn1c/ngap/NGAP_QosFlowListWithCause.c index ded07833d0..86e255c010 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowListWithCause.c +++ b/lib/asn1c/ngap/NGAP_QosFlowListWithCause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowListWithCause.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowListWithCause.h b/lib/asn1c/ngap/NGAP_QosFlowListWithCause.h index 6651aa6899..ad7ed1842f 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowListWithCause.h +++ b/lib/asn1c/ngap/NGAP_QosFlowListWithCause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowListWithCause_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.c b/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.c index 861ab88fef..e10cb9bdb5 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.c +++ b/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowListWithDataForwarding.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.h b/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.h index 82b9e54a88..10252984fc 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.h +++ b/lib/asn1c/ngap/NGAP_QosFlowListWithDataForwarding.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowListWithDataForwarding_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.c b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.c index baded26ce9..391148a988 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowModifyConfirmItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.h b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.h index 5037cf30ab..9836297ad7 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowModifyConfirmItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.c b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.c index 4e09cb5c81..e2d87ea34d 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowModifyConfirmList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.h b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.h index 58c53b1f6b..047a966e11 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowModifyConfirmList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowModifyConfirmList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.c b/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.c index eb4d62452b..a5b29a4e99 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowNotifyItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.h b/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.h index 11106239dd..7b8a4d81dd 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowNotifyItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowNotifyItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowNotifyList.c b/lib/asn1c/ngap/NGAP_QosFlowNotifyList.c index a1ba5235db..956cc68242 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowNotifyList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowNotifyList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowNotifyList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowNotifyList.h b/lib/asn1c/ngap/NGAP_QosFlowNotifyList.h index baf84d519f..a163430ed3 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowNotifyList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowNotifyList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowNotifyList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowParametersItem.c b/lib/asn1c/ngap/NGAP_QosFlowParametersItem.c index 7916f4ec7c..df443cc658 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowParametersItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowParametersItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowParametersItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowParametersItem.h b/lib/asn1c/ngap/NGAP_QosFlowParametersItem.h index 838acfc80a..8b232fd37c 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowParametersItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowParametersItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowParametersItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowParametersList.c b/lib/asn1c/ngap/NGAP_QosFlowParametersList.c index 6aacb1ea3b..595c86c250 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowParametersList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowParametersList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowParametersList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowParametersList.h b/lib/asn1c/ngap/NGAP_QosFlowParametersList.h index 23b823de6c..bdb36fccf2 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowParametersList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowParametersList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowParametersList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.c b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.c index 654b12a8d2..13afe94311 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.c +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowPerTNLInformation.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.h b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.h index 6760c7a75e..a6fe7a1f06 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.h +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowPerTNLInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.c b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.c index c47cfaeef2..1e7384cdc4 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowPerTNLInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.h b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.h index 4d94b4c69c..688c4ca7af 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowPerTNLInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.c b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.c index 1cff5f4c7b..58f688b3fd 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowPerTNLInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.h b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.h index 9ebb71a14f..7e2092207c 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowPerTNLInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowPerTNLInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.c b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.c index a96d7103f2..0bb89282c2 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowSetupRequestItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.h b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.h index 5f4256bd9b..61bc75703f 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowSetupRequestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.c b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.c index 85960144e9..801fa6b004 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowSetupRequestList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.h b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.h index 680adbabec..b7e3eee8bb 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowSetupRequestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowSetupRequestList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.c b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.c index 7e4312a311..fa96314512 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowToBeForwardedItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.h b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.h index ebf0e40931..d2d5bce4ce 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowToBeForwardedItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.c b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.c index 116c6acbf2..b300bf0162 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.c +++ b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowToBeForwardedList.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.h b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.h index ee1b7d8821..70133a0241 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.h +++ b/lib/asn1c/ngap/NGAP_QosFlowToBeForwardedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowToBeForwardedList_H_ diff --git a/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.c b/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.c index c2860159d2..0f339c6fb5 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.c +++ b/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosFlowWithCauseItem.h" diff --git a/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.h b/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.h index 5c365b94c4..d77831bf9b 100644 --- a/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.h +++ b/lib/asn1c/ngap/NGAP_QosFlowWithCauseItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosFlowWithCauseItem_H_ diff --git a/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.c b/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.c index 7fce3b311f..190c2a78dd 100644 --- a/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.c +++ b/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosMonitoringReportingFrequency.h" diff --git a/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.h b/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.h index 358e96f308..bee48cffad 100644 --- a/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.h +++ b/lib/asn1c/ngap/NGAP_QosMonitoringReportingFrequency.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosMonitoringReportingFrequency_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_QosMonitoringReportingFrequency; asn_struct_free_f NGAP_QosMonitoringReportingFrequency_free; asn_struct_print_f NGAP_QosMonitoringReportingFrequency_print; asn_constr_check_f NGAP_QosMonitoringReportingFrequency_constraint; -jer_type_encoder_f NGAP_QosMonitoringReportingFrequency_encode_jer; per_type_decoder_f NGAP_QosMonitoringReportingFrequency_decode_aper; per_type_encoder_f NGAP_QosMonitoringReportingFrequency_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_QosMonitoringRequest.c b/lib/asn1c/ngap/NGAP_QosMonitoringRequest.c index d30e0e5762..578878c249 100644 --- a/lib/asn1c/ngap/NGAP_QosMonitoringRequest.c +++ b/lib/asn1c/ngap/NGAP_QosMonitoringRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_QosMonitoringRequest.h" diff --git a/lib/asn1c/ngap/NGAP_QosMonitoringRequest.h b/lib/asn1c/ngap/NGAP_QosMonitoringRequest.h index 7f4df69479..cd6ae2e7b6 100644 --- a/lib/asn1c/ngap/NGAP_QosMonitoringRequest.h +++ b/lib/asn1c/ngap/NGAP_QosMonitoringRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_QosMonitoringRequest_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_QosMonitoringRequest_specs_1; asn_struct_free_f NGAP_QosMonitoringRequest_free; asn_struct_print_f NGAP_QosMonitoringRequest_print; asn_constr_check_f NGAP_QosMonitoringRequest_constraint; -jer_type_encoder_f NGAP_QosMonitoringRequest_encode_jer; per_type_decoder_f NGAP_QosMonitoringRequest_decode_aper; per_type_encoder_f NGAP_QosMonitoringRequest_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.c b/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.c index e4f3346864..058676aabb 100644 --- a/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.c +++ b/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RAN-UE-NGAP-ID.h" diff --git a/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.h b/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.h index 2b24c1e2da..9df77ccacc 100644 --- a/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.h +++ b/lib/asn1c/ngap/NGAP_RAN-UE-NGAP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RAN_UE_NGAP_ID_H_ @@ -28,7 +28,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RAN_UE_NGAP_ID_specs_1; asn_struct_free_f NGAP_RAN_UE_NGAP_ID_free; asn_struct_print_f NGAP_RAN_UE_NGAP_ID_print; asn_constr_check_f NGAP_RAN_UE_NGAP_ID_constraint; -jer_type_encoder_f NGAP_RAN_UE_NGAP_ID_encode_jer; per_type_decoder_f NGAP_RAN_UE_NGAP_ID_decode_aper; per_type_encoder_f NGAP_RAN_UE_NGAP_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.c b/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.c index 02651cd639..5d4797bb32 100644 --- a/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.c +++ b/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANCPRelocationIndication.h" diff --git a/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.h b/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.h index 260ba4bc61..e9671737eb 100644 --- a/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.h +++ b/lib/asn1c/ngap/NGAP_RANCPRelocationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANCPRelocationIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.c b/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.c index f034bee85d..c4b26eeed8 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.c +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANConfigurationUpdate.h" diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.h b/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.h index 9495688352..2cc2a32690 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.h +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANConfigurationUpdate_H_ diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.c b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.c index 24e80a402a..17a095dd6e 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.c +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANConfigurationUpdateAcknowledge.h" diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.h b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.h index b7a7a7b7e0..8f0aa4725e 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.h +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANConfigurationUpdateAcknowledge_H_ diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.c b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.c index 908d1f195f..61792b7b49 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.c +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANConfigurationUpdateFailure.h" diff --git a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.h b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.h index 5f52022e49..c7e6d191b6 100644 --- a/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.h +++ b/lib/asn1c/ngap/NGAP_RANConfigurationUpdateFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANConfigurationUpdateFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_RANNodeName.c b/lib/asn1c/ngap/NGAP_RANNodeName.c index 63e8660c60..bfe57d0d31 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeName.c +++ b/lib/asn1c/ngap/NGAP_RANNodeName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANNodeName.h" diff --git a/lib/asn1c/ngap/NGAP_RANNodeName.h b/lib/asn1c/ngap/NGAP_RANNodeName.h index a9f29ceec3..3c75c2d67a 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeName.h +++ b/lib/asn1c/ngap/NGAP_RANNodeName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANNodeName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RANNodeName; asn_struct_free_f NGAP_RANNodeName_free; asn_struct_print_f NGAP_RANNodeName_print; asn_constr_check_f NGAP_RANNodeName_constraint; -jer_type_encoder_f NGAP_RANNodeName_encode_jer; per_type_decoder_f NGAP_RANNodeName_decode_aper; per_type_encoder_f NGAP_RANNodeName_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.c b/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.c index ffa52f797c..a732787189 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.c +++ b/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANNodeNameUTF8String.h" diff --git a/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.h b/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.h index ac61e4261c..4f54200312 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.h +++ b/lib/asn1c/ngap/NGAP_RANNodeNameUTF8String.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANNodeNameUTF8String_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RANNodeNameUTF8String; asn_struct_free_f NGAP_RANNodeNameUTF8String_free; asn_struct_print_f NGAP_RANNodeNameUTF8String_print; asn_constr_check_f NGAP_RANNodeNameUTF8String_constraint; -jer_type_encoder_f NGAP_RANNodeNameUTF8String_encode_jer; per_type_decoder_f NGAP_RANNodeNameUTF8String_decode_aper; per_type_encoder_f NGAP_RANNodeNameUTF8String_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.c b/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.c index 643c15c7ce..a3d8e9e368 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.c +++ b/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANNodeNameVisibleString.h" diff --git a/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.h b/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.h index c1ea4539e9..21431ff28a 100644 --- a/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.h +++ b/lib/asn1c/ngap/NGAP_RANNodeNameVisibleString.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANNodeNameVisibleString_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RANNodeNameVisibleString; asn_struct_free_f NGAP_RANNodeNameVisibleString_free; asn_struct_print_f NGAP_RANNodeNameVisibleString_print; asn_constr_check_f NGAP_RANNodeNameVisibleString_constraint; -jer_type_encoder_f NGAP_RANNodeNameVisibleString_encode_jer; per_type_decoder_f NGAP_RANNodeNameVisibleString_decode_aper; per_type_encoder_f NGAP_RANNodeNameVisibleString_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RANPagingPriority.c b/lib/asn1c/ngap/NGAP_RANPagingPriority.c index c137c3d879..c00a8e7130 100644 --- a/lib/asn1c/ngap/NGAP_RANPagingPriority.c +++ b/lib/asn1c/ngap/NGAP_RANPagingPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANPagingPriority.h" diff --git a/lib/asn1c/ngap/NGAP_RANPagingPriority.h b/lib/asn1c/ngap/NGAP_RANPagingPriority.h index b70f9913da..5a6f1ff77f 100644 --- a/lib/asn1c/ngap/NGAP_RANPagingPriority.h +++ b/lib/asn1c/ngap/NGAP_RANPagingPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANPagingPriority_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RANPagingPriority; asn_struct_free_f NGAP_RANPagingPriority_free; asn_struct_print_f NGAP_RANPagingPriority_print; asn_constr_check_f NGAP_RANPagingPriority_constraint; -jer_type_encoder_f NGAP_RANPagingPriority_encode_jer; per_type_decoder_f NGAP_RANPagingPriority_decode_aper; per_type_encoder_f NGAP_RANPagingPriority_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.c b/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.c index 173e5b4236..33ba5430c9 100644 --- a/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RANStatusTransfer-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.h b/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.h index 8ddfab3cba..f7d7b7b2af 100644 --- a/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_RANStatusTransfer-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RANStatusTransfer_TransparentContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_RAT-Information.c b/lib/asn1c/ngap/NGAP_RAT-Information.c index d2e6bdb71c..963021680b 100644 --- a/lib/asn1c/ngap/NGAP_RAT-Information.c +++ b/lib/asn1c/ngap/NGAP_RAT-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RAT-Information.h" diff --git a/lib/asn1c/ngap/NGAP_RAT-Information.h b/lib/asn1c/ngap/NGAP_RAT-Information.h index 0fcfe994ac..d8583cb58d 100644 --- a/lib/asn1c/ngap/NGAP_RAT-Information.h +++ b/lib/asn1c/ngap/NGAP_RAT-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RAT_Information_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RAT_Information_specs_1; asn_struct_free_f NGAP_RAT_Information_free; asn_struct_print_f NGAP_RAT_Information_print; asn_constr_check_f NGAP_RAT_Information_constraint; -jer_type_encoder_f NGAP_RAT_Information_encode_jer; per_type_decoder_f NGAP_RAT_Information_decode_aper; per_type_encoder_f NGAP_RAT_Information_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RATRestrictionInformation.c b/lib/asn1c/ngap/NGAP_RATRestrictionInformation.c index bb0aca81f2..89260dc456 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictionInformation.c +++ b/lib/asn1c/ngap/NGAP_RATRestrictionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RATRestrictionInformation.h" diff --git a/lib/asn1c/ngap/NGAP_RATRestrictionInformation.h b/lib/asn1c/ngap/NGAP_RATRestrictionInformation.h index 6c0f6a93f6..68e9f21256 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictionInformation.h +++ b/lib/asn1c/ngap/NGAP_RATRestrictionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RATRestrictionInformation_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RATRestrictionInformation; asn_struct_free_f NGAP_RATRestrictionInformation_free; asn_struct_print_f NGAP_RATRestrictionInformation_print; asn_constr_check_f NGAP_RATRestrictionInformation_constraint; -jer_type_encoder_f NGAP_RATRestrictionInformation_encode_jer; per_type_decoder_f NGAP_RATRestrictionInformation_decode_aper; per_type_encoder_f NGAP_RATRestrictionInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RATRestrictions-Item.c b/lib/asn1c/ngap/NGAP_RATRestrictions-Item.c index f4c9677f7b..7324e68adc 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictions-Item.c +++ b/lib/asn1c/ngap/NGAP_RATRestrictions-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RATRestrictions-Item.h" diff --git a/lib/asn1c/ngap/NGAP_RATRestrictions-Item.h b/lib/asn1c/ngap/NGAP_RATRestrictions-Item.h index e639b99a5a..1a5aa486ad 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictions-Item.h +++ b/lib/asn1c/ngap/NGAP_RATRestrictions-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RATRestrictions_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_RATRestrictions.c b/lib/asn1c/ngap/NGAP_RATRestrictions.c index 76cd45492b..4ac0e370cd 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictions.c +++ b/lib/asn1c/ngap/NGAP_RATRestrictions.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RATRestrictions.h" diff --git a/lib/asn1c/ngap/NGAP_RATRestrictions.h b/lib/asn1c/ngap/NGAP_RATRestrictions.h index 8ee84a7b36..2ab221265c 100644 --- a/lib/asn1c/ngap/NGAP_RATRestrictions.h +++ b/lib/asn1c/ngap/NGAP_RATRestrictions.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RATRestrictions_H_ diff --git a/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.c b/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.c index fffe728829..96efb1e305 100644 --- a/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.c +++ b/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RGLevelWirelineAccessCharacteristics.h" diff --git a/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.h b/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.h index 1e23a4c504..f4134586c1 100644 --- a/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.h +++ b/lib/asn1c/ngap/NGAP_RGLevelWirelineAccessCharacteristics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RGLevelWirelineAccessCharacteristics_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RGLevelWirelineAccessCharacteristics; asn_struct_free_f NGAP_RGLevelWirelineAccessCharacteristics_free; asn_struct_print_f NGAP_RGLevelWirelineAccessCharacteristics_print; asn_constr_check_f NGAP_RGLevelWirelineAccessCharacteristics_constraint; -jer_type_encoder_f NGAP_RGLevelWirelineAccessCharacteristics_encode_jer; per_type_decoder_f NGAP_RGLevelWirelineAccessCharacteristics_decode_aper; per_type_encoder_f NGAP_RGLevelWirelineAccessCharacteristics_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RIMInformation.c b/lib/asn1c/ngap/NGAP_RIMInformation.c index 4de021b3c6..56631b51a2 100644 --- a/lib/asn1c/ngap/NGAP_RIMInformation.c +++ b/lib/asn1c/ngap/NGAP_RIMInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RIMInformation.h" diff --git a/lib/asn1c/ngap/NGAP_RIMInformation.h b/lib/asn1c/ngap/NGAP_RIMInformation.h index a596549b06..e3037d1df3 100644 --- a/lib/asn1c/ngap/NGAP_RIMInformation.h +++ b/lib/asn1c/ngap/NGAP_RIMInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RIMInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_RIMInformationTransfer.c b/lib/asn1c/ngap/NGAP_RIMInformationTransfer.c index 8a58c68679..73450147b0 100644 --- a/lib/asn1c/ngap/NGAP_RIMInformationTransfer.c +++ b/lib/asn1c/ngap/NGAP_RIMInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RIMInformationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_RIMInformationTransfer.h b/lib/asn1c/ngap/NGAP_RIMInformationTransfer.h index cd611172a3..6bf00cb2f9 100644 --- a/lib/asn1c/ngap/NGAP_RIMInformationTransfer.h +++ b/lib/asn1c/ngap/NGAP_RIMInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RIMInformationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_RNC-ID.c b/lib/asn1c/ngap/NGAP_RNC-ID.c index f2b7ac7020..1cf41ee9e5 100644 --- a/lib/asn1c/ngap/NGAP_RNC-ID.c +++ b/lib/asn1c/ngap/NGAP_RNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RNC-ID.h" diff --git a/lib/asn1c/ngap/NGAP_RNC-ID.h b/lib/asn1c/ngap/NGAP_RNC-ID.h index 7ebbe80613..7d34314433 100644 --- a/lib/asn1c/ngap/NGAP_RNC-ID.h +++ b/lib/asn1c/ngap/NGAP_RNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RNC_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RNC_ID; asn_struct_free_f NGAP_RNC_ID_free; asn_struct_print_f NGAP_RNC_ID_print; asn_constr_check_f NGAP_RNC_ID_constraint; -jer_type_encoder_f NGAP_RNC_ID_encode_jer; per_type_decoder_f NGAP_RNC_ID_decode_aper; per_type_encoder_f NGAP_RNC_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RRCContainer.c b/lib/asn1c/ngap/NGAP_RRCContainer.c index e57c4d7318..f17a4edf3d 100644 --- a/lib/asn1c/ngap/NGAP_RRCContainer.c +++ b/lib/asn1c/ngap/NGAP_RRCContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RRCContainer.h" diff --git a/lib/asn1c/ngap/NGAP_RRCContainer.h b/lib/asn1c/ngap/NGAP_RRCContainer.h index 59fde8a67b..6b256a4d59 100644 --- a/lib/asn1c/ngap/NGAP_RRCContainer.h +++ b/lib/asn1c/ngap/NGAP_RRCContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RRCContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RRCContainer; asn_struct_free_f NGAP_RRCContainer_free; asn_struct_print_f NGAP_RRCContainer_print; asn_constr_check_f NGAP_RRCContainer_constraint; -jer_type_encoder_f NGAP_RRCContainer_encode_jer; per_type_decoder_f NGAP_RRCContainer_decode_aper; per_type_encoder_f NGAP_RRCContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.c b/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.c index 9a92e5d229..2f74cd32ff 100644 --- a/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.c +++ b/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RRCEstablishmentCause.h" diff --git a/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.h b/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.h index 16b6366abd..2e389afe2d 100644 --- a/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.h +++ b/lib/asn1c/ngap/NGAP_RRCEstablishmentCause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RRCEstablishmentCause_H_ @@ -47,7 +47,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RRCEstablishmentCause_specs_1; asn_struct_free_f NGAP_RRCEstablishmentCause_free; asn_struct_print_f NGAP_RRCEstablishmentCause_print; asn_constr_check_f NGAP_RRCEstablishmentCause_constraint; -jer_type_encoder_f NGAP_RRCEstablishmentCause_encode_jer; per_type_decoder_f NGAP_RRCEstablishmentCause_decode_aper; per_type_encoder_f NGAP_RRCEstablishmentCause_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.c b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.c index 86c2a6ce15..f110abcaea 100644 --- a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.c +++ b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RRCInactiveTransitionReport.h" diff --git a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.h b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.h index 2bf5943962..036c680823 100644 --- a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.h +++ b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RRCInactiveTransitionReport_H_ diff --git a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.c b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.c index 54656f35b9..396dcbdc18 100644 --- a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.c +++ b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RRCInactiveTransitionReportRequest.h" diff --git a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.h b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.h index 2a3378c79a..f763d5ae4f 100644 --- a/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.h +++ b/lib/asn1c/ngap/NGAP_RRCInactiveTransitionReportRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RRCInactiveTransitionReportRequest_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RRCInactiveTransitionReportReq asn_struct_free_f NGAP_RRCInactiveTransitionReportRequest_free; asn_struct_print_f NGAP_RRCInactiveTransitionReportRequest_print; asn_constr_check_f NGAP_RRCInactiveTransitionReportRequest_constraint; -jer_type_encoder_f NGAP_RRCInactiveTransitionReportRequest_encode_jer; per_type_decoder_f NGAP_RRCInactiveTransitionReportRequest_decode_aper; per_type_encoder_f NGAP_RRCInactiveTransitionReportRequest_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RRCState.c b/lib/asn1c/ngap/NGAP_RRCState.c index 043ffeda6f..0e3afa1d9e 100644 --- a/lib/asn1c/ngap/NGAP_RRCState.c +++ b/lib/asn1c/ngap/NGAP_RRCState.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RRCState.h" diff --git a/lib/asn1c/ngap/NGAP_RRCState.h b/lib/asn1c/ngap/NGAP_RRCState.h index 66cf01a867..93fe124acc 100644 --- a/lib/asn1c/ngap/NGAP_RRCState.h +++ b/lib/asn1c/ngap/NGAP_RRCState.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RRCState_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RRCState_specs_1; asn_struct_free_f NGAP_RRCState_free; asn_struct_print_f NGAP_RRCState_print; asn_constr_check_f NGAP_RRCState_constraint; -jer_type_encoder_f NGAP_RRCState_encode_jer; per_type_decoder_f NGAP_RRCState_decode_aper; per_type_encoder_f NGAP_RRCState_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RSN.c b/lib/asn1c/ngap/NGAP_RSN.c index ce41d778d7..570b974f73 100644 --- a/lib/asn1c/ngap/NGAP_RSN.c +++ b/lib/asn1c/ngap/NGAP_RSN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RSN.h" diff --git a/lib/asn1c/ngap/NGAP_RSN.h b/lib/asn1c/ngap/NGAP_RSN.h index 7734b32ad0..3f3044b542 100644 --- a/lib/asn1c/ngap/NGAP_RSN.h +++ b/lib/asn1c/ngap/NGAP_RSN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RSN_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RSN_specs_1; asn_struct_free_f NGAP_RSN_free; asn_struct_print_f NGAP_RSN_print; asn_constr_check_f NGAP_RSN_constraint; -jer_type_encoder_f NGAP_RSN_encode_jer; per_type_decoder_f NGAP_RSN_decode_aper; per_type_encoder_f NGAP_RSN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Range.c b/lib/asn1c/ngap/NGAP_Range.c index 4ccae36ccf..5680ffc376 100644 --- a/lib/asn1c/ngap/NGAP_Range.c +++ b/lib/asn1c/ngap/NGAP_Range.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Range.h" diff --git a/lib/asn1c/ngap/NGAP_Range.h b/lib/asn1c/ngap/NGAP_Range.h index 5da5dce576..9c41af491a 100644 --- a/lib/asn1c/ngap/NGAP_Range.h +++ b/lib/asn1c/ngap/NGAP_Range.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Range_H_ @@ -44,7 +44,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Range_specs_1; asn_struct_free_f NGAP_Range_free; asn_struct_print_f NGAP_Range_print; asn_constr_check_f NGAP_Range_constraint; -jer_type_encoder_f NGAP_Range_encode_jer; per_type_decoder_f NGAP_Range_decode_aper; per_type_encoder_f NGAP_Range_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellItem.c b/lib/asn1c/ngap/NGAP_RecommendedCellItem.c index 7732acf13c..c86ce7b42e 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellItem.c +++ b/lib/asn1c/ngap/NGAP_RecommendedCellItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedCellItem.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellItem.h b/lib/asn1c/ngap/NGAP_RecommendedCellItem.h index 2a3a379d82..fa6dcf0d6d 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellItem.h +++ b/lib/asn1c/ngap/NGAP_RecommendedCellItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedCellItem_H_ diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellList.c b/lib/asn1c/ngap/NGAP_RecommendedCellList.c index 25d016b3b9..b4f54f5945 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellList.c +++ b/lib/asn1c/ngap/NGAP_RecommendedCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedCellList.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellList.h b/lib/asn1c/ngap/NGAP_RecommendedCellList.h index a6800888f1..8415257a0a 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellList.h +++ b/lib/asn1c/ngap/NGAP_RecommendedCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedCellList_H_ diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.c b/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.c index f1a8ec20e4..b96e375cf5 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.c +++ b/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedCellsForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.h b/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.h index 6c7a7ec812..bb38107e64 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.h +++ b/lib/asn1c/ngap/NGAP_RecommendedCellsForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedCellsForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.c b/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.c index fb1733e5d8..84a72d6169 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.c +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedRANNodeItem.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.h b/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.h index c523ef9ace..7ea2196631 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.h +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodeItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedRANNodeItem_H_ diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.c b/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.c index 588f8db0c4..bf90205c7c 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.c +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedRANNodeList.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.h b/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.h index d128222685..54c78780e2 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.h +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodeList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedRANNodeList_H_ diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.c b/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.c index 9b28ebaaf0..96585877b1 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.c +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RecommendedRANNodesForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.h b/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.h index 48a4e78d0e..ecee649082 100644 --- a/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.h +++ b/lib/asn1c/ngap/NGAP_RecommendedRANNodesForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RecommendedRANNodesForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_RedCapIndication.c b/lib/asn1c/ngap/NGAP_RedCapIndication.c index 08ff5f412c..69b6c22d07 100644 --- a/lib/asn1c/ngap/NGAP_RedCapIndication.c +++ b/lib/asn1c/ngap/NGAP_RedCapIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RedCapIndication.h" diff --git a/lib/asn1c/ngap/NGAP_RedCapIndication.h b/lib/asn1c/ngap/NGAP_RedCapIndication.h index 10071e332a..d837977722 100644 --- a/lib/asn1c/ngap/NGAP_RedCapIndication.h +++ b/lib/asn1c/ngap/NGAP_RedCapIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RedCapIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RedCapIndication_specs_1; asn_struct_free_f NGAP_RedCapIndication_free; asn_struct_print_f NGAP_RedCapIndication_print; asn_constr_check_f NGAP_RedCapIndication_constraint; -jer_type_encoder_f NGAP_RedCapIndication_encode_jer; per_type_decoder_f NGAP_RedCapIndication_decode_aper; per_type_encoder_f NGAP_RedCapIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.c b/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.c index a334288bf0..924a7fda79 100644 --- a/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.c +++ b/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RedirectionVoiceFallback.h" diff --git a/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.h b/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.h index 07e22b557f..436558fb25 100644 --- a/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.h +++ b/lib/asn1c/ngap/NGAP_RedirectionVoiceFallback.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RedirectionVoiceFallback_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RedirectionVoiceFallback_specs asn_struct_free_f NGAP_RedirectionVoiceFallback_free; asn_struct_print_f NGAP_RedirectionVoiceFallback_print; asn_constr_check_f NGAP_RedirectionVoiceFallback_constraint; -jer_type_encoder_f NGAP_RedirectionVoiceFallback_encode_jer; per_type_decoder_f NGAP_RedirectionVoiceFallback_decode_aper; per_type_encoder_f NGAP_RedirectionVoiceFallback_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.c b/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.c index f20d69b25f..9b3f25c154 100644 --- a/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.c +++ b/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RedundantPDUSessionInformation.h" diff --git a/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.h b/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.h index 494822e847..ac9965c3ff 100644 --- a/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.h +++ b/lib/asn1c/ngap/NGAP_RedundantPDUSessionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RedundantPDUSessionInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.c b/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.c index 6a6aae715f..38beaecad0 100644 --- a/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.c +++ b/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RedundantQosFlowIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.h b/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.h index 485dbe4c99..29112794da 100644 --- a/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.h +++ b/lib/asn1c/ngap/NGAP_RedundantQosFlowIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RedundantQosFlowIndicator_H_ @@ -34,7 +34,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_RedundantQosFlowIndicator_spec asn_struct_free_f NGAP_RedundantQosFlowIndicator_free; asn_struct_print_f NGAP_RedundantQosFlowIndicator_print; asn_constr_check_f NGAP_RedundantQosFlowIndicator_constraint; -jer_type_encoder_f NGAP_RedundantQosFlowIndicator_encode_jer; per_type_decoder_f NGAP_RedundantQosFlowIndicator_decode_aper; per_type_encoder_f NGAP_RedundantQosFlowIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.c b/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.c index 2b07692ff1..745db80482 100644 --- a/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.c +++ b/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReflectiveQosAttribute.h" diff --git a/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.h b/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.h index 02a6065d20..e682e7ca68 100644 --- a/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.h +++ b/lib/asn1c/ngap/NGAP_ReflectiveQosAttribute.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReflectiveQosAttribute_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ReflectiveQosAttribute_specs_1 asn_struct_free_f NGAP_ReflectiveQosAttribute_free; asn_struct_print_f NGAP_ReflectiveQosAttribute_print; asn_constr_check_f NGAP_ReflectiveQosAttribute_constraint; -jer_type_encoder_f NGAP_ReflectiveQosAttribute_encode_jer; per_type_decoder_f NGAP_ReflectiveQosAttribute_decode_aper; per_type_encoder_f NGAP_ReflectiveQosAttribute_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.c b/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.c index 5777622253..df78e268cc 100644 --- a/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.c +++ b/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RejectedNSSAIinPLMN.h" diff --git a/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.h b/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.h index e00937cc2c..beb84b5f0c 100644 --- a/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.h +++ b/lib/asn1c/ngap/NGAP_RejectedNSSAIinPLMN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RejectedNSSAIinPLMN_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RejectedNSSAIinPLMN; asn_struct_free_f NGAP_RejectedNSSAIinPLMN_free; asn_struct_print_f NGAP_RejectedNSSAIinPLMN_print; asn_constr_check_f NGAP_RejectedNSSAIinPLMN_constraint; -jer_type_encoder_f NGAP_RejectedNSSAIinPLMN_encode_jer; per_type_decoder_f NGAP_RejectedNSSAIinPLMN_decode_aper; per_type_encoder_f NGAP_RejectedNSSAIinPLMN_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.c b/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.c index d40508323e..6464f365c8 100644 --- a/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.c +++ b/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RejectedNSSAIinTA.h" diff --git a/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.h b/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.h index 4b6ccb54c2..e87ea9d8d3 100644 --- a/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.h +++ b/lib/asn1c/ngap/NGAP_RejectedNSSAIinTA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RejectedNSSAIinTA_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RejectedNSSAIinTA; asn_struct_free_f NGAP_RejectedNSSAIinTA_free; asn_struct_print_f NGAP_RejectedNSSAIinTA_print; asn_constr_check_f NGAP_RejectedNSSAIinTA_constraint; -jer_type_encoder_f NGAP_RejectedNSSAIinTA_encode_jer; per_type_decoder_f NGAP_RejectedNSSAIinTA_decode_aper; per_type_encoder_f NGAP_RejectedNSSAIinTA_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.c b/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.c index e844548ed0..08caeec372 100644 --- a/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.c +++ b/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RelativeAMFCapacity.h" diff --git a/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.h b/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.h index 9ff77a3e38..1cf1993ee8 100644 --- a/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.h +++ b/lib/asn1c/ngap/NGAP_RelativeAMFCapacity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RelativeAMFCapacity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RelativeAMFCapacity; asn_struct_free_f NGAP_RelativeAMFCapacity_free; asn_struct_print_f NGAP_RelativeAMFCapacity_print; asn_constr_check_f NGAP_RelativeAMFCapacity_constraint; -jer_type_encoder_f NGAP_RelativeAMFCapacity_encode_jer; per_type_decoder_f NGAP_RelativeAMFCapacity_decode_aper; per_type_encoder_f NGAP_RelativeAMFCapacity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_RepetitionPeriod.c b/lib/asn1c/ngap/NGAP_RepetitionPeriod.c index 4348328fbe..859c8b830e 100644 --- a/lib/asn1c/ngap/NGAP_RepetitionPeriod.c +++ b/lib/asn1c/ngap/NGAP_RepetitionPeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RepetitionPeriod.h" diff --git a/lib/asn1c/ngap/NGAP_RepetitionPeriod.h b/lib/asn1c/ngap/NGAP_RepetitionPeriod.h index 8f4003b55d..eae9d98ebf 100644 --- a/lib/asn1c/ngap/NGAP_RepetitionPeriod.h +++ b/lib/asn1c/ngap/NGAP_RepetitionPeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RepetitionPeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RepetitionPeriod; asn_struct_free_f NGAP_RepetitionPeriod_free; asn_struct_print_f NGAP_RepetitionPeriod_print; asn_constr_check_f NGAP_RepetitionPeriod_constraint; -jer_type_encoder_f NGAP_RepetitionPeriod_encode_jer; per_type_decoder_f NGAP_RepetitionPeriod_decode_aper; per_type_encoder_f NGAP_RepetitionPeriod_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportAmountMDT.c b/lib/asn1c/ngap/NGAP_ReportAmountMDT.c index 2bede5dcb8..bc1deee6b2 100644 --- a/lib/asn1c/ngap/NGAP_ReportAmountMDT.c +++ b/lib/asn1c/ngap/NGAP_ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportAmountMDT.h" diff --git a/lib/asn1c/ngap/NGAP_ReportAmountMDT.h b/lib/asn1c/ngap/NGAP_ReportAmountMDT.h index 6c01689a65..9d40a40660 100644 --- a/lib/asn1c/ngap/NGAP_ReportAmountMDT.h +++ b/lib/asn1c/ngap/NGAP_ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportAmountMDT_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ReportAmountMDT_specs_1; asn_struct_free_f NGAP_ReportAmountMDT_free; asn_struct_print_f NGAP_ReportAmountMDT_print; asn_constr_check_f NGAP_ReportAmountMDT_constraint; -jer_type_encoder_f NGAP_ReportAmountMDT_encode_jer; per_type_decoder_f NGAP_ReportAmountMDT_decode_aper; per_type_encoder_f NGAP_ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportArea.c b/lib/asn1c/ngap/NGAP_ReportArea.c index 1d4eeb2022..e98536632f 100644 --- a/lib/asn1c/ngap/NGAP_ReportArea.c +++ b/lib/asn1c/ngap/NGAP_ReportArea.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportArea.h" diff --git a/lib/asn1c/ngap/NGAP_ReportArea.h b/lib/asn1c/ngap/NGAP_ReportArea.h index 81d209c3dd..b2fa1b8f01 100644 --- a/lib/asn1c/ngap/NGAP_ReportArea.h +++ b/lib/asn1c/ngap/NGAP_ReportArea.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportArea_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ReportArea_specs_1; asn_struct_free_f NGAP_ReportArea_free; asn_struct_print_f NGAP_ReportArea_print; asn_constr_check_f NGAP_ReportArea_constraint; -jer_type_encoder_f NGAP_ReportArea_encode_jer; per_type_decoder_f NGAP_ReportArea_decode_aper; per_type_encoder_f NGAP_ReportArea_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportCharacteristics.c b/lib/asn1c/ngap/NGAP_ReportCharacteristics.c index 60b7ab096b..667370149b 100644 --- a/lib/asn1c/ngap/NGAP_ReportCharacteristics.c +++ b/lib/asn1c/ngap/NGAP_ReportCharacteristics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportCharacteristics.h" diff --git a/lib/asn1c/ngap/NGAP_ReportCharacteristics.h b/lib/asn1c/ngap/NGAP_ReportCharacteristics.h index a83b37fc3c..169d3ca905 100644 --- a/lib/asn1c/ngap/NGAP_ReportCharacteristics.h +++ b/lib/asn1c/ngap/NGAP_ReportCharacteristics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportCharacteristics_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_ReportCharacteristics; asn_struct_free_f NGAP_ReportCharacteristics_free; asn_struct_print_f NGAP_ReportCharacteristics_print; asn_constr_check_f NGAP_ReportCharacteristics_constraint; -jer_type_encoder_f NGAP_ReportCharacteristics_encode_jer; per_type_decoder_f NGAP_ReportCharacteristics_decode_aper; per_type_encoder_f NGAP_ReportCharacteristics_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportIntervalMDT.c b/lib/asn1c/ngap/NGAP_ReportIntervalMDT.c index 83e99a0695..5f598903d1 100644 --- a/lib/asn1c/ngap/NGAP_ReportIntervalMDT.c +++ b/lib/asn1c/ngap/NGAP_ReportIntervalMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportIntervalMDT.h" diff --git a/lib/asn1c/ngap/NGAP_ReportIntervalMDT.h b/lib/asn1c/ngap/NGAP_ReportIntervalMDT.h index a67787befc..79728c2649 100644 --- a/lib/asn1c/ngap/NGAP_ReportIntervalMDT.h +++ b/lib/asn1c/ngap/NGAP_ReportIntervalMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportIntervalMDT_H_ @@ -45,7 +45,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ReportIntervalMDT_specs_1; asn_struct_free_f NGAP_ReportIntervalMDT_free; asn_struct_print_f NGAP_ReportIntervalMDT_print; asn_constr_check_f NGAP_ReportIntervalMDT_constraint; -jer_type_encoder_f NGAP_ReportIntervalMDT_encode_jer; per_type_decoder_f NGAP_ReportIntervalMDT_decode_aper; per_type_encoder_f NGAP_ReportIntervalMDT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportType.c b/lib/asn1c/ngap/NGAP_ReportType.c index 734e3d8d6e..c45cbca28e 100644 --- a/lib/asn1c/ngap/NGAP_ReportType.c +++ b/lib/asn1c/ngap/NGAP_ReportType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportType.h" diff --git a/lib/asn1c/ngap/NGAP_ReportType.h b/lib/asn1c/ngap/NGAP_ReportType.h index b731abffb7..81b96bbf76 100644 --- a/lib/asn1c/ngap/NGAP_ReportType.h +++ b/lib/asn1c/ngap/NGAP_ReportType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportType_H_ diff --git a/lib/asn1c/ngap/NGAP_ReportingPeriodicity.c b/lib/asn1c/ngap/NGAP_ReportingPeriodicity.c index d38ac5b46a..7895c061de 100644 --- a/lib/asn1c/ngap/NGAP_ReportingPeriodicity.c +++ b/lib/asn1c/ngap/NGAP_ReportingPeriodicity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportingPeriodicity.h" diff --git a/lib/asn1c/ngap/NGAP_ReportingPeriodicity.h b/lib/asn1c/ngap/NGAP_ReportingPeriodicity.h index 80ebdb6bd9..f76f175fa1 100644 --- a/lib/asn1c/ngap/NGAP_ReportingPeriodicity.h +++ b/lib/asn1c/ngap/NGAP_ReportingPeriodicity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportingPeriodicity_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ReportingPeriodicity_specs_1; asn_struct_free_f NGAP_ReportingPeriodicity_free; asn_struct_print_f NGAP_ReportingPeriodicity_print; asn_constr_check_f NGAP_ReportingPeriodicity_constraint; -jer_type_encoder_f NGAP_ReportingPeriodicity_encode_jer; per_type_decoder_f NGAP_ReportingPeriodicity_decode_aper; per_type_encoder_f NGAP_ReportingPeriodicity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ReportingSystem.c b/lib/asn1c/ngap/NGAP_ReportingSystem.c index 8b98a7d13f..24e1022521 100644 --- a/lib/asn1c/ngap/NGAP_ReportingSystem.c +++ b/lib/asn1c/ngap/NGAP_ReportingSystem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ReportingSystem.h" diff --git a/lib/asn1c/ngap/NGAP_ReportingSystem.h b/lib/asn1c/ngap/NGAP_ReportingSystem.h index 1744460669..c10d4fb1d9 100644 --- a/lib/asn1c/ngap/NGAP_ReportingSystem.h +++ b/lib/asn1c/ngap/NGAP_ReportingSystem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ReportingSystem_H_ diff --git a/lib/asn1c/ngap/NGAP_RerouteNASRequest.c b/lib/asn1c/ngap/NGAP_RerouteNASRequest.c index 12e841aa51..97a8d5842b 100644 --- a/lib/asn1c/ngap/NGAP_RerouteNASRequest.c +++ b/lib/asn1c/ngap/NGAP_RerouteNASRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RerouteNASRequest.h" diff --git a/lib/asn1c/ngap/NGAP_RerouteNASRequest.h b/lib/asn1c/ngap/NGAP_RerouteNASRequest.h index 63f05683e0..ce4e888eeb 100644 --- a/lib/asn1c/ngap/NGAP_RerouteNASRequest.h +++ b/lib/asn1c/ngap/NGAP_RerouteNASRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RerouteNASRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_ResetAll.c b/lib/asn1c/ngap/NGAP_ResetAll.c index 51fdff6f89..18c3961fa9 100644 --- a/lib/asn1c/ngap/NGAP_ResetAll.c +++ b/lib/asn1c/ngap/NGAP_ResetAll.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ResetAll.h" diff --git a/lib/asn1c/ngap/NGAP_ResetAll.h b/lib/asn1c/ngap/NGAP_ResetAll.h index d1d92b7330..fc74ec64cc 100644 --- a/lib/asn1c/ngap/NGAP_ResetAll.h +++ b/lib/asn1c/ngap/NGAP_ResetAll.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ResetAll_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ResetAll_specs_1; asn_struct_free_f NGAP_ResetAll_free; asn_struct_print_f NGAP_ResetAll_print; asn_constr_check_f NGAP_ResetAll_constraint; -jer_type_encoder_f NGAP_ResetAll_encode_jer; per_type_decoder_f NGAP_ResetAll_decode_aper; per_type_encoder_f NGAP_ResetAll_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ResetType.c b/lib/asn1c/ngap/NGAP_ResetType.c index 6553d61595..829aec7c77 100644 --- a/lib/asn1c/ngap/NGAP_ResetType.c +++ b/lib/asn1c/ngap/NGAP_ResetType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ResetType.h" diff --git a/lib/asn1c/ngap/NGAP_ResetType.h b/lib/asn1c/ngap/NGAP_ResetType.h index 94c7c9b806..cd059d2ac7 100644 --- a/lib/asn1c/ngap/NGAP_ResetType.h +++ b/lib/asn1c/ngap/NGAP_ResetType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ResetType_H_ diff --git a/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.c b/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.c index 10e8b3a4dc..2e62917b37 100644 --- a/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.c +++ b/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ResourceStatusReportingSystem.h" diff --git a/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.h b/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.h index 486fd62ce6..bf5d822c21 100644 --- a/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.h +++ b/lib/asn1c/ngap/NGAP_ResourceStatusReportingSystem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ResourceStatusReportingSystem_H_ diff --git a/lib/asn1c/ngap/NGAP_RetrieveUEInformation.c b/lib/asn1c/ngap/NGAP_RetrieveUEInformation.c index 6f87e9c028..5746ca3e6d 100644 --- a/lib/asn1c/ngap/NGAP_RetrieveUEInformation.c +++ b/lib/asn1c/ngap/NGAP_RetrieveUEInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RetrieveUEInformation.h" diff --git a/lib/asn1c/ngap/NGAP_RetrieveUEInformation.h b/lib/asn1c/ngap/NGAP_RetrieveUEInformation.h index e554e14855..206e857f49 100644 --- a/lib/asn1c/ngap/NGAP_RetrieveUEInformation.h +++ b/lib/asn1c/ngap/NGAP_RetrieveUEInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RetrieveUEInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_RoutingID.c b/lib/asn1c/ngap/NGAP_RoutingID.c index 1ce808611c..9a3c16bbb0 100644 --- a/lib/asn1c/ngap/NGAP_RoutingID.c +++ b/lib/asn1c/ngap/NGAP_RoutingID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_RoutingID.h" diff --git a/lib/asn1c/ngap/NGAP_RoutingID.h b/lib/asn1c/ngap/NGAP_RoutingID.h index 3b0d480d42..125bad9e38 100644 --- a/lib/asn1c/ngap/NGAP_RoutingID.h +++ b/lib/asn1c/ngap/NGAP_RoutingID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_RoutingID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_RoutingID; asn_struct_free_f NGAP_RoutingID_free; asn_struct_print_f NGAP_RoutingID_print; asn_constr_check_f NGAP_RoutingID_constraint; -jer_type_encoder_f NGAP_RoutingID_encode_jer; per_type_decoder_f NGAP_RoutingID_decode_aper; per_type_encoder_f NGAP_RoutingID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_S-NSSAI.c b/lib/asn1c/ngap/NGAP_S-NSSAI.c index d0b9c7522f..b53d1e22d5 100644 --- a/lib/asn1c/ngap/NGAP_S-NSSAI.c +++ b/lib/asn1c/ngap/NGAP_S-NSSAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_S-NSSAI.h" diff --git a/lib/asn1c/ngap/NGAP_S-NSSAI.h b/lib/asn1c/ngap/NGAP_S-NSSAI.h index 0fdcff3603..1c32757c0e 100644 --- a/lib/asn1c/ngap/NGAP_S-NSSAI.h +++ b/lib/asn1c/ngap/NGAP_S-NSSAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_S_NSSAI_H_ diff --git a/lib/asn1c/ngap/NGAP_SCTP-TLAs.c b/lib/asn1c/ngap/NGAP_SCTP-TLAs.c index c226f0a323..d34e01e21f 100644 --- a/lib/asn1c/ngap/NGAP_SCTP-TLAs.c +++ b/lib/asn1c/ngap/NGAP_SCTP-TLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SCTP-TLAs.h" diff --git a/lib/asn1c/ngap/NGAP_SCTP-TLAs.h b/lib/asn1c/ngap/NGAP_SCTP-TLAs.h index 9f64e3f070..4dda12dd7d 100644 --- a/lib/asn1c/ngap/NGAP_SCTP-TLAs.h +++ b/lib/asn1c/ngap/NGAP_SCTP-TLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SCTP_TLAs_H_ diff --git a/lib/asn1c/ngap/NGAP_SD.c b/lib/asn1c/ngap/NGAP_SD.c index afecd2c173..f2ada0d5b5 100644 --- a/lib/asn1c/ngap/NGAP_SD.c +++ b/lib/asn1c/ngap/NGAP_SD.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SD.h" diff --git a/lib/asn1c/ngap/NGAP_SD.h b/lib/asn1c/ngap/NGAP_SD.h index f98b34db3f..3a869bc56d 100644 --- a/lib/asn1c/ngap/NGAP_SD.h +++ b/lib/asn1c/ngap/NGAP_SD.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SD_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SD; asn_struct_free_f NGAP_SD_free; asn_struct_print_f NGAP_SD_print; asn_constr_check_f NGAP_SD_constraint; -jer_type_encoder_f NGAP_SD_encode_jer; per_type_decoder_f NGAP_SD_decode_aper; per_type_encoder_f NGAP_SD_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.c b/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.c index 394f369e33..dc28c02eca 100644 --- a/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.c +++ b/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SNPN-MobilityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.h b/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.h index 45b2442991..a7276f0532 100644 --- a/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.h +++ b/lib/asn1c/ngap/NGAP_SNPN-MobilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SNPN_MobilityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.c b/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.c index 444517f813..8c974dae62 100644 --- a/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.c +++ b/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SONConfigurationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.h b/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.h index 07ab4e4581..433d71759d 100644 --- a/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.h +++ b/lib/asn1c/ngap/NGAP_SONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SONConfigurationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_SONInformation.c b/lib/asn1c/ngap/NGAP_SONInformation.c index a53982481b..cbb458c8bc 100644 --- a/lib/asn1c/ngap/NGAP_SONInformation.c +++ b/lib/asn1c/ngap/NGAP_SONInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SONInformation.h" diff --git a/lib/asn1c/ngap/NGAP_SONInformation.h b/lib/asn1c/ngap/NGAP_SONInformation.h index bfbe86441e..75e630be2c 100644 --- a/lib/asn1c/ngap/NGAP_SONInformation.h +++ b/lib/asn1c/ngap/NGAP_SONInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SONInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_SONInformationReply.c b/lib/asn1c/ngap/NGAP_SONInformationReply.c index 8c0202b39e..3d2459b597 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationReply.c +++ b/lib/asn1c/ngap/NGAP_SONInformationReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SONInformationReply.h" diff --git a/lib/asn1c/ngap/NGAP_SONInformationReply.h b/lib/asn1c/ngap/NGAP_SONInformationReply.h index db2058b06c..a4b6e19a56 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationReply.h +++ b/lib/asn1c/ngap/NGAP_SONInformationReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SONInformationReply_H_ diff --git a/lib/asn1c/ngap/NGAP_SONInformationReport.c b/lib/asn1c/ngap/NGAP_SONInformationReport.c index 8521729d2c..5bc9c3b2d2 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationReport.c +++ b/lib/asn1c/ngap/NGAP_SONInformationReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SONInformationReport.h" diff --git a/lib/asn1c/ngap/NGAP_SONInformationReport.h b/lib/asn1c/ngap/NGAP_SONInformationReport.h index f34c1c8e2d..3bd53a500c 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationReport.h +++ b/lib/asn1c/ngap/NGAP_SONInformationReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SONInformationReport_H_ diff --git a/lib/asn1c/ngap/NGAP_SONInformationRequest.c b/lib/asn1c/ngap/NGAP_SONInformationRequest.c index fc27830a97..db45f65b21 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationRequest.c +++ b/lib/asn1c/ngap/NGAP_SONInformationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SONInformationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_SONInformationRequest.h b/lib/asn1c/ngap/NGAP_SONInformationRequest.h index 5caf3e3900..c755dcf639 100644 --- a/lib/asn1c/ngap/NGAP_SONInformationRequest.h +++ b/lib/asn1c/ngap/NGAP_SONInformationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SONInformationRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SONInformationRequest_specs_1; asn_struct_free_f NGAP_SONInformationRequest_free; asn_struct_print_f NGAP_SONInformationRequest_print; asn_constr_check_f NGAP_SONInformationRequest_constraint; -jer_type_encoder_f NGAP_SONInformationRequest_encode_jer; per_type_decoder_f NGAP_SONInformationRequest_decode_aper; per_type_encoder_f NGAP_SONInformationRequest_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.c b/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.c index 3dc4f95d8f..fda7312e1b 100644 --- a/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.c +++ b/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SRVCCOperationPossible.h" diff --git a/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.h b/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.h index 0e11e7dc25..784d0f8dba 100644 --- a/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.h +++ b/lib/asn1c/ngap/NGAP_SRVCCOperationPossible.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SRVCCOperationPossible_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SRVCCOperationPossible_specs_1 asn_struct_free_f NGAP_SRVCCOperationPossible_free; asn_struct_print_f NGAP_SRVCCOperationPossible_print; asn_constr_check_f NGAP_SRVCCOperationPossible_constraint; -jer_type_encoder_f NGAP_SRVCCOperationPossible_encode_jer; per_type_decoder_f NGAP_SRVCCOperationPossible_decode_aper; per_type_encoder_f NGAP_SRVCCOperationPossible_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SST.c b/lib/asn1c/ngap/NGAP_SST.c index 8903ac83d0..27412a849a 100644 --- a/lib/asn1c/ngap/NGAP_SST.c +++ b/lib/asn1c/ngap/NGAP_SST.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SST.h" diff --git a/lib/asn1c/ngap/NGAP_SST.h b/lib/asn1c/ngap/NGAP_SST.h index 3033604321..24b3d1b1fc 100644 --- a/lib/asn1c/ngap/NGAP_SST.h +++ b/lib/asn1c/ngap/NGAP_SST.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SST_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SST; asn_struct_free_f NGAP_SST_free; asn_struct_print_f NGAP_SST_print; asn_constr_check_f NGAP_SST_constraint; -jer_type_encoder_f NGAP_SST_encode_jer; per_type_decoder_f NGAP_SST_decode_aper; per_type_encoder_f NGAP_SST_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.c b/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.c index 63371699c2..e912b3a3bf 100644 --- a/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.c +++ b/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ScheduledCommunicationTime.h" diff --git a/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.h b/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.h index 228f4fce76..c107d949db 100644 --- a/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.h +++ b/lib/asn1c/ngap/NGAP_ScheduledCommunicationTime.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ScheduledCommunicationTime_H_ diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.c b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.c index 38b11a6792..12afa99289 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.c +++ b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecondaryRATDataUsageReport.h" diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.h b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.h index 818cd90b1e..20c3ea4be4 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.h +++ b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecondaryRATDataUsageReport_H_ diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.c b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.c index c87e32e655..636632691b 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.c +++ b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecondaryRATDataUsageReportTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.h b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.h index 9787e11f7e..014b8b6d5d 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.h +++ b/lib/asn1c/ngap/NGAP_SecondaryRATDataUsageReportTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecondaryRATDataUsageReportTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.c b/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.c index 585d4cbd9b..04c12cb6a0 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.c +++ b/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecondaryRATUsageInformation.h" diff --git a/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.h b/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.h index 5895ec07fc..f91c4c6573 100644 --- a/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.h +++ b/lib/asn1c/ngap/NGAP_SecondaryRATUsageInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecondaryRATUsageInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_SecurityContext.c b/lib/asn1c/ngap/NGAP_SecurityContext.c index 886c9475de..524a72f1e3 100644 --- a/lib/asn1c/ngap/NGAP_SecurityContext.c +++ b/lib/asn1c/ngap/NGAP_SecurityContext.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecurityContext.h" diff --git a/lib/asn1c/ngap/NGAP_SecurityContext.h b/lib/asn1c/ngap/NGAP_SecurityContext.h index 9152969085..d7a7c73fb3 100644 --- a/lib/asn1c/ngap/NGAP_SecurityContext.h +++ b/lib/asn1c/ngap/NGAP_SecurityContext.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecurityContext_H_ diff --git a/lib/asn1c/ngap/NGAP_SecurityIndication.c b/lib/asn1c/ngap/NGAP_SecurityIndication.c index 55741f08f6..9536cb622d 100644 --- a/lib/asn1c/ngap/NGAP_SecurityIndication.c +++ b/lib/asn1c/ngap/NGAP_SecurityIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecurityIndication.h" diff --git a/lib/asn1c/ngap/NGAP_SecurityIndication.h b/lib/asn1c/ngap/NGAP_SecurityIndication.h index 1d93f08cae..bfeabdc568 100644 --- a/lib/asn1c/ngap/NGAP_SecurityIndication.h +++ b/lib/asn1c/ngap/NGAP_SecurityIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecurityIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_SecurityKey.c b/lib/asn1c/ngap/NGAP_SecurityKey.c index 0606c51dc9..38acf2d319 100644 --- a/lib/asn1c/ngap/NGAP_SecurityKey.c +++ b/lib/asn1c/ngap/NGAP_SecurityKey.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecurityKey.h" diff --git a/lib/asn1c/ngap/NGAP_SecurityKey.h b/lib/asn1c/ngap/NGAP_SecurityKey.h index 21416519ac..2de2d70d4c 100644 --- a/lib/asn1c/ngap/NGAP_SecurityKey.h +++ b/lib/asn1c/ngap/NGAP_SecurityKey.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecurityKey_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SecurityKey; asn_struct_free_f NGAP_SecurityKey_free; asn_struct_print_f NGAP_SecurityKey_print; asn_constr_check_f NGAP_SecurityKey_constraint; -jer_type_encoder_f NGAP_SecurityKey_encode_jer; per_type_decoder_f NGAP_SecurityKey_decode_aper; per_type_encoder_f NGAP_SecurityKey_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SecurityResult.c b/lib/asn1c/ngap/NGAP_SecurityResult.c index 440fc6187a..c878f9ac58 100644 --- a/lib/asn1c/ngap/NGAP_SecurityResult.c +++ b/lib/asn1c/ngap/NGAP_SecurityResult.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SecurityResult.h" diff --git a/lib/asn1c/ngap/NGAP_SecurityResult.h b/lib/asn1c/ngap/NGAP_SecurityResult.h index 9d93641d14..f83887d32c 100644 --- a/lib/asn1c/ngap/NGAP_SecurityResult.h +++ b/lib/asn1c/ngap/NGAP_SecurityResult.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SecurityResult_H_ diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfig.c b/lib/asn1c/ngap/NGAP_SensorMeasConfig.c index fcf00026fe..02cb1e4121 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfig.c +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SensorMeasConfig.h" diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfig.h b/lib/asn1c/ngap/NGAP_SensorMeasConfig.h index 672958b2bc..894f9f1baf 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfig.h +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SensorMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SensorMeasConfig_specs_1; asn_struct_free_f NGAP_SensorMeasConfig_free; asn_struct_print_f NGAP_SensorMeasConfig_print; asn_constr_check_f NGAP_SensorMeasConfig_constraint; -jer_type_encoder_f NGAP_SensorMeasConfig_encode_jer; per_type_decoder_f NGAP_SensorMeasConfig_decode_aper; per_type_encoder_f NGAP_SensorMeasConfig_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.c b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.c index 6895bfc6bb..c6ca8e4ced 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.c +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SensorMeasConfigNameItem.h" diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.h b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.h index ca4121346e..df2b5fc3b8 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.h +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SensorMeasConfigNameItem_H_ diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.c b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.c index 132603036a..867d1de8c8 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.c +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SensorMeasConfigNameList.h" diff --git a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.h b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.h index c485a0d553..a3c7c39d39 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.h +++ b/lib/asn1c/ngap/NGAP_SensorMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SensorMeasConfigNameList_H_ diff --git a/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.c b/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.c index 60d952f048..b3e86ffeb3 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.c +++ b/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SensorMeasurementConfiguration.h" diff --git a/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.h b/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.h index f42c6b1ded..66aa6be860 100644 --- a/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.h +++ b/lib/asn1c/ngap/NGAP_SensorMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SensorMeasurementConfiguration_H_ diff --git a/lib/asn1c/ngap/NGAP_SensorNameConfig.c b/lib/asn1c/ngap/NGAP_SensorNameConfig.c index 99e3007106..b51e4fab09 100644 --- a/lib/asn1c/ngap/NGAP_SensorNameConfig.c +++ b/lib/asn1c/ngap/NGAP_SensorNameConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SensorNameConfig.h" diff --git a/lib/asn1c/ngap/NGAP_SensorNameConfig.h b/lib/asn1c/ngap/NGAP_SensorNameConfig.h index 67f2acf18c..7d5bfaf75c 100644 --- a/lib/asn1c/ngap/NGAP_SensorNameConfig.h +++ b/lib/asn1c/ngap/NGAP_SensorNameConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SensorNameConfig_H_ diff --git a/lib/asn1c/ngap/NGAP_SerialNumber.c b/lib/asn1c/ngap/NGAP_SerialNumber.c index 73cb460eb7..a774fd4323 100644 --- a/lib/asn1c/ngap/NGAP_SerialNumber.c +++ b/lib/asn1c/ngap/NGAP_SerialNumber.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SerialNumber.h" diff --git a/lib/asn1c/ngap/NGAP_SerialNumber.h b/lib/asn1c/ngap/NGAP_SerialNumber.h index 574d706f17..5bfb6df73c 100644 --- a/lib/asn1c/ngap/NGAP_SerialNumber.h +++ b/lib/asn1c/ngap/NGAP_SerialNumber.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SerialNumber_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SerialNumber; asn_struct_free_f NGAP_SerialNumber_free; asn_struct_print_f NGAP_SerialNumber_print; asn_constr_check_f NGAP_SerialNumber_constraint; -jer_type_encoder_f NGAP_SerialNumber_encode_jer; per_type_decoder_f NGAP_SerialNumber_decode_aper; per_type_encoder_f NGAP_SerialNumber_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_ServedGUAMIItem.c b/lib/asn1c/ngap/NGAP_ServedGUAMIItem.c index eeeb7d8a9c..19b157bf99 100644 --- a/lib/asn1c/ngap/NGAP_ServedGUAMIItem.c +++ b/lib/asn1c/ngap/NGAP_ServedGUAMIItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ServedGUAMIItem.h" diff --git a/lib/asn1c/ngap/NGAP_ServedGUAMIItem.h b/lib/asn1c/ngap/NGAP_ServedGUAMIItem.h index 9e6073d9ed..08d13b4004 100644 --- a/lib/asn1c/ngap/NGAP_ServedGUAMIItem.h +++ b/lib/asn1c/ngap/NGAP_ServedGUAMIItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ServedGUAMIItem_H_ diff --git a/lib/asn1c/ngap/NGAP_ServedGUAMIList.c b/lib/asn1c/ngap/NGAP_ServedGUAMIList.c index 3a3a7ee275..80c9fa02d7 100644 --- a/lib/asn1c/ngap/NGAP_ServedGUAMIList.c +++ b/lib/asn1c/ngap/NGAP_ServedGUAMIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ServedGUAMIList.h" diff --git a/lib/asn1c/ngap/NGAP_ServedGUAMIList.h b/lib/asn1c/ngap/NGAP_ServedGUAMIList.h index cbbc14a52a..6567a25a19 100644 --- a/lib/asn1c/ngap/NGAP_ServedGUAMIList.h +++ b/lib/asn1c/ngap/NGAP_ServedGUAMIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ServedGUAMIList_H_ diff --git a/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.c b/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.c index 215786fac1..23bfb5fb38 100644 --- a/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.c +++ b/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ServiceAreaInformation-Item.h" diff --git a/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.h b/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.h index 7ff7a7a207..0e6cc294e0 100644 --- a/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.h +++ b/lib/asn1c/ngap/NGAP_ServiceAreaInformation-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ServiceAreaInformation_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_ServiceAreaInformation.c b/lib/asn1c/ngap/NGAP_ServiceAreaInformation.c index d81e32ba41..a10c601f34 100644 --- a/lib/asn1c/ngap/NGAP_ServiceAreaInformation.c +++ b/lib/asn1c/ngap/NGAP_ServiceAreaInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ServiceAreaInformation.h" diff --git a/lib/asn1c/ngap/NGAP_ServiceAreaInformation.h b/lib/asn1c/ngap/NGAP_ServiceAreaInformation.h index 134e1b4fa2..ef82a966c7 100644 --- a/lib/asn1c/ngap/NGAP_ServiceAreaInformation.h +++ b/lib/asn1c/ngap/NGAP_ServiceAreaInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ServiceAreaInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_ServiceType.c b/lib/asn1c/ngap/NGAP_ServiceType.c index cc8ee1b490..3200752869 100644 --- a/lib/asn1c/ngap/NGAP_ServiceType.c +++ b/lib/asn1c/ngap/NGAP_ServiceType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ServiceType.h" diff --git a/lib/asn1c/ngap/NGAP_ServiceType.h b/lib/asn1c/ngap/NGAP_ServiceType.h index 9da0da67a4..4b1ebb6e3f 100644 --- a/lib/asn1c/ngap/NGAP_ServiceType.h +++ b/lib/asn1c/ngap/NGAP_ServiceType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ServiceType_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ServiceType_specs_1; asn_struct_free_f NGAP_ServiceType_free; asn_struct_print_f NGAP_ServiceType_print; asn_constr_check_f NGAP_ServiceType_constraint; -jer_type_encoder_f NGAP_ServiceType_encode_jer; per_type_decoder_f NGAP_ServiceType_decode_aper; per_type_encoder_f NGAP_ServiceType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.c b/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.c index 8cf28a3ad0..c05a883f12 100644 --- a/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.c +++ b/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SgNB-UE-X2AP-ID.h" diff --git a/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.h b/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.h index 6d25389340..3cf7d37a75 100644 --- a/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.h +++ b/lib/asn1c/ngap/NGAP_SgNB-UE-X2AP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SgNB_UE_X2AP_ID_H_ @@ -28,7 +28,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SgNB_UE_X2AP_ID_specs_1; asn_struct_free_f NGAP_SgNB_UE_X2AP_ID_free; asn_struct_print_f NGAP_SgNB_UE_X2AP_ID_print; asn_constr_check_f NGAP_SgNB_UE_X2AP_ID_constraint; -jer_type_encoder_f NGAP_SgNB_UE_X2AP_ID_encode_jer; per_type_decoder_f NGAP_SgNB_UE_X2AP_ID_decode_aper; per_type_encoder_f NGAP_SgNB_UE_X2AP_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.c b/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.c index 19806c4de1..af80605c18 100644 --- a/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.c +++ b/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SharedNGU-MulticastTNLInformation.h" diff --git a/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.h b/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.h index 574c6417eb..6b86a6044c 100644 --- a/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.h +++ b/lib/asn1c/ngap/NGAP_SharedNGU-MulticastTNLInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SharedNGU_MulticastTNLInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceOverloadItem.c b/lib/asn1c/ngap/NGAP_SliceOverloadItem.c index 649ee39673..3f4efcf4f3 100644 --- a/lib/asn1c/ngap/NGAP_SliceOverloadItem.c +++ b/lib/asn1c/ngap/NGAP_SliceOverloadItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceOverloadItem.h" diff --git a/lib/asn1c/ngap/NGAP_SliceOverloadItem.h b/lib/asn1c/ngap/NGAP_SliceOverloadItem.h index 79ec8772cb..adbd819680 100644 --- a/lib/asn1c/ngap/NGAP_SliceOverloadItem.h +++ b/lib/asn1c/ngap/NGAP_SliceOverloadItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceOverloadItem_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceOverloadList.c b/lib/asn1c/ngap/NGAP_SliceOverloadList.c index c3a05d34d3..fe8d71dd4c 100644 --- a/lib/asn1c/ngap/NGAP_SliceOverloadList.c +++ b/lib/asn1c/ngap/NGAP_SliceOverloadList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceOverloadList.h" diff --git a/lib/asn1c/ngap/NGAP_SliceOverloadList.h b/lib/asn1c/ngap/NGAP_SliceOverloadList.h index 9aff2d3ba3..fc9d448afa 100644 --- a/lib/asn1c/ngap/NGAP_SliceOverloadList.h +++ b/lib/asn1c/ngap/NGAP_SliceOverloadList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceOverloadList_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceSupportItem.c b/lib/asn1c/ngap/NGAP_SliceSupportItem.c index 8ac92d9a32..566c84abd7 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportItem.c +++ b/lib/asn1c/ngap/NGAP_SliceSupportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceSupportItem.h" diff --git a/lib/asn1c/ngap/NGAP_SliceSupportItem.h b/lib/asn1c/ngap/NGAP_SliceSupportItem.h index 37765cba33..029fdab8d5 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportItem.h +++ b/lib/asn1c/ngap/NGAP_SliceSupportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceSupportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceSupportList.c b/lib/asn1c/ngap/NGAP_SliceSupportList.c index d8a9b00897..c772a3b09f 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportList.c +++ b/lib/asn1c/ngap/NGAP_SliceSupportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceSupportList.h" diff --git a/lib/asn1c/ngap/NGAP_SliceSupportList.h b/lib/asn1c/ngap/NGAP_SliceSupportList.h index 472c7db914..c7da4056b4 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportList.h +++ b/lib/asn1c/ngap/NGAP_SliceSupportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceSupportList_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceSupportListQMC.c b/lib/asn1c/ngap/NGAP_SliceSupportListQMC.c index 2a0b18990d..be53a40e51 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportListQMC.c +++ b/lib/asn1c/ngap/NGAP_SliceSupportListQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceSupportListQMC.h" diff --git a/lib/asn1c/ngap/NGAP_SliceSupportListQMC.h b/lib/asn1c/ngap/NGAP_SliceSupportListQMC.h index 5ed8e014ae..272cf2a90f 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportListQMC.h +++ b/lib/asn1c/ngap/NGAP_SliceSupportListQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceSupportListQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.c b/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.c index ff3376e32f..ae7e940161 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.c +++ b/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SliceSupportQMC-Item.h" diff --git a/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.h b/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.h index f88715ca04..9c9ecdd5ff 100644 --- a/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.h +++ b/lib/asn1c/ngap/NGAP_SliceSupportQMC-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SliceSupportQMC_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.c b/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.c index ccbb4075d8..26f7cc61e3 100644 --- a/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.h b/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.h index 9e3c27ca0d..3dc44ee354 100644 --- a/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_SourceNGRANNode-ToTargetNGRANNode-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceNGRANNode_ToTargetNGRANNode_TransparentContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_SourceNodeID.c b/lib/asn1c/ngap/NGAP_SourceNodeID.c index a3b554b1ad..a0a977a92e 100644 --- a/lib/asn1c/ngap/NGAP_SourceNodeID.c +++ b/lib/asn1c/ngap/NGAP_SourceNodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceNodeID.h" diff --git a/lib/asn1c/ngap/NGAP_SourceNodeID.h b/lib/asn1c/ngap/NGAP_SourceNodeID.h index 535a2667b5..4c601602e6 100644 --- a/lib/asn1c/ngap/NGAP_SourceNodeID.h +++ b/lib/asn1c/ngap/NGAP_SourceNodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceNodeID_H_ diff --git a/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.c b/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.c index f98b1544c1..29b8c63841 100644 --- a/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.c +++ b/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceOfUEActivityBehaviourInformation.h" diff --git a/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.h b/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.h index b5e03c14d0..4e67c2e802 100644 --- a/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.h +++ b/lib/asn1c/ngap/NGAP_SourceOfUEActivityBehaviourInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceOfUEActivityBehaviourInformation_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SourceOfUEActivityBehaviourInf asn_struct_free_f NGAP_SourceOfUEActivityBehaviourInformation_free; asn_struct_print_f NGAP_SourceOfUEActivityBehaviourInformation_print; asn_constr_check_f NGAP_SourceOfUEActivityBehaviourInformation_constraint; -jer_type_encoder_f NGAP_SourceOfUEActivityBehaviourInformation_encode_jer; per_type_decoder_f NGAP_SourceOfUEActivityBehaviourInformation_decode_aper; per_type_encoder_f NGAP_SourceOfUEActivityBehaviourInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SourceRANNodeID.c b/lib/asn1c/ngap/NGAP_SourceRANNodeID.c index 26fb3b9dfe..23a1c32d55 100644 --- a/lib/asn1c/ngap/NGAP_SourceRANNodeID.c +++ b/lib/asn1c/ngap/NGAP_SourceRANNodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceRANNodeID.h" diff --git a/lib/asn1c/ngap/NGAP_SourceRANNodeID.h b/lib/asn1c/ngap/NGAP_SourceRANNodeID.h index 44ee0e60f6..e808eb4834 100644 --- a/lib/asn1c/ngap/NGAP_SourceRANNodeID.h +++ b/lib/asn1c/ngap/NGAP_SourceRANNodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceRANNodeID_H_ diff --git a/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.c b/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.c index 1a4dea98ea..a400140613 100644 --- a/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.c +++ b/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceToTarget-AMFInformationReroute.h" diff --git a/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.h b/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.h index 0aaf3a6d29..20d468f7e8 100644 --- a/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.h +++ b/lib/asn1c/ngap/NGAP_SourceToTarget-AMFInformationReroute.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceToTarget_AMFInformationReroute_H_ diff --git a/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.c b/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.c index 8930b4c551..0cede012a5 100644 --- a/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SourceToTarget-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.h b/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.h index 169efbff22..ccf77c0749 100644 --- a/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_SourceToTarget-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SourceToTarget_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SourceToTarget_TransparentContainer; asn_struct_free_f NGAP_SourceToTarget_TransparentContainer_free; asn_struct_print_f NGAP_SourceToTarget_TransparentContainer_print; asn_constr_check_f NGAP_SourceToTarget_TransparentContainer_constraint; -jer_type_encoder_f NGAP_SourceToTarget_TransparentContainer_encode_jer; per_type_decoder_f NGAP_SourceToTarget_TransparentContainer_decode_aper; per_type_encoder_f NGAP_SourceToTarget_TransparentContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.c b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.c index ff5da992b9..449a2b3074 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.c +++ b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SuccessfulHandoverReport-Item.h" diff --git a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.h b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.h index 042cdbe2a1..97aa0097e0 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.h +++ b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReport-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SuccessfulHandoverReport_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.c b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.c index a89be48098..13a0d30ed7 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.c +++ b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SuccessfulHandoverReportList.h" diff --git a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.h b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.h index 7847938e9f..c3a961eeca 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.h +++ b/lib/asn1c/ngap/NGAP_SuccessfulHandoverReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SuccessfulHandoverReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_SuccessfulOutcome.c b/lib/asn1c/ngap/NGAP_SuccessfulOutcome.c index b4b41880f1..d9d929b22c 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulOutcome.c +++ b/lib/asn1c/ngap/NGAP_SuccessfulOutcome.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SuccessfulOutcome.h" diff --git a/lib/asn1c/ngap/NGAP_SuccessfulOutcome.h b/lib/asn1c/ngap/NGAP_SuccessfulOutcome.h index a58299b13e..e3c5636651 100644 --- a/lib/asn1c/ngap/NGAP_SuccessfulOutcome.h +++ b/lib/asn1c/ngap/NGAP_SuccessfulOutcome.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SuccessfulOutcome_H_ diff --git a/lib/asn1c/ngap/NGAP_SupportedTAItem.c b/lib/asn1c/ngap/NGAP_SupportedTAItem.c index 857336e0b4..5da3582a46 100644 --- a/lib/asn1c/ngap/NGAP_SupportedTAItem.c +++ b/lib/asn1c/ngap/NGAP_SupportedTAItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SupportedTAItem.h" diff --git a/lib/asn1c/ngap/NGAP_SupportedTAItem.h b/lib/asn1c/ngap/NGAP_SupportedTAItem.h index 3fbac6fa22..f04f2bbf24 100644 --- a/lib/asn1c/ngap/NGAP_SupportedTAItem.h +++ b/lib/asn1c/ngap/NGAP_SupportedTAItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SupportedTAItem_H_ diff --git a/lib/asn1c/ngap/NGAP_SupportedTAList.c b/lib/asn1c/ngap/NGAP_SupportedTAList.c index 3bf66f19b6..74544adbc4 100644 --- a/lib/asn1c/ngap/NGAP_SupportedTAList.c +++ b/lib/asn1c/ngap/NGAP_SupportedTAList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SupportedTAList.h" diff --git a/lib/asn1c/ngap/NGAP_SupportedTAList.h b/lib/asn1c/ngap/NGAP_SupportedTAList.h index 57d11ca25c..47b0c48232 100644 --- a/lib/asn1c/ngap/NGAP_SupportedTAList.h +++ b/lib/asn1c/ngap/NGAP_SupportedTAList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SupportedTAList_H_ diff --git a/lib/asn1c/ngap/NGAP_SurvivalTime.c b/lib/asn1c/ngap/NGAP_SurvivalTime.c index 177bf38961..a40de9496a 100644 --- a/lib/asn1c/ngap/NGAP_SurvivalTime.c +++ b/lib/asn1c/ngap/NGAP_SurvivalTime.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SurvivalTime.h" diff --git a/lib/asn1c/ngap/NGAP_SurvivalTime.h b/lib/asn1c/ngap/NGAP_SurvivalTime.h index 068fbf74fd..70589f1380 100644 --- a/lib/asn1c/ngap/NGAP_SurvivalTime.h +++ b/lib/asn1c/ngap/NGAP_SurvivalTime.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SurvivalTime_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_SurvivalTime; asn_struct_free_f NGAP_SurvivalTime_free; asn_struct_print_f NGAP_SurvivalTime_print; asn_constr_check_f NGAP_SurvivalTime_constraint; -jer_type_encoder_f NGAP_SurvivalTime_encode_jer; per_type_decoder_f NGAP_SurvivalTime_decode_aper; per_type_encoder_f NGAP_SurvivalTime_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.c b/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.c index 1b9b0fa9a1..7d13656512 100644 --- a/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.c +++ b/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Suspend-Request-Indication.h" diff --git a/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.h b/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.h index e45be6c5a0..da150e9faa 100644 --- a/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.h +++ b/lib/asn1c/ngap/NGAP_Suspend-Request-Indication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Suspend_Request_Indication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Suspend_Request_Indication_spe asn_struct_free_f NGAP_Suspend_Request_Indication_free; asn_struct_print_f NGAP_Suspend_Request_Indication_print; asn_constr_check_f NGAP_Suspend_Request_Indication_constraint; -jer_type_encoder_f NGAP_Suspend_Request_Indication_encode_jer; per_type_decoder_f NGAP_Suspend_Request_Indication_decode_aper; per_type_encoder_f NGAP_Suspend_Request_Indication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.c b/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.c index 9ec1df000c..53efa01e0f 100644 --- a/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.c +++ b/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Suspend-Response-Indication.h" diff --git a/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.h b/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.h index f9397461ba..fa696fe3c7 100644 --- a/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.h +++ b/lib/asn1c/ngap/NGAP_Suspend-Response-Indication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Suspend_Response_Indication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_Suspend_Response_Indication_sp asn_struct_free_f NGAP_Suspend_Response_Indication_free; asn_struct_print_f NGAP_Suspend_Response_Indication_print; asn_constr_check_f NGAP_Suspend_Response_Indication_constraint; -jer_type_encoder_f NGAP_Suspend_Response_Indication_encode_jer; per_type_decoder_f NGAP_Suspend_Response_Indication_decode_aper; per_type_encoder_f NGAP_Suspend_Response_Indication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_SuspendIndicator.c b/lib/asn1c/ngap/NGAP_SuspendIndicator.c index cb91527228..568e68cf47 100644 --- a/lib/asn1c/ngap/NGAP_SuspendIndicator.c +++ b/lib/asn1c/ngap/NGAP_SuspendIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_SuspendIndicator.h" diff --git a/lib/asn1c/ngap/NGAP_SuspendIndicator.h b/lib/asn1c/ngap/NGAP_SuspendIndicator.h index 915c548f95..d051deaad0 100644 --- a/lib/asn1c/ngap/NGAP_SuspendIndicator.h +++ b/lib/asn1c/ngap/NGAP_SuspendIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_SuspendIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_SuspendIndicator_specs_1; asn_struct_free_f NGAP_SuspendIndicator_free; asn_struct_print_f NGAP_SuspendIndicator_print; asn_constr_check_f NGAP_SuspendIndicator_constraint; -jer_type_encoder_f NGAP_SuspendIndicator_encode_jer; per_type_decoder_f NGAP_SuspendIndicator_decode_aper; per_type_encoder_f NGAP_SuspendIndicator_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TABasedMDT.c b/lib/asn1c/ngap/NGAP_TABasedMDT.c index 65f3c492cd..923078a9a4 100644 --- a/lib/asn1c/ngap/NGAP_TABasedMDT.c +++ b/lib/asn1c/ngap/NGAP_TABasedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TABasedMDT.h" diff --git a/lib/asn1c/ngap/NGAP_TABasedMDT.h b/lib/asn1c/ngap/NGAP_TABasedMDT.h index 6f7b40e433..a8496062f2 100644 --- a/lib/asn1c/ngap/NGAP_TABasedMDT.h +++ b/lib/asn1c/ngap/NGAP_TABasedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TABasedMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_TABasedQMC.c b/lib/asn1c/ngap/NGAP_TABasedQMC.c index d402e84e94..3fc29b99fc 100644 --- a/lib/asn1c/ngap/NGAP_TABasedQMC.c +++ b/lib/asn1c/ngap/NGAP_TABasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TABasedQMC.h" diff --git a/lib/asn1c/ngap/NGAP_TABasedQMC.h b/lib/asn1c/ngap/NGAP_TABasedQMC.h index 2b0ce912bd..98a5f56ae8 100644 --- a/lib/asn1c/ngap/NGAP_TABasedQMC.h +++ b/lib/asn1c/ngap/NGAP_TABasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TABasedQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_TAC.c b/lib/asn1c/ngap/NGAP_TAC.c index a43e6fb031..d856bc71e3 100644 --- a/lib/asn1c/ngap/NGAP_TAC.c +++ b/lib/asn1c/ngap/NGAP_TAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAC.h" diff --git a/lib/asn1c/ngap/NGAP_TAC.h b/lib/asn1c/ngap/NGAP_TAC.h index e50d8ef7a8..2376713f54 100644 --- a/lib/asn1c/ngap/NGAP_TAC.h +++ b/lib/asn1c/ngap/NGAP_TAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TAC; asn_struct_free_f NGAP_TAC_free; asn_struct_print_f NGAP_TAC_print; asn_constr_check_f NGAP_TAC_constraint; -jer_type_encoder_f NGAP_TAC_encode_jer; per_type_decoder_f NGAP_TAC_decode_aper; per_type_encoder_f NGAP_TAC_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TACListInNRNTN.c b/lib/asn1c/ngap/NGAP_TACListInNRNTN.c index 5743842160..9fa3faf2b8 100644 --- a/lib/asn1c/ngap/NGAP_TACListInNRNTN.c +++ b/lib/asn1c/ngap/NGAP_TACListInNRNTN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TACListInNRNTN.h" diff --git a/lib/asn1c/ngap/NGAP_TACListInNRNTN.h b/lib/asn1c/ngap/NGAP_TACListInNRNTN.h index 08793a70ca..b233d9f376 100644 --- a/lib/asn1c/ngap/NGAP_TACListInNRNTN.h +++ b/lib/asn1c/ngap/NGAP_TACListInNRNTN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TACListInNRNTN_H_ diff --git a/lib/asn1c/ngap/NGAP_TAI.c b/lib/asn1c/ngap/NGAP_TAI.c index 5e746faa21..908c2930bf 100644 --- a/lib/asn1c/ngap/NGAP_TAI.c +++ b/lib/asn1c/ngap/NGAP_TAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAI.h" diff --git a/lib/asn1c/ngap/NGAP_TAI.h b/lib/asn1c/ngap/NGAP_TAI.h index 9c8887065f..743f612962 100644 --- a/lib/asn1c/ngap/NGAP_TAI.h +++ b/lib/asn1c/ngap/NGAP_TAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAI_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBasedMDT.c b/lib/asn1c/ngap/NGAP_TAIBasedMDT.c index fb7a4400c0..291675642e 100644 --- a/lib/asn1c/ngap/NGAP_TAIBasedMDT.c +++ b/lib/asn1c/ngap/NGAP_TAIBasedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBasedMDT.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBasedMDT.h b/lib/asn1c/ngap/NGAP_TAIBasedMDT.h index 8fa2c65a75..f4b37b740f 100644 --- a/lib/asn1c/ngap/NGAP_TAIBasedMDT.h +++ b/lib/asn1c/ngap/NGAP_TAIBasedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBasedMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBasedQMC.c b/lib/asn1c/ngap/NGAP_TAIBasedQMC.c index 3a2b43502d..3526c2b92d 100644 --- a/lib/asn1c/ngap/NGAP_TAIBasedQMC.c +++ b/lib/asn1c/ngap/NGAP_TAIBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBasedQMC.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBasedQMC.h b/lib/asn1c/ngap/NGAP_TAIBasedQMC.h index f64f2a7896..d354b0239e 100644 --- a/lib/asn1c/ngap/NGAP_TAIBasedQMC.h +++ b/lib/asn1c/ngap/NGAP_TAIBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBasedQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.c b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.c index c6a8c44d86..2df9df14a0 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBroadcastEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.h b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.h index ad3be5a474..564bcd0ebb 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBroadcastEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.c b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.c index 530cda0cd3..d2d1d4d433 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.c +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBroadcastEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.h b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.h index fba3af143a..80993411ae 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.h +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBroadcastEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.c b/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.c index 7d47109b23..670ab37664 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.c +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBroadcastNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.h b/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.h index 55514c54f3..b72a94ba9d 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.h +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBroadcastNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastNR.c b/lib/asn1c/ngap/NGAP_TAIBroadcastNR.c index a2f34852fa..7310ae9a8e 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastNR.c +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIBroadcastNR.h" diff --git a/lib/asn1c/ngap/NGAP_TAIBroadcastNR.h b/lib/asn1c/ngap/NGAP_TAIBroadcastNR.h index 5267111b0d..53f5631551 100644 --- a/lib/asn1c/ngap/NGAP_TAIBroadcastNR.h +++ b/lib/asn1c/ngap/NGAP_TAIBroadcastNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIBroadcastNR_H_ diff --git a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.c b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.c index 79792afcfa..83479047bf 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.c +++ b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAICancelledEUTRA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.h b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.h index 36f69ae785..1d1de2e90d 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.h +++ b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAICancelledEUTRA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.c b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.c index 998ededfb7..445423819e 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.c +++ b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAICancelledEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.h b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.h index 576b6ce626..9a65ff6ef9 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.h +++ b/lib/asn1c/ngap/NGAP_TAICancelledEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAICancelledEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.c b/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.c index 1f5aa89974..caefea2619 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.c +++ b/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAICancelledNR-Item.h" diff --git a/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.h b/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.h index 908a65f9d4..913e873ebb 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.h +++ b/lib/asn1c/ngap/NGAP_TAICancelledNR-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAICancelledNR_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_TAICancelledNR.c b/lib/asn1c/ngap/NGAP_TAICancelledNR.c index d4285760e7..cfd63977f5 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledNR.c +++ b/lib/asn1c/ngap/NGAP_TAICancelledNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAICancelledNR.h" diff --git a/lib/asn1c/ngap/NGAP_TAICancelledNR.h b/lib/asn1c/ngap/NGAP_TAICancelledNR.h index dd373b8d9c..871ac8528e 100644 --- a/lib/asn1c/ngap/NGAP_TAICancelledNR.h +++ b/lib/asn1c/ngap/NGAP_TAICancelledNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAICancelledNR_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForInactive.c b/lib/asn1c/ngap/NGAP_TAIListForInactive.c index b6d19e6df4..27d336f3d4 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForInactive.c +++ b/lib/asn1c/ngap/NGAP_TAIListForInactive.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForInactive.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForInactive.h b/lib/asn1c/ngap/NGAP_TAIListForInactive.h index 85151851c8..8f08ff8584 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForInactive.h +++ b/lib/asn1c/ngap/NGAP_TAIListForInactive.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForInactive_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.c b/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.c index caf53bae5a..d6ee8f3c26 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.c +++ b/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForInactiveItem.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.h b/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.h index 961b0b86c6..4d8fb24e27 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.h +++ b/lib/asn1c/ngap/NGAP_TAIListForInactiveItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForInactiveItem_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForPaging.c b/lib/asn1c/ngap/NGAP_TAIListForPaging.c index cb0a7a57a3..d4a7eaa650 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForPaging.c +++ b/lib/asn1c/ngap/NGAP_TAIListForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForPaging.h b/lib/asn1c/ngap/NGAP_TAIListForPaging.h index e724b80798..cb4fd8fccf 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForPaging.h +++ b/lib/asn1c/ngap/NGAP_TAIListForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForPagingItem.c b/lib/asn1c/ngap/NGAP_TAIListForPagingItem.c index 7dbc70298d..95fb043ebb 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForPagingItem.c +++ b/lib/asn1c/ngap/NGAP_TAIListForPagingItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForPagingItem.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForPagingItem.h b/lib/asn1c/ngap/NGAP_TAIListForPagingItem.h index be0ec62ac6..9c3a5dcf9f 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForPagingItem.h +++ b/lib/asn1c/ngap/NGAP_TAIListForPagingItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForPagingItem_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForRestart.c b/lib/asn1c/ngap/NGAP_TAIListForRestart.c index f7f8682562..46f8d4bdc0 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForRestart.c +++ b/lib/asn1c/ngap/NGAP_TAIListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForRestart.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForRestart.h b/lib/asn1c/ngap/NGAP_TAIListForRestart.h index 9fcf0b1b3a..2d9b5a6254 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForRestart.h +++ b/lib/asn1c/ngap/NGAP_TAIListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForRestart_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListForWarning.c b/lib/asn1c/ngap/NGAP_TAIListForWarning.c index 97e463fa36..82aa95ee46 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForWarning.c +++ b/lib/asn1c/ngap/NGAP_TAIListForWarning.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListForWarning.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListForWarning.h b/lib/asn1c/ngap/NGAP_TAIListForWarning.h index f6dc59a2d5..5e059900e4 100644 --- a/lib/asn1c/ngap/NGAP_TAIListForWarning.h +++ b/lib/asn1c/ngap/NGAP_TAIListForWarning.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListForWarning_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListforMDT.c b/lib/asn1c/ngap/NGAP_TAIListforMDT.c index a70fd4b5b2..9e4e2133a7 100644 --- a/lib/asn1c/ngap/NGAP_TAIListforMDT.c +++ b/lib/asn1c/ngap/NGAP_TAIListforMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListforMDT.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListforMDT.h b/lib/asn1c/ngap/NGAP_TAIListforMDT.h index 8bc53f032c..dc0a711896 100644 --- a/lib/asn1c/ngap/NGAP_TAIListforMDT.h +++ b/lib/asn1c/ngap/NGAP_TAIListforMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListforMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_TAIListforQMC.c b/lib/asn1c/ngap/NGAP_TAIListforQMC.c index 9680ce21d3..23df540aac 100644 --- a/lib/asn1c/ngap/NGAP_TAIListforQMC.c +++ b/lib/asn1c/ngap/NGAP_TAIListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAIListforQMC.h" diff --git a/lib/asn1c/ngap/NGAP_TAIListforQMC.h b/lib/asn1c/ngap/NGAP_TAIListforQMC.h index adb878ee26..1cfbea5191 100644 --- a/lib/asn1c/ngap/NGAP_TAIListforQMC.h +++ b/lib/asn1c/ngap/NGAP_TAIListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAIListforQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.c b/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.c index bcb05de9a2..60ab69d384 100644 --- a/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.c +++ b/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAINSAGSupportItem.h" diff --git a/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.h b/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.h index 4f30e1ea43..333caebc26 100644 --- a/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.h +++ b/lib/asn1c/ngap/NGAP_TAINSAGSupportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAINSAGSupportItem_H_ diff --git a/lib/asn1c/ngap/NGAP_TAINSAGSupportList.c b/lib/asn1c/ngap/NGAP_TAINSAGSupportList.c index f673c3468a..4ae9e916f0 100644 --- a/lib/asn1c/ngap/NGAP_TAINSAGSupportList.c +++ b/lib/asn1c/ngap/NGAP_TAINSAGSupportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAINSAGSupportList.h" diff --git a/lib/asn1c/ngap/NGAP_TAINSAGSupportList.h b/lib/asn1c/ngap/NGAP_TAINSAGSupportList.h index f2a7bad7b7..f43bde6f6b 100644 --- a/lib/asn1c/ngap/NGAP_TAINSAGSupportList.h +++ b/lib/asn1c/ngap/NGAP_TAINSAGSupportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAINSAGSupportList_H_ diff --git a/lib/asn1c/ngap/NGAP_TAListforMDT.c b/lib/asn1c/ngap/NGAP_TAListforMDT.c index f5d8e4eed9..884401fe3b 100644 --- a/lib/asn1c/ngap/NGAP_TAListforMDT.c +++ b/lib/asn1c/ngap/NGAP_TAListforMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAListforMDT.h" diff --git a/lib/asn1c/ngap/NGAP_TAListforMDT.h b/lib/asn1c/ngap/NGAP_TAListforMDT.h index 74946edf14..2f4635e1fd 100644 --- a/lib/asn1c/ngap/NGAP_TAListforMDT.h +++ b/lib/asn1c/ngap/NGAP_TAListforMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAListforMDT_H_ diff --git a/lib/asn1c/ngap/NGAP_TAListforQMC.c b/lib/asn1c/ngap/NGAP_TAListforQMC.c index dc85e13acb..8e150e48f4 100644 --- a/lib/asn1c/ngap/NGAP_TAListforQMC.c +++ b/lib/asn1c/ngap/NGAP_TAListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TAListforQMC.h" diff --git a/lib/asn1c/ngap/NGAP_TAListforQMC.h b/lib/asn1c/ngap/NGAP_TAListforQMC.h index 7fdb0dcde9..b8f9d7e987 100644 --- a/lib/asn1c/ngap/NGAP_TAListforQMC.h +++ b/lib/asn1c/ngap/NGAP_TAListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TAListforQMC_H_ diff --git a/lib/asn1c/ngap/NGAP_TMGI.c b/lib/asn1c/ngap/NGAP_TMGI.c index 4a6f8001fb..0b37c45613 100644 --- a/lib/asn1c/ngap/NGAP_TMGI.c +++ b/lib/asn1c/ngap/NGAP_TMGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TMGI.h" diff --git a/lib/asn1c/ngap/NGAP_TMGI.h b/lib/asn1c/ngap/NGAP_TMGI.h index f5c78f07f9..8a22a1ee19 100644 --- a/lib/asn1c/ngap/NGAP_TMGI.h +++ b/lib/asn1c/ngap/NGAP_TMGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TMGI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TMGI; asn_struct_free_f NGAP_TMGI_free; asn_struct_print_f NGAP_TMGI_print; asn_constr_check_f NGAP_TMGI_constraint; -jer_type_encoder_f NGAP_TMGI_encode_jer; per_type_decoder_f NGAP_TMGI_decode_aper; per_type_encoder_f NGAP_TMGI_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TNAP-ID.c b/lib/asn1c/ngap/NGAP_TNAP-ID.c index c74946d101..104672bfd6 100644 --- a/lib/asn1c/ngap/NGAP_TNAP-ID.c +++ b/lib/asn1c/ngap/NGAP_TNAP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNAP-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TNAP-ID.h b/lib/asn1c/ngap/NGAP_TNAP-ID.h index 2bb9fd768b..91741823c7 100644 --- a/lib/asn1c/ngap/NGAP_TNAP-ID.h +++ b/lib/asn1c/ngap/NGAP_TNAP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNAP_ID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TNAP_ID; asn_struct_free_f NGAP_TNAP_ID_free; asn_struct_print_f NGAP_TNAP_ID_print; asn_constr_check_f NGAP_TNAP_ID_constraint; -jer_type_encoder_f NGAP_TNAP_ID_encode_jer; per_type_decoder_f NGAP_TNAP_ID_decode_aper; per_type_encoder_f NGAP_TNAP_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TNGF-ID.c b/lib/asn1c/ngap/NGAP_TNGF-ID.c index 3e9d94dd92..16dca339ff 100644 --- a/lib/asn1c/ngap/NGAP_TNGF-ID.c +++ b/lib/asn1c/ngap/NGAP_TNGF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNGF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TNGF-ID.h b/lib/asn1c/ngap/NGAP_TNGF-ID.h index f8b453c093..d9b180b79c 100644 --- a/lib/asn1c/ngap/NGAP_TNGF-ID.h +++ b/lib/asn1c/ngap/NGAP_TNGF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNGF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.c b/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.c index 96b4f484c1..4f651e78ff 100644 --- a/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.c +++ b/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNLAddressWeightFactor.h" diff --git a/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.h b/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.h index 6a8ecb995a..3bed0cbb69 100644 --- a/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.h +++ b/lib/asn1c/ngap/NGAP_TNLAddressWeightFactor.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNLAddressWeightFactor_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TNLAddressWeightFactor; asn_struct_free_f NGAP_TNLAddressWeightFactor_free; asn_struct_print_f NGAP_TNLAddressWeightFactor_print; asn_constr_check_f NGAP_TNLAddressWeightFactor_constraint; -jer_type_encoder_f NGAP_TNLAddressWeightFactor_encode_jer; per_type_decoder_f NGAP_TNLAddressWeightFactor_decode_aper; per_type_encoder_f NGAP_TNLAddressWeightFactor_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationItem.c b/lib/asn1c/ngap/NGAP_TNLAssociationItem.c index 0a9f331f37..081d5c0f85 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationItem.c +++ b/lib/asn1c/ngap/NGAP_TNLAssociationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNLAssociationItem.h" diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationItem.h b/lib/asn1c/ngap/NGAP_TNLAssociationItem.h index c28267e537..4aa2689891 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationItem.h +++ b/lib/asn1c/ngap/NGAP_TNLAssociationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNLAssociationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationList.c b/lib/asn1c/ngap/NGAP_TNLAssociationList.c index 1005d57478..55789220a9 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationList.c +++ b/lib/asn1c/ngap/NGAP_TNLAssociationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNLAssociationList.h" diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationList.h b/lib/asn1c/ngap/NGAP_TNLAssociationList.h index f649ec4429..73a41f8b01 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationList.h +++ b/lib/asn1c/ngap/NGAP_TNLAssociationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNLAssociationList_H_ diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationUsage.c b/lib/asn1c/ngap/NGAP_TNLAssociationUsage.c index 26e5d12248..c1a19bbc6f 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationUsage.c +++ b/lib/asn1c/ngap/NGAP_TNLAssociationUsage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TNLAssociationUsage.h" diff --git a/lib/asn1c/ngap/NGAP_TNLAssociationUsage.h b/lib/asn1c/ngap/NGAP_TNLAssociationUsage.h index 35f34d433b..c7966ea760 100644 --- a/lib/asn1c/ngap/NGAP_TNLAssociationUsage.h +++ b/lib/asn1c/ngap/NGAP_TNLAssociationUsage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TNLAssociationUsage_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TNLAssociationUsage_specs_1; asn_struct_free_f NGAP_TNLAssociationUsage_free; asn_struct_print_f NGAP_TNLAssociationUsage_print; asn_constr_check_f NGAP_TNLAssociationUsage_constraint; -jer_type_encoder_f NGAP_TNLAssociationUsage_encode_jer; per_type_decoder_f NGAP_TNLAssociationUsage_decode_aper; per_type_encoder_f NGAP_TNLAssociationUsage_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.c b/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.c index bd373455bf..9a5295d629 100644 --- a/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.c +++ b/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TSCAssistanceInformation.h" diff --git a/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.h b/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.h index ddfe3db99a..3817c63b5d 100644 --- a/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.h +++ b/lib/asn1c/ngap/NGAP_TSCAssistanceInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TSCAssistanceInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.c b/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.c index 7b33694a6d..403c0ac352 100644 --- a/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.c +++ b/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TSCTrafficCharacteristics.h" diff --git a/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.h b/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.h index 033182d349..1d3434a0fc 100644 --- a/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.h +++ b/lib/asn1c/ngap/NGAP_TSCTrafficCharacteristics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TSCTrafficCharacteristics_H_ diff --git a/lib/asn1c/ngap/NGAP_TWAP-ID.c b/lib/asn1c/ngap/NGAP_TWAP-ID.c index ea0893b648..72c3eca62d 100644 --- a/lib/asn1c/ngap/NGAP_TWAP-ID.c +++ b/lib/asn1c/ngap/NGAP_TWAP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TWAP-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TWAP-ID.h b/lib/asn1c/ngap/NGAP_TWAP-ID.h index 23346a9039..17d2d03351 100644 --- a/lib/asn1c/ngap/NGAP_TWAP-ID.h +++ b/lib/asn1c/ngap/NGAP_TWAP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TWAP_ID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TWAP_ID; asn_struct_free_f NGAP_TWAP_ID_free; asn_struct_print_f NGAP_TWAP_ID_print; asn_constr_check_f NGAP_TWAP_ID_constraint; -jer_type_encoder_f NGAP_TWAP_ID_encode_jer; per_type_decoder_f NGAP_TWAP_ID_decode_aper; per_type_encoder_f NGAP_TWAP_ID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TWIF-ID.c b/lib/asn1c/ngap/NGAP_TWIF-ID.c index e6098055de..47401afa7e 100644 --- a/lib/asn1c/ngap/NGAP_TWIF-ID.c +++ b/lib/asn1c/ngap/NGAP_TWIF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TWIF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TWIF-ID.h b/lib/asn1c/ngap/NGAP_TWIF-ID.h index a605ce281a..c87a419ca2 100644 --- a/lib/asn1c/ngap/NGAP_TWIF-ID.h +++ b/lib/asn1c/ngap/NGAP_TWIF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TWIF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetID.c b/lib/asn1c/ngap/NGAP_TargetID.c index 3ceca59456..2b0244da5f 100644 --- a/lib/asn1c/ngap/NGAP_TargetID.c +++ b/lib/asn1c/ngap/NGAP_TargetID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetID.h" diff --git a/lib/asn1c/ngap/NGAP_TargetID.h b/lib/asn1c/ngap/NGAP_TargetID.h index 323f6088d8..a92cc05b64 100644 --- a/lib/asn1c/ngap/NGAP_TargetID.h +++ b/lib/asn1c/ngap/NGAP_TargetID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetID_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.c b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.c index 4aa25da542..f5b5161234 100644 --- a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.h b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.h index dae09f3aa1..eba1f3c788 100644 --- a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-FailureTransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetNGRANNode_ToSourceNGRANNode_FailureTransparentContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.c b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.c index ec5a700c76..60c4d23edc 100644 --- a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.h b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.h index c6d864e5be..dab645ff30 100644 --- a/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_TargetNGRANNode-ToSourceNGRANNode-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetNGRANNode_ToSourceNGRANNode_TransparentContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.c b/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.c index 2a1071caa6..7606c1d286 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.c +++ b/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetNSSAI-Item.h" diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.h b/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.h index 5da0564e80..a9908502f6 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.h +++ b/lib/asn1c/ngap/NGAP_TargetNSSAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetNSSAI_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAI.c b/lib/asn1c/ngap/NGAP_TargetNSSAI.c index b91483e305..1cb47f2604 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAI.c +++ b/lib/asn1c/ngap/NGAP_TargetNSSAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetNSSAI.h" diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAI.h b/lib/asn1c/ngap/NGAP_TargetNSSAI.h index 18b24787dc..a601bc9d57 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAI.h +++ b/lib/asn1c/ngap/NGAP_TargetNSSAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetNSSAI_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.c b/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.c index afdbde1885..d1d0f91ea2 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.c +++ b/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetNSSAIInformation.h" diff --git a/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.h b/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.h index ef02132088..00144d42de 100644 --- a/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.h +++ b/lib/asn1c/ngap/NGAP_TargetNSSAIInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetNSSAIInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetRANNodeID.c b/lib/asn1c/ngap/NGAP_TargetRANNodeID.c index b4122e384b..b94b254378 100644 --- a/lib/asn1c/ngap/NGAP_TargetRANNodeID.c +++ b/lib/asn1c/ngap/NGAP_TargetRANNodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetRANNodeID.h" diff --git a/lib/asn1c/ngap/NGAP_TargetRANNodeID.h b/lib/asn1c/ngap/NGAP_TargetRANNodeID.h index f35a747b5d..c9baf87a2d 100644 --- a/lib/asn1c/ngap/NGAP_TargetRANNodeID.h +++ b/lib/asn1c/ngap/NGAP_TargetRANNodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetRANNodeID_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetRNC-ID.c b/lib/asn1c/ngap/NGAP_TargetRNC-ID.c index 561e07882a..09997a2729 100644 --- a/lib/asn1c/ngap/NGAP_TargetRNC-ID.c +++ b/lib/asn1c/ngap/NGAP_TargetRNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetRNC-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TargetRNC-ID.h b/lib/asn1c/ngap/NGAP_TargetRNC-ID.h index 4c46a5bb9c..b9c0b56e65 100644 --- a/lib/asn1c/ngap/NGAP_TargetRNC-ID.h +++ b/lib/asn1c/ngap/NGAP_TargetRNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetRNC_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.c b/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.c index d4122c2a52..1a3f60d831 100644 --- a/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargetToSource-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.h b/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.h index e3aa2bd43a..499de92f12 100644 --- a/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_TargetToSource-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargetToSource_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TargetToSource_TransparentContainer; asn_struct_free_f NGAP_TargetToSource_TransparentContainer_free; asn_struct_print_f NGAP_TargetToSource_TransparentContainer_print; asn_constr_check_f NGAP_TargetToSource_TransparentContainer_constraint; -jer_type_encoder_f NGAP_TargetToSource_TransparentContainer_encode_jer; per_type_decoder_f NGAP_TargetToSource_TransparentContainer_decode_aper; per_type_encoder_f NGAP_TargetToSource_TransparentContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TargeteNB-ID.c b/lib/asn1c/ngap/NGAP_TargeteNB-ID.c index a7826d8405..609dece3d8 100644 --- a/lib/asn1c/ngap/NGAP_TargeteNB-ID.c +++ b/lib/asn1c/ngap/NGAP_TargeteNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargeteNB-ID.h" diff --git a/lib/asn1c/ngap/NGAP_TargeteNB-ID.h b/lib/asn1c/ngap/NGAP_TargeteNB-ID.h index 58ccea0f1e..e1f0c0414f 100644 --- a/lib/asn1c/ngap/NGAP_TargeteNB-ID.h +++ b/lib/asn1c/ngap/NGAP_TargeteNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargeteNB_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.c b/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.c index 9c41429d9d..11aebf835a 100644 --- a/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.c +++ b/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TargettoSource-Failure-TransparentContainer.h" diff --git a/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.h b/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.h index 461492a427..be25892e04 100644 --- a/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.h +++ b/lib/asn1c/ngap/NGAP_TargettoSource-Failure-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TargettoSource_Failure_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TargettoSource_Failure_TransparentCont asn_struct_free_f NGAP_TargettoSource_Failure_TransparentContainer_free; asn_struct_print_f NGAP_TargettoSource_Failure_TransparentContainer_print; asn_constr_check_f NGAP_TargettoSource_Failure_TransparentContainer_constraint; -jer_type_encoder_f NGAP_TargettoSource_Failure_TransparentContainer_encode_jer; per_type_decoder_f NGAP_TargettoSource_Failure_TransparentContainer_decode_aper; per_type_encoder_f NGAP_TargettoSource_Failure_TransparentContainer_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Threshold-RSRP.c b/lib/asn1c/ngap/NGAP_Threshold-RSRP.c index 092a521c71..e36e595744 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-RSRP.c +++ b/lib/asn1c/ngap/NGAP_Threshold-RSRP.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Threshold-RSRP.h" diff --git a/lib/asn1c/ngap/NGAP_Threshold-RSRP.h b/lib/asn1c/ngap/NGAP_Threshold-RSRP.h index 8675fe86dc..1d613f7f34 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-RSRP.h +++ b/lib/asn1c/ngap/NGAP_Threshold-RSRP.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Threshold_RSRP_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Threshold_RSRP; asn_struct_free_f NGAP_Threshold_RSRP_free; asn_struct_print_f NGAP_Threshold_RSRP_print; asn_constr_check_f NGAP_Threshold_RSRP_constraint; -jer_type_encoder_f NGAP_Threshold_RSRP_encode_jer; per_type_decoder_f NGAP_Threshold_RSRP_decode_aper; per_type_encoder_f NGAP_Threshold_RSRP_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Threshold-RSRQ.c b/lib/asn1c/ngap/NGAP_Threshold-RSRQ.c index 8c4a93423b..39fddc4788 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-RSRQ.c +++ b/lib/asn1c/ngap/NGAP_Threshold-RSRQ.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Threshold-RSRQ.h" diff --git a/lib/asn1c/ngap/NGAP_Threshold-RSRQ.h b/lib/asn1c/ngap/NGAP_Threshold-RSRQ.h index 37d131c63c..0a6616cca0 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-RSRQ.h +++ b/lib/asn1c/ngap/NGAP_Threshold-RSRQ.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Threshold_RSRQ_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Threshold_RSRQ; asn_struct_free_f NGAP_Threshold_RSRQ_free; asn_struct_print_f NGAP_Threshold_RSRQ_print; asn_constr_check_f NGAP_Threshold_RSRQ_constraint; -jer_type_encoder_f NGAP_Threshold_RSRQ_encode_jer; per_type_decoder_f NGAP_Threshold_RSRQ_decode_aper; per_type_encoder_f NGAP_Threshold_RSRQ_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_Threshold-SINR.c b/lib/asn1c/ngap/NGAP_Threshold-SINR.c index b66f689c01..a5eec839a7 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-SINR.c +++ b/lib/asn1c/ngap/NGAP_Threshold-SINR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_Threshold-SINR.h" diff --git a/lib/asn1c/ngap/NGAP_Threshold-SINR.h b/lib/asn1c/ngap/NGAP_Threshold-SINR.h index 660c1cf62c..dba686f469 100644 --- a/lib/asn1c/ngap/NGAP_Threshold-SINR.h +++ b/lib/asn1c/ngap/NGAP_Threshold-SINR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_Threshold_SINR_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_Threshold_SINR; asn_struct_free_f NGAP_Threshold_SINR_free; asn_struct_print_f NGAP_Threshold_SINR_print; asn_constr_check_f NGAP_Threshold_SINR_constraint; -jer_type_encoder_f NGAP_Threshold_SINR_encode_jer; per_type_decoder_f NGAP_Threshold_SINR_decode_aper; per_type_encoder_f NGAP_Threshold_SINR_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimeStamp.c b/lib/asn1c/ngap/NGAP_TimeStamp.c index 50345c7ed1..2992ff6172 100644 --- a/lib/asn1c/ngap/NGAP_TimeStamp.c +++ b/lib/asn1c/ngap/NGAP_TimeStamp.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeStamp.h" diff --git a/lib/asn1c/ngap/NGAP_TimeStamp.h b/lib/asn1c/ngap/NGAP_TimeStamp.h index efd549fc8f..ece507907c 100644 --- a/lib/asn1c/ngap/NGAP_TimeStamp.h +++ b/lib/asn1c/ngap/NGAP_TimeStamp.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeStamp_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TimeStamp; asn_struct_free_f NGAP_TimeStamp_free; asn_struct_print_f NGAP_TimeStamp_print; asn_constr_check_f NGAP_TimeStamp_constraint; -jer_type_encoder_f NGAP_TimeStamp_encode_jer; per_type_decoder_f NGAP_TimeStamp_decode_aper; per_type_encoder_f NGAP_TimeStamp_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.c b/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.c index 101dce0a3b..870611c3a3 100644 --- a/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.c +++ b/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeSyncAssistanceInfo.h" diff --git a/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.h b/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.h index 665f3caa5e..670b4de138 100644 --- a/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.h +++ b/lib/asn1c/ngap/NGAP_TimeSyncAssistanceInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeSyncAssistanceInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_TimeToTrigger.c b/lib/asn1c/ngap/NGAP_TimeToTrigger.c index 6d42d68433..bd9174a446 100644 --- a/lib/asn1c/ngap/NGAP_TimeToTrigger.c +++ b/lib/asn1c/ngap/NGAP_TimeToTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeToTrigger.h" diff --git a/lib/asn1c/ngap/NGAP_TimeToTrigger.h b/lib/asn1c/ngap/NGAP_TimeToTrigger.h index 70751e7f2d..9cb232088c 100644 --- a/lib/asn1c/ngap/NGAP_TimeToTrigger.h +++ b/lib/asn1c/ngap/NGAP_TimeToTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeToTrigger_H_ @@ -48,7 +48,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TimeToTrigger_specs_1; asn_struct_free_f NGAP_TimeToTrigger_free; asn_struct_print_f NGAP_TimeToTrigger_print; asn_constr_check_f NGAP_TimeToTrigger_constraint; -jer_type_encoder_f NGAP_TimeToTrigger_encode_jer; per_type_decoder_f NGAP_TimeToTrigger_decode_aper; per_type_encoder_f NGAP_TimeToTrigger_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimeToWait.c b/lib/asn1c/ngap/NGAP_TimeToWait.c index d3eb759e70..652ac8d814 100644 --- a/lib/asn1c/ngap/NGAP_TimeToWait.c +++ b/lib/asn1c/ngap/NGAP_TimeToWait.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeToWait.h" diff --git a/lib/asn1c/ngap/NGAP_TimeToWait.h b/lib/asn1c/ngap/NGAP_TimeToWait.h index e2f74fe266..306fcffbd1 100644 --- a/lib/asn1c/ngap/NGAP_TimeToWait.h +++ b/lib/asn1c/ngap/NGAP_TimeToWait.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeToWait_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TimeToWait_specs_1; asn_struct_free_f NGAP_TimeToWait_free; asn_struct_print_f NGAP_TimeToWait_print; asn_constr_check_f NGAP_TimeToWait_constraint; -jer_type_encoder_f NGAP_TimeToWait_encode_jer; per_type_decoder_f NGAP_TimeToWait_decode_aper; per_type_encoder_f NGAP_TimeToWait_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.c b/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.c index 125e29571e..fcd153c20a 100644 --- a/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.c +++ b/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeUEStayedInCell.h" diff --git a/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.h b/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.h index 60c4111e37..b67c65a8fb 100644 --- a/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.h +++ b/lib/asn1c/ngap/NGAP_TimeUEStayedInCell.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeUEStayedInCell_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TimeUEStayedInCell; asn_struct_free_f NGAP_TimeUEStayedInCell_free; asn_struct_print_f NGAP_TimeUEStayedInCell_print; asn_constr_check_f NGAP_TimeUEStayedInCell_constraint; -jer_type_encoder_f NGAP_TimeUEStayedInCell_encode_jer; per_type_decoder_f NGAP_TimeUEStayedInCell_decode_aper; per_type_encoder_f NGAP_TimeUEStayedInCell_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.c b/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.c index 203260064b..9e977ece6c 100644 --- a/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.c +++ b/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimeUEStayedInCellEnhancedGranularity.h" diff --git a/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.h b/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.h index 910fbdfbb9..eb019bea1b 100644 --- a/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.h +++ b/lib/asn1c/ngap/NGAP_TimeUEStayedInCellEnhancedGranularity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimeUEStayedInCellEnhancedGranularity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TimeUEStayedInCellEnhancedGranularity; asn_struct_free_f NGAP_TimeUEStayedInCellEnhancedGranularity_free; asn_struct_print_f NGAP_TimeUEStayedInCellEnhancedGranularity_print; asn_constr_check_f NGAP_TimeUEStayedInCellEnhancedGranularity_constraint; -jer_type_encoder_f NGAP_TimeUEStayedInCellEnhancedGranularity_encode_jer; per_type_decoder_f NGAP_TimeUEStayedInCellEnhancedGranularity_decode_aper; per_type_encoder_f NGAP_TimeUEStayedInCellEnhancedGranularity_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.c b/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.c index 48f47d55a7..8dde50c274 100644 --- a/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.c +++ b/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TimerApproachForGUAMIRemoval.h" diff --git a/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.h b/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.h index 02d2fca8ed..ec6d7f9a0c 100644 --- a/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.h +++ b/lib/asn1c/ngap/NGAP_TimerApproachForGUAMIRemoval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TimerApproachForGUAMIRemoval_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TimerApproachForGUAMIRemoval_s asn_struct_free_f NGAP_TimerApproachForGUAMIRemoval_free; asn_struct_print_f NGAP_TimerApproachForGUAMIRemoval_print; asn_constr_check_f NGAP_TimerApproachForGUAMIRemoval_constraint; -jer_type_encoder_f NGAP_TimerApproachForGUAMIRemoval_encode_jer; per_type_decoder_f NGAP_TimerApproachForGUAMIRemoval_decode_aper; per_type_encoder_f NGAP_TimerApproachForGUAMIRemoval_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.c b/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.c index 88f254a9b4..f12530f597 100644 --- a/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.c +++ b/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TooearlyIntersystemHO.h" diff --git a/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.h b/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.h index cb938f2082..4b83249c80 100644 --- a/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.h +++ b/lib/asn1c/ngap/NGAP_TooearlyIntersystemHO.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TooearlyIntersystemHO_H_ diff --git a/lib/asn1c/ngap/NGAP_TraceActivation.c b/lib/asn1c/ngap/NGAP_TraceActivation.c index 94412c42ac..a35375b4f0 100644 --- a/lib/asn1c/ngap/NGAP_TraceActivation.c +++ b/lib/asn1c/ngap/NGAP_TraceActivation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TraceActivation.h" diff --git a/lib/asn1c/ngap/NGAP_TraceActivation.h b/lib/asn1c/ngap/NGAP_TraceActivation.h index 2a9694fb8e..ce8c7dc980 100644 --- a/lib/asn1c/ngap/NGAP_TraceActivation.h +++ b/lib/asn1c/ngap/NGAP_TraceActivation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TraceActivation_H_ diff --git a/lib/asn1c/ngap/NGAP_TraceDepth.c b/lib/asn1c/ngap/NGAP_TraceDepth.c index 017107f98b..7051e006b2 100644 --- a/lib/asn1c/ngap/NGAP_TraceDepth.c +++ b/lib/asn1c/ngap/NGAP_TraceDepth.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TraceDepth.h" diff --git a/lib/asn1c/ngap/NGAP_TraceDepth.h b/lib/asn1c/ngap/NGAP_TraceDepth.h index 93fc92db17..e9ae112edc 100644 --- a/lib/asn1c/ngap/NGAP_TraceDepth.h +++ b/lib/asn1c/ngap/NGAP_TraceDepth.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TraceDepth_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TraceDepth_specs_1; asn_struct_free_f NGAP_TraceDepth_free; asn_struct_print_f NGAP_TraceDepth_print; asn_constr_check_f NGAP_TraceDepth_constraint; -jer_type_encoder_f NGAP_TraceDepth_encode_jer; per_type_decoder_f NGAP_TraceDepth_decode_aper; per_type_encoder_f NGAP_TraceDepth_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TraceFailureIndication.c b/lib/asn1c/ngap/NGAP_TraceFailureIndication.c index 4ca66392a4..35be747869 100644 --- a/lib/asn1c/ngap/NGAP_TraceFailureIndication.c +++ b/lib/asn1c/ngap/NGAP_TraceFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TraceFailureIndication.h" diff --git a/lib/asn1c/ngap/NGAP_TraceFailureIndication.h b/lib/asn1c/ngap/NGAP_TraceFailureIndication.h index 68ef364e6f..fb8ea42ddd 100644 --- a/lib/asn1c/ngap/NGAP_TraceFailureIndication.h +++ b/lib/asn1c/ngap/NGAP_TraceFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TraceFailureIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_TraceStart.c b/lib/asn1c/ngap/NGAP_TraceStart.c index 1105e0fdb8..935eefdc1a 100644 --- a/lib/asn1c/ngap/NGAP_TraceStart.c +++ b/lib/asn1c/ngap/NGAP_TraceStart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TraceStart.h" diff --git a/lib/asn1c/ngap/NGAP_TraceStart.h b/lib/asn1c/ngap/NGAP_TraceStart.h index 98825cf46c..23d6b30f33 100644 --- a/lib/asn1c/ngap/NGAP_TraceStart.h +++ b/lib/asn1c/ngap/NGAP_TraceStart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TraceStart_H_ diff --git a/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.c b/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.c index 11bcc78257..febe2256ea 100644 --- a/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.c +++ b/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TrafficLoadReductionIndication.h" diff --git a/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.h b/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.h index fa094a7363..a8fd408d94 100644 --- a/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.h +++ b/lib/asn1c/ngap/NGAP_TrafficLoadReductionIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TrafficLoadReductionIndication_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TrafficLoadReductionIndication; asn_struct_free_f NGAP_TrafficLoadReductionIndication_free; asn_struct_print_f NGAP_TrafficLoadReductionIndication_print; asn_constr_check_f NGAP_TrafficLoadReductionIndication_constraint; -jer_type_encoder_f NGAP_TrafficLoadReductionIndication_encode_jer; per_type_decoder_f NGAP_TrafficLoadReductionIndication_decode_aper; per_type_encoder_f NGAP_TrafficLoadReductionIndication_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TransportLayerAddress.c b/lib/asn1c/ngap/NGAP_TransportLayerAddress.c index 3faf6db51c..411da2f5d7 100644 --- a/lib/asn1c/ngap/NGAP_TransportLayerAddress.c +++ b/lib/asn1c/ngap/NGAP_TransportLayerAddress.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TransportLayerAddress.h" diff --git a/lib/asn1c/ngap/NGAP_TransportLayerAddress.h b/lib/asn1c/ngap/NGAP_TransportLayerAddress.h index 0c1c563288..ee58568ce1 100644 --- a/lib/asn1c/ngap/NGAP_TransportLayerAddress.h +++ b/lib/asn1c/ngap/NGAP_TransportLayerAddress.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TransportLayerAddress_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_TransportLayerAddress; asn_struct_free_f NGAP_TransportLayerAddress_free; asn_struct_print_f NGAP_TransportLayerAddress_print; asn_constr_check_f NGAP_TransportLayerAddress_constraint; -jer_type_encoder_f NGAP_TransportLayerAddress_encode_jer; per_type_decoder_f NGAP_TransportLayerAddress_decode_aper; per_type_encoder_f NGAP_TransportLayerAddress_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TriggeringMessage.c b/lib/asn1c/ngap/NGAP_TriggeringMessage.c index 832a4fc9ac..a69fe953ec 100644 --- a/lib/asn1c/ngap/NGAP_TriggeringMessage.c +++ b/lib/asn1c/ngap/NGAP_TriggeringMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TriggeringMessage.h" diff --git a/lib/asn1c/ngap/NGAP_TriggeringMessage.h b/lib/asn1c/ngap/NGAP_TriggeringMessage.h index 34fccaf492..4054862688 100644 --- a/lib/asn1c/ngap/NGAP_TriggeringMessage.h +++ b/lib/asn1c/ngap/NGAP_TriggeringMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-CommonDataTypes" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TriggeringMessage_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TriggeringMessage_specs_1; asn_struct_free_f NGAP_TriggeringMessage_free; asn_struct_print_f NGAP_TriggeringMessage_print; asn_constr_check_f NGAP_TriggeringMessage_constraint; -jer_type_encoder_f NGAP_TriggeringMessage_encode_jer; per_type_decoder_f NGAP_TriggeringMessage_decode_aper; per_type_encoder_f NGAP_TriggeringMessage_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_TypeOfError.c b/lib/asn1c/ngap/NGAP_TypeOfError.c index 78af510c09..7d6d1f4674 100644 --- a/lib/asn1c/ngap/NGAP_TypeOfError.c +++ b/lib/asn1c/ngap/NGAP_TypeOfError.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_TypeOfError.h" diff --git a/lib/asn1c/ngap/NGAP_TypeOfError.h b/lib/asn1c/ngap/NGAP_TypeOfError.h index e5753d1ca2..908cc4dc1d 100644 --- a/lib/asn1c/ngap/NGAP_TypeOfError.h +++ b/lib/asn1c/ngap/NGAP_TypeOfError.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_TypeOfError_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_TypeOfError_specs_1; asn_struct_free_f NGAP_TypeOfError_free; asn_struct_print_f NGAP_TypeOfError_print; asn_constr_check_f NGAP_TypeOfError_constraint; -jer_type_encoder_f NGAP_TypeOfError_encode_jer; per_type_decoder_f NGAP_TypeOfError_decode_aper; per_type_encoder_f NGAP_TypeOfError_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.c b/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.c index e3e4dc5d41..2ae6e87124 100644 --- a/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.c +++ b/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-DifferentiationInfo.h" diff --git a/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.h b/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.h index 8a8403cb7b..68ffc310c8 100644 --- a/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.h +++ b/lib/asn1c/ngap/NGAP_UE-DifferentiationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_DifferentiationInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.c b/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.c index db51b913ec..cd45acb4ce 100644 --- a/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.c +++ b/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-NGAP-ID-pair.h" diff --git a/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.h b/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.h index 64fceccd43..112e0caa84 100644 --- a/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.h +++ b/lib/asn1c/ngap/NGAP_UE-NGAP-ID-pair.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_NGAP_ID_pair_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.c b/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.c index ca81aa3008..2a425e7bc9 100644 --- a/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.c +++ b/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-NGAP-IDs.h" diff --git a/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.h b/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.h index 090fab9ef8..a8feec6a30 100644 --- a/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.h +++ b/lib/asn1c/ngap/NGAP_UE-NGAP-IDs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_NGAP_IDs_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-PagingItem.c b/lib/asn1c/ngap/NGAP_UE-PagingItem.c index 1626703c9c..d026e55a91 100644 --- a/lib/asn1c/ngap/NGAP_UE-PagingItem.c +++ b/lib/asn1c/ngap/NGAP_UE-PagingItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-PagingItem.h" diff --git a/lib/asn1c/ngap/NGAP_UE-PagingItem.h b/lib/asn1c/ngap/NGAP_UE-PagingItem.h index c13e227869..f94719b902 100644 --- a/lib/asn1c/ngap/NGAP_UE-PagingItem.h +++ b/lib/asn1c/ngap/NGAP_UE-PagingItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_PagingItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-PagingList.c b/lib/asn1c/ngap/NGAP_UE-PagingList.c index 976813c777..88a61967a7 100644 --- a/lib/asn1c/ngap/NGAP_UE-PagingList.c +++ b/lib/asn1c/ngap/NGAP_UE-PagingList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-PagingList.h" diff --git a/lib/asn1c/ngap/NGAP_UE-PagingList.h b/lib/asn1c/ngap/NGAP_UE-PagingList.h index 99e2176ac7..ce68b6ee36 100644 --- a/lib/asn1c/ngap/NGAP_UE-PagingList.h +++ b/lib/asn1c/ngap/NGAP_UE-PagingList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_PagingList_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.c b/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.c index 9a5bedcc01..608d9390d0 100644 --- a/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.c +++ b/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-UP-CIoT-Support.h" diff --git a/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.h b/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.h index ddfda95034..9c31a9e40f 100644 --- a/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.h +++ b/lib/asn1c/ngap/NGAP_UE-UP-CIoT-Support.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_UP_CIoT_Support_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_UE_UP_CIoT_Support_specs_1; asn_struct_free_f NGAP_UE_UP_CIoT_Support_free; asn_struct_print_f NGAP_UE_UP_CIoT_Support_print; asn_constr_check_f NGAP_UE_UP_CIoT_Support_constraint; -jer_type_encoder_f NGAP_UE_UP_CIoT_Support_encode_jer; per_type_decoder_f NGAP_UE_UP_CIoT_Support_decode_aper; per_type_encoder_f NGAP_UE_UP_CIoT_Support_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.c b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.c index d7b47a8740..91a8eaeddd 100644 --- a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.c +++ b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-associatedLogicalNG-connectionItem.h" diff --git a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.h b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.h index a0654c90cd..3d9c305539 100644 --- a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.h +++ b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_associatedLogicalNG_connectionItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.c b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.c index 01be46ff20..6c55926088 100644 --- a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.c +++ b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UE-associatedLogicalNG-connectionList.h" diff --git a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.h b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.h index dbe4660834..5d37ad7e38 100644 --- a/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.h +++ b/lib/asn1c/ngap/NGAP_UE-associatedLogicalNG-connectionList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UE_associatedLogicalNG_connectionList_H_ diff --git a/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.c b/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.c index 246210cdc7..37405a8766 100644 --- a/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.c +++ b/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEAggregateMaximumBitRate.h" diff --git a/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.h b/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.h index 83ff24fd3f..0c7267f6ee 100644 --- a/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.h +++ b/lib/asn1c/ngap/NGAP_UEAggregateMaximumBitRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEAggregateMaximumBitRate_H_ diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.c b/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.c index 1e90c685d3..9513465ace 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.c +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEAppLayerMeasConfigInfo.h" diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.h b/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.h index f789fb4b5b..023495b313 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.h +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasConfigInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEAppLayerMeasConfigInfo_H_ diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.c b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.c index bed57c1da2..b2440b748a 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.c +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEAppLayerMeasInfoItem.h" diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.h b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.h index 59d04844e6..8c67f86996 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.h +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEAppLayerMeasInfoItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.c b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.c index 83376e3ba3..8c666f8388 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.c +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEAppLayerMeasInfoList.h" diff --git a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.h b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.h index e35d157d43..64018dd5cf 100644 --- a/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.h +++ b/lib/asn1c/ngap/NGAP_UEAppLayerMeasInfoList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEAppLayerMeasInfoList_H_ diff --git a/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.c b/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.c index 82e8244ce2..604690ce50 100644 --- a/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.c +++ b/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UECapabilityInfoRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.h b/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.h index 487f5ec91c..3546d5e000 100644 --- a/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.h +++ b/lib/asn1c/ngap/NGAP_UECapabilityInfoRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UECapabilityInfoRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_UECapabilityInfoRequest_specs_ asn_struct_free_f NGAP_UECapabilityInfoRequest_free; asn_struct_print_f NGAP_UECapabilityInfoRequest_print; asn_constr_check_f NGAP_UECapabilityInfoRequest_constraint; -jer_type_encoder_f NGAP_UECapabilityInfoRequest_encode_jer; per_type_decoder_f NGAP_UECapabilityInfoRequest_decode_aper; per_type_encoder_f NGAP_UECapabilityInfoRequest_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationFailure.c b/lib/asn1c/ngap/NGAP_UEContextModificationFailure.c index 86d2545f05..c76c25393c 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationFailure.c +++ b/lib/asn1c/ngap/NGAP_UEContextModificationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextModificationFailure.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationFailure.h b/lib/asn1c/ngap/NGAP_UEContextModificationFailure.h index 6a4ff22827..e3cce5a569 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationFailure.h +++ b/lib/asn1c/ngap/NGAP_UEContextModificationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextModificationFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationRequest.c b/lib/asn1c/ngap/NGAP_UEContextModificationRequest.c index cd0bbf026f..1acefb13c0 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationRequest.c +++ b/lib/asn1c/ngap/NGAP_UEContextModificationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextModificationRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationRequest.h b/lib/asn1c/ngap/NGAP_UEContextModificationRequest.h index f29e0c4234..567f631b24 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationRequest.h +++ b/lib/asn1c/ngap/NGAP_UEContextModificationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextModificationRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationResponse.c b/lib/asn1c/ngap/NGAP_UEContextModificationResponse.c index 0a4773d1b0..84c19b8f13 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationResponse.c +++ b/lib/asn1c/ngap/NGAP_UEContextModificationResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextModificationResponse.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextModificationResponse.h b/lib/asn1c/ngap/NGAP_UEContextModificationResponse.h index 4d45cade27..36b1d90342 100644 --- a/lib/asn1c/ngap/NGAP_UEContextModificationResponse.h +++ b/lib/asn1c/ngap/NGAP_UEContextModificationResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextModificationResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.c b/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.c index d75e69a7be..5ed7c054c4 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.c +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextReleaseCommand.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.h b/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.h index a00eb10efa..c05cd018f5 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.h +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextReleaseCommand_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.c b/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.c index 17f09211a3..63cdab5c72 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.c +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextReleaseComplete.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.h b/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.h index 7a7dba1add..0ae049cf52 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.h +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseComplete.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextReleaseComplete_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.c b/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.c index 3a52b3e828..95fab53234 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.c +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextReleaseRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.h b/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.h index 0f72480234..a3a0a86258 100644 --- a/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.h +++ b/lib/asn1c/ngap/NGAP_UEContextReleaseRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextReleaseRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextRequest.c b/lib/asn1c/ngap/NGAP_UEContextRequest.c index e09b65a6e6..675b36d738 100644 --- a/lib/asn1c/ngap/NGAP_UEContextRequest.c +++ b/lib/asn1c/ngap/NGAP_UEContextRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextRequest.h b/lib/asn1c/ngap/NGAP_UEContextRequest.h index eecd5585ef..3093223244 100644 --- a/lib/asn1c/ngap/NGAP_UEContextRequest.h +++ b/lib/asn1c/ngap/NGAP_UEContextRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_UEContextRequest_specs_1; asn_struct_free_f NGAP_UEContextRequest_free; asn_struct_print_f NGAP_UEContextRequest_print; asn_constr_check_f NGAP_UEContextRequest_constraint; -jer_type_encoder_f NGAP_UEContextRequest_encode_jer; per_type_decoder_f NGAP_UEContextRequest_decode_aper; per_type_encoder_f NGAP_UEContextRequest_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeFailure.c b/lib/asn1c/ngap/NGAP_UEContextResumeFailure.c index c5d0722654..b584a44155 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeFailure.c +++ b/lib/asn1c/ngap/NGAP_UEContextResumeFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextResumeFailure.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeFailure.h b/lib/asn1c/ngap/NGAP_UEContextResumeFailure.h index c1076d6972..dfab985a4d 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeFailure.h +++ b/lib/asn1c/ngap/NGAP_UEContextResumeFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextResumeFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeRequest.c b/lib/asn1c/ngap/NGAP_UEContextResumeRequest.c index 0566beb982..a6781c661a 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeRequest.c +++ b/lib/asn1c/ngap/NGAP_UEContextResumeRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextResumeRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeRequest.h b/lib/asn1c/ngap/NGAP_UEContextResumeRequest.h index 81aee46fcb..2bbfc1c08b 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeRequest.h +++ b/lib/asn1c/ngap/NGAP_UEContextResumeRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextResumeRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.c b/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.c index 555d01000f..e934f9506e 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextResumeRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.h b/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.h index 731a3838c8..ceefa101f3 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_UEContextResumeRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextResumeRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeResponse.c b/lib/asn1c/ngap/NGAP_UEContextResumeResponse.c index 7774b5b1d7..def3c60e43 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeResponse.c +++ b/lib/asn1c/ngap/NGAP_UEContextResumeResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextResumeResponse.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeResponse.h b/lib/asn1c/ngap/NGAP_UEContextResumeResponse.h index bd4b58591f..38d357fb03 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeResponse.h +++ b/lib/asn1c/ngap/NGAP_UEContextResumeResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextResumeResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.c b/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.c index e9aa2a5ca0..be26fa435c 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.c +++ b/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextResumeResponseTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.h b/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.h index 49022fb60c..cf3611bad4 100644 --- a/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.h +++ b/lib/asn1c/ngap/NGAP_UEContextResumeResponseTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextResumeResponseTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.c b/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.c index b2003b8b0d..958f713f5f 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.c +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextSuspendFailure.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.h b/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.h index c72794795d..4ecbd3dd82 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.h +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextSuspendFailure_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.c b/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.c index 8b19288b4c..7e6492c38c 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.c +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextSuspendRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.h b/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.h index 0315bf5560..15f41a4a5b 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.h +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextSuspendRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.c b/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.c index 9cf70147a1..d4d8813ee5 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.c +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextSuspendRequestTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.h b/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.h index eb70b90d87..9bc2b38098 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.h +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendRequestTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextSuspendRequestTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.c b/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.c index be262e3b6e..ccabe4c532 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.c +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEContextSuspendResponse.h" diff --git a/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.h b/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.h index e20485d72f..e0c983c0c9 100644 --- a/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.h +++ b/lib/asn1c/ngap/NGAP_UEContextSuspendResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEContextSuspendResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_UEHistoryInformation.c b/lib/asn1c/ngap/NGAP_UEHistoryInformation.c index 0eb2c67bcb..1642857212 100644 --- a/lib/asn1c/ngap/NGAP_UEHistoryInformation.c +++ b/lib/asn1c/ngap/NGAP_UEHistoryInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEHistoryInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UEHistoryInformation.h b/lib/asn1c/ngap/NGAP_UEHistoryInformation.h index 307f2d98ee..e40936a94a 100644 --- a/lib/asn1c/ngap/NGAP_UEHistoryInformation.h +++ b/lib/asn1c/ngap/NGAP_UEHistoryInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEHistoryInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.c b/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.c index 2318ba8a21..e6cfa3cf4a 100644 --- a/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.c +++ b/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEHistoryInformationFromTheUE.h" diff --git a/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.h b/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.h index 055f48b052..3b9edc02a4 100644 --- a/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.h +++ b/lib/asn1c/ngap/NGAP_UEHistoryInformationFromTheUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEHistoryInformationFromTheUE_H_ diff --git a/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.c b/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.c index 1364739aca..70c24709ac 100644 --- a/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.c +++ b/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEIdentityIndexValue.h" diff --git a/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.h b/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.h index d67a1e3941..2b94f81be4 100644 --- a/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.h +++ b/lib/asn1c/ngap/NGAP_UEIdentityIndexValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEIdentityIndexValue_H_ diff --git a/lib/asn1c/ngap/NGAP_UEInformationTransfer.c b/lib/asn1c/ngap/NGAP_UEInformationTransfer.c index 218f19eb9c..f5b5ba1131 100644 --- a/lib/asn1c/ngap/NGAP_UEInformationTransfer.c +++ b/lib/asn1c/ngap/NGAP_UEInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEInformationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UEInformationTransfer.h b/lib/asn1c/ngap/NGAP_UEInformationTransfer.h index 9c92cbf1d8..badbd563b7 100644 --- a/lib/asn1c/ngap/NGAP_UEInformationTransfer.h +++ b/lib/asn1c/ngap/NGAP_UEInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEInformationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UEPagingIdentity.c b/lib/asn1c/ngap/NGAP_UEPagingIdentity.c index 9e7a6da8e1..b6e362a499 100644 --- a/lib/asn1c/ngap/NGAP_UEPagingIdentity.c +++ b/lib/asn1c/ngap/NGAP_UEPagingIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEPagingIdentity.h" diff --git a/lib/asn1c/ngap/NGAP_UEPagingIdentity.h b/lib/asn1c/ngap/NGAP_UEPagingIdentity.h index af12ac7a0e..4b0393a217 100644 --- a/lib/asn1c/ngap/NGAP_UEPagingIdentity.h +++ b/lib/asn1c/ngap/NGAP_UEPagingIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEPagingIdentity_H_ diff --git a/lib/asn1c/ngap/NGAP_UEPresence.c b/lib/asn1c/ngap/NGAP_UEPresence.c index 41a529abd5..57dfa24aee 100644 --- a/lib/asn1c/ngap/NGAP_UEPresence.c +++ b/lib/asn1c/ngap/NGAP_UEPresence.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEPresence.h" diff --git a/lib/asn1c/ngap/NGAP_UEPresence.h b/lib/asn1c/ngap/NGAP_UEPresence.h index c547e12c40..5969d48091 100644 --- a/lib/asn1c/ngap/NGAP_UEPresence.h +++ b/lib/asn1c/ngap/NGAP_UEPresence.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEPresence_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_UEPresence_specs_1; asn_struct_free_f NGAP_UEPresence_free; asn_struct_print_f NGAP_UEPresence_print; asn_constr_check_f NGAP_UEPresence_constraint; -jer_type_encoder_f NGAP_UEPresence_encode_jer; per_type_decoder_f NGAP_UEPresence_decode_aper; per_type_encoder_f NGAP_UEPresence_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.c b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.c index 87aa897a80..29c0f868a4 100644 --- a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.c +++ b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEPresenceInAreaOfInterestItem.h" diff --git a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.h b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.h index 04febfab67..7686968a8d 100644 --- a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.h +++ b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEPresenceInAreaOfInterestItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.c b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.c index 46b0bc1638..0182186d46 100644 --- a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.c +++ b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UEPresenceInAreaOfInterestList.h" diff --git a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.h b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.h index 815e9a6175..4f819a8ad8 100644 --- a/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.h +++ b/lib/asn1c/ngap/NGAP_UEPresenceInAreaOfInterestList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UEPresenceInAreaOfInterestList_H_ diff --git a/lib/asn1c/ngap/NGAP_UERLFReportContainer.c b/lib/asn1c/ngap/NGAP_UERLFReportContainer.c index 1406211d7e..37cd383f1f 100644 --- a/lib/asn1c/ngap/NGAP_UERLFReportContainer.c +++ b/lib/asn1c/ngap/NGAP_UERLFReportContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERLFReportContainer.h" diff --git a/lib/asn1c/ngap/NGAP_UERLFReportContainer.h b/lib/asn1c/ngap/NGAP_UERLFReportContainer.h index 2e3d167133..e279ed3a0d 100644 --- a/lib/asn1c/ngap/NGAP_UERLFReportContainer.h +++ b/lib/asn1c/ngap/NGAP_UERLFReportContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERLFReportContainer_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapability.c b/lib/asn1c/ngap/NGAP_UERadioCapability.c index e2cb794d27..4801db1b5b 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapability.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapability.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapability.h b/lib/asn1c/ngap/NGAP_UERadioCapability.h index f086296e75..852c78139f 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapability.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapability_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UERadioCapability; asn_struct_free_f NGAP_UERadioCapability_free; asn_struct_print_f NGAP_UERadioCapability_print; asn_constr_check_f NGAP_UERadioCapability_constraint; -jer_type_encoder_f NGAP_UERadioCapability_encode_jer; per_type_decoder_f NGAP_UERadioCapability_decode_aper; per_type_encoder_f NGAP_UERadioCapability_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.c index 69f7e7ec8f..5d2306f70e 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityCheckRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.h index 4f60f04d3d..a7ea7e9db3 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityCheckRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.c index 11d6b7d80b..7d1e206b57 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityCheckResponse.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.h index 381eae9a83..3c38fb391e 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityCheckResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityCheckResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.c index 49962ed3cc..dc60e27031 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityForPaging.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.h index 8896fbc5be..da2de5af00 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityForPaging_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.c index 807ee5776b..0ba226aaf6 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityForPagingOfEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.h index 4f83fdeef1..9d1659709c 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityForPagingOfEUTRA_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UERadioCapabilityForPagingOfEUTRA; asn_struct_free_f NGAP_UERadioCapabilityForPagingOfEUTRA_free; asn_struct_print_f NGAP_UERadioCapabilityForPagingOfEUTRA_print; asn_constr_check_f NGAP_UERadioCapabilityForPagingOfEUTRA_constraint; -jer_type_encoder_f NGAP_UERadioCapabilityForPagingOfEUTRA_encode_jer; per_type_decoder_f NGAP_UERadioCapabilityForPagingOfEUTRA_decode_aper; per_type_encoder_f NGAP_UERadioCapabilityForPagingOfEUTRA_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.c index 31e2884849..e2c63934e2 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityForPagingOfNB-IoT.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.h index 6807ae93ca..00ea3452e4 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNB-IoT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityForPagingOfNB_IoT_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UERadioCapabilityForPagingOfNB_IoT; asn_struct_free_f NGAP_UERadioCapabilityForPagingOfNB_IoT_free; asn_struct_print_f NGAP_UERadioCapabilityForPagingOfNB_IoT_print; asn_constr_check_f NGAP_UERadioCapabilityForPagingOfNB_IoT_constraint; -jer_type_encoder_f NGAP_UERadioCapabilityForPagingOfNB_IoT_encode_jer; per_type_decoder_f NGAP_UERadioCapabilityForPagingOfNB_IoT_decode_aper; per_type_encoder_f NGAP_UERadioCapabilityForPagingOfNB_IoT_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.c index 78c28dbbe1..b5bd497f2c 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityForPagingOfNR.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.h index d3cda7aea2..517db2ac2d 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityForPagingOfNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityForPagingOfNR_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UERadioCapabilityForPagingOfNR; asn_struct_free_f NGAP_UERadioCapabilityForPagingOfNR_free; asn_struct_print_f NGAP_UERadioCapabilityForPagingOfNR_print; asn_constr_check_f NGAP_UERadioCapabilityForPagingOfNR_constraint; -jer_type_encoder_f NGAP_UERadioCapabilityForPagingOfNR_encode_jer; per_type_decoder_f NGAP_UERadioCapabilityForPagingOfNR_decode_aper; per_type_encoder_f NGAP_UERadioCapabilityForPagingOfNR_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityID.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityID.c index d0f70062b1..1b9ea8cf96 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityID.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityID.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityID.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityID.h index 44a4d3e289..dddc8e540c 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityID.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UERadioCapabilityID; asn_struct_free_f NGAP_UERadioCapabilityID_free; asn_struct_print_f NGAP_UERadioCapabilityID_print; asn_constr_check_f NGAP_UERadioCapabilityID_constraint; -jer_type_encoder_f NGAP_UERadioCapabilityID_encode_jer; per_type_decoder_f NGAP_UERadioCapabilityID_decode_aper; per_type_encoder_f NGAP_UERadioCapabilityID_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.c index ac26bc4b62..8beb8c4246 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityIDMappingRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.h index 53fb51ae9f..bf305ff0b1 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityIDMappingRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.c index 2184bf619d..9b1e250db7 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityIDMappingResponse.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.h index fcc48bf59c..b07a07acb5 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityIDMappingResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityIDMappingResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.c b/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.c index 65d6a3e5e1..53d36cbf04 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.c +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERadioCapabilityInfoIndication.h" diff --git a/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.h b/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.h index 062c3a6b3e..aa95701583 100644 --- a/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.h +++ b/lib/asn1c/ngap/NGAP_UERadioCapabilityInfoIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERadioCapabilityInfoIndication_H_ diff --git a/lib/asn1c/ngap/NGAP_UERetentionInformation.c b/lib/asn1c/ngap/NGAP_UERetentionInformation.c index 62e82e3635..c2576eed1b 100644 --- a/lib/asn1c/ngap/NGAP_UERetentionInformation.c +++ b/lib/asn1c/ngap/NGAP_UERetentionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UERetentionInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UERetentionInformation.h b/lib/asn1c/ngap/NGAP_UERetentionInformation.h index 3528d2e204..43397a9635 100644 --- a/lib/asn1c/ngap/NGAP_UERetentionInformation.h +++ b/lib/asn1c/ngap/NGAP_UERetentionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UERetentionInformation_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_UERetentionInformation_specs_1 asn_struct_free_f NGAP_UERetentionInformation_free; asn_struct_print_f NGAP_UERetentionInformation_print; asn_constr_check_f NGAP_UERetentionInformation_constraint; -jer_type_encoder_f NGAP_UERetentionInformation_encode_jer; per_type_decoder_f NGAP_UERetentionInformation_decode_aper; per_type_encoder_f NGAP_UERetentionInformation_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UESecurityCapabilities.c b/lib/asn1c/ngap/NGAP_UESecurityCapabilities.c index 0d9d3083ee..1073757432 100644 --- a/lib/asn1c/ngap/NGAP_UESecurityCapabilities.c +++ b/lib/asn1c/ngap/NGAP_UESecurityCapabilities.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UESecurityCapabilities.h" diff --git a/lib/asn1c/ngap/NGAP_UESecurityCapabilities.h b/lib/asn1c/ngap/NGAP_UESecurityCapabilities.h index db2fce5e97..68bb98f627 100644 --- a/lib/asn1c/ngap/NGAP_UESecurityCapabilities.h +++ b/lib/asn1c/ngap/NGAP_UESecurityCapabilities.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UESecurityCapabilities_H_ diff --git a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.c b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.c index c832e24f21..0d8957df9a 100644 --- a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.c +++ b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UESliceMaximumBitRateItem.h" diff --git a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.h b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.h index 641473402b..916ac73cdb 100644 --- a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.h +++ b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UESliceMaximumBitRateItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.c b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.c index f37115c803..072b57859f 100644 --- a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.c +++ b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UESliceMaximumBitRateList.h" diff --git a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.h b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.h index 3468644bbd..443f442ad8 100644 --- a/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.h +++ b/lib/asn1c/ngap/NGAP_UESliceMaximumBitRateList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UESliceMaximumBitRateList_H_ diff --git a/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.c b/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.c index d99b624d89..9c489a268d 100644 --- a/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.c +++ b/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UETNLABindingReleaseRequest.h" diff --git a/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.h b/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.h index db81b6e6f3..0e79cd0035 100644 --- a/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.h +++ b/lib/asn1c/ngap/NGAP_UETNLABindingReleaseRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UETNLABindingReleaseRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.c b/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.c index 275e99586d..c7151d5697 100644 --- a/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.c +++ b/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UL-CP-SecurityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.h b/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.h index ccbce6a78d..a95ab12d17 100644 --- a/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.h +++ b/lib/asn1c/ngap/NGAP_UL-CP-SecurityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UL_CP_SecurityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_UL-NAS-Count.c b/lib/asn1c/ngap/NGAP_UL-NAS-Count.c index 5f1f4b006b..a7803f4448 100644 --- a/lib/asn1c/ngap/NGAP_UL-NAS-Count.c +++ b/lib/asn1c/ngap/NGAP_UL-NAS-Count.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UL-NAS-Count.h" diff --git a/lib/asn1c/ngap/NGAP_UL-NAS-Count.h b/lib/asn1c/ngap/NGAP_UL-NAS-Count.h index 9c459c8d7b..b2954e6bcd 100644 --- a/lib/asn1c/ngap/NGAP_UL-NAS-Count.h +++ b/lib/asn1c/ngap/NGAP_UL-NAS-Count.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UL_NAS_Count_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UL_NAS_Count; asn_struct_free_f NGAP_UL_NAS_Count_free; asn_struct_print_f NGAP_UL_NAS_Count_print; asn_constr_check_f NGAP_UL_NAS_Count_constraint; -jer_type_encoder_f NGAP_UL_NAS_Count_encode_jer; per_type_decoder_f NGAP_UL_NAS_Count_decode_aper; per_type_encoder_f NGAP_UL_NAS_Count_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UL-NAS-MAC.c b/lib/asn1c/ngap/NGAP_UL-NAS-MAC.c index 135adc27f2..4771133582 100644 --- a/lib/asn1c/ngap/NGAP_UL-NAS-MAC.c +++ b/lib/asn1c/ngap/NGAP_UL-NAS-MAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UL-NAS-MAC.h" diff --git a/lib/asn1c/ngap/NGAP_UL-NAS-MAC.h b/lib/asn1c/ngap/NGAP_UL-NAS-MAC.h index a9d857222f..54776c64b5 100644 --- a/lib/asn1c/ngap/NGAP_UL-NAS-MAC.h +++ b/lib/asn1c/ngap/NGAP_UL-NAS-MAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UL_NAS_MAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UL_NAS_MAC; asn_struct_free_f NGAP_UL_NAS_MAC_free; asn_struct_print_f NGAP_UL_NAS_MAC_print; asn_constr_check_f NGAP_UL_NAS_MAC_constraint; -jer_type_encoder_f NGAP_UL_NAS_MAC_encode_jer; per_type_decoder_f NGAP_UL_NAS_MAC_decode_aper; per_type_encoder_f NGAP_UL_NAS_MAC_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.c b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.c index 91c87a31b9..ade2f8ab11 100644 --- a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.c +++ b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UL-NGU-UP-TNLModifyItem.h" diff --git a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.h b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.h index 6e6e56ce24..29f60abed7 100644 --- a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.h +++ b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UL_NGU_UP_TNLModifyItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.c b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.c index d92e6e3e32..cc49d31efe 100644 --- a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.c +++ b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UL-NGU-UP-TNLModifyList.h" diff --git a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.h b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.h index 6bf22f6a9f..e807f1745d 100644 --- a/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.h +++ b/lib/asn1c/ngap/NGAP_UL-NGU-UP-TNLModifyList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UL_NGU_UP_TNLModifyList_H_ diff --git a/lib/asn1c/ngap/NGAP_ULForwarding.c b/lib/asn1c/ngap/NGAP_ULForwarding.c index f82d4f801b..e28d75877a 100644 --- a/lib/asn1c/ngap/NGAP_ULForwarding.c +++ b/lib/asn1c/ngap/NGAP_ULForwarding.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_ULForwarding.h" diff --git a/lib/asn1c/ngap/NGAP_ULForwarding.h b/lib/asn1c/ngap/NGAP_ULForwarding.h index ae0f1e6a8c..3523188600 100644 --- a/lib/asn1c/ngap/NGAP_ULForwarding.h +++ b/lib/asn1c/ngap/NGAP_ULForwarding.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_ULForwarding_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_ULForwarding_specs_1; asn_struct_free_f NGAP_ULForwarding_free; asn_struct_print_f NGAP_ULForwarding_print; asn_constr_check_f NGAP_ULForwarding_constraint; -jer_type_encoder_f NGAP_ULForwarding_encode_jer; per_type_decoder_f NGAP_ULForwarding_decode_aper; per_type_encoder_f NGAP_ULForwarding_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.c b/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.c index cf2f8d2472..54ad3a5b70 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.c +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UPTransportLayerInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.h b/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.h index e976ced9e8..fe58b872de 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.h +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UPTransportLayerInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.c b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.c index 1665873003..9979809c9a 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.c +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UPTransportLayerInformationItem.h" diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.h b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.h index bd3453c3cf..1e75c77d68 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.h +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UPTransportLayerInformationItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.c b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.c index 93d1883f6a..684b80ebbf 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.c +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UPTransportLayerInformationList.h" diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.h b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.h index 242e650419..6086a63491 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.h +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UPTransportLayerInformationList_H_ diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.c b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.c index 5b15599a14..16aa902499 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.c +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UPTransportLayerInformationPairItem.h" diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.h b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.h index b4345a8cd6..d9e26afe21 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.h +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UPTransportLayerInformationPairItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.c b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.c index 5e1833086f..f0fdcc4192 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.c +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UPTransportLayerInformationPairList.h" diff --git a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.h b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.h index 8ac858c32d..4f0c3a1b51 100644 --- a/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.h +++ b/lib/asn1c/ngap/NGAP_UPTransportLayerInformationPairList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UPTransportLayerInformationPairList_H_ diff --git a/lib/asn1c/ngap/NGAP_URI-address.c b/lib/asn1c/ngap/NGAP_URI-address.c index a144156857..0244f0003f 100644 --- a/lib/asn1c/ngap/NGAP_URI-address.c +++ b/lib/asn1c/ngap/NGAP_URI-address.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_URI-address.h" diff --git a/lib/asn1c/ngap/NGAP_URI-address.h b/lib/asn1c/ngap/NGAP_URI-address.h index 542cdb3a06..fa6aaa5483 100644 --- a/lib/asn1c/ngap/NGAP_URI-address.h +++ b/lib/asn1c/ngap/NGAP_URI-address.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_URI_address_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_URI_address; asn_struct_free_f NGAP_URI_address_free; asn_struct_print_f NGAP_URI_address_print; asn_constr_check_f NGAP_URI_address_constraint; -jer_type_encoder_f NGAP_URI_address_encode_jer; per_type_decoder_f NGAP_URI_address_decode_aper; per_type_encoder_f NGAP_URI_address_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.c b/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.c index f802c6b37b..a59517456d 100644 --- a/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.c +++ b/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UnavailableGUAMIItem.h" diff --git a/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.h b/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.h index d66d59528d..5b5dab88fc 100644 --- a/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.h +++ b/lib/asn1c/ngap/NGAP_UnavailableGUAMIItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UnavailableGUAMIItem_H_ diff --git a/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.c b/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.c index 86fca21252..6fa1fc2553 100644 --- a/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.c +++ b/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UnavailableGUAMIList.h" diff --git a/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.h b/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.h index b55e09ae35..bb8b829414 100644 --- a/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.h +++ b/lib/asn1c/ngap/NGAP_UnavailableGUAMIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UnavailableGUAMIList_H_ diff --git a/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.c b/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.c index ba5a7e68ae..a8f0654ae3 100644 --- a/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.c +++ b/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UnsuccessfulOutcome.h" diff --git a/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.h b/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.h index 98add3573e..c57696ea03 100644 --- a/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.h +++ b/lib/asn1c/ngap/NGAP_UnsuccessfulOutcome.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Descriptions" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UnsuccessfulOutcome_H_ diff --git a/lib/asn1c/ngap/NGAP_UpdateFeedback.c b/lib/asn1c/ngap/NGAP_UpdateFeedback.c index 4aaebb70c9..66ed055630 100644 --- a/lib/asn1c/ngap/NGAP_UpdateFeedback.c +++ b/lib/asn1c/ngap/NGAP_UpdateFeedback.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UpdateFeedback.h" diff --git a/lib/asn1c/ngap/NGAP_UpdateFeedback.h b/lib/asn1c/ngap/NGAP_UpdateFeedback.h index 6fb5570915..f771e50817 100644 --- a/lib/asn1c/ngap/NGAP_UpdateFeedback.h +++ b/lib/asn1c/ngap/NGAP_UpdateFeedback.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UpdateFeedback_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_UpdateFeedback; asn_struct_free_f NGAP_UpdateFeedback_free; asn_struct_print_f NGAP_UpdateFeedback_print; asn_constr_check_f NGAP_UpdateFeedback_constraint; -jer_type_encoder_f NGAP_UpdateFeedback_encode_jer; per_type_decoder_f NGAP_UpdateFeedback_decode_aper; per_type_encoder_f NGAP_UpdateFeedback_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_UplinkNASTransport.c b/lib/asn1c/ngap/NGAP_UplinkNASTransport.c index 2642aa4a44..aedddd335d 100644 --- a/lib/asn1c/ngap/NGAP_UplinkNASTransport.c +++ b/lib/asn1c/ngap/NGAP_UplinkNASTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkNASTransport.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkNASTransport.h b/lib/asn1c/ngap/NGAP_UplinkNASTransport.h index ccfa679db9..7ee541c238 100644 --- a/lib/asn1c/ngap/NGAP_UplinkNASTransport.h +++ b/lib/asn1c/ngap/NGAP_UplinkNASTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkNASTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.c b/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.c index a8ab53cb81..109aba236c 100644 --- a/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.c +++ b/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkNonUEAssociatedNRPPaTransport.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.h b/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.h index 2613a84731..30b36e7a71 100644 --- a/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.h +++ b/lib/asn1c/ngap/NGAP_UplinkNonUEAssociatedNRPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkNonUEAssociatedNRPPaTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.c b/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.c index 5f01cc0fef..85db02aa7d 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.c +++ b/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkRANConfigurationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.h b/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.h index 0005e555ba..05c8439168 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.h +++ b/lib/asn1c/ngap/NGAP_UplinkRANConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkRANConfigurationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.c b/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.c index abfa4fd0cf..2445da3393 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.c +++ b/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkRANEarlyStatusTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.h b/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.h index 41adc2cd1e..87658e57a3 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.h +++ b/lib/asn1c/ngap/NGAP_UplinkRANEarlyStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkRANEarlyStatusTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.c b/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.c index e7b0590ea5..4bd32ff478 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.c +++ b/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkRANStatusTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.h b/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.h index 35ede1ec28..c8fb389ca5 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.h +++ b/lib/asn1c/ngap/NGAP_UplinkRANStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkRANStatusTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.c b/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.c index 11f31c6352..cdc3a61fd2 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.c +++ b/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkRIMInformationTransfer.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.h b/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.h index 46a8b00e40..1a1965f2b5 100644 --- a/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.h +++ b/lib/asn1c/ngap/NGAP_UplinkRIMInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkRIMInformationTransfer_H_ diff --git a/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.c b/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.c index 6f59c22db8..0adea6a631 100644 --- a/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.c +++ b/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UplinkUEAssociatedNRPPaTransport.h" diff --git a/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.h b/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.h index 22bd88ebd0..1552f12b97 100644 --- a/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.h +++ b/lib/asn1c/ngap/NGAP_UplinkUEAssociatedNRPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UplinkUEAssociatedNRPPaTransport_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformation.c b/lib/asn1c/ngap/NGAP_UserLocationInformation.c index 11e12b4c54..b36856c32c 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformation.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformation.h b/lib/asn1c/ngap/NGAP_UserLocationInformation.h index 1f9557b36d..916e70e10f 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformation.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.c b/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.c index 6aacd7ef4c..41202f273a 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationEUTRA.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.h b/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.h index 377efa3920..eb2cefbc35 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationEUTRA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationEUTRA_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.c b/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.c index a06d544f07..aefa05fe1b 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationN3IWF.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.h b/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.h index 9b80e47193..53786bf9ac 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationN3IWF.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationN3IWF_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationNR.c b/lib/asn1c/ngap/NGAP_UserLocationInformationNR.c index c8a30170bb..6766d1834a 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationNR.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationNR.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationNR.h b/lib/asn1c/ngap/NGAP_UserLocationInformationNR.h index 5eae4b59f3..ef501a468b 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationNR.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationNR_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.c b/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.c index 7c82f32036..d42a9b0da6 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationTNGF.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.h b/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.h index 34599b8e4d..b5018f711b 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationTNGF.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationTNGF_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.c b/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.c index 4c4d1fee5f..33e82662d1 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationTWIF.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.h b/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.h index ae58fa598f..37bb4f09d5 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationTWIF.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationTWIF_H_ diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.c b/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.c index 14aec3a2ab..f29b89de4d 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.c +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserLocationInformationW-AGF.h" diff --git a/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.h b/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.h index 53198b05ec..91f8a9fcc0 100644 --- a/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.h +++ b/lib/asn1c/ngap/NGAP_UserLocationInformationW-AGF.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserLocationInformationW_AGF_H_ diff --git a/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.c b/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.c index a4cbcbfd99..6c28448dc6 100644 --- a/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.c +++ b/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_UserPlaneSecurityInformation.h" diff --git a/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.h b/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.h index 95d16f60bd..dbb4ee8a9e 100644 --- a/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.h +++ b/lib/asn1c/ngap/NGAP_UserPlaneSecurityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_UserPlaneSecurityInformation_H_ diff --git a/lib/asn1c/ngap/NGAP_VehicleUE.c b/lib/asn1c/ngap/NGAP_VehicleUE.c index 094da72014..44ee17e0c9 100644 --- a/lib/asn1c/ngap/NGAP_VehicleUE.c +++ b/lib/asn1c/ngap/NGAP_VehicleUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_VehicleUE.h" diff --git a/lib/asn1c/ngap/NGAP_VehicleUE.h b/lib/asn1c/ngap/NGAP_VehicleUE.h index 2d9d978488..7975cda510 100644 --- a/lib/asn1c/ngap/NGAP_VehicleUE.h +++ b/lib/asn1c/ngap/NGAP_VehicleUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_VehicleUE_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_VehicleUE_specs_1; asn_struct_free_f NGAP_VehicleUE_free; asn_struct_print_f NGAP_VehicleUE_print; asn_constr_check_f NGAP_VehicleUE_constraint; -jer_type_encoder_f NGAP_VehicleUE_encode_jer; per_type_decoder_f NGAP_VehicleUE_decode_aper; per_type_encoder_f NGAP_VehicleUE_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.c b/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.c index a6611f5be4..18364c25d0 100644 --- a/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.c +++ b/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_VolumeTimedReport-Item.h" diff --git a/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.h b/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.h index 3855207b1d..d856b3425f 100644 --- a/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.h +++ b/lib/asn1c/ngap/NGAP_VolumeTimedReport-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_VolumeTimedReport_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_VolumeTimedReportList.c b/lib/asn1c/ngap/NGAP_VolumeTimedReportList.c index 12248139a4..acc376dbc0 100644 --- a/lib/asn1c/ngap/NGAP_VolumeTimedReportList.c +++ b/lib/asn1c/ngap/NGAP_VolumeTimedReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_VolumeTimedReportList.h" diff --git a/lib/asn1c/ngap/NGAP_VolumeTimedReportList.h b/lib/asn1c/ngap/NGAP_VolumeTimedReportList.h index 0a3b8df339..4f6a7169ea 100644 --- a/lib/asn1c/ngap/NGAP_VolumeTimedReportList.h +++ b/lib/asn1c/ngap/NGAP_VolumeTimedReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_VolumeTimedReportList_H_ diff --git a/lib/asn1c/ngap/NGAP_W-AGF-ID.c b/lib/asn1c/ngap/NGAP_W-AGF-ID.c index f4b2f5fdb7..d0ea93806b 100644 --- a/lib/asn1c/ngap/NGAP_W-AGF-ID.c +++ b/lib/asn1c/ngap/NGAP_W-AGF-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_W-AGF-ID.h" diff --git a/lib/asn1c/ngap/NGAP_W-AGF-ID.h b/lib/asn1c/ngap/NGAP_W-AGF-ID.h index a64b63cbc4..50e3b5ecf4 100644 --- a/lib/asn1c/ngap/NGAP_W-AGF-ID.h +++ b/lib/asn1c/ngap/NGAP_W-AGF-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_W_AGF_ID_H_ diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfig.c b/lib/asn1c/ngap/NGAP_WLANMeasConfig.c index 0d742048a5..4e56282d1f 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfig.c +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WLANMeasConfig.h" diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfig.h b/lib/asn1c/ngap/NGAP_WLANMeasConfig.h index eef9684a7a..967c4f06c7 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfig.h +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WLANMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_NGAP_WLANMeasConfig_specs_1; asn_struct_free_f NGAP_WLANMeasConfig_free; asn_struct_print_f NGAP_WLANMeasConfig_print; asn_constr_check_f NGAP_WLANMeasConfig_constraint; -jer_type_encoder_f NGAP_WLANMeasConfig_encode_jer; per_type_decoder_f NGAP_WLANMeasConfig_decode_aper; per_type_encoder_f NGAP_WLANMeasConfig_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.c b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.c index ba2786113a..52b15bdf6d 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.c +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WLANMeasConfigNameItem.h" diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.h b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.h index c21e7f1bd1..8cc59dbb79 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.h +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WLANMeasConfigNameItem_H_ diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.c b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.c index c674c60233..b7c7e5a921 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.c +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WLANMeasConfigNameList.h" diff --git a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.h b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.h index a8fd3b54e9..002c1b32a3 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.h +++ b/lib/asn1c/ngap/NGAP_WLANMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WLANMeasConfigNameList_H_ diff --git a/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.c b/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.c index 520b525174..30922e2529 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.c +++ b/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WLANMeasurementConfiguration.h" diff --git a/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.h b/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.h index 3de3ff6f30..d9e78944f1 100644 --- a/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.h +++ b/lib/asn1c/ngap/NGAP_WLANMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WLANMeasurementConfiguration_H_ diff --git a/lib/asn1c/ngap/NGAP_WLANName.c b/lib/asn1c/ngap/NGAP_WLANName.c index afefca567e..092b7f1a90 100644 --- a/lib/asn1c/ngap/NGAP_WLANName.c +++ b/lib/asn1c/ngap/NGAP_WLANName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WLANName.h" diff --git a/lib/asn1c/ngap/NGAP_WLANName.h b/lib/asn1c/ngap/NGAP_WLANName.h index ce0c7003a8..2085c56982 100644 --- a/lib/asn1c/ngap/NGAP_WLANName.h +++ b/lib/asn1c/ngap/NGAP_WLANName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WLANName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_WLANName; asn_struct_free_f NGAP_WLANName_free; asn_struct_print_f NGAP_WLANName_print; asn_constr_check_f NGAP_WLANName_constraint; -jer_type_encoder_f NGAP_WLANName_encode_jer; per_type_decoder_f NGAP_WLANName_decode_aper; per_type_encoder_f NGAP_WLANName_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.c b/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.c index bee19e3902..b34e971c10 100644 --- a/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.c +++ b/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WUS-Assistance-Information.h" diff --git a/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.h b/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.h index b42476c912..fd9362974f 100644 --- a/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.h +++ b/lib/asn1c/ngap/NGAP_WUS-Assistance-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WUS_Assistance_Information_H_ diff --git a/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.c b/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.c index 0f155110e3..1a2de33b82 100644 --- a/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.c +++ b/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WarningAreaCoordinates.h" diff --git a/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.h b/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.h index 78de85aebe..397f049351 100644 --- a/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.h +++ b/lib/asn1c/ngap/NGAP_WarningAreaCoordinates.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WarningAreaCoordinates_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_WarningAreaCoordinates; asn_struct_free_f NGAP_WarningAreaCoordinates_free; asn_struct_print_f NGAP_WarningAreaCoordinates_print; asn_constr_check_f NGAP_WarningAreaCoordinates_constraint; -jer_type_encoder_f NGAP_WarningAreaCoordinates_encode_jer; per_type_decoder_f NGAP_WarningAreaCoordinates_decode_aper; per_type_encoder_f NGAP_WarningAreaCoordinates_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WarningAreaList.c b/lib/asn1c/ngap/NGAP_WarningAreaList.c index 6917c1b7da..1f73fdabde 100644 --- a/lib/asn1c/ngap/NGAP_WarningAreaList.c +++ b/lib/asn1c/ngap/NGAP_WarningAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WarningAreaList.h" diff --git a/lib/asn1c/ngap/NGAP_WarningAreaList.h b/lib/asn1c/ngap/NGAP_WarningAreaList.h index 4c05ec9a29..33d54214e7 100644 --- a/lib/asn1c/ngap/NGAP_WarningAreaList.h +++ b/lib/asn1c/ngap/NGAP_WarningAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WarningAreaList_H_ diff --git a/lib/asn1c/ngap/NGAP_WarningMessageContents.c b/lib/asn1c/ngap/NGAP_WarningMessageContents.c index de80c50c17..093e759a33 100644 --- a/lib/asn1c/ngap/NGAP_WarningMessageContents.c +++ b/lib/asn1c/ngap/NGAP_WarningMessageContents.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WarningMessageContents.h" diff --git a/lib/asn1c/ngap/NGAP_WarningMessageContents.h b/lib/asn1c/ngap/NGAP_WarningMessageContents.h index b91017b698..54d22cfeb5 100644 --- a/lib/asn1c/ngap/NGAP_WarningMessageContents.h +++ b/lib/asn1c/ngap/NGAP_WarningMessageContents.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WarningMessageContents_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_WarningMessageContents; asn_struct_free_f NGAP_WarningMessageContents_free; asn_struct_print_f NGAP_WarningMessageContents_print; asn_constr_check_f NGAP_WarningMessageContents_constraint; -jer_type_encoder_f NGAP_WarningMessageContents_encode_jer; per_type_decoder_f NGAP_WarningMessageContents_decode_aper; per_type_encoder_f NGAP_WarningMessageContents_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WarningSecurityInfo.c b/lib/asn1c/ngap/NGAP_WarningSecurityInfo.c index 3c2b38e638..ada8970453 100644 --- a/lib/asn1c/ngap/NGAP_WarningSecurityInfo.c +++ b/lib/asn1c/ngap/NGAP_WarningSecurityInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WarningSecurityInfo.h" diff --git a/lib/asn1c/ngap/NGAP_WarningSecurityInfo.h b/lib/asn1c/ngap/NGAP_WarningSecurityInfo.h index 57acacadfa..579a69ff52 100644 --- a/lib/asn1c/ngap/NGAP_WarningSecurityInfo.h +++ b/lib/asn1c/ngap/NGAP_WarningSecurityInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WarningSecurityInfo_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_WarningSecurityInfo; asn_struct_free_f NGAP_WarningSecurityInfo_free; asn_struct_print_f NGAP_WarningSecurityInfo_print; asn_constr_check_f NGAP_WarningSecurityInfo_constraint; -jer_type_encoder_f NGAP_WarningSecurityInfo_encode_jer; per_type_decoder_f NGAP_WarningSecurityInfo_decode_aper; per_type_encoder_f NGAP_WarningSecurityInfo_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WarningType.c b/lib/asn1c/ngap/NGAP_WarningType.c index a7f2736e46..d77365c283 100644 --- a/lib/asn1c/ngap/NGAP_WarningType.c +++ b/lib/asn1c/ngap/NGAP_WarningType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WarningType.h" diff --git a/lib/asn1c/ngap/NGAP_WarningType.h b/lib/asn1c/ngap/NGAP_WarningType.h index f51cc42b76..6c570bbb1a 100644 --- a/lib/asn1c/ngap/NGAP_WarningType.h +++ b/lib/asn1c/ngap/NGAP_WarningType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WarningType_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NGAP_WarningType; asn_struct_free_f NGAP_WarningType_free; asn_struct_print_f NGAP_WarningType_print; asn_constr_check_f NGAP_WarningType_constraint; -jer_type_encoder_f NGAP_WarningType_encode_jer; per_type_decoder_f NGAP_WarningType_decode_aper; per_type_encoder_f NGAP_WarningType_encode_aper; diff --git a/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.c b/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.c index ce72fcf037..19e0f74070 100644 --- a/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.c +++ b/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WriteReplaceWarningRequest.h" diff --git a/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.h b/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.h index 0efc247592..6c712af024 100644 --- a/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.h +++ b/lib/asn1c/ngap/NGAP_WriteReplaceWarningRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WriteReplaceWarningRequest_H_ diff --git a/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.c b/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.c index 5bcd819d24..4dd14decfc 100644 --- a/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.c +++ b/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_WriteReplaceWarningResponse.h" diff --git a/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.h b/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.h index d8dfaa15ce..b769ecec8c 100644 --- a/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.h +++ b/lib/asn1c/ngap/NGAP_WriteReplaceWarningResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-PDU-Contents" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_WriteReplaceWarningResponse_H_ diff --git a/lib/asn1c/ngap/NGAP_XnExtTLA-Item.c b/lib/asn1c/ngap/NGAP_XnExtTLA-Item.c index 7f6c1b9ca4..87bb435e81 100644 --- a/lib/asn1c/ngap/NGAP_XnExtTLA-Item.c +++ b/lib/asn1c/ngap/NGAP_XnExtTLA-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_XnExtTLA-Item.h" diff --git a/lib/asn1c/ngap/NGAP_XnExtTLA-Item.h b/lib/asn1c/ngap/NGAP_XnExtTLA-Item.h index 067ed026d9..a47b77e87a 100644 --- a/lib/asn1c/ngap/NGAP_XnExtTLA-Item.h +++ b/lib/asn1c/ngap/NGAP_XnExtTLA-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_XnExtTLA_Item_H_ diff --git a/lib/asn1c/ngap/NGAP_XnExtTLAs.c b/lib/asn1c/ngap/NGAP_XnExtTLAs.c index 981d0b102a..30c5f68c99 100644 --- a/lib/asn1c/ngap/NGAP_XnExtTLAs.c +++ b/lib/asn1c/ngap/NGAP_XnExtTLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_XnExtTLAs.h" diff --git a/lib/asn1c/ngap/NGAP_XnExtTLAs.h b/lib/asn1c/ngap/NGAP_XnExtTLAs.h index 257115c07d..59b4475200 100644 --- a/lib/asn1c/ngap/NGAP_XnExtTLAs.h +++ b/lib/asn1c/ngap/NGAP_XnExtTLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_XnExtTLAs_H_ diff --git a/lib/asn1c/ngap/NGAP_XnGTP-TLAs.c b/lib/asn1c/ngap/NGAP_XnGTP-TLAs.c index f0134a9224..e791004ca5 100644 --- a/lib/asn1c/ngap/NGAP_XnGTP-TLAs.c +++ b/lib/asn1c/ngap/NGAP_XnGTP-TLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_XnGTP-TLAs.h" diff --git a/lib/asn1c/ngap/NGAP_XnGTP-TLAs.h b/lib/asn1c/ngap/NGAP_XnGTP-TLAs.h index d39d75d7e5..cb666c0a68 100644 --- a/lib/asn1c/ngap/NGAP_XnGTP-TLAs.h +++ b/lib/asn1c/ngap/NGAP_XnGTP-TLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_XnGTP_TLAs_H_ diff --git a/lib/asn1c/ngap/NGAP_XnTLAs.c b/lib/asn1c/ngap/NGAP_XnTLAs.c index 7d9b87587f..3a667a5fe2 100644 --- a/lib/asn1c/ngap/NGAP_XnTLAs.c +++ b/lib/asn1c/ngap/NGAP_XnTLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_XnTLAs.h" diff --git a/lib/asn1c/ngap/NGAP_XnTLAs.h b/lib/asn1c/ngap/NGAP_XnTLAs.h index 56ddc1744a..8afa38d72d 100644 --- a/lib/asn1c/ngap/NGAP_XnTLAs.h +++ b/lib/asn1c/ngap/NGAP_XnTLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_XnTLAs_H_ diff --git a/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.c b/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.c index fb694f29a4..fe78929f4f 100644 --- a/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.c +++ b/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "NGAP_XnTNLConfigurationInfo.h" diff --git a/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.h b/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.h index a1792676e7..6c95f81652 100644 --- a/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.h +++ b/lib/asn1c/ngap/NGAP_XnTNLConfigurationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "NGAP-IEs" * found in "../support/ngap-r17.3.0/38413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _NGAP_XnTNLConfigurationInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_Additional-GUTI.c b/lib/asn1c/s1ap/S1AP_Additional-GUTI.c index a6edd158d7..3b13870b9c 100644 --- a/lib/asn1c/s1ap/S1AP_Additional-GUTI.c +++ b/lib/asn1c/s1ap/S1AP_Additional-GUTI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Additional-GUTI.h" diff --git a/lib/asn1c/s1ap/S1AP_Additional-GUTI.h b/lib/asn1c/s1ap/S1AP_Additional-GUTI.h index e66a535e4c..b5a90ba094 100644 --- a/lib/asn1c/s1ap/S1AP_Additional-GUTI.h +++ b/lib/asn1c/s1ap/S1AP_Additional-GUTI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Additional_GUTI_H_ diff --git a/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.c b/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.c index 5320ef364d..da04330052 100644 --- a/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.c +++ b/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AdditionalCSFallbackIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.h b/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.h index e8d0bee2eb..69ec6b378f 100644 --- a/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.h +++ b/lib/asn1c/s1ap/S1AP_AdditionalCSFallbackIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AdditionalCSFallbackIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_AdditionalCSFallbackIndicator_ asn_struct_free_f S1AP_AdditionalCSFallbackIndicator_free; asn_struct_print_f S1AP_AdditionalCSFallbackIndicator_print; asn_constr_check_f S1AP_AdditionalCSFallbackIndicator_constraint; -jer_type_encoder_f S1AP_AdditionalCSFallbackIndicator_encode_jer; per_type_decoder_f S1AP_AdditionalCSFallbackIndicator_decode_aper; per_type_encoder_f S1AP_AdditionalCSFallbackIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.c b/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.c index 9df10a273b..bfbb92566e 100644 --- a/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.c +++ b/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AdditionalRRMPriorityIndex.h" diff --git a/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.h b/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.h index 86c304aebe..01f50d0209 100644 --- a/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.h +++ b/lib/asn1c/s1ap/S1AP_AdditionalRRMPriorityIndex.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AdditionalRRMPriorityIndex_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_AdditionalRRMPriorityIndex; asn_struct_free_f S1AP_AdditionalRRMPriorityIndex_free; asn_struct_print_f S1AP_AdditionalRRMPriorityIndex_print; asn_constr_check_f S1AP_AdditionalRRMPriorityIndex_constraint; -jer_type_encoder_f S1AP_AdditionalRRMPriorityIndex_encode_jer; per_type_decoder_f S1AP_AdditionalRRMPriorityIndex_decode_aper; per_type_encoder_f S1AP_AdditionalRRMPriorityIndex_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.c b/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.c index 76e226e97b..89f62e05e7 100644 --- a/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.c +++ b/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AerialUEsubscriptionInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.h b/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.h index 0285a3e5c9..8b7e5b3784 100644 --- a/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.h +++ b/lib/asn1c/s1ap/S1AP_AerialUEsubscriptionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AerialUEsubscriptionInformation_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_AerialUEsubscriptionInformatio asn_struct_free_f S1AP_AerialUEsubscriptionInformation_free; asn_struct_print_f S1AP_AerialUEsubscriptionInformation_print; asn_constr_check_f S1AP_AerialUEsubscriptionInformation_constraint; -jer_type_encoder_f S1AP_AerialUEsubscriptionInformation_encode_jer; per_type_decoder_f S1AP_AerialUEsubscriptionInformation_decode_aper; per_type_encoder_f S1AP_AerialUEsubscriptionInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.c b/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.c index 5bbd51e07f..20d1da78fc 100644 --- a/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.c +++ b/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AllocationAndRetentionPriority.h" diff --git a/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.h b/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.h index 7d31050b28..2eaff49dfb 100644 --- a/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.h +++ b/lib/asn1c/s1ap/S1AP_AllocationAndRetentionPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AllocationAndRetentionPriority_H_ diff --git a/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.c b/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.c index 524a8c1faf..6652ec6f7c 100644 --- a/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.c +++ b/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AreaScopeOfMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.h b/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.h index 342d449588..8c3ada9df5 100644 --- a/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.h +++ b/lib/asn1c/s1ap/S1AP_AreaScopeOfMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AreaScopeOfMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.c b/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.c index f61c83fc9b..f3d33f3070 100644 --- a/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.c +++ b/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AreaScopeOfQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.h b/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.h index 630c999741..9aec388295 100644 --- a/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.h +++ b/lib/asn1c/s1ap/S1AP_AreaScopeOfQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AreaScopeOfQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.c b/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.c index 6c8c3cb6ec..cf58e76da9 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.c +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AssistanceDataForCECapableUEs.h" diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.h b/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.h index 2d8081d68e..950528abb5 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.h +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForCECapableUEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AssistanceDataForCECapableUEs_H_ diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.c b/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.c index ba8b9808c6..3a33f9881e 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.c +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AssistanceDataForPaging.h" diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.h b/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.h index 50e72ef235..ce02318af2 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.h +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AssistanceDataForPaging_H_ diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.c b/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.c index 41a411bff4..3cc3efeffd 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.c +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_AssistanceDataForRecommendedCells.h" diff --git a/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.h b/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.h index c56d246985..659499ab99 100644 --- a/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.h +++ b/lib/asn1c/s1ap/S1AP_AssistanceDataForRecommendedCells.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_AssistanceDataForRecommendedCells_H_ diff --git a/lib/asn1c/s1ap/S1AP_BPLMNs.c b/lib/asn1c/s1ap/S1AP_BPLMNs.c index 4d19edcc74..ee9a810514 100644 --- a/lib/asn1c/s1ap/S1AP_BPLMNs.c +++ b/lib/asn1c/s1ap/S1AP_BPLMNs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BPLMNs.h" diff --git a/lib/asn1c/s1ap/S1AP_BPLMNs.h b/lib/asn1c/s1ap/S1AP_BPLMNs.h index 8c70be5d17..aaf671b5b5 100644 --- a/lib/asn1c/s1ap/S1AP_BPLMNs.h +++ b/lib/asn1c/s1ap/S1AP_BPLMNs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BPLMNs_H_ diff --git a/lib/asn1c/s1ap/S1AP_BearerType.c b/lib/asn1c/s1ap/S1AP_BearerType.c index 97c583d57b..8f51f543bc 100644 --- a/lib/asn1c/s1ap/S1AP_BearerType.c +++ b/lib/asn1c/s1ap/S1AP_BearerType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BearerType.h" diff --git a/lib/asn1c/s1ap/S1AP_BearerType.h b/lib/asn1c/s1ap/S1AP_BearerType.h index d6b4e7c1b0..67363073ee 100644 --- a/lib/asn1c/s1ap/S1AP_BearerType.h +++ b/lib/asn1c/s1ap/S1AP_BearerType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BearerType_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_BearerType_specs_1; asn_struct_free_f S1AP_BearerType_free; asn_struct_print_f S1AP_BearerType_print; asn_constr_check_f S1AP_BearerType_constraint; -jer_type_encoder_f S1AP_BearerType_encode_jer; per_type_decoder_f S1AP_BearerType_decode_aper; per_type_encoder_f S1AP_BearerType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.c b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.c index 6061c4ebc4..54a6959538 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.c +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.h b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.h index f88c468bab..41aef97c39 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.h +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransfer-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Bearers_SubjectToEarlyStatusTransfer_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.c b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.c index 4bbb539c56..874fe7c13a 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.c +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Bearers-SubjectToEarlyStatusTransferList.h" diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.h b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.h index 248d81e7fb..69f74bcda1 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.h +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToEarlyStatusTransferList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Bearers_SubjectToEarlyStatusTransferList_H_ diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.c b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.c index a6de69c65c..3e9d307942 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.c +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Bearers-SubjectToStatusTransfer-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.h b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.h index b286d73e75..9d52ff177f 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.h +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransfer-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Bearers_SubjectToStatusTransfer_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.c b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.c index 6c83f6230e..912d9256c5 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.c +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Bearers-SubjectToStatusTransferList.h" diff --git a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.h b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.h index 6669b16d13..cfc6c3afdc 100644 --- a/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.h +++ b/lib/asn1c/s1ap/S1AP_Bearers-SubjectToStatusTransferList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Bearers_SubjectToStatusTransferList_H_ diff --git a/lib/asn1c/s1ap/S1AP_BitRate.c b/lib/asn1c/s1ap/S1AP_BitRate.c index f6a92c231d..61a0048070 100644 --- a/lib/asn1c/s1ap/S1AP_BitRate.c +++ b/lib/asn1c/s1ap/S1AP_BitRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BitRate.h" diff --git a/lib/asn1c/s1ap/S1AP_BitRate.h b/lib/asn1c/s1ap/S1AP_BitRate.h index 9acb24a9ee..d9dadf9ae7 100644 --- a/lib/asn1c/s1ap/S1AP_BitRate.h +++ b/lib/asn1c/s1ap/S1AP_BitRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BitRate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_BitRate; asn_struct_free_f S1AP_BitRate_free; asn_struct_print_f S1AP_BitRate_print; asn_constr_check_f S1AP_BitRate_constraint; -jer_type_encoder_f S1AP_BitRate_encode_jer; per_type_decoder_f S1AP_BitRate_decode_aper; per_type_encoder_f S1AP_BitRate_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.c b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.c index cc8e089fce..007cf90a4c 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.c +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BluetoothMeasConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.h b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.h index 2fb5db6388..3c3f07ef4c 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.h +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BluetoothMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_BluetoothMeasConfig_specs_1; asn_struct_free_f S1AP_BluetoothMeasConfig_free; asn_struct_print_f S1AP_BluetoothMeasConfig_print; asn_constr_check_f S1AP_BluetoothMeasConfig_constraint; -jer_type_encoder_f S1AP_BluetoothMeasConfig_encode_jer; per_type_decoder_f S1AP_BluetoothMeasConfig_decode_aper; per_type_encoder_f S1AP_BluetoothMeasConfig_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.c b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.c index 9ab4c5e701..906963c58d 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.c +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BluetoothMeasConfigNameList.h" diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.h b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.h index 7b0e068fbf..3be6adb51a 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.h +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BluetoothMeasConfigNameList_H_ diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.c b/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.c index b3c540ce0e..f233f40a62 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.c +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BluetoothMeasurementConfiguration.h" diff --git a/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.h b/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.h index 9d14d7acd6..493e6eb969 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.h +++ b/lib/asn1c/s1ap/S1AP_BluetoothMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BluetoothMeasurementConfiguration_H_ diff --git a/lib/asn1c/s1ap/S1AP_BluetoothName.c b/lib/asn1c/s1ap/S1AP_BluetoothName.c index ff65809e6f..227fe65d2b 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothName.c +++ b/lib/asn1c/s1ap/S1AP_BluetoothName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BluetoothName.h" diff --git a/lib/asn1c/s1ap/S1AP_BluetoothName.h b/lib/asn1c/s1ap/S1AP_BluetoothName.h index 2e7e7f2d0f..3da0dcac12 100644 --- a/lib/asn1c/s1ap/S1AP_BluetoothName.h +++ b/lib/asn1c/s1ap/S1AP_BluetoothName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BluetoothName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_BluetoothName; asn_struct_free_f S1AP_BluetoothName_free; asn_struct_print_f S1AP_BluetoothName_print; asn_constr_check_f S1AP_BluetoothName_constraint; -jer_type_encoder_f S1AP_BluetoothName_encode_jer; per_type_decoder_f S1AP_BluetoothName_decode_aper; per_type_encoder_f S1AP_BluetoothName_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.c b/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.c index 771d63ba5a..3acfc5e645 100644 --- a/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.c +++ b/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BroadcastCancelledAreaList.h" diff --git a/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.h b/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.h index f903515415..3c2b4b1086 100644 --- a/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.h +++ b/lib/asn1c/s1ap/S1AP_BroadcastCancelledAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BroadcastCancelledAreaList_H_ diff --git a/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.c b/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.c index a283f1ac31..2cf03707aa 100644 --- a/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.c +++ b/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_BroadcastCompletedAreaList.h" diff --git a/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.h b/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.h index 2529e8bf85..f7fb69a842 100644 --- a/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.h +++ b/lib/asn1c/s1ap/S1AP_BroadcastCompletedAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_BroadcastCompletedAreaList_H_ diff --git a/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.c b/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.c index 21f04c58f2..7afcb09528 100644 --- a/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.c +++ b/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CE-ModeBRestricted.h" diff --git a/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.h b/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.h index a70a230795..a927945d2a 100644 --- a/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.h +++ b/lib/asn1c/s1ap/S1AP_CE-ModeBRestricted.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CE_ModeBRestricted_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CE_ModeBRestricted_specs_1; asn_struct_free_f S1AP_CE_ModeBRestricted_free; asn_struct_print_f S1AP_CE_ModeBRestricted_print; asn_constr_check_f S1AP_CE_ModeBRestricted_constraint; -jer_type_encoder_f S1AP_CE_ModeBRestricted_encode_jer; per_type_decoder_f S1AP_CE_ModeBRestricted_decode_aper; per_type_encoder_f S1AP_CE_ModeBRestricted_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.c b/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.c index 6686f44eac..2f1b3db445 100644 --- a/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.c +++ b/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CE-mode-B-SupportIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.h b/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.h index 616e30d607..cd079c8525 100644 --- a/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.h +++ b/lib/asn1c/s1ap/S1AP_CE-mode-B-SupportIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CE_mode_B_SupportIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CE_mode_B_SupportIndicator_spe asn_struct_free_f S1AP_CE_mode_B_SupportIndicator_free; asn_struct_print_f S1AP_CE_mode_B_SupportIndicator_print; asn_constr_check_f S1AP_CE_mode_B_SupportIndicator_constraint; -jer_type_encoder_f S1AP_CE_mode_B_SupportIndicator_encode_jer; per_type_decoder_f S1AP_CE_mode_B_SupportIndicator_decode_aper; per_type_encoder_f S1AP_CE_mode_B_SupportIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CELevel.c b/lib/asn1c/s1ap/S1AP_CELevel.c index b04f4323a8..350d0634ea 100644 --- a/lib/asn1c/s1ap/S1AP_CELevel.c +++ b/lib/asn1c/s1ap/S1AP_CELevel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CELevel.h" diff --git a/lib/asn1c/s1ap/S1AP_CELevel.h b/lib/asn1c/s1ap/S1AP_CELevel.h index 8d6da5fe96..63ff1e69e7 100644 --- a/lib/asn1c/s1ap/S1AP_CELevel.h +++ b/lib/asn1c/s1ap/S1AP_CELevel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CELevel_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_CELevel; asn_struct_free_f S1AP_CELevel_free; asn_struct_print_f S1AP_CELevel_print; asn_constr_check_f S1AP_CELevel_constraint; -jer_type_encoder_f S1AP_CELevel_encode_jer; per_type_decoder_f S1AP_CELevel_decode_aper; per_type_encoder_f S1AP_CELevel_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CGI.c b/lib/asn1c/s1ap/S1AP_CGI.c index 769f89e398..884f46090a 100644 --- a/lib/asn1c/s1ap/S1AP_CGI.c +++ b/lib/asn1c/s1ap/S1AP_CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CGI.h" diff --git a/lib/asn1c/s1ap/S1AP_CGI.h b/lib/asn1c/s1ap/S1AP_CGI.h index ff0cdb736b..a30becb6fe 100644 --- a/lib/asn1c/s1ap/S1AP_CGI.h +++ b/lib/asn1c/s1ap/S1AP_CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CGI_H_ diff --git a/lib/asn1c/s1ap/S1AP_CI.c b/lib/asn1c/s1ap/S1AP_CI.c index 6545ab2552..c89c99baab 100644 --- a/lib/asn1c/s1ap/S1AP_CI.c +++ b/lib/asn1c/s1ap/S1AP_CI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CI.h" diff --git a/lib/asn1c/s1ap/S1AP_CI.h b/lib/asn1c/s1ap/S1AP_CI.h index 825af1d7b7..f0ea977283 100644 --- a/lib/asn1c/s1ap/S1AP_CI.h +++ b/lib/asn1c/s1ap/S1AP_CI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_CI; asn_struct_free_f S1AP_CI_free; asn_struct_print_f S1AP_CI_print; asn_constr_check_f S1AP_CI_constraint; -jer_type_encoder_f S1AP_CI_encode_jer; per_type_decoder_f S1AP_CI_decode_aper; per_type_encoder_f S1AP_CI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CNDomain.c b/lib/asn1c/s1ap/S1AP_CNDomain.c index d05e7d263e..0f01ac8fd6 100644 --- a/lib/asn1c/s1ap/S1AP_CNDomain.c +++ b/lib/asn1c/s1ap/S1AP_CNDomain.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CNDomain.h" diff --git a/lib/asn1c/s1ap/S1AP_CNDomain.h b/lib/asn1c/s1ap/S1AP_CNDomain.h index 57611d888a..845b1a1369 100644 --- a/lib/asn1c/s1ap/S1AP_CNDomain.h +++ b/lib/asn1c/s1ap/S1AP_CNDomain.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CNDomain_H_ @@ -34,7 +34,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CNDomain_specs_1; asn_struct_free_f S1AP_CNDomain_free; asn_struct_print_f S1AP_CNDomain_print; asn_constr_check_f S1AP_CNDomain_constraint; -jer_type_encoder_f S1AP_CNDomain_encode_jer; per_type_decoder_f S1AP_CNDomain_decode_aper; per_type_encoder_f S1AP_CNDomain_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CNType.c b/lib/asn1c/s1ap/S1AP_CNType.c index 81f83d1a47..c2c0ad4577 100644 --- a/lib/asn1c/s1ap/S1AP_CNType.c +++ b/lib/asn1c/s1ap/S1AP_CNType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CNType.h" diff --git a/lib/asn1c/s1ap/S1AP_CNType.h b/lib/asn1c/s1ap/S1AP_CNType.h index bc26cc24d0..6d195760c3 100644 --- a/lib/asn1c/s1ap/S1AP_CNType.h +++ b/lib/asn1c/s1ap/S1AP_CNType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CNType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CNType_specs_1; asn_struct_free_f S1AP_CNType_free; asn_struct_print_f S1AP_CNType_print; asn_constr_check_f S1AP_CNType_constraint; -jer_type_encoder_f S1AP_CNType_encode_jer; per_type_decoder_f S1AP_CNType_decode_aper; per_type_encoder_f S1AP_CNType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.c b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.c index 101d986421..85e43c1f35 100644 --- a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.c +++ b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CNTypeRestrictions-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.h b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.h index 5acae5f669..6040aee05b 100644 --- a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.h +++ b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CNTypeRestrictions_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.c b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.c index 040beed634..d7fe42ba5e 100644 --- a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.c +++ b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CNTypeRestrictions.h" diff --git a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.h b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.h index 79b1f30866..5afa5f7b2f 100644 --- a/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.h +++ b/lib/asn1c/s1ap/S1AP_CNTypeRestrictions.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CNTypeRestrictions_H_ diff --git a/lib/asn1c/s1ap/S1AP_COUNTValueExtended.c b/lib/asn1c/s1ap/S1AP_COUNTValueExtended.c index 7b7d77bd7c..d0026e2b72 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTValueExtended.c +++ b/lib/asn1c/s1ap/S1AP_COUNTValueExtended.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_COUNTValueExtended.h" diff --git a/lib/asn1c/s1ap/S1AP_COUNTValueExtended.h b/lib/asn1c/s1ap/S1AP_COUNTValueExtended.h index f3af1fdcb3..e3a13b3446 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTValueExtended.h +++ b/lib/asn1c/s1ap/S1AP_COUNTValueExtended.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_COUNTValueExtended_H_ diff --git a/lib/asn1c/s1ap/S1AP_COUNTvalue.c b/lib/asn1c/s1ap/S1AP_COUNTvalue.c index ffc24158b9..be8508cb97 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTvalue.c +++ b/lib/asn1c/s1ap/S1AP_COUNTvalue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_COUNTvalue.h" diff --git a/lib/asn1c/s1ap/S1AP_COUNTvalue.h b/lib/asn1c/s1ap/S1AP_COUNTvalue.h index 6373407379..2895871aa4 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTvalue.h +++ b/lib/asn1c/s1ap/S1AP_COUNTvalue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_COUNTvalue_H_ diff --git a/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.c b/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.c index 2baf472a6f..f41bbaaf05 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.c +++ b/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_COUNTvaluePDCP-SNlength18.h" diff --git a/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.h b/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.h index 51713e939d..94e266955a 100644 --- a/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.h +++ b/lib/asn1c/s1ap/S1AP_COUNTvaluePDCP-SNlength18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_COUNTvaluePDCP_SNlength18_H_ diff --git a/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.c b/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.c index dfc0b1f198..f88b64acdd 100644 --- a/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.c +++ b/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSFallbackIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.h b/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.h index 227ed44241..173b7d87cb 100644 --- a/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.h +++ b/lib/asn1c/s1ap/S1AP_CSFallbackIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSFallbackIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CSFallbackIndicator_specs_1; asn_struct_free_f S1AP_CSFallbackIndicator_free; asn_struct_print_f S1AP_CSFallbackIndicator_print; asn_constr_check_f S1AP_CSFallbackIndicator_constraint; -jer_type_encoder_f S1AP_CSFallbackIndicator_encode_jer; per_type_decoder_f S1AP_CSFallbackIndicator_decode_aper; per_type_encoder_f S1AP_CSFallbackIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CSG-Id.c b/lib/asn1c/s1ap/S1AP_CSG-Id.c index c791014d74..3befc04871 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-Id.c +++ b/lib/asn1c/s1ap/S1AP_CSG-Id.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSG-Id.h" diff --git a/lib/asn1c/s1ap/S1AP_CSG-Id.h b/lib/asn1c/s1ap/S1AP_CSG-Id.h index d4fc3ea44a..8e2076d77e 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-Id.h +++ b/lib/asn1c/s1ap/S1AP_CSG-Id.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSG_Id_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_CSG_Id; asn_struct_free_f S1AP_CSG_Id_free; asn_struct_print_f S1AP_CSG_Id_print; asn_constr_check_f S1AP_CSG_Id_constraint; -jer_type_encoder_f S1AP_CSG_Id_encode_jer; per_type_decoder_f S1AP_CSG_Id_decode_aper; per_type_encoder_f S1AP_CSG_Id_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.c b/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.c index 85678c224a..9c04e29662 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.c +++ b/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSG-IdList-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.h b/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.h index 9e006948ee..fb18b06314 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.h +++ b/lib/asn1c/s1ap/S1AP_CSG-IdList-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSG_IdList_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CSG-IdList.c b/lib/asn1c/s1ap/S1AP_CSG-IdList.c index cbe7d50978..f34dda7d51 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-IdList.c +++ b/lib/asn1c/s1ap/S1AP_CSG-IdList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSG-IdList.h" diff --git a/lib/asn1c/s1ap/S1AP_CSG-IdList.h b/lib/asn1c/s1ap/S1AP_CSG-IdList.h index 4dba3f2bce..e5539c4c68 100644 --- a/lib/asn1c/s1ap/S1AP_CSG-IdList.h +++ b/lib/asn1c/s1ap/S1AP_CSG-IdList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSG_IdList_H_ diff --git a/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.c b/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.c index 399d8fd343..b452492a42 100644 --- a/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.c +++ b/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSGMembershipInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.h b/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.h index 232fe3c3e9..6ec9caeb01 100644 --- a/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.h +++ b/lib/asn1c/s1ap/S1AP_CSGMembershipInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSGMembershipInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.c b/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.c index 23e535fa17..aeb22d242a 100644 --- a/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.c +++ b/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CSGMembershipStatus.h" diff --git a/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.h b/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.h index 78bd40b213..3e38e38d51 100644 --- a/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.h +++ b/lib/asn1c/s1ap/S1AP_CSGMembershipStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CSGMembershipStatus_H_ @@ -34,7 +34,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CSGMembershipStatus_specs_1; asn_struct_free_f S1AP_CSGMembershipStatus_free; asn_struct_print_f S1AP_CSGMembershipStatus_print; asn_constr_check_f S1AP_CSGMembershipStatus_constraint; -jer_type_encoder_f S1AP_CSGMembershipStatus_encode_jer; per_type_decoder_f S1AP_CSGMembershipStatus_decode_aper; per_type_encoder_f S1AP_CSGMembershipStatus_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.c b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.c index 99b0f1b8cd..4e7f9c4c7f 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.c +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CancelledCellinEAI-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.h b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.h index f2108c01d3..1aa374a28b 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.h +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CancelledCellinEAI_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.c b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.c index 4e59b9b70f..ecbd4be21a 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.c +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CancelledCellinEAI.h" diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.h b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.h index 5437d34740..6ef696c7f7 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.h +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinEAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CancelledCellinEAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.c b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.c index aa0cee19dc..1ae07af370 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.c +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CancelledCellinTAI-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.h b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.h index 501b9f25dd..1ccfe8fef8 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.h +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CancelledCellinTAI_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.c b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.c index 6649e7de1d..d5ca4c1622 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.c +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CancelledCellinTAI.h" diff --git a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.h b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.h index b02efa94d2..7acd85c716 100644 --- a/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.h +++ b/lib/asn1c/s1ap/S1AP_CancelledCellinTAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CancelledCellinTAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_Cause.c b/lib/asn1c/s1ap/S1AP_Cause.c index e3de9a8ed6..4237abf49d 100644 --- a/lib/asn1c/s1ap/S1AP_Cause.c +++ b/lib/asn1c/s1ap/S1AP_Cause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cause.h" diff --git a/lib/asn1c/s1ap/S1AP_Cause.h b/lib/asn1c/s1ap/S1AP_Cause.h index 9b1dce01bc..d8701b4c73 100644 --- a/lib/asn1c/s1ap/S1AP_Cause.h +++ b/lib/asn1c/s1ap/S1AP_Cause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cause_H_ diff --git a/lib/asn1c/s1ap/S1AP_CauseMisc.c b/lib/asn1c/s1ap/S1AP_CauseMisc.c index 0af88fb489..6df52ff2aa 100644 --- a/lib/asn1c/s1ap/S1AP_CauseMisc.c +++ b/lib/asn1c/s1ap/S1AP_CauseMisc.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CauseMisc.h" diff --git a/lib/asn1c/s1ap/S1AP_CauseMisc.h b/lib/asn1c/s1ap/S1AP_CauseMisc.h index 62dbeb4ef0..6a957fd7be 100644 --- a/lib/asn1c/s1ap/S1AP_CauseMisc.h +++ b/lib/asn1c/s1ap/S1AP_CauseMisc.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CauseMisc_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CauseMisc_specs_1; asn_struct_free_f S1AP_CauseMisc_free; asn_struct_print_f S1AP_CauseMisc_print; asn_constr_check_f S1AP_CauseMisc_constraint; -jer_type_encoder_f S1AP_CauseMisc_encode_jer; per_type_decoder_f S1AP_CauseMisc_decode_aper; per_type_encoder_f S1AP_CauseMisc_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CauseNas.c b/lib/asn1c/s1ap/S1AP_CauseNas.c index 08bbed0e1d..7a690bab92 100644 --- a/lib/asn1c/s1ap/S1AP_CauseNas.c +++ b/lib/asn1c/s1ap/S1AP_CauseNas.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CauseNas.h" diff --git a/lib/asn1c/s1ap/S1AP_CauseNas.h b/lib/asn1c/s1ap/S1AP_CauseNas.h index 35a9f66376..df32a3b24e 100644 --- a/lib/asn1c/s1ap/S1AP_CauseNas.h +++ b/lib/asn1c/s1ap/S1AP_CauseNas.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CauseNas_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CauseNas_specs_1; asn_struct_free_f S1AP_CauseNas_free; asn_struct_print_f S1AP_CauseNas_print; asn_constr_check_f S1AP_CauseNas_constraint; -jer_type_encoder_f S1AP_CauseNas_encode_jer; per_type_decoder_f S1AP_CauseNas_decode_aper; per_type_encoder_f S1AP_CauseNas_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CauseProtocol.c b/lib/asn1c/s1ap/S1AP_CauseProtocol.c index 86ff0b021f..6080bf027e 100644 --- a/lib/asn1c/s1ap/S1AP_CauseProtocol.c +++ b/lib/asn1c/s1ap/S1AP_CauseProtocol.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CauseProtocol.h" diff --git a/lib/asn1c/s1ap/S1AP_CauseProtocol.h b/lib/asn1c/s1ap/S1AP_CauseProtocol.h index 1dfa63b66b..6fdafe6fb9 100644 --- a/lib/asn1c/s1ap/S1AP_CauseProtocol.h +++ b/lib/asn1c/s1ap/S1AP_CauseProtocol.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CauseProtocol_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CauseProtocol_specs_1; asn_struct_free_f S1AP_CauseProtocol_free; asn_struct_print_f S1AP_CauseProtocol_print; asn_constr_check_f S1AP_CauseProtocol_constraint; -jer_type_encoder_f S1AP_CauseProtocol_encode_jer; per_type_decoder_f S1AP_CauseProtocol_decode_aper; per_type_encoder_f S1AP_CauseProtocol_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.c b/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.c index e1d12da202..4aca750da9 100644 --- a/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.c +++ b/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CauseRadioNetwork.h" diff --git a/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.h b/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.h index c2006b5269..c2c16801ed 100644 --- a/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.h +++ b/lib/asn1c/s1ap/S1AP_CauseRadioNetwork.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CauseRadioNetwork_H_ @@ -79,7 +79,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CauseRadioNetwork_specs_1; asn_struct_free_f S1AP_CauseRadioNetwork_free; asn_struct_print_f S1AP_CauseRadioNetwork_print; asn_constr_check_f S1AP_CauseRadioNetwork_constraint; -jer_type_encoder_f S1AP_CauseRadioNetwork_encode_jer; per_type_decoder_f S1AP_CauseRadioNetwork_decode_aper; per_type_encoder_f S1AP_CauseRadioNetwork_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CauseTransport.c b/lib/asn1c/s1ap/S1AP_CauseTransport.c index 6f31fffafe..4fd6ad1628 100644 --- a/lib/asn1c/s1ap/S1AP_CauseTransport.c +++ b/lib/asn1c/s1ap/S1AP_CauseTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CauseTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_CauseTransport.h b/lib/asn1c/s1ap/S1AP_CauseTransport.h index efcb1dbd2b..cd3331b147 100644 --- a/lib/asn1c/s1ap/S1AP_CauseTransport.h +++ b/lib/asn1c/s1ap/S1AP_CauseTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CauseTransport_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CauseTransport_specs_1; asn_struct_free_f S1AP_CauseTransport_free; asn_struct_print_f S1AP_CauseTransport_print; asn_constr_check_f S1AP_CauseTransport_constraint; -jer_type_encoder_f S1AP_CauseTransport_encode_jer; per_type_decoder_f S1AP_CauseTransport_decode_aper; per_type_encoder_f S1AP_CauseTransport_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.c b/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.c index 5184d01ed0..5059b9c1d0 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000HORequiredIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.h b/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.h index 00c63ab6b7..5628739e23 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000HORequiredIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000HORequiredIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Cdma2000HORequiredIndication_s asn_struct_free_f S1AP_Cdma2000HORequiredIndication_free; asn_struct_print_f S1AP_Cdma2000HORequiredIndication_print; asn_constr_check_f S1AP_Cdma2000HORequiredIndication_constraint; -jer_type_encoder_f S1AP_Cdma2000HORequiredIndication_encode_jer; per_type_decoder_f S1AP_Cdma2000HORequiredIndication_decode_aper; per_type_encoder_f S1AP_Cdma2000HORequiredIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.c b/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.c index 8a4a4fb1ca..fac9b6b3f3 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000HOStatus.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.h b/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.h index 052a6070a4..cbb4bf0968 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000HOStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000HOStatus_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Cdma2000HOStatus_specs_1; asn_struct_free_f S1AP_Cdma2000HOStatus_free; asn_struct_print_f S1AP_Cdma2000HOStatus_print; asn_constr_check_f S1AP_Cdma2000HOStatus_constraint; -jer_type_encoder_f S1AP_Cdma2000HOStatus_encode_jer; per_type_decoder_f S1AP_Cdma2000HOStatus_decode_aper; per_type_encoder_f S1AP_Cdma2000HOStatus_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.c b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.c index ae29aed0c7..d2120aac65 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000OneXMEID.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.h b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.h index 1f637046d7..a14fea445b 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMEID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000OneXMEID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000OneXMEID; asn_struct_free_f S1AP_Cdma2000OneXMEID_free; asn_struct_print_f S1AP_Cdma2000OneXMEID_print; asn_constr_check_f S1AP_Cdma2000OneXMEID_constraint; -jer_type_encoder_f S1AP_Cdma2000OneXMEID_encode_jer; per_type_decoder_f S1AP_Cdma2000OneXMEID_decode_aper; per_type_encoder_f S1AP_Cdma2000OneXMEID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.c b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.c index e7bdd385a8..3facf48cf0 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000OneXMSI.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.h b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.h index edb742de20..232626b750 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000OneXMSI_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000OneXMSI; asn_struct_free_f S1AP_Cdma2000OneXMSI_free; asn_struct_print_f S1AP_Cdma2000OneXMSI_print; asn_constr_check_f S1AP_Cdma2000OneXMSI_constraint; -jer_type_encoder_f S1AP_Cdma2000OneXMSI_encode_jer; per_type_decoder_f S1AP_Cdma2000OneXMSI_decode_aper; per_type_encoder_f S1AP_Cdma2000OneXMSI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.c b/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.c index a3b4e6e3c7..92fd700de9 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000OneXPilot.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.h b/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.h index 5d56ed1dc6..2844e34636 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXPilot.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000OneXPilot_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000OneXPilot; asn_struct_free_f S1AP_Cdma2000OneXPilot_free; asn_struct_print_f S1AP_Cdma2000OneXPilot_print; asn_constr_check_f S1AP_Cdma2000OneXPilot_constraint; -jer_type_encoder_f S1AP_Cdma2000OneXPilot_encode_jer; per_type_decoder_f S1AP_Cdma2000OneXPilot_decode_aper; per_type_encoder_f S1AP_Cdma2000OneXPilot_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.c b/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.c index 8909eb6fd1..9643173b60 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000OneXRAND.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.h b/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.h index 4ef8679b76..1c737abb7b 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXRAND.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000OneXRAND_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000OneXRAND; asn_struct_free_f S1AP_Cdma2000OneXRAND_free; asn_struct_print_f S1AP_Cdma2000OneXRAND_print; asn_constr_check_f S1AP_Cdma2000OneXRAND_constraint; -jer_type_encoder_f S1AP_Cdma2000OneXRAND_encode_jer; per_type_decoder_f S1AP_Cdma2000OneXRAND_decode_aper; per_type_encoder_f S1AP_Cdma2000OneXRAND_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.c b/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.c index 07291ffba9..87b2768f03 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000OneXSRVCCInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.h b/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.h index a6aebc3163..7a476b22d6 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000OneXSRVCCInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000OneXSRVCCInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000PDU.c b/lib/asn1c/s1ap/S1AP_Cdma2000PDU.c index ea251e8717..b2a08ebd82 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000PDU.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000PDU.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000PDU.h b/lib/asn1c/s1ap/S1AP_Cdma2000PDU.h index d2296fc599..61dbef851b 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000PDU.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000PDU_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000PDU; asn_struct_free_f S1AP_Cdma2000PDU_free; asn_struct_print_f S1AP_Cdma2000PDU_print; asn_constr_check_f S1AP_Cdma2000PDU_constraint; -jer_type_encoder_f S1AP_Cdma2000PDU_encode_jer; per_type_decoder_f S1AP_Cdma2000PDU_decode_aper; per_type_encoder_f S1AP_Cdma2000PDU_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000RATType.c b/lib/asn1c/s1ap/S1AP_Cdma2000RATType.c index 6e651a5003..0eae57fbe6 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000RATType.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000RATType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000RATType.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000RATType.h b/lib/asn1c/s1ap/S1AP_Cdma2000RATType.h index e0312c700c..0b63338362 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000RATType.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000RATType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000RATType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Cdma2000RATType_specs_1; asn_struct_free_f S1AP_Cdma2000RATType_free; asn_struct_print_f S1AP_Cdma2000RATType_print; asn_constr_check_f S1AP_Cdma2000RATType_constraint; -jer_type_encoder_f S1AP_Cdma2000RATType_encode_jer; per_type_decoder_f S1AP_Cdma2000RATType_decode_aper; per_type_encoder_f S1AP_Cdma2000RATType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.c b/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.c index 6bf25a8416..6591029f71 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.c +++ b/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cdma2000SectorID.h" diff --git a/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.h b/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.h index 5cee603575..c13a9b6184 100644 --- a/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.h +++ b/lib/asn1c/s1ap/S1AP_Cdma2000SectorID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cdma2000SectorID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Cdma2000SectorID; asn_struct_free_f S1AP_Cdma2000SectorID_free; asn_struct_print_f S1AP_Cdma2000SectorID_print; asn_constr_check_f S1AP_Cdma2000SectorID_constraint; -jer_type_encoder_f S1AP_Cdma2000SectorID_encode_jer; per_type_decoder_f S1AP_Cdma2000SectorID_decode_aper; per_type_encoder_f S1AP_Cdma2000SectorID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Cell-Size.c b/lib/asn1c/s1ap/S1AP_Cell-Size.c index ae61e13770..9d5ab389a0 100644 --- a/lib/asn1c/s1ap/S1AP_Cell-Size.c +++ b/lib/asn1c/s1ap/S1AP_Cell-Size.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Cell-Size.h" diff --git a/lib/asn1c/s1ap/S1AP_Cell-Size.h b/lib/asn1c/s1ap/S1AP_Cell-Size.h index 788519c7a5..72edeab358 100644 --- a/lib/asn1c/s1ap/S1AP_Cell-Size.h +++ b/lib/asn1c/s1ap/S1AP_Cell-Size.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Cell_Size_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Cell_Size_specs_1; asn_struct_free_f S1AP_Cell_Size_free; asn_struct_print_f S1AP_Cell_Size_print; asn_constr_check_f S1AP_Cell_Size_constraint; -jer_type_encoder_f S1AP_Cell_Size_encode_jer; per_type_decoder_f S1AP_Cell_Size_decode_aper; per_type_encoder_f S1AP_Cell_Size_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CellAccessMode.c b/lib/asn1c/s1ap/S1AP_CellAccessMode.c index bb9a49bbed..d33341d03d 100644 --- a/lib/asn1c/s1ap/S1AP_CellAccessMode.c +++ b/lib/asn1c/s1ap/S1AP_CellAccessMode.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellAccessMode.h" diff --git a/lib/asn1c/s1ap/S1AP_CellAccessMode.h b/lib/asn1c/s1ap/S1AP_CellAccessMode.h index 6e2462f7b0..a07166a1fe 100644 --- a/lib/asn1c/s1ap/S1AP_CellAccessMode.h +++ b/lib/asn1c/s1ap/S1AP_CellAccessMode.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellAccessMode_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_CellAccessMode_specs_1; asn_struct_free_f S1AP_CellAccessMode_free; asn_struct_print_f S1AP_CellAccessMode_print; asn_constr_check_f S1AP_CellAccessMode_constraint; -jer_type_encoder_f S1AP_CellAccessMode_encode_jer; per_type_decoder_f S1AP_CellAccessMode_decode_aper; per_type_encoder_f S1AP_CellAccessMode_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CellBasedMDT.c b/lib/asn1c/s1ap/S1AP_CellBasedMDT.c index 0ba48de4e7..30abbc79b5 100644 --- a/lib/asn1c/s1ap/S1AP_CellBasedMDT.c +++ b/lib/asn1c/s1ap/S1AP_CellBasedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellBasedMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_CellBasedMDT.h b/lib/asn1c/s1ap/S1AP_CellBasedMDT.h index 7cacd190aa..82bbd1df4c 100644 --- a/lib/asn1c/s1ap/S1AP_CellBasedMDT.h +++ b/lib/asn1c/s1ap/S1AP_CellBasedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellBasedMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellBasedQMC.c b/lib/asn1c/s1ap/S1AP_CellBasedQMC.c index fce709d8a8..8a5bc0eff4 100644 --- a/lib/asn1c/s1ap/S1AP_CellBasedQMC.c +++ b/lib/asn1c/s1ap/S1AP_CellBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellBasedQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_CellBasedQMC.h b/lib/asn1c/s1ap/S1AP_CellBasedQMC.h index 459f4b4572..c66b569277 100644 --- a/lib/asn1c/s1ap/S1AP_CellBasedQMC.h +++ b/lib/asn1c/s1ap/S1AP_CellBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellBasedQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.c b/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.c index 4a68d1640a..583a8e7163 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.c +++ b/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellID-Broadcast-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.h b/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.h index 8f468664c9..7536c12e14 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.h +++ b/lib/asn1c/s1ap/S1AP_CellID-Broadcast-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellID_Broadcast_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellID-Broadcast.c b/lib/asn1c/s1ap/S1AP_CellID-Broadcast.c index 80f506d6c5..fb7867cb43 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Broadcast.c +++ b/lib/asn1c/s1ap/S1AP_CellID-Broadcast.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellID-Broadcast.h" diff --git a/lib/asn1c/s1ap/S1AP_CellID-Broadcast.h b/lib/asn1c/s1ap/S1AP_CellID-Broadcast.h index 1b39ba6486..02e9e3cbf0 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Broadcast.h +++ b/lib/asn1c/s1ap/S1AP_CellID-Broadcast.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellID_Broadcast_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.c b/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.c index 0449f61d45..428bdea629 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.c +++ b/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellID-Cancelled-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.h b/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.h index 62950dcd20..2177571ec0 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.h +++ b/lib/asn1c/s1ap/S1AP_CellID-Cancelled-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellID_Cancelled_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellID-Cancelled.c b/lib/asn1c/s1ap/S1AP_CellID-Cancelled.c index 2162cacdd8..34bee35b0d 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Cancelled.c +++ b/lib/asn1c/s1ap/S1AP_CellID-Cancelled.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellID-Cancelled.h" diff --git a/lib/asn1c/s1ap/S1AP_CellID-Cancelled.h b/lib/asn1c/s1ap/S1AP_CellID-Cancelled.h index d7e727de13..7de1f26ac4 100644 --- a/lib/asn1c/s1ap/S1AP_CellID-Cancelled.h +++ b/lib/asn1c/s1ap/S1AP_CellID-Cancelled.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellID_Cancelled_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellIdListforMDT.c b/lib/asn1c/s1ap/S1AP_CellIdListforMDT.c index c478373c9e..3e09b44bfd 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdListforMDT.c +++ b/lib/asn1c/s1ap/S1AP_CellIdListforMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellIdListforMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_CellIdListforMDT.h b/lib/asn1c/s1ap/S1AP_CellIdListforMDT.h index 86bb024c8f..99bf2895e2 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdListforMDT.h +++ b/lib/asn1c/s1ap/S1AP_CellIdListforMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellIdListforMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellIdListforQMC.c b/lib/asn1c/s1ap/S1AP_CellIdListforQMC.c index 2c841b8c00..db9dfbfa5a 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdListforQMC.c +++ b/lib/asn1c/s1ap/S1AP_CellIdListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellIdListforQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_CellIdListforQMC.h b/lib/asn1c/s1ap/S1AP_CellIdListforQMC.h index 08e6964df1..780bdaacb9 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdListforQMC.h +++ b/lib/asn1c/s1ap/S1AP_CellIdListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellIdListforQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.c b/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.c index 3f1aaa1ed0..7954975e60 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.c +++ b/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellIdentifierAndCELevelForCECapableUEs.h" diff --git a/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.h b/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.h index e5963d7e32..6f682bc66e 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.h +++ b/lib/asn1c/s1ap/S1AP_CellIdentifierAndCELevelForCECapableUEs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellIdentifierAndCELevelForCECapableUEs_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellIdentity.c b/lib/asn1c/s1ap/S1AP_CellIdentity.c index 6c5a78f7c0..8413817cb5 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdentity.c +++ b/lib/asn1c/s1ap/S1AP_CellIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellIdentity.h" diff --git a/lib/asn1c/s1ap/S1AP_CellIdentity.h b/lib/asn1c/s1ap/S1AP_CellIdentity.h index b92cf93eda..ef98e32c31 100644 --- a/lib/asn1c/s1ap/S1AP_CellIdentity.h +++ b/lib/asn1c/s1ap/S1AP_CellIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellIdentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_CellIdentity; asn_struct_free_f S1AP_CellIdentity_free; asn_struct_print_f S1AP_CellIdentity_print; asn_constr_check_f S1AP_CellIdentity_constraint; -jer_type_encoder_f S1AP_CellIdentity_encode_jer; per_type_decoder_f S1AP_CellIdentity_decode_aper; per_type_encoder_f S1AP_CellIdentity_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CellTrafficTrace.c b/lib/asn1c/s1ap/S1AP_CellTrafficTrace.c index c423495f84..2c1bdfe998 100644 --- a/lib/asn1c/s1ap/S1AP_CellTrafficTrace.c +++ b/lib/asn1c/s1ap/S1AP_CellTrafficTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellTrafficTrace.h" diff --git a/lib/asn1c/s1ap/S1AP_CellTrafficTrace.h b/lib/asn1c/s1ap/S1AP_CellTrafficTrace.h index 8f9fc4a024..9b508e519a 100644 --- a/lib/asn1c/s1ap/S1AP_CellTrafficTrace.h +++ b/lib/asn1c/s1ap/S1AP_CellTrafficTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellTrafficTrace_H_ diff --git a/lib/asn1c/s1ap/S1AP_CellType.c b/lib/asn1c/s1ap/S1AP_CellType.c index fc11c83404..c3ffb2de41 100644 --- a/lib/asn1c/s1ap/S1AP_CellType.c +++ b/lib/asn1c/s1ap/S1AP_CellType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CellType.h" diff --git a/lib/asn1c/s1ap/S1AP_CellType.h b/lib/asn1c/s1ap/S1AP_CellType.h index e8fe27f43e..fc6376b3ed 100644 --- a/lib/asn1c/s1ap/S1AP_CellType.h +++ b/lib/asn1c/s1ap/S1AP_CellType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CellType_H_ diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.c b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.c index 1bf2ff7667..9f04080ec8 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.c +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CompletedCellinEAI-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.h b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.h index ba550549d8..4abd0e86d7 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.h +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CompletedCellinEAI_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.c b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.c index 22e7bb542e..a9d69b3b11 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.c +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CompletedCellinEAI.h" diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.h b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.h index d29f3abaf6..0f6a21cf78 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.h +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinEAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CompletedCellinEAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.c b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.c index af89828d57..ed334c614c 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.c +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CompletedCellinTAI-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.h b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.h index 7e85d2ff5c..d3ee118665 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.h +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CompletedCellinTAI_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.c b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.c index fb5cd4ad96..af6d1ae57a 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.c +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CompletedCellinTAI.h" diff --git a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.h b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.h index 6ac355ace1..37730c6c73 100644 --- a/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.h +++ b/lib/asn1c/s1ap/S1AP_CompletedCellinTAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CompletedCellinTAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.c b/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.c index 82518af94b..dcc3694bdd 100644 --- a/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.c +++ b/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ConcurrentWarningMessageIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.h b/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.h index 1c81fc71c5..5d04b6d3e0 100644 --- a/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.h +++ b/lib/asn1c/s1ap/S1AP_ConcurrentWarningMessageIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ConcurrentWarningMessageIndicator_H_ @@ -33,7 +33,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ConcurrentWarningMessageIndica asn_struct_free_f S1AP_ConcurrentWarningMessageIndicator_free; asn_struct_print_f S1AP_ConcurrentWarningMessageIndicator_print; asn_constr_check_f S1AP_ConcurrentWarningMessageIndicator_constraint; -jer_type_encoder_f S1AP_ConcurrentWarningMessageIndicator_encode_jer; per_type_decoder_f S1AP_ConcurrentWarningMessageIndicator_decode_aper; per_type_encoder_f S1AP_ConcurrentWarningMessageIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.c b/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.c index b4fbe39297..348d3027e0 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.c +++ b/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ConnectedengNBItem.h" diff --git a/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.h b/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.h index 5948518dca..047722f187 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.h +++ b/lib/asn1c/s1ap/S1AP_ConnectedengNBItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ConnectedengNBItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_ConnectedengNBList.c b/lib/asn1c/s1ap/S1AP_ConnectedengNBList.c index 15d20d0b59..636f665f7b 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectedengNBList.c +++ b/lib/asn1c/s1ap/S1AP_ConnectedengNBList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ConnectedengNBList.h" diff --git a/lib/asn1c/s1ap/S1AP_ConnectedengNBList.h b/lib/asn1c/s1ap/S1AP_ConnectedengNBList.h index e4596ad932..bf0118ae9f 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectedengNBList.h +++ b/lib/asn1c/s1ap/S1AP_ConnectedengNBList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ConnectedengNBList_H_ diff --git a/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.c b/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.c index 5bca297663..bb8ea84fe3 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.c +++ b/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ConnectionEstablishmentIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.h b/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.h index 78044c02fd..5cf0574143 100644 --- a/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.h +++ b/lib/asn1c/s1ap/S1AP_ConnectionEstablishmentIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ConnectionEstablishmentIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_ContextatSource.c b/lib/asn1c/s1ap/S1AP_ContextatSource.c index f71d6319c5..24482d6fb2 100644 --- a/lib/asn1c/s1ap/S1AP_ContextatSource.c +++ b/lib/asn1c/s1ap/S1AP_ContextatSource.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ContextatSource.h" diff --git a/lib/asn1c/s1ap/S1AP_ContextatSource.h b/lib/asn1c/s1ap/S1AP_ContextatSource.h index 209543f6f8..7699635935 100644 --- a/lib/asn1c/s1ap/S1AP_ContextatSource.h +++ b/lib/asn1c/s1ap/S1AP_ContextatSource.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ContextatSource_H_ diff --git a/lib/asn1c/s1ap/S1AP_Correlation-ID.c b/lib/asn1c/s1ap/S1AP_Correlation-ID.c index ce43d7a508..21b1db9f36 100644 --- a/lib/asn1c/s1ap/S1AP_Correlation-ID.c +++ b/lib/asn1c/s1ap/S1AP_Correlation-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Correlation-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Correlation-ID.h b/lib/asn1c/s1ap/S1AP_Correlation-ID.h index 1a246e040a..adeb3e23dd 100644 --- a/lib/asn1c/s1ap/S1AP_Correlation-ID.h +++ b/lib/asn1c/s1ap/S1AP_Correlation-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Correlation_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Correlation_ID; asn_struct_free_f S1AP_Correlation_ID_free; asn_struct_print_f S1AP_Correlation_ID_print; asn_constr_check_f S1AP_Correlation_ID_constraint; -jer_type_encoder_f S1AP_Correlation_ID_encode_jer; per_type_decoder_f S1AP_Correlation_ID_decode_aper; per_type_encoder_f S1AP_Correlation_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Coverage-Level.c b/lib/asn1c/s1ap/S1AP_Coverage-Level.c index 09709d7068..9b1876dc69 100644 --- a/lib/asn1c/s1ap/S1AP_Coverage-Level.c +++ b/lib/asn1c/s1ap/S1AP_Coverage-Level.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Coverage-Level.h" diff --git a/lib/asn1c/s1ap/S1AP_Coverage-Level.h b/lib/asn1c/s1ap/S1AP_Coverage-Level.h index e04cda9ec1..c1dba5ac6b 100644 --- a/lib/asn1c/s1ap/S1AP_Coverage-Level.h +++ b/lib/asn1c/s1ap/S1AP_Coverage-Level.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Coverage_Level_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Coverage_Level_specs_1; asn_struct_free_f S1AP_Coverage_Level_free; asn_struct_print_f S1AP_Coverage_Level_print; asn_constr_check_f S1AP_Coverage_Level_constraint; -jer_type_encoder_f S1AP_Coverage_Level_encode_jer; per_type_decoder_f S1AP_Coverage_Level_decode_aper; per_type_encoder_f S1AP_Coverage_Level_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Criticality.c b/lib/asn1c/s1ap/S1AP_Criticality.c index 1f1214fcaa..5606775138 100644 --- a/lib/asn1c/s1ap/S1AP_Criticality.c +++ b/lib/asn1c/s1ap/S1AP_Criticality.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Criticality.h" diff --git a/lib/asn1c/s1ap/S1AP_Criticality.h b/lib/asn1c/s1ap/S1AP_Criticality.h index 736a2e5d62..13868cefc5 100644 --- a/lib/asn1c/s1ap/S1AP_Criticality.h +++ b/lib/asn1c/s1ap/S1AP_Criticality.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Criticality_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Criticality_specs_1; asn_struct_free_f S1AP_Criticality_free; asn_struct_print_f S1AP_Criticality_print; asn_constr_check_f S1AP_Criticality_constraint; -jer_type_encoder_f S1AP_Criticality_encode_jer; per_type_decoder_f S1AP_Criticality_decode_aper; per_type_encoder_f S1AP_Criticality_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.c b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.c index 8497891a34..d4008465ef 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.c +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CriticalityDiagnostics-IE-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.h b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.h index 7f8a552745..c4a491f2ac 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.h +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CriticalityDiagnostics_IE_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.c b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.c index b5823496e2..59d3443734 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.c +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CriticalityDiagnostics-IE-List.h" diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.h b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.h index 33e94a1b9f..b182929bd8 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.h +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics-IE-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CriticalityDiagnostics_IE_List_H_ diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.c b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.c index 557b8c1329..c73427769e 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.c +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_CriticalityDiagnostics.h" diff --git a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.h b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.h index edab0e172b..1e797e6f5c 100644 --- a/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.h +++ b/lib/asn1c/s1ap/S1AP_CriticalityDiagnostics.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_CriticalityDiagnostics_H_ diff --git a/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.c b/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.c index a5bb3f4136..cc136b0dbd 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.c +++ b/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DAPSRequestInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.h b/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.h index 031badd0f6..111ddde10c 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.h +++ b/lib/asn1c/s1ap/S1AP_DAPSRequestInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DAPSRequestInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.c b/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.c index ca69c89648..abf71891a8 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.c +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DAPSResponseInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.h b/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.h index 36cc2423fa..f7b9c63c97 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.h +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DAPSResponseInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.c b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.c index 3622add358..671150effd 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.c +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DAPSResponseInfoItem.h" diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.h b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.h index bb8f0eb4d5..cf27e43b0e 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.h +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DAPSResponseInfoItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.c b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.c index af89b368be..6c753e8f9d 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.c +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DAPSResponseInfoList.h" diff --git a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.h b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.h index 83f967f7a7..fe522244a9 100644 --- a/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.h +++ b/lib/asn1c/s1ap/S1AP_DAPSResponseInfoList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DAPSResponseInfoList_H_ diff --git a/lib/asn1c/s1ap/S1AP_DCN-ID.c b/lib/asn1c/s1ap/S1AP_DCN-ID.c index ad3d19c27d..fb8712a93d 100644 --- a/lib/asn1c/s1ap/S1AP_DCN-ID.c +++ b/lib/asn1c/s1ap/S1AP_DCN-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DCN-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_DCN-ID.h b/lib/asn1c/s1ap/S1AP_DCN-ID.h index 1055209549..8a219e5f77 100644 --- a/lib/asn1c/s1ap/S1AP_DCN-ID.h +++ b/lib/asn1c/s1ap/S1AP_DCN-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DCN_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_DCN_ID; asn_struct_free_f S1AP_DCN_ID_free; asn_struct_print_f S1AP_DCN_ID_print; asn_constr_check_f S1AP_DCN_ID_constraint; -jer_type_encoder_f S1AP_DCN_ID_encode_jer; per_type_decoder_f S1AP_DCN_ID_decode_aper; per_type_encoder_f S1AP_DCN_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.c b/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.c index 06555d15b4..d97c9a0eb1 100644 --- a/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.c +++ b/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DL-CP-SecurityInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.h b/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.h index 2ee9e999d5..8a7e5c142c 100644 --- a/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.h +++ b/lib/asn1c/s1ap/S1AP_DL-CP-SecurityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DL_CP_SecurityInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_DL-Forwarding.c b/lib/asn1c/s1ap/S1AP_DL-Forwarding.c index 396468d072..cef6e0f8dd 100644 --- a/lib/asn1c/s1ap/S1AP_DL-Forwarding.c +++ b/lib/asn1c/s1ap/S1AP_DL-Forwarding.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DL-Forwarding.h" diff --git a/lib/asn1c/s1ap/S1AP_DL-Forwarding.h b/lib/asn1c/s1ap/S1AP_DL-Forwarding.h index 3e185371cb..a625220861 100644 --- a/lib/asn1c/s1ap/S1AP_DL-Forwarding.h +++ b/lib/asn1c/s1ap/S1AP_DL-Forwarding.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DL_Forwarding_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_DL_Forwarding_specs_1; asn_struct_free_f S1AP_DL_Forwarding_free; asn_struct_print_f S1AP_DL_Forwarding_print; asn_constr_check_f S1AP_DL_Forwarding_constraint; -jer_type_encoder_f S1AP_DL_Forwarding_encode_jer; per_type_decoder_f S1AP_DL_Forwarding_decode_aper; per_type_encoder_f S1AP_DL_Forwarding_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.c b/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.c index c3f4d5aa25..cfa47a9190 100644 --- a/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.c +++ b/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DL-NAS-MAC.h" diff --git a/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.h b/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.h index de8d02222b..d39b223ee1 100644 --- a/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.h +++ b/lib/asn1c/s1ap/S1AP_DL-NAS-MAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DL_NAS_MAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_DL_NAS_MAC; asn_struct_free_f S1AP_DL_NAS_MAC_free; asn_struct_print_f S1AP_DL_NAS_MAC_print; asn_constr_check_f S1AP_DL_NAS_MAC_constraint; -jer_type_encoder_f S1AP_DL_NAS_MAC_encode_jer; per_type_decoder_f S1AP_DL_NAS_MAC_decode_aper; per_type_encoder_f S1AP_DL_NAS_MAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.c b/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.c index af334b57d1..64bd0d9f51 100644 --- a/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.c +++ b/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DLCOUNT-PDCP-SNlength.h" diff --git a/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.h b/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.h index bdac9640a7..e7a4540c64 100644 --- a/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.h +++ b/lib/asn1c/s1ap/S1AP_DLCOUNT-PDCP-SNlength.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DLCOUNT_PDCP_SNlength_H_ diff --git a/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.c b/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.c index 9dd705ea8d..3e16b77fd7 100644 --- a/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.c +++ b/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DLNASPDUDeliveryAckRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.h b/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.h index 94c7a2c0b0..9ddeb1697d 100644 --- a/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.h +++ b/lib/asn1c/s1ap/S1AP_DLNASPDUDeliveryAckRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DLNASPDUDeliveryAckRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_DLNASPDUDeliveryAckRequest_spe asn_struct_free_f S1AP_DLNASPDUDeliveryAckRequest_free; asn_struct_print_f S1AP_DLNASPDUDeliveryAckRequest_print; asn_constr_check_f S1AP_DLNASPDUDeliveryAckRequest_constraint; -jer_type_encoder_f S1AP_DLNASPDUDeliveryAckRequest_encode_jer; per_type_decoder_f S1AP_DLNASPDUDeliveryAckRequest_decode_aper; per_type_encoder_f S1AP_DLNASPDUDeliveryAckRequest_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.c b/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.c index 95f6bbfc71..92e55bc5a9 100644 --- a/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.c +++ b/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Data-Forwarding-Not-Possible.h" diff --git a/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.h b/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.h index b1dc7986be..a9a2b4b4f1 100644 --- a/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.h +++ b/lib/asn1c/s1ap/S1AP_Data-Forwarding-Not-Possible.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Data_Forwarding_Not_Possible_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Data_Forwarding_Not_Possible_s asn_struct_free_f S1AP_Data_Forwarding_Not_Possible_free; asn_struct_print_f S1AP_Data_Forwarding_Not_Possible_print; asn_constr_check_f S1AP_Data_Forwarding_Not_Possible_constraint; -jer_type_encoder_f S1AP_Data_Forwarding_Not_Possible_encode_jer; per_type_decoder_f S1AP_Data_Forwarding_Not_Possible_decode_aper; per_type_encoder_f S1AP_Data_Forwarding_Not_Possible_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DataCodingScheme.c b/lib/asn1c/s1ap/S1AP_DataCodingScheme.c index d2217a621a..acfc0ad574 100644 --- a/lib/asn1c/s1ap/S1AP_DataCodingScheme.c +++ b/lib/asn1c/s1ap/S1AP_DataCodingScheme.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DataCodingScheme.h" diff --git a/lib/asn1c/s1ap/S1AP_DataCodingScheme.h b/lib/asn1c/s1ap/S1AP_DataCodingScheme.h index 2c7e09d98f..97746584ba 100644 --- a/lib/asn1c/s1ap/S1AP_DataCodingScheme.h +++ b/lib/asn1c/s1ap/S1AP_DataCodingScheme.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DataCodingScheme_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_DataCodingScheme; asn_struct_free_f S1AP_DataCodingScheme_free; asn_struct_print_f S1AP_DataCodingScheme_print; asn_constr_check_f S1AP_DataCodingScheme_constraint; -jer_type_encoder_f S1AP_DataCodingScheme_encode_jer; per_type_decoder_f S1AP_DataCodingScheme_decode_aper; per_type_encoder_f S1AP_DataCodingScheme_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DataSize.c b/lib/asn1c/s1ap/S1AP_DataSize.c index cff068aeaf..153b5ad711 100644 --- a/lib/asn1c/s1ap/S1AP_DataSize.c +++ b/lib/asn1c/s1ap/S1AP_DataSize.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DataSize.h" diff --git a/lib/asn1c/s1ap/S1AP_DataSize.h b/lib/asn1c/s1ap/S1AP_DataSize.h index 89ef779638..839d170aac 100644 --- a/lib/asn1c/s1ap/S1AP_DataSize.h +++ b/lib/asn1c/s1ap/S1AP_DataSize.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DataSize_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_DataSize; asn_struct_free_f S1AP_DataSize_free; asn_struct_print_f S1AP_DataSize_print; asn_constr_check_f S1AP_DataSize_constraint; -jer_type_encoder_f S1AP_DataSize_encode_jer; per_type_decoder_f S1AP_DataSize_decode_aper; per_type_encoder_f S1AP_DataSize_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DeactivateTrace.c b/lib/asn1c/s1ap/S1AP_DeactivateTrace.c index 243b3881ee..e021faa93a 100644 --- a/lib/asn1c/s1ap/S1AP_DeactivateTrace.c +++ b/lib/asn1c/s1ap/S1AP_DeactivateTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DeactivateTrace.h" diff --git a/lib/asn1c/s1ap/S1AP_DeactivateTrace.h b/lib/asn1c/s1ap/S1AP_DeactivateTrace.h index 84942dd609..06f44f36fd 100644 --- a/lib/asn1c/s1ap/S1AP_DeactivateTrace.h +++ b/lib/asn1c/s1ap/S1AP_DeactivateTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DeactivateTrace_H_ diff --git a/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.c b/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.c index 49a5ccfb19..b5834bcc6b 100644 --- a/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.c +++ b/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Direct-Forwarding-Path-Availability.h" diff --git a/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.h b/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.h index 25329ddcc0..d9d0b0f0b2 100644 --- a/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.h +++ b/lib/asn1c/s1ap/S1AP_Direct-Forwarding-Path-Availability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Direct_Forwarding_Path_Availability_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Direct_Forwarding_Path_Availab asn_struct_free_f S1AP_Direct_Forwarding_Path_Availability_free; asn_struct_print_f S1AP_Direct_Forwarding_Path_Availability_print; asn_constr_check_f S1AP_Direct_Forwarding_Path_Availability_constraint; -jer_type_encoder_f S1AP_Direct_Forwarding_Path_Availability_encode_jer; per_type_decoder_f S1AP_Direct_Forwarding_Path_Availability_decode_aper; per_type_encoder_f S1AP_Direct_Forwarding_Path_Availability_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.c b/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.c index 4381fa8e89..3dcce924bf 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.c +++ b/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DownlinkNASTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.h b/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.h index bb0618deb9..f6620f9f73 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.h +++ b/lib/asn1c/s1ap/S1AP_DownlinkNASTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DownlinkNASTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.c b/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.c index e6a022fef8..3bcb63ffb5 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.c +++ b/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DownlinkNonUEAssociatedLPPaTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.h b/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.h index c5a5f8d41c..6e9c5088e3 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.h +++ b/lib/asn1c/s1ap/S1AP_DownlinkNonUEAssociatedLPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DownlinkNonUEAssociatedLPPaTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.c b/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.c index 3b10672b50..abc3ad5398 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.c +++ b/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DownlinkS1cdma2000tunnelling.h" diff --git a/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.h b/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.h index 18a59e3e45..7d255e81be 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.h +++ b/lib/asn1c/s1ap/S1AP_DownlinkS1cdma2000tunnelling.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DownlinkS1cdma2000tunnelling_H_ diff --git a/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.c b/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.c index 0e4ef8b1e3..c43828d60d 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.c +++ b/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_DownlinkUEAssociatedLPPaTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.h b/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.h index d3c60e4570..482544c402 100644 --- a/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.h +++ b/lib/asn1c/s1ap/S1AP_DownlinkUEAssociatedLPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_DownlinkUEAssociatedLPPaTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RAB-ID.c b/lib/asn1c/s1ap/S1AP_E-RAB-ID.c index 0e97414d42..13950ab396 100644 --- a/lib/asn1c/s1ap/S1AP_E-RAB-ID.c +++ b/lib/asn1c/s1ap/S1AP_E-RAB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RAB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RAB-ID.h b/lib/asn1c/s1ap/S1AP_E-RAB-ID.h index 0f0b3104a8..971e5b9d46 100644 --- a/lib/asn1c/s1ap/S1AP_E-RAB-ID.h +++ b/lib/asn1c/s1ap/S1AP_E-RAB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RAB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_ID; asn_struct_free_f S1AP_E_RAB_ID_free; asn_struct_print_f S1AP_E_RAB_ID_print; asn_constr_check_f S1AP_E_RAB_ID_constraint; -jer_type_encoder_f S1AP_E_RAB_ID_encode_jer; per_type_decoder_f S1AP_E_RAB_ID_decode_aper; per_type_encoder_f S1AP_E_RAB_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.c b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.c index 184d133212..bb19f6c891 100644 --- a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.c +++ b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RAB-IE-ContainerList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.h b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.h index 57a6b6257e..2ee9d60208 100644 --- a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.h +++ b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RAB_IE_ContainerList_H_ @@ -37,7 +37,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P0; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P0_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P0_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P0_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P0_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P0_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P0_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P1_constr_2; @@ -45,7 +44,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P1; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P1_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P1_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P1_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P1_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P1_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P1_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P2_constr_3; @@ -53,7 +51,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P2; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P2_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P2_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P2_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P2_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P2_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P2_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P3_constr_4; @@ -61,7 +58,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P3; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P3_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P3_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P3_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P3_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P3_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P3_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P4_constr_5; @@ -69,7 +65,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P4; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P4_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P4_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P4_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P4_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P4_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P4_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P5_constr_6; @@ -77,7 +72,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P5; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P5_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P5_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P5_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P5_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P5_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P5_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P6_constr_7; @@ -85,7 +79,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P6; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P6_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P6_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P6_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P6_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P6_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P6_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P7_constr_8; @@ -93,7 +86,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P7; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P7_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P7_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P7_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P7_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P7_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P7_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P8_constr_9; @@ -101,7 +93,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P8; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P8_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P8_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P8_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P8_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P8_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P8_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P9_constr_10; @@ -109,7 +100,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P9; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P9_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P9_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P9_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P9_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P9_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P9_encode_aper; extern asn_per_constraints_t asn_PER_type_S1AP_E_RAB_IE_ContainerList_1280P10_constr_11; @@ -117,7 +107,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RAB_IE_ContainerList_1280P10; asn_struct_free_f S1AP_E_RAB_IE_ContainerList_1280P10_free; asn_struct_print_f S1AP_E_RAB_IE_ContainerList_1280P10_print; asn_constr_check_f S1AP_E_RAB_IE_ContainerList_1280P10_constraint; -jer_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P10_encode_jer; per_type_decoder_f S1AP_E_RAB_IE_ContainerList_1280P10_decode_aper; per_type_encoder_f S1AP_E_RAB_IE_ContainerList_1280P10_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerPairList.h b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerPairList.h index fda2da6ae4..a2a7284289 100644 --- a/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerPairList.h +++ b/lib/asn1c/s1ap/S1AP_E-RAB-IE-ContainerPairList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RAB_IE_ContainerPairList_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.c b/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.c index bb351bab2a..ae5099ee87 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABAdmittedItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.h b/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.h index 8f1a39c4da..622b6dd0a1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABAdmittedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABAdmittedItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.c b/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.c index 37ba8c589a..a44c1fc268 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABAdmittedList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.h b/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.h index 165af97e9e..7f3be3683a 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABAdmittedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABAdmittedList_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABAdmittedList; asn_struct_free_f S1AP_E_RABAdmittedList_free; asn_struct_print_f S1AP_E_RABAdmittedList_print; asn_constr_check_f S1AP_E_RABAdmittedList_constraint; -jer_type_encoder_f S1AP_E_RABAdmittedList_encode_jer; per_type_decoder_f S1AP_E_RABAdmittedList_decode_aper; per_type_encoder_f S1AP_E_RABAdmittedList_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.c b/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.c index 71bccdb30e..928b99b924 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABDataForwardingItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.h b/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.h index 2c2ca71891..5cd76b4637 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABDataForwardingItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABDataForwardingItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.c b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.c index 3e536ebed9..af21ca3fe1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedToResumeItemResumeReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.h b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.h index ef1c34350f..440992e4c1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedToResumeItemResumeReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.c b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.c index caa4687f94..665ec193a4 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedToResumeItemResumeRes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.h b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.h index f57f9166d3..c30be4245e 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeItemResumeRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedToResumeItemResumeRes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.c b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.c index a12370813c..b6f515c84a 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedToResumeListResumeReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.h b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.h index 1b43c9a92c..6b2c09dfaa 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedToResumeListResumeReq_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABFailedToResumeListResumeReq; asn_struct_free_f S1AP_E_RABFailedToResumeListResumeReq_free; asn_struct_print_f S1AP_E_RABFailedToResumeListResumeReq_print; asn_constr_check_f S1AP_E_RABFailedToResumeListResumeReq_constraint; -jer_type_encoder_f S1AP_E_RABFailedToResumeListResumeReq_encode_jer; per_type_decoder_f S1AP_E_RABFailedToResumeListResumeReq_decode_aper; per_type_encoder_f S1AP_E_RABFailedToResumeListResumeReq_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.c b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.c index be0aa5b2ed..dd3d310be8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedToResumeListResumeRes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.h b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.h index 6adcdc6b7f..8233b25060 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToResumeListResumeRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedToResumeListResumeRes_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABFailedToResumeListResumeRes; asn_struct_free_f S1AP_E_RABFailedToResumeListResumeRes_free; asn_struct_print_f S1AP_E_RABFailedToResumeListResumeRes_print; asn_constr_check_f S1AP_E_RABFailedToResumeListResumeRes_constraint; -jer_type_encoder_f S1AP_E_RABFailedToResumeListResumeRes_encode_jer; per_type_decoder_f S1AP_E_RABFailedToResumeListResumeRes_decode_aper; per_type_encoder_f S1AP_E_RABFailedToResumeListResumeRes_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.c b/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.c index e8a2f5ad68..adfeb94790 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedToSetupItemHOReqAck.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.h b/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.h index f9eb4d70bf..0500cbc695 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedToSetupItemHOReqAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedToSetupItemHOReqAck_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.c b/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.c index 015bab9d0d..5f2d2715c7 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.c +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABFailedtoSetupListHOReqAck.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.h b/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.h index 9a486d16a1..ec74a78ad0 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.h +++ b/lib/asn1c/s1ap/S1AP_E-RABFailedtoSetupListHOReqAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABFailedtoSetupListHOReqAck_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABFailedtoSetupListHOReqAck; asn_struct_free_f S1AP_E_RABFailedtoSetupListHOReqAck_free; asn_struct_print_f S1AP_E_RABFailedtoSetupListHOReqAck_print; asn_constr_check_f S1AP_E_RABFailedtoSetupListHOReqAck_constraint; -jer_type_encoder_f S1AP_E_RABFailedtoSetupListHOReqAck_encode_jer; per_type_decoder_f S1AP_E_RABFailedtoSetupListHOReqAck_decode_aper; per_type_encoder_f S1AP_E_RABFailedtoSetupListHOReqAck_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABInformationList.c b/lib/asn1c/s1ap/S1AP_E-RABInformationList.c index 6683d7db52..890c2adf4c 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABInformationList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABInformationList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABInformationList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABInformationList.h b/lib/asn1c/s1ap/S1AP_E-RABInformationList.h index 8c66d9dfd2..0a757d748f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABInformationList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABInformationList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABInformationList_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.c b/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.c index 75169051a1..a76a9d12b0 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABInformationListItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.h b/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.h index 418a4eeb8f..5a339d83b1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABInformationListItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABInformationListItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABItem.c b/lib/asn1c/s1ap/S1AP_E-RABItem.c index 7c9e80c2d0..2fa7f4b928 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABItem.h b/lib/asn1c/s1ap/S1AP_E-RABItem.h index d74a8f19b6..f48161d835 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.c b/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.c index 119254ee15..92305ff34b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.c +++ b/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABLevelQoSParameters.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.h b/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.h index 280bc1a34c..06683953ef 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.h +++ b/lib/asn1c/s1ap/S1AP_E-RABLevelQoSParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABLevelQoSParameters_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABList.c b/lib/asn1c/s1ap/S1AP_E-RABList.c index 64d1e648f9..85ffea4ab7 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABList.h b/lib/asn1c/s1ap/S1AP_E-RABList.h index bbe352e664..de7ca61268 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABList_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.c b/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.c index 5ddbc2a60a..099af26a83 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModificationConfirm.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.h b/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.h index 4fd10ac3eb..45e0001ec5 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModificationConfirm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModificationConfirm_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.c b/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.c index a03b6733f4..47743f6cea 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModificationIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.h b/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.h index 0a311ece08..244998b8c0 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModificationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModificationIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.c b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.c index d5cf4bb446..68b83c563b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyItemBearerModConf.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.h b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.h index 01e9d57060..f61ada3f22 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModConf.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyItemBearerModConf_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.c b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.c index c96a8c587c..4811142fd6 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyItemBearerModRes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.h b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.h index b5233caa1b..58d82fef1c 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyItemBearerModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyItemBearerModRes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.c b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.c index 804b95ec60..b9fb6cac2c 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyListBearerModConf.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.h b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.h index 9b02cd4ce9..b690beb23a 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModConf.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyListBearerModConf_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.c b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.c index a353813134..7eb1059b21 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyListBearerModRes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.h b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.h index 055e94d742..70b547bb7c 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyListBearerModRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyListBearerModRes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.c b/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.c index cb14e2eabe..c65d486357 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.h b/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.h index a943ff49a8..f45dcf6be8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.c b/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.c index 175fedc7d7..4186a165bc 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.c +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABModifyResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.h b/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.h index e20a65dc54..f5ab403b33 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.h +++ b/lib/asn1c/s1ap/S1AP_E-RABModifyResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABModifyResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.c b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.c index 7d60518247..e26f7965be 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.c +++ b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABNotToBeModifiedItemBearerModInd.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.h b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.h index f4d3509f62..c231512d33 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.h +++ b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedItemBearerModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABNotToBeModifiedItemBearerModInd_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.c b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.c index a85ef187c7..0a46d5962c 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.c +++ b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABNotToBeModifiedListBearerModInd.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.h b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.h index f71d2d5a23..294d54672e 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.h +++ b/lib/asn1c/s1ap/S1AP_E-RABNotToBeModifiedListBearerModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABNotToBeModifiedListBearerModInd_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABNotToBeModifiedListBearerModInd; asn_struct_free_f S1AP_E_RABNotToBeModifiedListBearerModInd_free; asn_struct_print_f S1AP_E_RABNotToBeModifiedListBearerModInd_print; asn_constr_check_f S1AP_E_RABNotToBeModifiedListBearerModInd_constraint; -jer_type_encoder_f S1AP_E_RABNotToBeModifiedListBearerModInd_encode_jer; per_type_decoder_f S1AP_E_RABNotToBeModifiedListBearerModInd_decode_aper; per_type_encoder_f S1AP_E_RABNotToBeModifiedListBearerModInd_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.c b/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.c index c718e3bb58..f788a652d8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.c +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABReleaseCommand.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.h b/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.h index 22626429dc..3fb1ecee44 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.h +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABReleaseCommand_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.c b/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.c index 49a7d40a66..c68d2c6726 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.c +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABReleaseIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.h b/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.h index 06873f707b..0432a35531 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.h +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABReleaseIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.c b/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.c index f93c356483..869fc81265 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.c +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABReleaseItemBearerRelComp.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.h b/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.h index 6db4bdb9b8..c24766313b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.h +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseItemBearerRelComp.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABReleaseItemBearerRelComp_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.c b/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.c index fb6315d472..bd92d6a62a 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.c +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABReleaseListBearerRelComp.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.h b/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.h index f598478357..96369a7e36 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.h +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseListBearerRelComp.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABReleaseListBearerRelComp_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.c b/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.c index d6a8c5fc9d..eab19447d6 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.c +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABReleaseResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.h b/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.h index f30de6f803..1d77c56f02 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.h +++ b/lib/asn1c/s1ap/S1AP_E-RABReleaseResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABReleaseResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.c b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.c index cbd0214a6e..81e2f21f71 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSecurityResultItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.h b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.h index b90d01f655..84e67f2edf 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSecurityResultItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.c b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.c index a9badb0d9e..a1900a079f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSecurityResultList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.h b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.h index 5dde38bb36..a396d268a8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSecurityResultList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSecurityResultList_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.c b/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.c index fc44bb7aa2..6442074bc7 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupItemBearerSURes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.h b/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.h index 70c115ba70..10d05ac22f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupItemBearerSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupItemBearerSURes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.c b/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.c index 26214d1098..112489b7b6 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupItemCtxtSURes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.h b/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.h index 26763922b9..629f4eb66d 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupItemCtxtSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupItemCtxtSURes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.c b/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.c index f5384a5f48..45e9e5531f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupListBearerSURes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.h b/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.h index 802ef0282c..fa498419d8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupListBearerSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupListBearerSURes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.c b/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.c index fba6218766..e99e8202fa 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupListCtxtSURes.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.h b/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.h index 9c52046bfa..d3a02ed3f5 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupListCtxtSURes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupListCtxtSURes_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.c b/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.c index 9088988943..b42962ca24 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.h b/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.h index 7107d97b0c..10346bc03f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.c b/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.c index ce0bad11e5..9581dfcf0a 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSetupResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.h b/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.h index 1270dc2e85..a1d93f7cc8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSetupResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.c b/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.c index 237afc06dd..825c220017 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABSubjecttoDataForwardingList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.h b/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.h index 3ac86aa7db..cf90137294 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABSubjecttoDataForwardingList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABSubjecttoDataForwardingList_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABSubjecttoDataForwardingList; asn_struct_free_f S1AP_E_RABSubjecttoDataForwardingList_free; asn_struct_print_f S1AP_E_RABSubjecttoDataForwardingList_print; asn_constr_check_f S1AP_E_RABSubjecttoDataForwardingList_constraint; -jer_type_encoder_f S1AP_E_RABSubjecttoDataForwardingList_encode_jer; per_type_decoder_f S1AP_E_RABSubjecttoDataForwardingList_decode_aper; per_type_encoder_f S1AP_E_RABSubjecttoDataForwardingList_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.c b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.c index 36bee778ed..87010f1e98 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeModifiedItemBearerModInd.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.h b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.h index 1cf5d7b46c..83ec7b0db7 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeModifiedItemBearerModInd_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.c index fb8bec5ae3..ca550ea45d 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeModifiedItemBearerModReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.h index e6850f869a..d438341475 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedItemBearerModReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeModifiedItemBearerModReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.c b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.c index 21881fca6e..a89bdcf03d 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeModifiedListBearerModInd.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.h b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.h index 8e8db6ddf3..7764abe70b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModInd.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeModifiedListBearerModInd_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABToBeModifiedListBearerModInd; asn_struct_free_f S1AP_E_RABToBeModifiedListBearerModInd_free; asn_struct_print_f S1AP_E_RABToBeModifiedListBearerModInd_print; asn_constr_check_f S1AP_E_RABToBeModifiedListBearerModInd_constraint; -jer_type_encoder_f S1AP_E_RABToBeModifiedListBearerModInd_encode_jer; per_type_decoder_f S1AP_E_RABToBeModifiedListBearerModInd_decode_aper; per_type_encoder_f S1AP_E_RABToBeModifiedListBearerModInd_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.c index 2c0c2b8b21..d3704230a4 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeModifiedListBearerModReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.h index d51b39569c..cf27b4c8ff 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeModifiedListBearerModReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeModifiedListBearerModReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.c index 264c6b44f8..907fd5eb22 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupItemBearerSUReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.h index cf99d974bb..c86d978e38 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemBearerSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupItemBearerSUReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.c index 50802ee349..5ffa5cdd8f 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupItemCtxtSUReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.h index 8e5ec76c73..0317da7577 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemCtxtSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupItemCtxtSUReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.c index f60236ec02..7b7a54f72d 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupItemHOReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.h index fdec2235af..a6eaf345c0 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupItemHOReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupItemHOReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.c index 7004c16039..89b3c4cd7b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupListBearerSUReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.h index 048cb94f74..2c915d4509 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListBearerSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupListBearerSUReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.c index 028e14b033..7ab9f18c39 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupListCtxtSUReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.h index 54c981b3c9..0b93c684ab 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListCtxtSUReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupListCtxtSUReq_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.c index 37f9d85339..04a4ec25b5 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSetupListHOReq.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.h index f024173d9a..636dab93e1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSetupListHOReq.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSetupListHOReq_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABToBeSetupListHOReq; asn_struct_free_f S1AP_E_RABToBeSetupListHOReq_free; asn_struct_print_f S1AP_E_RABToBeSetupListHOReq_print; asn_constr_check_f S1AP_E_RABToBeSetupListHOReq_constraint; -jer_type_encoder_f S1AP_E_RABToBeSetupListHOReq_encode_jer; per_type_decoder_f S1AP_E_RABToBeSetupListHOReq_decode_aper; per_type_encoder_f S1AP_E_RABToBeSetupListHOReq_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.c index d93a5e55d8..ea8564ff5b 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSwitchedDLItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.h index 6a0d8bfd10..57af7c3f11 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSwitchedDLItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.c index 86f7c2a0ca..67ba4ce496 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSwitchedDLList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.h index 6b2fd6c226..b29b6bb5ee 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedDLList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSwitchedDLList_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABToBeSwitchedDLList; asn_struct_free_f S1AP_E_RABToBeSwitchedDLList_free; asn_struct_print_f S1AP_E_RABToBeSwitchedDLList_print; asn_constr_check_f S1AP_E_RABToBeSwitchedDLList_constraint; -jer_type_encoder_f S1AP_E_RABToBeSwitchedDLList_encode_jer; per_type_decoder_f S1AP_E_RABToBeSwitchedDLList_decode_aper; per_type_encoder_f S1AP_E_RABToBeSwitchedDLList_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.c index 3edeea6695..92e7e3c6c1 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSwitchedULItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.h index 547c5e8b42..4bcad45af0 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSwitchedULItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.c b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.c index 26031b868e..8dc3f73137 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeSwitchedULList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.h b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.h index 27dafa7bec..d49d31ffdb 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeSwitchedULList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeSwitchedULList_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABToBeSwitchedULList; asn_struct_free_f S1AP_E_RABToBeSwitchedULList_free; asn_struct_print_f S1AP_E_RABToBeSwitchedULList_print; asn_constr_check_f S1AP_E_RABToBeSwitchedULList_constraint; -jer_type_encoder_f S1AP_E_RABToBeSwitchedULList_encode_jer; per_type_decoder_f S1AP_E_RABToBeSwitchedULList_decode_aper; per_type_encoder_f S1AP_E_RABToBeSwitchedULList_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.c b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.c index 0a2a5cc4bd..8727bfe9b3 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeUpdatedItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.h b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.h index d4773ed462..22973350cc 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeUpdatedItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.c b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.c index 066a46f7ca..bc2b83ed23 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABToBeUpdatedList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.h b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.h index 53ff747a8e..779bd2e055 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABToBeUpdatedList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABToBeUpdatedList_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_RABToBeUpdatedList; asn_struct_free_f S1AP_E_RABToBeUpdatedList_free; asn_struct_print_f S1AP_E_RABToBeUpdatedList_print; asn_constr_check_f S1AP_E_RABToBeUpdatedList_constraint; -jer_type_encoder_f S1AP_E_RABToBeUpdatedList_encode_jer; per_type_decoder_f S1AP_E_RABToBeUpdatedList_decode_aper; per_type_encoder_f S1AP_E_RABToBeUpdatedList_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.c b/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.c index 7815264fde..cafb26c920 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.c +++ b/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABUsageReportItem.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.h b/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.h index 72ce87969d..dcea935bb7 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.h +++ b/lib/asn1c/s1ap/S1AP_E-RABUsageReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABUsageReportItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.c b/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.c index 65c4fb3e34..b710bedac8 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.c +++ b/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-RABUsageReportList.h" diff --git a/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.h b/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.h index 5732f2b45f..bc0e1918b5 100644 --- a/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.h +++ b/lib/asn1c/s1ap/S1AP_E-RABUsageReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_RABUsageReportList_H_ diff --git a/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.c b/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.c index 8edfc85319..5feb194f3d 100644 --- a/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.c +++ b/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_E-UTRAN-Trace-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.h b/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.h index c5b7791839..1ae37e35da 100644 --- a/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.h +++ b/lib/asn1c/s1ap/S1AP_E-UTRAN-Trace-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_E_UTRAN_Trace_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_E_UTRAN_Trace_ID; asn_struct_free_f S1AP_E_UTRAN_Trace_ID_free; asn_struct_print_f S1AP_E_UTRAN_Trace_ID_print; asn_constr_check_f S1AP_E_UTRAN_Trace_ID_constraint; -jer_type_encoder_f S1AP_E_UTRAN_Trace_ID_encode_jer; per_type_decoder_f S1AP_E_UTRAN_Trace_ID_decode_aper; per_type_encoder_f S1AP_E_UTRAN_Trace_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EARFCN.c b/lib/asn1c/s1ap/S1AP_EARFCN.c index 68256b7fda..e49033617f 100644 --- a/lib/asn1c/s1ap/S1AP_EARFCN.c +++ b/lib/asn1c/s1ap/S1AP_EARFCN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EARFCN.h" diff --git a/lib/asn1c/s1ap/S1AP_EARFCN.h b/lib/asn1c/s1ap/S1AP_EARFCN.h index c76753c43e..9d31e9578e 100644 --- a/lib/asn1c/s1ap/S1AP_EARFCN.h +++ b/lib/asn1c/s1ap/S1AP_EARFCN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EARFCN_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_EARFCN; asn_struct_free_f S1AP_EARFCN_free; asn_struct_print_f S1AP_EARFCN_print; asn_constr_check_f S1AP_EARFCN_constraint; -jer_type_encoder_f S1AP_EARFCN_encode_jer; per_type_decoder_f S1AP_EARFCN_decode_aper; per_type_encoder_f S1AP_EARFCN_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ECGI-List.c b/lib/asn1c/s1ap/S1AP_ECGI-List.c index 22a1636e59..eb31527ab7 100644 --- a/lib/asn1c/s1ap/S1AP_ECGI-List.c +++ b/lib/asn1c/s1ap/S1AP_ECGI-List.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ECGI-List.h" diff --git a/lib/asn1c/s1ap/S1AP_ECGI-List.h b/lib/asn1c/s1ap/S1AP_ECGI-List.h index a4e1ec9a70..acc4583f63 100644 --- a/lib/asn1c/s1ap/S1AP_ECGI-List.h +++ b/lib/asn1c/s1ap/S1AP_ECGI-List.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ECGI_List_H_ diff --git a/lib/asn1c/s1ap/S1AP_ECGIList.c b/lib/asn1c/s1ap/S1AP_ECGIList.c index b060e431e3..ff2533cc6d 100644 --- a/lib/asn1c/s1ap/S1AP_ECGIList.c +++ b/lib/asn1c/s1ap/S1AP_ECGIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ECGIList.h" diff --git a/lib/asn1c/s1ap/S1AP_ECGIList.h b/lib/asn1c/s1ap/S1AP_ECGIList.h index 5e1869ebef..f562fe9f38 100644 --- a/lib/asn1c/s1ap/S1AP_ECGIList.h +++ b/lib/asn1c/s1ap/S1AP_ECGIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ECGIList_H_ diff --git a/lib/asn1c/s1ap/S1AP_ECGIListForRestart.c b/lib/asn1c/s1ap/S1AP_ECGIListForRestart.c index 3318ddf3e5..b7333dc8d5 100644 --- a/lib/asn1c/s1ap/S1AP_ECGIListForRestart.c +++ b/lib/asn1c/s1ap/S1AP_ECGIListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ECGIListForRestart.h" diff --git a/lib/asn1c/s1ap/S1AP_ECGIListForRestart.h b/lib/asn1c/s1ap/S1AP_ECGIListForRestart.h index 70efb06b23..6bf02006d6 100644 --- a/lib/asn1c/s1ap/S1AP_ECGIListForRestart.h +++ b/lib/asn1c/s1ap/S1AP_ECGIListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ECGIListForRestart_H_ diff --git a/lib/asn1c/s1ap/S1AP_EDT-Session.c b/lib/asn1c/s1ap/S1AP_EDT-Session.c index f35389ba99..b9e1412365 100644 --- a/lib/asn1c/s1ap/S1AP_EDT-Session.c +++ b/lib/asn1c/s1ap/S1AP_EDT-Session.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EDT-Session.h" diff --git a/lib/asn1c/s1ap/S1AP_EDT-Session.h b/lib/asn1c/s1ap/S1AP_EDT-Session.h index 5e09d2011e..7757c6a687 100644 --- a/lib/asn1c/s1ap/S1AP_EDT-Session.h +++ b/lib/asn1c/s1ap/S1AP_EDT-Session.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EDT_Session_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_EDT_Session_specs_1; asn_struct_free_f S1AP_EDT_Session_free; asn_struct_print_f S1AP_EDT_Session_print; asn_constr_check_f S1AP_EDT_Session_constraint; -jer_type_encoder_f S1AP_EDT_Session_encode_jer; per_type_decoder_f S1AP_EDT_Session_decode_aper; per_type_encoder_f S1AP_EDT_Session_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.c b/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.c index 551affa156..f56e838c66 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCSONConfigurationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.h b/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.h index b049ec5376..6e8819cce4 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCSONConfigurationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.c b/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.c index 19d5b914ab..0bf2044975 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCSONTransferType.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.h b/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.h index d3777b2230..9ab4344287 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONTransferType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCSONTransferType_H_ diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.c b/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.c index 00cdc05580..8f4af047ca 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCSONeNBIdentification.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.h b/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.h index 58caf08565..373e47313d 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONeNBIdentification.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCSONeNBIdentification_H_ diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.c b/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.c index 464ec029a6..bbadb5d9aa 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCSONengNBIdentification.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.h b/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.h index dc4c9d2b1b..3e920436e7 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCSONengNBIdentification.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCSONengNBIdentification_H_ diff --git a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.c b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.c index a49c69f6a2..df854b2c40 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCTransferTypeReply.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.h b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.h index a018c11f1a..5d702b8610 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCTransferTypeReply_H_ diff --git a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.c b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.c index ccabe35849..8469cd6d9f 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.c +++ b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EN-DCTransferTypeRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.h b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.h index 273fc2bb21..61bb33d357 100644 --- a/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.h +++ b/lib/asn1c/s1ap/S1AP_EN-DCTransferTypeRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EN_DCTransferTypeRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.c index 71e5bf43b2..688e1c4dbd 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENB-EarlyStatusTransfer-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.h index a4b528122a..42ae4a8888 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_ENB-EarlyStatusTransfer-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENB_EarlyStatusTransfer_TransparentContainer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENB-ID.c b/lib/asn1c/s1ap/S1AP_ENB-ID.c index d57b1a246c..c0e729766f 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-ID.c +++ b/lib/asn1c/s1ap/S1AP_ENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_ENB-ID.h b/lib/asn1c/s1ap/S1AP_ENB-ID.h index b8ee69b310..d43bdea761 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-ID.h +++ b/lib/asn1c/s1ap/S1AP_ENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.c index da0463bb8e..3d5c388b6f 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENB-StatusTransfer-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.h index 46393aa2ba..803420374b 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_ENB-StatusTransfer-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENB_StatusTransfer_TransparentContainer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.c b/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.c index 3e7d835ef9..d7615072a5 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.c +++ b/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENB-UE-S1AP-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.h b/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.h index 3075559e9a..0de57f9345 100644 --- a/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.h +++ b/lib/asn1c/s1ap/S1AP_ENB-UE-S1AP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENB_UE_S1AP_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ENB_UE_S1AP_ID; asn_struct_free_f S1AP_ENB_UE_S1AP_ID_free; asn_struct_print_f S1AP_ENB_UE_S1AP_ID_print; asn_constr_check_f S1AP_ENB_UE_S1AP_ID_constraint; -jer_type_encoder_f S1AP_ENB_UE_S1AP_ID_encode_jer; per_type_decoder_f S1AP_ENB_UE_S1AP_ID_decode_aper; per_type_encoder_f S1AP_ENB_UE_S1AP_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.c b/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.c index f371d59870..9f848e2450 100644 --- a/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.c +++ b/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBCPRelocationIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.h b/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.h index 7ed70d45d1..66bea41e1e 100644 --- a/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.h +++ b/lib/asn1c/s1ap/S1AP_ENBCPRelocationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBCPRelocationIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.c b/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.c index be04cb2fd4..317d9dc43b 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBConfigurationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.h b/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.h index 1db455aea4..07b85ef26a 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBConfigurationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.c b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.c index f8001d7d08..ad310f2698 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.c +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBConfigurationUpdate.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.h b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.h index f30bc4b965..10d6a8eb90 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.h +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBConfigurationUpdate_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.c b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.c index f061f92a14..cd5fbd2af3 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBConfigurationUpdateAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.h b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.h index 11a3810612..d5fb5b9bde 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBConfigurationUpdateAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.c b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.c index 9e600f6aa9..e035ee42da 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.c +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBConfigurationUpdateFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.h b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.h index f049bd8c99..57d4497bc8 100644 --- a/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.h +++ b/lib/asn1c/s1ap/S1AP_ENBConfigurationUpdateFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBConfigurationUpdateFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.c b/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.c index 1db33c047a..327c841b9f 100644 --- a/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBDirectInformationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.h b/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.h index 75692abcce..9f78e4e2e0 100644 --- a/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_ENBDirectInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBDirectInformationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.c b/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.c index cb8a4634d8..c23bc1395e 100644 --- a/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.c +++ b/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBEarlyStatusTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.h b/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.h index e5da028cdd..984b48afd7 100644 --- a/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.h +++ b/lib/asn1c/s1ap/S1AP_ENBEarlyStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBEarlyStatusTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.c b/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.c index a2d3af297b..28b57eba4e 100644 --- a/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.c +++ b/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBIndirectX2TransportLayerAddresses.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.h b/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.h index 1d8104dbaf..9dc21d3032 100644 --- a/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.h +++ b/lib/asn1c/s1ap/S1AP_ENBIndirectX2TransportLayerAddresses.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBIndirectX2TransportLayerAddresses_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.c b/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.c index 39ea7b7b5a..6e37b305f4 100644 --- a/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.c +++ b/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBStatusTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.h b/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.h index 3e870d4e12..23ea88cba2 100644 --- a/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.h +++ b/lib/asn1c/s1ap/S1AP_ENBStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBStatusTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.c b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.c index 2b5565e4e2..18f135f3c9 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.c +++ b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBX2ExtTLA.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.h b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.h index d30165c5f8..cf2e1a06b1 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.h +++ b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLA.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBX2ExtTLA_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.c b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.c index c5508204f8..4dec1a6695 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.c +++ b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBX2ExtTLAs.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.h b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.h index a7f4e5a901..0d8d227d67 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.h +++ b/lib/asn1c/s1ap/S1AP_ENBX2ExtTLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBX2ExtTLAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.c b/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.c index 392a6a44e8..b950252d41 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.c +++ b/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBX2GTPTLAs.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.h b/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.h index f67d59f878..d6aebe9c5d 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.h +++ b/lib/asn1c/s1ap/S1AP_ENBX2GTPTLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBX2GTPTLAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBX2TLAs.c b/lib/asn1c/s1ap/S1AP_ENBX2TLAs.c index df4d54e7aa..39beded373 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2TLAs.c +++ b/lib/asn1c/s1ap/S1AP_ENBX2TLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBX2TLAs.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBX2TLAs.h b/lib/asn1c/s1ap/S1AP_ENBX2TLAs.h index 878dc885c6..7a0cce8273 100644 --- a/lib/asn1c/s1ap/S1AP_ENBX2TLAs.h +++ b/lib/asn1c/s1ap/S1AP_ENBX2TLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBX2TLAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ENBname.c b/lib/asn1c/s1ap/S1AP_ENBname.c index 75d1732c3e..6c5fa752a6 100644 --- a/lib/asn1c/s1ap/S1AP_ENBname.c +++ b/lib/asn1c/s1ap/S1AP_ENBname.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ENBname.h" diff --git a/lib/asn1c/s1ap/S1AP_ENBname.h b/lib/asn1c/s1ap/S1AP_ENBname.h index 45b3b2487a..9da1ddb1b6 100644 --- a/lib/asn1c/s1ap/S1AP_ENBname.h +++ b/lib/asn1c/s1ap/S1AP_ENBname.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ENBname_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ENBname; asn_struct_free_f S1AP_ENBname_free; asn_struct_print_f S1AP_ENBname_print; asn_constr_check_f S1AP_ENBname_constraint; -jer_type_encoder_f S1AP_ENBname_encode_jer; per_type_decoder_f S1AP_ENBname_decode_aper; per_type_encoder_f S1AP_ENBname_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EPLMNs.c b/lib/asn1c/s1ap/S1AP_EPLMNs.c index 30851364a1..3d8ce0c1c4 100644 --- a/lib/asn1c/s1ap/S1AP_EPLMNs.c +++ b/lib/asn1c/s1ap/S1AP_EPLMNs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EPLMNs.h" diff --git a/lib/asn1c/s1ap/S1AP_EPLMNs.h b/lib/asn1c/s1ap/S1AP_EPLMNs.h index 900dc1e72e..2df2869d48 100644 --- a/lib/asn1c/s1ap/S1AP_EPLMNs.h +++ b/lib/asn1c/s1ap/S1AP_EPLMNs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EPLMNs_H_ diff --git a/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.c b/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.c index 14e08cdf2a..5387e5ca3d 100644 --- a/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.c +++ b/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EUTRAN-CGI.h" diff --git a/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.h b/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.h index 3e5de651ff..ed1911fc5f 100644 --- a/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.h +++ b/lib/asn1c/s1ap/S1AP_EUTRAN-CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EUTRAN_CGI_H_ diff --git a/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.c b/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.c index ba724d0bce..eccce7aad3 100644 --- a/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.c +++ b/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EUTRANRoundTripDelayEstimationInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.h b/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.h index a50058e584..9404595d52 100644 --- a/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.h +++ b/lib/asn1c/s1ap/S1AP_EUTRANRoundTripDelayEstimationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EUTRANRoundTripDelayEstimationInfo_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_EUTRANRoundTripDelayEstimationInfo; asn_struct_free_f S1AP_EUTRANRoundTripDelayEstimationInfo_free; asn_struct_print_f S1AP_EUTRANRoundTripDelayEstimationInfo_print; asn_constr_check_f S1AP_EUTRANRoundTripDelayEstimationInfo_constraint; -jer_type_encoder_f S1AP_EUTRANRoundTripDelayEstimationInfo_encode_jer; per_type_decoder_f S1AP_EUTRANRoundTripDelayEstimationInfo_decode_aper; per_type_encoder_f S1AP_EUTRANRoundTripDelayEstimationInfo_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EXTERNAL.c b/lib/asn1c/s1ap/S1AP_EXTERNAL.c index 901908fc24..ca2ff539a6 100644 --- a/lib/asn1c/s1ap/S1AP_EXTERNAL.c +++ b/lib/asn1c/s1ap/S1AP_EXTERNAL.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" * found in "../../../../my/asn1c/asn1c/../skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EXTERNAL.h" diff --git a/lib/asn1c/s1ap/S1AP_EXTERNAL.h b/lib/asn1c/s1ap/S1AP_EXTERNAL.h index 293d8201fe..520853fc07 100644 --- a/lib/asn1c/s1ap/S1AP_EXTERNAL.h +++ b/lib/asn1c/s1ap/S1AP_EXTERNAL.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" * found in "../../../../my/asn1c/asn1c/../skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EXTERNAL_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.c index 7a510068eb..3eec70d137 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaID-Broadcast-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.h index 40ad8ca54b..263d4942f0 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaID_Broadcast_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.c index 4f706171f8..5a6e3d5908 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaID-Broadcast.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.h index f906ec630a..5e85f661e1 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Broadcast.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaID_Broadcast_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.c index cd3227e754..fc97925123 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaID-Cancelled-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.h index 43f906267c..9d3c24fc75 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaID_Cancelled_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.c index 36e478def4..046d8aaf5f 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaID-Cancelled.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.h index bb55ce8c23..66d955fa09 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID-Cancelled.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaID_Cancelled_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaID.c index a987c42986..7e75ffa945 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaID.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaID.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaID.h index d24bdda8f1..bc8ca3d83d 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaID.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_EmergencyAreaID; asn_struct_free_f S1AP_EmergencyAreaID_free; asn_struct_print_f S1AP_EmergencyAreaID_print; asn_constr_check_f S1AP_EmergencyAreaID_constraint; -jer_type_encoder_f S1AP_EmergencyAreaID_encode_jer; per_type_decoder_f S1AP_EmergencyAreaID_decode_aper; per_type_encoder_f S1AP_EmergencyAreaID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.c index 2452872723..3faf5ebc0b 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaIDList.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.h index 7b9311ea11..86a1d7505e 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaIDList_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.c b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.c index e28f0bf8b8..c76a9e95ba 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyAreaIDListForRestart.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.h b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.h index c2e67d9f49..153459ef8a 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyAreaIDListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyAreaIDListForRestart_H_ diff --git a/lib/asn1c/s1ap/S1AP_EmergencyIndicator.c b/lib/asn1c/s1ap/S1AP_EmergencyIndicator.c index d774ac1a19..64c98ff6ae 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyIndicator.c +++ b/lib/asn1c/s1ap/S1AP_EmergencyIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EmergencyIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_EmergencyIndicator.h b/lib/asn1c/s1ap/S1AP_EmergencyIndicator.h index 767a0f63a4..3f6d80c9cf 100644 --- a/lib/asn1c/s1ap/S1AP_EmergencyIndicator.h +++ b/lib/asn1c/s1ap/S1AP_EmergencyIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EmergencyIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_EmergencyIndicator_specs_1; asn_struct_free_f S1AP_EmergencyIndicator_free; asn_struct_print_f S1AP_EmergencyIndicator_print; asn_constr_check_f S1AP_EmergencyIndicator_constraint; -jer_type_encoder_f S1AP_EmergencyIndicator_encode_jer; per_type_decoder_f S1AP_EmergencyIndicator_decode_aper; per_type_encoder_f S1AP_EmergencyIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_En-gNB-ID.c b/lib/asn1c/s1ap/S1AP_En-gNB-ID.c index 6eb1aadc46..3fba5c48c8 100644 --- a/lib/asn1c/s1ap/S1AP_En-gNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_En-gNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_En-gNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_En-gNB-ID.h b/lib/asn1c/s1ap/S1AP_En-gNB-ID.h index fde82f6bd2..eecda5be1d 100644 --- a/lib/asn1c/s1ap/S1AP_En-gNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_En-gNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_En_gNB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_En_gNB_ID; asn_struct_free_f S1AP_En_gNB_ID_free; asn_struct_print_f S1AP_En_gNB_ID_print; asn_constr_check_f S1AP_En_gNB_ID_constraint; -jer_type_encoder_f S1AP_En_gNB_ID_encode_jer; per_type_decoder_f S1AP_En_gNB_ID_decode_aper; per_type_encoder_f S1AP_En_gNB_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.c b/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.c index aa88cebfb7..c8cd828dad 100644 --- a/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.c +++ b/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EncryptionAlgorithms.h" diff --git a/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.h b/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.h index df60882491..a45977ddc0 100644 --- a/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.h +++ b/lib/asn1c/s1ap/S1AP_EncryptionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EncryptionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_EncryptionAlgorithms; asn_struct_free_f S1AP_EncryptionAlgorithms_free; asn_struct_print_f S1AP_EncryptionAlgorithms_print; asn_constr_check_f S1AP_EncryptionAlgorithms_constraint; -jer_type_encoder_f S1AP_EncryptionAlgorithms_encode_jer; per_type_decoder_f S1AP_EncryptionAlgorithms_decode_aper; per_type_encoder_f S1AP_EncryptionAlgorithms_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EndIndication.c b/lib/asn1c/s1ap/S1AP_EndIndication.c index 6aa73b58d1..81a0688fe9 100644 --- a/lib/asn1c/s1ap/S1AP_EndIndication.c +++ b/lib/asn1c/s1ap/S1AP_EndIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EndIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_EndIndication.h b/lib/asn1c/s1ap/S1AP_EndIndication.h index ac755e22f0..a0d7bfde96 100644 --- a/lib/asn1c/s1ap/S1AP_EndIndication.h +++ b/lib/asn1c/s1ap/S1AP_EndIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EndIndication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_EndIndication_specs_1; asn_struct_free_f S1AP_EndIndication_free; asn_struct_print_f S1AP_EndIndication_print; asn_constr_check_f S1AP_EndIndication_constraint; -jer_type_encoder_f S1AP_EndIndication_encode_jer; per_type_decoder_f S1AP_EndIndication_decode_aper; per_type_encoder_f S1AP_EndIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.c b/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.c index a1094db215..64b6be7f9b 100644 --- a/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.c +++ b/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EnhancedCoverageRestricted.h" diff --git a/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.h b/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.h index 1d614f0313..ed6edf1239 100644 --- a/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.h +++ b/lib/asn1c/s1ap/S1AP_EnhancedCoverageRestricted.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EnhancedCoverageRestricted_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_EnhancedCoverageRestricted_spe asn_struct_free_f S1AP_EnhancedCoverageRestricted_free; asn_struct_print_f S1AP_EnhancedCoverageRestricted_print; asn_constr_check_f S1AP_EnhancedCoverageRestricted_constraint; -jer_type_encoder_f S1AP_EnhancedCoverageRestricted_encode_jer; per_type_decoder_f S1AP_EnhancedCoverageRestricted_decode_aper; per_type_encoder_f S1AP_EnhancedCoverageRestricted_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ErrorIndication.c b/lib/asn1c/s1ap/S1AP_ErrorIndication.c index 3a25fcd699..f467c6c9f2 100644 --- a/lib/asn1c/s1ap/S1AP_ErrorIndication.c +++ b/lib/asn1c/s1ap/S1AP_ErrorIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ErrorIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_ErrorIndication.h b/lib/asn1c/s1ap/S1AP_ErrorIndication.h index 074bfebd8e..edc7042b77 100644 --- a/lib/asn1c/s1ap/S1AP_ErrorIndication.h +++ b/lib/asn1c/s1ap/S1AP_ErrorIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ErrorIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_Ethernet-Type.c b/lib/asn1c/s1ap/S1AP_Ethernet-Type.c index 7fcb48aafe..96bdb1c2df 100644 --- a/lib/asn1c/s1ap/S1AP_Ethernet-Type.c +++ b/lib/asn1c/s1ap/S1AP_Ethernet-Type.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Ethernet-Type.h" diff --git a/lib/asn1c/s1ap/S1AP_Ethernet-Type.h b/lib/asn1c/s1ap/S1AP_Ethernet-Type.h index 92398b8386..6bc8fe4c68 100644 --- a/lib/asn1c/s1ap/S1AP_Ethernet-Type.h +++ b/lib/asn1c/s1ap/S1AP_Ethernet-Type.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Ethernet_Type_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Ethernet_Type_specs_1; asn_struct_free_f S1AP_Ethernet_Type_free; asn_struct_print_f S1AP_Ethernet_Type_print; asn_constr_check_f S1AP_Ethernet_Type_constraint; -jer_type_encoder_f S1AP_Ethernet_Type_encode_jer; per_type_decoder_f S1AP_Ethernet_Type_decode_aper; per_type_encoder_f S1AP_Ethernet_Type_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.c b/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.c index 5850b010e0..29ce5b8206 100644 --- a/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.c +++ b/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EventL1LoggedMDTConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.h b/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.h index a5e0051fba..134c6a6cda 100644 --- a/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.h +++ b/lib/asn1c/s1ap/S1AP_EventL1LoggedMDTConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EventL1LoggedMDTConfig_H_ diff --git a/lib/asn1c/s1ap/S1AP_EventTrigger.c b/lib/asn1c/s1ap/S1AP_EventTrigger.c index 506429a433..076b57c5f2 100644 --- a/lib/asn1c/s1ap/S1AP_EventTrigger.c +++ b/lib/asn1c/s1ap/S1AP_EventTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EventTrigger.h" diff --git a/lib/asn1c/s1ap/S1AP_EventTrigger.h b/lib/asn1c/s1ap/S1AP_EventTrigger.h index 8ffa088f70..d345574d01 100644 --- a/lib/asn1c/s1ap/S1AP_EventTrigger.h +++ b/lib/asn1c/s1ap/S1AP_EventTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EventTrigger_H_ diff --git a/lib/asn1c/s1ap/S1AP_EventType.c b/lib/asn1c/s1ap/S1AP_EventType.c index f28742c306..83336d3b74 100644 --- a/lib/asn1c/s1ap/S1AP_EventType.c +++ b/lib/asn1c/s1ap/S1AP_EventType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_EventType.h" diff --git a/lib/asn1c/s1ap/S1AP_EventType.h b/lib/asn1c/s1ap/S1AP_EventType.h index 6637a43fd9..4e8b6a8ec3 100644 --- a/lib/asn1c/s1ap/S1AP_EventType.h +++ b/lib/asn1c/s1ap/S1AP_EventType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_EventType_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_EventType_specs_1; asn_struct_free_f S1AP_EventType_free; asn_struct_print_f S1AP_EventType_print; asn_constr_check_f S1AP_EventType_constraint; -jer_type_encoder_f S1AP_EventType_encode_jer; per_type_decoder_f S1AP_EventType_decode_aper; per_type_encoder_f S1AP_EventType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.c b/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.c index 1e711abb29..aaf7fb0bef 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.c +++ b/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExpectedActivityPeriod.h" diff --git a/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.h b/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.h index fb0722e311..4861c1fcd6 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.h +++ b/lib/asn1c/s1ap/S1AP_ExpectedActivityPeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExpectedActivityPeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ExpectedActivityPeriod; asn_struct_free_f S1AP_ExpectedActivityPeriod_free; asn_struct_print_f S1AP_ExpectedActivityPeriod_print; asn_constr_check_f S1AP_ExpectedActivityPeriod_constraint; -jer_type_encoder_f S1AP_ExpectedActivityPeriod_encode_jer; per_type_decoder_f S1AP_ExpectedActivityPeriod_decode_aper; per_type_encoder_f S1AP_ExpectedActivityPeriod_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.c b/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.c index 7953201427..5f67e1b969 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.c +++ b/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExpectedHOInterval.h" diff --git a/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.h b/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.h index 1ad4ce63ab..1a179a3154 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.h +++ b/lib/asn1c/s1ap/S1AP_ExpectedHOInterval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExpectedHOInterval_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ExpectedHOInterval_specs_1; asn_struct_free_f S1AP_ExpectedHOInterval_free; asn_struct_print_f S1AP_ExpectedHOInterval_print; asn_constr_check_f S1AP_ExpectedHOInterval_constraint; -jer_type_encoder_f S1AP_ExpectedHOInterval_encode_jer; per_type_decoder_f S1AP_ExpectedHOInterval_decode_aper; per_type_encoder_f S1AP_ExpectedHOInterval_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.c b/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.c index 93049dd27c..68cdb590a2 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.c +++ b/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExpectedIdlePeriod.h" diff --git a/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.h b/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.h index 8d8ee6d13e..e72a78bf8c 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.h +++ b/lib/asn1c/s1ap/S1AP_ExpectedIdlePeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExpectedIdlePeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ExpectedIdlePeriod; asn_struct_free_f S1AP_ExpectedIdlePeriod_free; asn_struct_print_f S1AP_ExpectedIdlePeriod_print; asn_constr_check_f S1AP_ExpectedIdlePeriod_constraint; -jer_type_encoder_f S1AP_ExpectedIdlePeriod_encode_jer; per_type_decoder_f S1AP_ExpectedIdlePeriod_decode_aper; per_type_encoder_f S1AP_ExpectedIdlePeriod_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.c b/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.c index 764e6f0914..3f7b5f6bdc 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.c +++ b/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExpectedUEActivityBehaviour.h" diff --git a/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.h b/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.h index b4ea28cf59..35cacec964 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.h +++ b/lib/asn1c/s1ap/S1AP_ExpectedUEActivityBehaviour.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExpectedUEActivityBehaviour_H_ diff --git a/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.c b/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.c index 73278343aa..c313595b18 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.c +++ b/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExpectedUEBehaviour.h" diff --git a/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.h b/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.h index 5e493dd0ae..9ee63a54f5 100644 --- a/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.h +++ b/lib/asn1c/s1ap/S1AP_ExpectedUEBehaviour.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExpectedUEBehaviour_H_ diff --git a/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.c b/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.c index a92bc46222..837e750c98 100644 --- a/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.c +++ b/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Extended-UEIdentityIndexValue.h" diff --git a/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.h b/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.h index b159e39092..fc54363732 100644 --- a/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.h +++ b/lib/asn1c/s1ap/S1AP_Extended-UEIdentityIndexValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Extended_UEIdentityIndexValue_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Extended_UEIdentityIndexValue; asn_struct_free_f S1AP_Extended_UEIdentityIndexValue_free; asn_struct_print_f S1AP_Extended_UEIdentityIndexValue_print; asn_constr_check_f S1AP_Extended_UEIdentityIndexValue_constraint; -jer_type_encoder_f S1AP_Extended_UEIdentityIndexValue_encode_jer; per_type_decoder_f S1AP_Extended_UEIdentityIndexValue_decode_aper; per_type_encoder_f S1AP_Extended_UEIdentityIndexValue_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExtendedBitRate.c b/lib/asn1c/s1ap/S1AP_ExtendedBitRate.c index 752a8947e5..ed5e358b4d 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedBitRate.c +++ b/lib/asn1c/s1ap/S1AP_ExtendedBitRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExtendedBitRate.h" diff --git a/lib/asn1c/s1ap/S1AP_ExtendedBitRate.h b/lib/asn1c/s1ap/S1AP_ExtendedBitRate.h index b75ef9cdd8..a02c40d587 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedBitRate.h +++ b/lib/asn1c/s1ap/S1AP_ExtendedBitRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExtendedBitRate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ExtendedBitRate; asn_struct_free_f S1AP_ExtendedBitRate_free; asn_struct_print_f S1AP_ExtendedBitRate_print; asn_constr_check_f S1AP_ExtendedBitRate_constraint; -jer_type_encoder_f S1AP_ExtendedBitRate_encode_jer; per_type_decoder_f S1AP_ExtendedBitRate_decode_aper; per_type_encoder_f S1AP_ExtendedBitRate_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.c b/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.c index c607d74ca5..046cb3a96e 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.c +++ b/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExtendedRNC-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.h b/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.h index 3e15289658..c5a2bdd314 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.h +++ b/lib/asn1c/s1ap/S1AP_ExtendedRNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExtendedRNC_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ExtendedRNC_ID; asn_struct_free_f S1AP_ExtendedRNC_ID_free; asn_struct_print_f S1AP_ExtendedRNC_ID_print; asn_constr_check_f S1AP_ExtendedRNC_ID_constraint; -jer_type_encoder_f S1AP_ExtendedRNC_ID_encode_jer; per_type_decoder_f S1AP_ExtendedRNC_ID_decode_aper; per_type_encoder_f S1AP_ExtendedRNC_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.c b/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.c index f4cc13d43c..53d7d1fbc8 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.c +++ b/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ExtendedRepetitionPeriod.h" diff --git a/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.h b/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.h index a84af072b0..aea52a0870 100644 --- a/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.h +++ b/lib/asn1c/s1ap/S1AP_ExtendedRepetitionPeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ExtendedRepetitionPeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ExtendedRepetitionPeriod; asn_struct_free_f S1AP_ExtendedRepetitionPeriod_free; asn_struct_print_f S1AP_ExtendedRepetitionPeriod_print; asn_constr_check_f S1AP_ExtendedRepetitionPeriod_constraint; -jer_type_encoder_f S1AP_ExtendedRepetitionPeriod_encode_jer; per_type_decoder_f S1AP_ExtendedRepetitionPeriod_decode_aper; per_type_encoder_f S1AP_ExtendedRepetitionPeriod_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_FiveGSTAC.c b/lib/asn1c/s1ap/S1AP_FiveGSTAC.c index 54ad69bc57..820a3abd96 100644 --- a/lib/asn1c/s1ap/S1AP_FiveGSTAC.c +++ b/lib/asn1c/s1ap/S1AP_FiveGSTAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_FiveGSTAC.h" diff --git a/lib/asn1c/s1ap/S1AP_FiveGSTAC.h b/lib/asn1c/s1ap/S1AP_FiveGSTAC.h index 39c5dd37fa..7c7766bd91 100644 --- a/lib/asn1c/s1ap/S1AP_FiveGSTAC.h +++ b/lib/asn1c/s1ap/S1AP_FiveGSTAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_FiveGSTAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_FiveGSTAC; asn_struct_free_f S1AP_FiveGSTAC_free; asn_struct_print_f S1AP_FiveGSTAC_print; asn_constr_check_f S1AP_FiveGSTAC_constraint; -jer_type_encoder_f S1AP_FiveGSTAC_encode_jer; per_type_decoder_f S1AP_FiveGSTAC_decode_aper; per_type_encoder_f S1AP_FiveGSTAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_FiveGSTAI.c b/lib/asn1c/s1ap/S1AP_FiveGSTAI.c index 43da5cb209..7c978cfac3 100644 --- a/lib/asn1c/s1ap/S1AP_FiveGSTAI.c +++ b/lib/asn1c/s1ap/S1AP_FiveGSTAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_FiveGSTAI.h" diff --git a/lib/asn1c/s1ap/S1AP_FiveGSTAI.h b/lib/asn1c/s1ap/S1AP_FiveGSTAI.h index 33bf4a4598..37f6c08781 100644 --- a/lib/asn1c/s1ap/S1AP_FiveGSTAI.h +++ b/lib/asn1c/s1ap/S1AP_FiveGSTAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_FiveGSTAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_FiveQI.c b/lib/asn1c/s1ap/S1AP_FiveQI.c index d5a92a8c07..b6b0c55291 100644 --- a/lib/asn1c/s1ap/S1AP_FiveQI.c +++ b/lib/asn1c/s1ap/S1AP_FiveQI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_FiveQI.h" diff --git a/lib/asn1c/s1ap/S1AP_FiveQI.h b/lib/asn1c/s1ap/S1AP_FiveQI.h index 716abe4d7f..3d2ca45217 100644 --- a/lib/asn1c/s1ap/S1AP_FiveQI.h +++ b/lib/asn1c/s1ap/S1AP_FiveQI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_FiveQI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_FiveQI; asn_struct_free_f S1AP_FiveQI_free; asn_struct_print_f S1AP_FiveQI_print; asn_constr_check_f S1AP_FiveQI_constraint; -jer_type_encoder_f S1AP_FiveQI_encode_jer; per_type_decoder_f S1AP_FiveQI_decode_aper; per_type_encoder_f S1AP_FiveQI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.c b/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.c index 72369a5156..ee3d7b14bf 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenInterRATs.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.h b/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.h index 1014299192..326bf8db0c 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenInterRATs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenInterRATs_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ForbiddenInterRATs_specs_1; asn_struct_free_f S1AP_ForbiddenInterRATs_free; asn_struct_print_f S1AP_ForbiddenInterRATs_print; asn_constr_check_f S1AP_ForbiddenInterRATs_constraint; -jer_type_encoder_f S1AP_ForbiddenInterRATs_encode_jer; per_type_decoder_f S1AP_ForbiddenInterRATs_decode_aper; per_type_encoder_f S1AP_ForbiddenInterRATs_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLACs.c b/lib/asn1c/s1ap/S1AP_ForbiddenLACs.c index 267e9080c0..3a303c3dcb 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLACs.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLACs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenLACs.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLACs.h b/lib/asn1c/s1ap/S1AP_ForbiddenLACs.h index 82d70273bb..abdbe1d85e 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLACs.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLACs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenLACs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.c b/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.c index e7d749b2c3..568d12ca07 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenLAs-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.h b/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.h index 401afdc7bf..22a6f1ae7f 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLAs-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenLAs_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLAs.c b/lib/asn1c/s1ap/S1AP_ForbiddenLAs.c index b154dc3ba0..77b6c3565e 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLAs.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenLAs.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenLAs.h b/lib/asn1c/s1ap/S1AP_ForbiddenLAs.h index fd7c3996b9..ed6b323706 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenLAs.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenLAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenLAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTACs.c b/lib/asn1c/s1ap/S1AP_ForbiddenTACs.c index 453ea188d3..56dd0da086 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTACs.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTACs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenTACs.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTACs.h b/lib/asn1c/s1ap/S1AP_ForbiddenTACs.h index 68531fd1c4..60fec2772a 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTACs.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTACs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenTACs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.c b/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.c index c5371d0b39..fb6fec28b4 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenTAs-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.h b/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.h index 2791ab1bba..322f47e144 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTAs-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenTAs_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTAs.c b/lib/asn1c/s1ap/S1AP_ForbiddenTAs.c index 581e6591bb..0b32714fb1 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTAs.c +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ForbiddenTAs.h" diff --git a/lib/asn1c/s1ap/S1AP_ForbiddenTAs.h b/lib/asn1c/s1ap/S1AP_ForbiddenTAs.h index 7319dcbd14..9812fa8523 100644 --- a/lib/asn1c/s1ap/S1AP_ForbiddenTAs.h +++ b/lib/asn1c/s1ap/S1AP_ForbiddenTAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ForbiddenTAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_GBR-QosInformation.c b/lib/asn1c/s1ap/S1AP_GBR-QosInformation.c index 60e74a3851..97968ac7e0 100644 --- a/lib/asn1c/s1ap/S1AP_GBR-QosInformation.c +++ b/lib/asn1c/s1ap/S1AP_GBR-QosInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GBR-QosInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_GBR-QosInformation.h b/lib/asn1c/s1ap/S1AP_GBR-QosInformation.h index 373a90258a..dbb060ec3b 100644 --- a/lib/asn1c/s1ap/S1AP_GBR-QosInformation.h +++ b/lib/asn1c/s1ap/S1AP_GBR-QosInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GBR_QosInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.c b/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.c index cecfc52c4e..ae9ed352dd 100644 --- a/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.c +++ b/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GERAN-Cell-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.h b/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.h index c1a37c8d93..076c9cdee7 100644 --- a/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.h +++ b/lib/asn1c/s1ap/S1AP_GERAN-Cell-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GERAN_Cell_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_GNB-ID.c b/lib/asn1c/s1ap/S1AP_GNB-ID.c index c465ddb988..bf2c30244c 100644 --- a/lib/asn1c/s1ap/S1AP_GNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_GNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_GNB-ID.h b/lib/asn1c/s1ap/S1AP_GNB-ID.h index b3e3cecdcf..8cce18aa3b 100644 --- a/lib/asn1c/s1ap/S1AP_GNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_GNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GNB_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_GNB_ID; asn_struct_free_f S1AP_GNB_ID_free; asn_struct_print_f S1AP_GNB_ID_print; asn_constr_check_f S1AP_GNB_ID_constraint; -jer_type_encoder_f S1AP_GNB_ID_encode_jer; per_type_decoder_f S1AP_GNB_ID_decode_aper; per_type_encoder_f S1AP_GNB_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_GNB-Identity.c b/lib/asn1c/s1ap/S1AP_GNB-Identity.c index 7be161e2c4..9748f9a991 100644 --- a/lib/asn1c/s1ap/S1AP_GNB-Identity.c +++ b/lib/asn1c/s1ap/S1AP_GNB-Identity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GNB-Identity.h" diff --git a/lib/asn1c/s1ap/S1AP_GNB-Identity.h b/lib/asn1c/s1ap/S1AP_GNB-Identity.h index 3e2dceed19..2396633cc3 100644 --- a/lib/asn1c/s1ap/S1AP_GNB-Identity.h +++ b/lib/asn1c/s1ap/S1AP_GNB-Identity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GNB_Identity_H_ diff --git a/lib/asn1c/s1ap/S1AP_GNB.c b/lib/asn1c/s1ap/S1AP_GNB.c index 849b8a1183..f3e1c19ca9 100644 --- a/lib/asn1c/s1ap/S1AP_GNB.c +++ b/lib/asn1c/s1ap/S1AP_GNB.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GNB.h" diff --git a/lib/asn1c/s1ap/S1AP_GNB.h b/lib/asn1c/s1ap/S1AP_GNB.h index e35efb2497..15c3b1ac3b 100644 --- a/lib/asn1c/s1ap/S1AP_GNB.h +++ b/lib/asn1c/s1ap/S1AP_GNB.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GNB_H_ diff --git a/lib/asn1c/s1ap/S1AP_GTP-TEID.c b/lib/asn1c/s1ap/S1AP_GTP-TEID.c index 2ba4f37990..72032ac0af 100644 --- a/lib/asn1c/s1ap/S1AP_GTP-TEID.c +++ b/lib/asn1c/s1ap/S1AP_GTP-TEID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GTP-TEID.h" diff --git a/lib/asn1c/s1ap/S1AP_GTP-TEID.h b/lib/asn1c/s1ap/S1AP_GTP-TEID.h index 133848b4e3..f7df18f215 100644 --- a/lib/asn1c/s1ap/S1AP_GTP-TEID.h +++ b/lib/asn1c/s1ap/S1AP_GTP-TEID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GTP_TEID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_GTP_TEID; asn_struct_free_f S1AP_GTP_TEID_free; asn_struct_print_f S1AP_GTP_TEID_print; asn_constr_check_f S1AP_GTP_TEID_constraint; -jer_type_encoder_f S1AP_GTP_TEID_encode_jer; per_type_decoder_f S1AP_GTP_TEID_decode_aper; per_type_encoder_f S1AP_GTP_TEID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_GUMMEI.c b/lib/asn1c/s1ap/S1AP_GUMMEI.c index 38c6f5e59f..1319d10376 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEI.c +++ b/lib/asn1c/s1ap/S1AP_GUMMEI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GUMMEI.h" diff --git a/lib/asn1c/s1ap/S1AP_GUMMEI.h b/lib/asn1c/s1ap/S1AP_GUMMEI.h index 2c53cb2c31..d9e54bf17d 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEI.h +++ b/lib/asn1c/s1ap/S1AP_GUMMEI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GUMMEI_H_ diff --git a/lib/asn1c/s1ap/S1AP_GUMMEIList.c b/lib/asn1c/s1ap/S1AP_GUMMEIList.c index 92ed2b4700..3a82788c1f 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEIList.c +++ b/lib/asn1c/s1ap/S1AP_GUMMEIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GUMMEIList.h" diff --git a/lib/asn1c/s1ap/S1AP_GUMMEIList.h b/lib/asn1c/s1ap/S1AP_GUMMEIList.h index 8de6f7f64d..dcafea1da9 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEIList.h +++ b/lib/asn1c/s1ap/S1AP_GUMMEIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GUMMEIList_H_ diff --git a/lib/asn1c/s1ap/S1AP_GUMMEIType.c b/lib/asn1c/s1ap/S1AP_GUMMEIType.c index 697a84fcc3..7673e259dc 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEIType.c +++ b/lib/asn1c/s1ap/S1AP_GUMMEIType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GUMMEIType.h" diff --git a/lib/asn1c/s1ap/S1AP_GUMMEIType.h b/lib/asn1c/s1ap/S1AP_GUMMEIType.h index 49556d93bc..3f5c99f610 100644 --- a/lib/asn1c/s1ap/S1AP_GUMMEIType.h +++ b/lib/asn1c/s1ap/S1AP_GUMMEIType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GUMMEIType_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_GUMMEIType_specs_1; asn_struct_free_f S1AP_GUMMEIType_free; asn_struct_print_f S1AP_GUMMEIType_print; asn_constr_check_f S1AP_GUMMEIType_constraint; -jer_type_encoder_f S1AP_GUMMEIType_encode_jer; per_type_decoder_f S1AP_GUMMEIType_decode_aper; per_type_encoder_f S1AP_GUMMEIType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.c b/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.c index 01022355ef..7d99cb56aa 100644 --- a/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.c +++ b/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_GWContextReleaseIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.h b/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.h index dad50b8355..8c40268d82 100644 --- a/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.h +++ b/lib/asn1c/s1ap/S1AP_GWContextReleaseIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_GWContextReleaseIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_GWContextReleaseIndication_spe asn_struct_free_f S1AP_GWContextReleaseIndication_free; asn_struct_print_f S1AP_GWContextReleaseIndication_print; asn_constr_check_f S1AP_GWContextReleaseIndication_constraint; -jer_type_encoder_f S1AP_GWContextReleaseIndication_encode_jer; per_type_decoder_f S1AP_GWContextReleaseIndication_decode_aper; per_type_encoder_f S1AP_GWContextReleaseIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Global-ENB-ID.c b/lib/asn1c/s1ap/S1AP_Global-ENB-ID.c index 4fecd7cf0f..9a3c0cc606 100644 --- a/lib/asn1c/s1ap/S1AP_Global-ENB-ID.c +++ b/lib/asn1c/s1ap/S1AP_Global-ENB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Global-ENB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Global-ENB-ID.h b/lib/asn1c/s1ap/S1AP_Global-ENB-ID.h index 0fba3df6ff..075c29c66d 100644 --- a/lib/asn1c/s1ap/S1AP_Global-ENB-ID.h +++ b/lib/asn1c/s1ap/S1AP_Global-ENB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Global_ENB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_Global-GNB-ID.c b/lib/asn1c/s1ap/S1AP_Global-GNB-ID.c index 68522b59b6..28277b1bb3 100644 --- a/lib/asn1c/s1ap/S1AP_Global-GNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_Global-GNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Global-GNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Global-GNB-ID.h b/lib/asn1c/s1ap/S1AP_Global-GNB-ID.h index ce6d6e416f..27302c6e75 100644 --- a/lib/asn1c/s1ap/S1AP_Global-GNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_Global-GNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Global_GNB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.c b/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.c index cbb57c378e..fade582cfd 100644 --- a/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.c +++ b/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Global-RAN-NODE-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.h b/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.h index dd45e0c878..a70e31c881 100644 --- a/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.h +++ b/lib/asn1c/s1ap/S1AP_Global-RAN-NODE-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Global_RAN_NODE_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.c b/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.c index 63dcd37695..0c5f5a17d1 100644 --- a/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Global-en-gNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.h b/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.h index bef4348f92..ae5b160a5f 100644 --- a/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_Global-en-gNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Global_en_gNB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_HFN.c b/lib/asn1c/s1ap/S1AP_HFN.c index 7c4e4f2782..b993599bac 100644 --- a/lib/asn1c/s1ap/S1AP_HFN.c +++ b/lib/asn1c/s1ap/S1AP_HFN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HFN.h" diff --git a/lib/asn1c/s1ap/S1AP_HFN.h b/lib/asn1c/s1ap/S1AP_HFN.h index c441105978..3489d226d1 100644 --- a/lib/asn1c/s1ap/S1AP_HFN.h +++ b/lib/asn1c/s1ap/S1AP_HFN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HFN_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_HFN; asn_struct_free_f S1AP_HFN_free; asn_struct_print_f S1AP_HFN_print; asn_constr_check_f S1AP_HFN_constraint; -jer_type_encoder_f S1AP_HFN_encode_jer; per_type_decoder_f S1AP_HFN_decode_aper; per_type_encoder_f S1AP_HFN_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_HFNModified.c b/lib/asn1c/s1ap/S1AP_HFNModified.c index d6000ff3a4..262d069927 100644 --- a/lib/asn1c/s1ap/S1AP_HFNModified.c +++ b/lib/asn1c/s1ap/S1AP_HFNModified.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HFNModified.h" diff --git a/lib/asn1c/s1ap/S1AP_HFNModified.h b/lib/asn1c/s1ap/S1AP_HFNModified.h index aa68f3428b..16c9aec9d6 100644 --- a/lib/asn1c/s1ap/S1AP_HFNModified.h +++ b/lib/asn1c/s1ap/S1AP_HFNModified.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HFNModified_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_HFNModified; asn_struct_free_f S1AP_HFNModified_free; asn_struct_print_f S1AP_HFNModified_print; asn_constr_check_f S1AP_HFNModified_constraint; -jer_type_encoder_f S1AP_HFNModified_encode_jer; per_type_decoder_f S1AP_HFNModified_decode_aper; per_type_encoder_f S1AP_HFNModified_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.c b/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.c index 02ad8d78a0..64b3880e2d 100644 --- a/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.c +++ b/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HFNforPDCP-SNlength18.h" diff --git a/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.h b/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.h index 23dcd2d13b..1945e0c6d4 100644 --- a/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.h +++ b/lib/asn1c/s1ap/S1AP_HFNforPDCP-SNlength18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HFNforPDCP_SNlength18_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_HFNforPDCP_SNlength18; asn_struct_free_f S1AP_HFNforPDCP_SNlength18_free; asn_struct_print_f S1AP_HFNforPDCP_SNlength18_print; asn_constr_check_f S1AP_HFNforPDCP_SNlength18_constraint; -jer_type_encoder_f S1AP_HFNforPDCP_SNlength18_encode_jer; per_type_decoder_f S1AP_HFNforPDCP_SNlength18_decode_aper; per_type_encoder_f S1AP_HFNforPDCP_SNlength18_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_HandoverCancel.c b/lib/asn1c/s1ap/S1AP_HandoverCancel.c index 4c6d2b5825..b7786ffb6b 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCancel.c +++ b/lib/asn1c/s1ap/S1AP_HandoverCancel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverCancel.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverCancel.h b/lib/asn1c/s1ap/S1AP_HandoverCancel.h index 7cdc26f5c6..a660791f15 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCancel.h +++ b/lib/asn1c/s1ap/S1AP_HandoverCancel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverCancel_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.c b/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.c index 17f433a04d..9fcf69643e 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverCancelAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.h b/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.h index 3c48d62bda..27baa87c27 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_HandoverCancelAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverCancelAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverCommand.c b/lib/asn1c/s1ap/S1AP_HandoverCommand.c index 227ae5b4fe..11d745cb82 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCommand.c +++ b/lib/asn1c/s1ap/S1AP_HandoverCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverCommand.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverCommand.h b/lib/asn1c/s1ap/S1AP_HandoverCommand.h index f2492bd470..f43e58f881 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverCommand.h +++ b/lib/asn1c/s1ap/S1AP_HandoverCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverCommand_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverFailure.c b/lib/asn1c/s1ap/S1AP_HandoverFailure.c index 673b91f24d..2782e9c786 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverFailure.c +++ b/lib/asn1c/s1ap/S1AP_HandoverFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverFailure.h b/lib/asn1c/s1ap/S1AP_HandoverFailure.h index 69c78bfedb..4703cecad0 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverFailure.h +++ b/lib/asn1c/s1ap/S1AP_HandoverFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverFlag.c b/lib/asn1c/s1ap/S1AP_HandoverFlag.c index b1bbeac49e..85d32cf13a 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverFlag.c +++ b/lib/asn1c/s1ap/S1AP_HandoverFlag.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverFlag.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverFlag.h b/lib/asn1c/s1ap/S1AP_HandoverFlag.h index 5e0b260007..edd3937bca 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverFlag.h +++ b/lib/asn1c/s1ap/S1AP_HandoverFlag.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverFlag_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_HandoverFlag_specs_1; asn_struct_free_f S1AP_HandoverFlag_free; asn_struct_print_f S1AP_HandoverFlag_print; asn_constr_check_f S1AP_HandoverFlag_constraint; -jer_type_encoder_f S1AP_HandoverFlag_encode_jer; per_type_decoder_f S1AP_HandoverFlag_decode_aper; per_type_encoder_f S1AP_HandoverFlag_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_HandoverNotify.c b/lib/asn1c/s1ap/S1AP_HandoverNotify.c index af4afab949..6afcae96a9 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverNotify.c +++ b/lib/asn1c/s1ap/S1AP_HandoverNotify.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverNotify.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverNotify.h b/lib/asn1c/s1ap/S1AP_HandoverNotify.h index d13a29deba..5acb0ebab9 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverNotify.h +++ b/lib/asn1c/s1ap/S1AP_HandoverNotify.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverNotify_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.c b/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.c index 234dc804e9..730ea686b6 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.c +++ b/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverPreparationFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.h b/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.h index b37921b2d3..2da64e0125 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.h +++ b/lib/asn1c/s1ap/S1AP_HandoverPreparationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverPreparationFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequest.c b/lib/asn1c/s1ap/S1AP_HandoverRequest.c index 475d48bfe9..409d450ed1 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequest.c +++ b/lib/asn1c/s1ap/S1AP_HandoverRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequest.h b/lib/asn1c/s1ap/S1AP_HandoverRequest.h index 9a8b4a3b04..ee2e20666a 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequest.h +++ b/lib/asn1c/s1ap/S1AP_HandoverRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.c b/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.c index 78f6cc1f03..65c9bf6553 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverRequestAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.h b/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.h index 22208d7c68..aa3afedb68 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_HandoverRequestAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverRequestAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequired.c b/lib/asn1c/s1ap/S1AP_HandoverRequired.c index d6c32a96c3..c22f0f645e 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequired.c +++ b/lib/asn1c/s1ap/S1AP_HandoverRequired.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverRequired.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverRequired.h b/lib/asn1c/s1ap/S1AP_HandoverRequired.h index 9bd6691ea1..5d3892974c 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRequired.h +++ b/lib/asn1c/s1ap/S1AP_HandoverRequired.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverRequired_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.c b/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.c index ba6b21dabc..655d04ae6a 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.c +++ b/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverRestrictionList.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.h b/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.h index 6e17e9db05..f2b6fc0c98 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.h +++ b/lib/asn1c/s1ap/S1AP_HandoverRestrictionList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverRestrictionList_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverSuccess.c b/lib/asn1c/s1ap/S1AP_HandoverSuccess.c index 18e1011083..773c482faf 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverSuccess.c +++ b/lib/asn1c/s1ap/S1AP_HandoverSuccess.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverSuccess.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverSuccess.h b/lib/asn1c/s1ap/S1AP_HandoverSuccess.h index 32526ddf4e..7969c8a0bd 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverSuccess.h +++ b/lib/asn1c/s1ap/S1AP_HandoverSuccess.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverSuccess_H_ diff --git a/lib/asn1c/s1ap/S1AP_HandoverType.c b/lib/asn1c/s1ap/S1AP_HandoverType.c index 0ea359c829..2b82133689 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverType.c +++ b/lib/asn1c/s1ap/S1AP_HandoverType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_HandoverType.h" diff --git a/lib/asn1c/s1ap/S1AP_HandoverType.h b/lib/asn1c/s1ap/S1AP_HandoverType.h index bdbcb4d899..1291a85321 100644 --- a/lib/asn1c/s1ap/S1AP_HandoverType.h +++ b/lib/asn1c/s1ap/S1AP_HandoverType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_HandoverType_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_HandoverType_specs_1; asn_struct_free_f S1AP_HandoverType_free; asn_struct_print_f S1AP_HandoverType_print; asn_constr_check_f S1AP_HandoverType_constraint; -jer_type_encoder_f S1AP_HandoverType_encode_jer; per_type_decoder_f S1AP_HandoverType_decode_aper; per_type_encoder_f S1AP_HandoverType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Hysteresis.c b/lib/asn1c/s1ap/S1AP_Hysteresis.c index 525bad794c..802a2f7cb4 100644 --- a/lib/asn1c/s1ap/S1AP_Hysteresis.c +++ b/lib/asn1c/s1ap/S1AP_Hysteresis.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Hysteresis.h" diff --git a/lib/asn1c/s1ap/S1AP_Hysteresis.h b/lib/asn1c/s1ap/S1AP_Hysteresis.h index b0a979a713..383b6ee217 100644 --- a/lib/asn1c/s1ap/S1AP_Hysteresis.h +++ b/lib/asn1c/s1ap/S1AP_Hysteresis.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Hysteresis_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Hysteresis; asn_struct_free_f S1AP_Hysteresis_free; asn_struct_print_f S1AP_Hysteresis_print; asn_constr_check_f S1AP_Hysteresis_constraint; -jer_type_encoder_f S1AP_Hysteresis_encode_jer; per_type_decoder_f S1AP_Hysteresis_decode_aper; per_type_encoder_f S1AP_Hysteresis_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IAB-Authorized.c b/lib/asn1c/s1ap/S1AP_IAB-Authorized.c index aa74358b18..b3f0dc2d51 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Authorized.c +++ b/lib/asn1c/s1ap/S1AP_IAB-Authorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IAB-Authorized.h" diff --git a/lib/asn1c/s1ap/S1AP_IAB-Authorized.h b/lib/asn1c/s1ap/S1AP_IAB-Authorized.h index 7454aa601f..94d3fbf00d 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Authorized.h +++ b/lib/asn1c/s1ap/S1AP_IAB-Authorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IAB_Authorized_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IAB_Authorized_specs_1; asn_struct_free_f S1AP_IAB_Authorized_free; asn_struct_print_f S1AP_IAB_Authorized_print; asn_constr_check_f S1AP_IAB_Authorized_constraint; -jer_type_encoder_f S1AP_IAB_Authorized_encode_jer; per_type_decoder_f S1AP_IAB_Authorized_decode_aper; per_type_encoder_f S1AP_IAB_Authorized_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.c b/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.c index 6fe2681c8f..4fbbcc4077 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.c +++ b/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IAB-Node-Indication.h" diff --git a/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.h b/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.h index 0ce774e0bd..e095cc9ebb 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.h +++ b/lib/asn1c/s1ap/S1AP_IAB-Node-Indication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IAB_Node_Indication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IAB_Node_Indication_specs_1; asn_struct_free_f S1AP_IAB_Node_Indication_free; asn_struct_print_f S1AP_IAB_Node_Indication_print; asn_constr_check_f S1AP_IAB_Node_Indication_constraint; -jer_type_encoder_f S1AP_IAB_Node_Indication_encode_jer; per_type_decoder_f S1AP_IAB_Node_Indication_decode_aper; per_type_encoder_f S1AP_IAB_Node_Indication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IAB-Supported.c b/lib/asn1c/s1ap/S1AP_IAB-Supported.c index 3806b36fd1..179806fbb7 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Supported.c +++ b/lib/asn1c/s1ap/S1AP_IAB-Supported.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IAB-Supported.h" diff --git a/lib/asn1c/s1ap/S1AP_IAB-Supported.h b/lib/asn1c/s1ap/S1AP_IAB-Supported.h index 5da7aad53d..1f80152ed4 100644 --- a/lib/asn1c/s1ap/S1AP_IAB-Supported.h +++ b/lib/asn1c/s1ap/S1AP_IAB-Supported.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IAB_Supported_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IAB_Supported_specs_1; asn_struct_free_f S1AP_IAB_Supported_free; asn_struct_print_f S1AP_IAB_Supported_print; asn_constr_check_f S1AP_IAB_Supported_constraint; -jer_type_encoder_f S1AP_IAB_Supported_encode_jer; per_type_decoder_f S1AP_IAB_Supported_decode_aper; per_type_encoder_f S1AP_IAB_Supported_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IMSI.c b/lib/asn1c/s1ap/S1AP_IMSI.c index 286462a3e3..b90f85291f 100644 --- a/lib/asn1c/s1ap/S1AP_IMSI.c +++ b/lib/asn1c/s1ap/S1AP_IMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IMSI.h" diff --git a/lib/asn1c/s1ap/S1AP_IMSI.h b/lib/asn1c/s1ap/S1AP_IMSI.h index 9699cf1e05..7b2089b58a 100644 --- a/lib/asn1c/s1ap/S1AP_IMSI.h +++ b/lib/asn1c/s1ap/S1AP_IMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IMSI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_IMSI; asn_struct_free_f S1AP_IMSI_free; asn_struct_print_f S1AP_IMSI_print; asn_constr_check_f S1AP_IMSI_constraint; -jer_type_encoder_f S1AP_IMSI_encode_jer; per_type_decoder_f S1AP_IMSI_decode_aper; per_type_encoder_f S1AP_IMSI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.c b/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.c index e22bd35f9e..6d625e00af 100644 --- a/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.c +++ b/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IMSvoiceEPSfallbackfrom5G.h" diff --git a/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.h b/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.h index 416622a977..4141261b63 100644 --- a/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.h +++ b/lib/asn1c/s1ap/S1AP_IMSvoiceEPSfallbackfrom5G.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IMSvoiceEPSfallbackfrom5G_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IMSvoiceEPSfallbackfrom5G_spec asn_struct_free_f S1AP_IMSvoiceEPSfallbackfrom5G_free; asn_struct_print_f S1AP_IMSvoiceEPSfallbackfrom5G_print; asn_constr_check_f S1AP_IMSvoiceEPSfallbackfrom5G_constraint; -jer_type_encoder_f S1AP_IMSvoiceEPSfallbackfrom5G_encode_jer; per_type_decoder_f S1AP_IMSvoiceEPSfallbackfrom5G_decode_aper; per_type_encoder_f S1AP_IMSvoiceEPSfallbackfrom5G_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ImmediateMDT.c b/lib/asn1c/s1ap/S1AP_ImmediateMDT.c index 5da1c9a995..0f03579e42 100644 --- a/lib/asn1c/s1ap/S1AP_ImmediateMDT.c +++ b/lib/asn1c/s1ap/S1AP_ImmediateMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ImmediateMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_ImmediateMDT.h b/lib/asn1c/s1ap/S1AP_ImmediateMDT.h index 6acac4d18f..eaee4fa3bd 100644 --- a/lib/asn1c/s1ap/S1AP_ImmediateMDT.h +++ b/lib/asn1c/s1ap/S1AP_ImmediateMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ImmediateMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.c b/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.c index 1b9ef21ac2..1499e7c1fa 100644 --- a/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.c +++ b/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InformationOnRecommendedCellsAndENBsForPaging.h" diff --git a/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.h b/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.h index c9c5af6605..1f305ecc6f 100644 --- a/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.h +++ b/lib/asn1c/s1ap/S1AP_InformationOnRecommendedCellsAndENBsForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InformationOnRecommendedCellsAndENBsForPaging_H_ diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.c b/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.c index 2725fb2b71..7230373e5d 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.c +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InitialContextSetupFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.h b/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.h index bd387f9d7c..f7fcd38381 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.h +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InitialContextSetupFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.c b/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.c index bab57fc983..525e43465b 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.c +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InitialContextSetupRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.h b/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.h index bd3152dc2b..8b823e1c41 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.h +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InitialContextSetupRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.c b/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.c index fb20fc3d47..5424bac2a2 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.c +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InitialContextSetupResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.h b/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.h index ae58f541a9..a699790cf5 100644 --- a/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.h +++ b/lib/asn1c/s1ap/S1AP_InitialContextSetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InitialContextSetupResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_InitialUEMessage.c b/lib/asn1c/s1ap/S1AP_InitialUEMessage.c index c36c2f2b5a..c74bc69524 100644 --- a/lib/asn1c/s1ap/S1AP_InitialUEMessage.c +++ b/lib/asn1c/s1ap/S1AP_InitialUEMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InitialUEMessage.h" diff --git a/lib/asn1c/s1ap/S1AP_InitialUEMessage.h b/lib/asn1c/s1ap/S1AP_InitialUEMessage.h index d2f44ce524..e33b7c5fc8 100644 --- a/lib/asn1c/s1ap/S1AP_InitialUEMessage.h +++ b/lib/asn1c/s1ap/S1AP_InitialUEMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InitialUEMessage_H_ diff --git a/lib/asn1c/s1ap/S1AP_InitiatingMessage.c b/lib/asn1c/s1ap/S1AP_InitiatingMessage.c index 6aee704699..d1d1d9337d 100644 --- a/lib/asn1c/s1ap/S1AP_InitiatingMessage.c +++ b/lib/asn1c/s1ap/S1AP_InitiatingMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InitiatingMessage.h" diff --git a/lib/asn1c/s1ap/S1AP_InitiatingMessage.h b/lib/asn1c/s1ap/S1AP_InitiatingMessage.h index b3348816bf..8425215a5d 100644 --- a/lib/asn1c/s1ap/S1AP_InitiatingMessage.h +++ b/lib/asn1c/s1ap/S1AP_InitiatingMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InitiatingMessage_H_ diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.c b/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.c index 1c0662fde2..c4e56ec72a 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.c +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntegrityProtectionAlgorithms.h" diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.h b/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.h index 730a51ab5b..726f6833f6 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.h +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntegrityProtectionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_IntegrityProtectionAlgorithms; asn_struct_free_f S1AP_IntegrityProtectionAlgorithms_free; asn_struct_print_f S1AP_IntegrityProtectionAlgorithms_print; asn_constr_check_f S1AP_IntegrityProtectionAlgorithms_constraint; -jer_type_encoder_f S1AP_IntegrityProtectionAlgorithms_encode_jer; per_type_decoder_f S1AP_IntegrityProtectionAlgorithms_decode_aper; per_type_encoder_f S1AP_IntegrityProtectionAlgorithms_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.c b/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.c index c8220e5e38..45ba0edca9 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.c +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntegrityProtectionIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.h b/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.h index 3ed4319904..850f6cc885 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.h +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntegrityProtectionIndication_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IntegrityProtectionIndication_ asn_struct_free_f S1AP_IntegrityProtectionIndication_free; asn_struct_print_f S1AP_IntegrityProtectionIndication_print; asn_constr_check_f S1AP_IntegrityProtectionIndication_constraint; -jer_type_encoder_f S1AP_IntegrityProtectionIndication_encode_jer; per_type_decoder_f S1AP_IntegrityProtectionIndication_decode_aper; per_type_encoder_f S1AP_IntegrityProtectionIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.c b/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.c index 598ffc5a4b..7b12d5e746 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.c +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntegrityProtectionResult.h" diff --git a/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.h b/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.h index c34c929163..e8d9568dca 100644 --- a/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.h +++ b/lib/asn1c/s1ap/S1AP_IntegrityProtectionResult.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntegrityProtectionResult_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_IntegrityProtectionResult_spec asn_struct_free_f S1AP_IntegrityProtectionResult_free; asn_struct_print_f S1AP_IntegrityProtectionResult_print; asn_constr_check_f S1AP_IntegrityProtectionResult_constraint; -jer_type_encoder_f S1AP_IntegrityProtectionResult_encode_jer; per_type_decoder_f S1AP_IntegrityProtectionResult_decode_aper; per_type_encoder_f S1AP_IntegrityProtectionResult_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.c b/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.c index 95b274d22c..93b54f6d12 100644 --- a/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.c +++ b/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntendedNumberOfPagingAttempts.h" diff --git a/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.h b/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.h index 92e9ae78ea..5b6df16b7b 100644 --- a/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.h +++ b/lib/asn1c/s1ap/S1AP_IntendedNumberOfPagingAttempts.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntendedNumberOfPagingAttempts_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_IntendedNumberOfPagingAttempts; asn_struct_free_f S1AP_IntendedNumberOfPagingAttempts_free; asn_struct_print_f S1AP_IntendedNumberOfPagingAttempts_print; asn_constr_check_f S1AP_IntendedNumberOfPagingAttempts_constraint; -jer_type_encoder_f S1AP_IntendedNumberOfPagingAttempts_encode_jer; per_type_decoder_f S1AP_IntendedNumberOfPagingAttempts_decode_aper; per_type_encoder_f S1AP_IntendedNumberOfPagingAttempts_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.c b/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.c index 9166c1142a..333f88d250 100644 --- a/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.c +++ b/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Inter-SystemInformationTransferType.h" diff --git a/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.h b/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.h index 260ad4e2f9..330c7e0f0b 100644 --- a/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.h +++ b/lib/asn1c/s1ap/S1AP_Inter-SystemInformationTransferType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Inter_SystemInformationTransferType_H_ diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.c b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.c index c9362b98cc..319b39c67a 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.c +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InterSystemMeasurementItem.h" diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.h b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.h index f53cab9975..bfb13871e7 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.h +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InterSystemMeasurementItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.c b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.c index 17dbad4aa3..52ca33c0ff 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.c +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InterSystemMeasurementList.h" diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.h b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.h index 02f5dc1a38..d0ee61d0b9 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.h +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InterSystemMeasurementList_H_ diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.c b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.c index 21f248b0a8..7bcf60d887 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.c +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InterSystemMeasurementParameters.h" diff --git a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.h b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.h index bd4b00f021..12a5e49a5a 100644 --- a/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.h +++ b/lib/asn1c/s1ap/S1AP_InterSystemMeasurementParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InterSystemMeasurementParameters_H_ diff --git a/lib/asn1c/s1ap/S1AP_InterfacesToTrace.c b/lib/asn1c/s1ap/S1AP_InterfacesToTrace.c index 1cd6cd1795..9104de3e92 100644 --- a/lib/asn1c/s1ap/S1AP_InterfacesToTrace.c +++ b/lib/asn1c/s1ap/S1AP_InterfacesToTrace.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_InterfacesToTrace.h" diff --git a/lib/asn1c/s1ap/S1AP_InterfacesToTrace.h b/lib/asn1c/s1ap/S1AP_InterfacesToTrace.h index 432c55c40c..e3d68f6d97 100644 --- a/lib/asn1c/s1ap/S1AP_InterfacesToTrace.h +++ b/lib/asn1c/s1ap/S1AP_InterfacesToTrace.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_InterfacesToTrace_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_InterfacesToTrace; asn_struct_free_f S1AP_InterfacesToTrace_free; asn_struct_print_f S1AP_InterfacesToTrace_print; asn_constr_check_f S1AP_InterfacesToTrace_constraint; -jer_type_encoder_f S1AP_InterfacesToTrace_encode_jer; per_type_decoder_f S1AP_InterfacesToTrace_decode_aper; per_type_encoder_f S1AP_InterfacesToTrace_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.c b/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.c index 801ff63ae3..b56cca68b8 100644 --- a/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.c +++ b/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntersystemMeasurementConfiguration.h" diff --git a/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.h b/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.h index 08c6eb2c6d..55e03b3e8f 100644 --- a/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.h +++ b/lib/asn1c/s1ap/S1AP_IntersystemMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntersystemMeasurementConfiguration_H_ diff --git a/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.c b/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.c index c735fdcf8a..b57413ff07 100644 --- a/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_IntersystemSONConfigurationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.h b/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.h index 50e74c0529..573cc1a202 100644 --- a/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_IntersystemSONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_IntersystemSONConfigurationTransfer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_IntersystemSONConfigurationTransfer; asn_struct_free_f S1AP_IntersystemSONConfigurationTransfer_free; asn_struct_print_f S1AP_IntersystemSONConfigurationTransfer_print; asn_constr_check_f S1AP_IntersystemSONConfigurationTransfer_constraint; -jer_type_encoder_f S1AP_IntersystemSONConfigurationTransfer_encode_jer; per_type_decoder_f S1AP_IntersystemSONConfigurationTransfer_decode_aper; per_type_encoder_f S1AP_IntersystemSONConfigurationTransfer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.c b/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.c index 7cc582bf0a..1e44dee0b5 100644 --- a/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.c +++ b/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_KillAllWarningMessages.h" diff --git a/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.h b/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.h index 46cc2eb364..0e87991861 100644 --- a/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.h +++ b/lib/asn1c/s1ap/S1AP_KillAllWarningMessages.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_KillAllWarningMessages_H_ @@ -33,7 +33,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_KillAllWarningMessages_specs_1 asn_struct_free_f S1AP_KillAllWarningMessages_free; asn_struct_print_f S1AP_KillAllWarningMessages_print; asn_constr_check_f S1AP_KillAllWarningMessages_constraint; -jer_type_encoder_f S1AP_KillAllWarningMessages_encode_jer; per_type_decoder_f S1AP_KillAllWarningMessages_decode_aper; per_type_encoder_f S1AP_KillAllWarningMessages_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_KillRequest.c b/lib/asn1c/s1ap/S1AP_KillRequest.c index ee3e9ba66d..0070f861d0 100644 --- a/lib/asn1c/s1ap/S1AP_KillRequest.c +++ b/lib/asn1c/s1ap/S1AP_KillRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_KillRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_KillRequest.h b/lib/asn1c/s1ap/S1AP_KillRequest.h index a52645a64c..692b4a7407 100644 --- a/lib/asn1c/s1ap/S1AP_KillRequest.h +++ b/lib/asn1c/s1ap/S1AP_KillRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_KillRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_KillResponse.c b/lib/asn1c/s1ap/S1AP_KillResponse.c index 958e44d1a1..8d939c2ea3 100644 --- a/lib/asn1c/s1ap/S1AP_KillResponse.c +++ b/lib/asn1c/s1ap/S1AP_KillResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_KillResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_KillResponse.h b/lib/asn1c/s1ap/S1AP_KillResponse.h index e258c56b33..844c51a0e8 100644 --- a/lib/asn1c/s1ap/S1AP_KillResponse.h +++ b/lib/asn1c/s1ap/S1AP_KillResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_KillResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_L3-Information.c b/lib/asn1c/s1ap/S1AP_L3-Information.c index 8f1d23a6e5..04282ec5eb 100644 --- a/lib/asn1c/s1ap/S1AP_L3-Information.c +++ b/lib/asn1c/s1ap/S1AP_L3-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_L3-Information.h" diff --git a/lib/asn1c/s1ap/S1AP_L3-Information.h b/lib/asn1c/s1ap/S1AP_L3-Information.h index bbfe73acdb..62e7c6a38f 100644 --- a/lib/asn1c/s1ap/S1AP_L3-Information.h +++ b/lib/asn1c/s1ap/S1AP_L3-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_L3_Information_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_L3_Information; asn_struct_free_f S1AP_L3_Information_free; asn_struct_print_f S1AP_L3_Information_print; asn_constr_check_f S1AP_L3_Information_constraint; -jer_type_encoder_f S1AP_L3_Information_encode_jer; per_type_decoder_f S1AP_L3_Information_decode_aper; per_type_encoder_f S1AP_L3_Information_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LAC.c b/lib/asn1c/s1ap/S1AP_LAC.c index 06a79671b5..cda8b07812 100644 --- a/lib/asn1c/s1ap/S1AP_LAC.c +++ b/lib/asn1c/s1ap/S1AP_LAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LAC.h" diff --git a/lib/asn1c/s1ap/S1AP_LAC.h b/lib/asn1c/s1ap/S1AP_LAC.h index da80a841f9..329130d121 100644 --- a/lib/asn1c/s1ap/S1AP_LAC.h +++ b/lib/asn1c/s1ap/S1AP_LAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_LAC; asn_struct_free_f S1AP_LAC_free; asn_struct_print_f S1AP_LAC_print; asn_constr_check_f S1AP_LAC_constraint; -jer_type_encoder_f S1AP_LAC_encode_jer; per_type_decoder_f S1AP_LAC_decode_aper; per_type_encoder_f S1AP_LAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LAI.c b/lib/asn1c/s1ap/S1AP_LAI.c index 4f6d45468c..3ca82be3f9 100644 --- a/lib/asn1c/s1ap/S1AP_LAI.c +++ b/lib/asn1c/s1ap/S1AP_LAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LAI.h" diff --git a/lib/asn1c/s1ap/S1AP_LAI.h b/lib/asn1c/s1ap/S1AP_LAI.h index 9b3f4d490e..7aa1674f84 100644 --- a/lib/asn1c/s1ap/S1AP_LAI.h +++ b/lib/asn1c/s1ap/S1AP_LAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_LHN-ID.c b/lib/asn1c/s1ap/S1AP_LHN-ID.c index edd1fedb0e..e7fe465fdc 100644 --- a/lib/asn1c/s1ap/S1AP_LHN-ID.c +++ b/lib/asn1c/s1ap/S1AP_LHN-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LHN-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_LHN-ID.h b/lib/asn1c/s1ap/S1AP_LHN-ID.h index 50b88c6b64..ecf817bdaf 100644 --- a/lib/asn1c/s1ap/S1AP_LHN-ID.h +++ b/lib/asn1c/s1ap/S1AP_LHN-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LHN_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_LHN_ID; asn_struct_free_f S1AP_LHN_ID_free; asn_struct_print_f S1AP_LHN_ID_print; asn_constr_check_f S1AP_LHN_ID_constraint; -jer_type_encoder_f S1AP_LHN_ID_encode_jer; per_type_decoder_f S1AP_LHN_ID_decode_aper; per_type_encoder_f S1AP_LHN_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LPPa-PDU.c b/lib/asn1c/s1ap/S1AP_LPPa-PDU.c index 83e22d6089..286dce4021 100644 --- a/lib/asn1c/s1ap/S1AP_LPPa-PDU.c +++ b/lib/asn1c/s1ap/S1AP_LPPa-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LPPa-PDU.h" diff --git a/lib/asn1c/s1ap/S1AP_LPPa-PDU.h b/lib/asn1c/s1ap/S1AP_LPPa-PDU.h index 556e7efc3c..830a7f5471 100644 --- a/lib/asn1c/s1ap/S1AP_LPPa-PDU.h +++ b/lib/asn1c/s1ap/S1AP_LPPa-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LPPa_PDU_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_LPPa_PDU; asn_struct_free_f S1AP_LPPa_PDU_free; asn_struct_print_f S1AP_LPPa_PDU_print; asn_constr_check_f S1AP_LPPa_PDU_constraint; -jer_type_encoder_f S1AP_LPPa_PDU_encode_jer; per_type_decoder_f S1AP_LPPa_PDU_decode_aper; per_type_encoder_f S1AP_LPPa_PDU_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LTE-M-Indication.c b/lib/asn1c/s1ap/S1AP_LTE-M-Indication.c index 4aa5a18a70..19d2e9c9c2 100644 --- a/lib/asn1c/s1ap/S1AP_LTE-M-Indication.c +++ b/lib/asn1c/s1ap/S1AP_LTE-M-Indication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LTE-M-Indication.h" diff --git a/lib/asn1c/s1ap/S1AP_LTE-M-Indication.h b/lib/asn1c/s1ap/S1AP_LTE-M-Indication.h index 712b06dbef..12605d550c 100644 --- a/lib/asn1c/s1ap/S1AP_LTE-M-Indication.h +++ b/lib/asn1c/s1ap/S1AP_LTE-M-Indication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LTE_M_Indication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_LTE_M_Indication_specs_1; asn_struct_free_f S1AP_LTE_M_Indication_free; asn_struct_print_f S1AP_LTE_M_Indication_print; asn_constr_check_f S1AP_LTE_M_Indication_constraint; -jer_type_encoder_f S1AP_LTE_M_Indication_encode_jer; per_type_decoder_f S1AP_LTE_M_Indication_decode_aper; per_type_encoder_f S1AP_LTE_M_Indication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.c b/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.c index 859a3888ff..4e96c6f93b 100644 --- a/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.c +++ b/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LTE-NTN-TAI-Information.h" diff --git a/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.h b/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.h index 8d44697bb7..407c825323 100644 --- a/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.h +++ b/lib/asn1c/s1ap/S1AP_LTE-NTN-TAI-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LTE_NTN_TAI_Information_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.c b/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.c index a80eb14810..0e524ea673 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedCell-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.h b/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.h index 603dece3d2..d9bc7dfc6d 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedCell-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedCell_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.c b/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.c index 87157e033c..eeac28657b 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedEUTRANCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.h b/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.h index f4d8f0f5dd..b25c49bb04 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedEUTRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedEUTRANCellInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.c b/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.c index 66c7ec24ee..777f72b422 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedGERANCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.h b/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.h index 0bc34cefba..c0eb05f51b 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedGERANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedGERANCellInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.c b/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.c index 901e46430c..b4a0b0953b 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedNGRANCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.h b/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.h index 4ea92bf687..f177cf8c0f 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedNGRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedNGRANCellInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_LastVisitedNGRANCellInformation; asn_struct_free_f S1AP_LastVisitedNGRANCellInformation_free; asn_struct_print_f S1AP_LastVisitedNGRANCellInformation_print; asn_constr_check_f S1AP_LastVisitedNGRANCellInformation_constraint; -jer_type_encoder_f S1AP_LastVisitedNGRANCellInformation_encode_jer; per_type_decoder_f S1AP_LastVisitedNGRANCellInformation_decode_aper; per_type_encoder_f S1AP_LastVisitedNGRANCellInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.c b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.c index 090bd83966..7e022d6127 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedPSCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.h b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.h index 32c0031960..237a6d3025 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedPSCellInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.c b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.c index dd48afc362..bf64c12645 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedPSCellList.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.h b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.h index c06241dde4..1a6621140e 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedPSCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedPSCellList_H_ diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.c b/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.c index 25d1bf6949..8bc0b0412c 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LastVisitedUTRANCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.h b/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.h index b63cdeec0e..8a5d6fc203 100644 --- a/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_LastVisitedUTRANCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LastVisitedUTRANCellInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_LastVisitedUTRANCellInformation; asn_struct_free_f S1AP_LastVisitedUTRANCellInformation_free; asn_struct_print_f S1AP_LastVisitedUTRANCellInformation_print; asn_constr_check_f S1AP_LastVisitedUTRANCellInformation_constraint; -jer_type_encoder_f S1AP_LastVisitedUTRANCellInformation_encode_jer; per_type_decoder_f S1AP_LastVisitedUTRANCellInformation_decode_aper; per_type_encoder_f S1AP_LastVisitedUTRANCellInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Links-to-log.c b/lib/asn1c/s1ap/S1AP_Links-to-log.c index 728e6c3ae6..de7c1d5c4f 100644 --- a/lib/asn1c/s1ap/S1AP_Links-to-log.c +++ b/lib/asn1c/s1ap/S1AP_Links-to-log.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Links-to-log.h" diff --git a/lib/asn1c/s1ap/S1AP_Links-to-log.h b/lib/asn1c/s1ap/S1AP_Links-to-log.h index f1f9b14367..c3107880c1 100644 --- a/lib/asn1c/s1ap/S1AP_Links-to-log.h +++ b/lib/asn1c/s1ap/S1AP_Links-to-log.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Links_to_log_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Links_to_log_specs_1; asn_struct_free_f S1AP_Links_to_log_free; asn_struct_print_f S1AP_Links_to_log_print; asn_constr_check_f S1AP_Links_to_log_constraint; -jer_type_encoder_f S1AP_Links_to_log_encode_jer; per_type_decoder_f S1AP_Links_to_log_decode_aper; per_type_encoder_f S1AP_Links_to_log_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.c b/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.c index 6e6c8f771c..eff60483a8 100644 --- a/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.c +++ b/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ListeningSubframePattern.h" diff --git a/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.h b/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.h index 377f27717a..e40de6a877 100644 --- a/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.h +++ b/lib/asn1c/s1ap/S1AP_ListeningSubframePattern.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ListeningSubframePattern_H_ diff --git a/lib/asn1c/s1ap/S1AP_LocationReport.c b/lib/asn1c/s1ap/S1AP_LocationReport.c index 4616b21db4..9e61bd578c 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReport.c +++ b/lib/asn1c/s1ap/S1AP_LocationReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LocationReport.h" diff --git a/lib/asn1c/s1ap/S1AP_LocationReport.h b/lib/asn1c/s1ap/S1AP_LocationReport.h index 5b744c887c..2d4355078e 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReport.h +++ b/lib/asn1c/s1ap/S1AP_LocationReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LocationReport_H_ diff --git a/lib/asn1c/s1ap/S1AP_LocationReportingControl.c b/lib/asn1c/s1ap/S1AP_LocationReportingControl.c index b7729ab6e1..cb717c2d8d 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReportingControl.c +++ b/lib/asn1c/s1ap/S1AP_LocationReportingControl.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LocationReportingControl.h" diff --git a/lib/asn1c/s1ap/S1AP_LocationReportingControl.h b/lib/asn1c/s1ap/S1AP_LocationReportingControl.h index 6fc5cd5837..94ce8ef7c6 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReportingControl.h +++ b/lib/asn1c/s1ap/S1AP_LocationReportingControl.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LocationReportingControl_H_ diff --git a/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.c b/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.c index 1cea6a6c91..2906973e36 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.c +++ b/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LocationReportingFailureIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.h b/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.h index a9034383ab..ece84b9f11 100644 --- a/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.h +++ b/lib/asn1c/s1ap/S1AP_LocationReportingFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LocationReportingFailureIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.c b/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.c index 224e57a2e8..c11e39e1fb 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.c +++ b/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LoggedMBSFNMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.h b/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.h index 3c99014b58..cd55a6a16b 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.h +++ b/lib/asn1c/s1ap/S1AP_LoggedMBSFNMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LoggedMBSFNMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_LoggedMDT.c b/lib/asn1c/s1ap/S1AP_LoggedMDT.c index e36eda1f79..b7ef44fd3c 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMDT.c +++ b/lib/asn1c/s1ap/S1AP_LoggedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LoggedMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_LoggedMDT.h b/lib/asn1c/s1ap/S1AP_LoggedMDT.h index ab75b55814..463d7e12c4 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMDT.h +++ b/lib/asn1c/s1ap/S1AP_LoggedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LoggedMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.c b/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.c index 5620f621be..f9db525c10 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.c +++ b/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LoggedMDTTrigger.h" diff --git a/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.h b/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.h index 7f1bbcf6be..7c00ffa59c 100644 --- a/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.h +++ b/lib/asn1c/s1ap/S1AP_LoggedMDTTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LoggedMDTTrigger_H_ diff --git a/lib/asn1c/s1ap/S1AP_LoggingDuration.c b/lib/asn1c/s1ap/S1AP_LoggingDuration.c index 2f2dfb524a..caadffb25e 100644 --- a/lib/asn1c/s1ap/S1AP_LoggingDuration.c +++ b/lib/asn1c/s1ap/S1AP_LoggingDuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LoggingDuration.h" diff --git a/lib/asn1c/s1ap/S1AP_LoggingDuration.h b/lib/asn1c/s1ap/S1AP_LoggingDuration.h index 57f7b350b5..d7d37c0738 100644 --- a/lib/asn1c/s1ap/S1AP_LoggingDuration.h +++ b/lib/asn1c/s1ap/S1AP_LoggingDuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LoggingDuration_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_LoggingDuration_specs_1; asn_struct_free_f S1AP_LoggingDuration_free; asn_struct_print_f S1AP_LoggingDuration_print; asn_constr_check_f S1AP_LoggingDuration_constraint; -jer_type_encoder_f S1AP_LoggingDuration_encode_jer; per_type_decoder_f S1AP_LoggingDuration_decode_aper; per_type_encoder_f S1AP_LoggingDuration_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_LoggingInterval.c b/lib/asn1c/s1ap/S1AP_LoggingInterval.c index 43c9c09c30..2d3ef303f2 100644 --- a/lib/asn1c/s1ap/S1AP_LoggingInterval.c +++ b/lib/asn1c/s1ap/S1AP_LoggingInterval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_LoggingInterval.h" diff --git a/lib/asn1c/s1ap/S1AP_LoggingInterval.h b/lib/asn1c/s1ap/S1AP_LoggingInterval.h index 813000165a..d875332ac1 100644 --- a/lib/asn1c/s1ap/S1AP_LoggingInterval.h +++ b/lib/asn1c/s1ap/S1AP_LoggingInterval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_LoggingInterval_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_LoggingInterval_specs_1; asn_struct_free_f S1AP_LoggingInterval_free; asn_struct_print_f S1AP_LoggingInterval_print; asn_constr_check_f S1AP_LoggingInterval_constraint; -jer_type_encoder_f S1AP_LoggingInterval_encode_jer; per_type_decoder_f S1AP_LoggingInterval_decode_aper; per_type_encoder_f S1AP_LoggingInterval_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M-TMSI.c b/lib/asn1c/s1ap/S1AP_M-TMSI.c index ded865a4cb..6d09809aed 100644 --- a/lib/asn1c/s1ap/S1AP_M-TMSI.c +++ b/lib/asn1c/s1ap/S1AP_M-TMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M-TMSI.h" diff --git a/lib/asn1c/s1ap/S1AP_M-TMSI.h b/lib/asn1c/s1ap/S1AP_M-TMSI.h index 3ca7afcbf7..00355adf68 100644 --- a/lib/asn1c/s1ap/S1AP_M-TMSI.h +++ b/lib/asn1c/s1ap/S1AP_M-TMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M_TMSI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_M_TMSI; asn_struct_free_f S1AP_M_TMSI_free; asn_struct_print_f S1AP_M_TMSI_print; asn_constr_check_f S1AP_M_TMSI_constraint; -jer_type_encoder_f S1AP_M_TMSI_encode_jer; per_type_decoder_f S1AP_M_TMSI_decode_aper; per_type_encoder_f S1AP_M_TMSI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.c b/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.c index 8d7dda8ae8..9a123673fb 100644 --- a/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.c +++ b/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M1PeriodicReporting.h" diff --git a/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.h b/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.h index 320fb3fcc7..9498c67fdc 100644 --- a/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.h +++ b/lib/asn1c/s1ap/S1AP_M1PeriodicReporting.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M1PeriodicReporting_H_ diff --git a/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.c b/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.c index fc2d418978..82a557fc8d 100644 --- a/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.c +++ b/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M1ReportingTrigger.h" diff --git a/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.h b/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.h index 57e1aa9153..88222a7fd6 100644 --- a/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.h +++ b/lib/asn1c/s1ap/S1AP_M1ReportingTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M1ReportingTrigger_H_ @@ -38,7 +38,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M1ReportingTrigger_specs_1; asn_struct_free_f S1AP_M1ReportingTrigger_free; asn_struct_print_f S1AP_M1ReportingTrigger_print; asn_constr_check_f S1AP_M1ReportingTrigger_constraint; -jer_type_encoder_f S1AP_M1ReportingTrigger_encode_jer; per_type_decoder_f S1AP_M1ReportingTrigger_decode_aper; per_type_encoder_f S1AP_M1ReportingTrigger_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.c b/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.c index 60ed1f05bc..b6042eafe6 100644 --- a/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.c +++ b/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M1ThresholdEventA2.h" diff --git a/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.h b/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.h index 877f86083b..4281278550 100644 --- a/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.h +++ b/lib/asn1c/s1ap/S1AP_M1ThresholdEventA2.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M1ThresholdEventA2_H_ diff --git a/lib/asn1c/s1ap/S1AP_M3Configuration.c b/lib/asn1c/s1ap/S1AP_M3Configuration.c index 8db376aa3c..910c50d35b 100644 --- a/lib/asn1c/s1ap/S1AP_M3Configuration.c +++ b/lib/asn1c/s1ap/S1AP_M3Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M3Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_M3Configuration.h b/lib/asn1c/s1ap/S1AP_M3Configuration.h index f2db08affe..7995d5960b 100644 --- a/lib/asn1c/s1ap/S1AP_M3Configuration.h +++ b/lib/asn1c/s1ap/S1AP_M3Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M3Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_M3period.c b/lib/asn1c/s1ap/S1AP_M3period.c index f39c03186f..d2c49820ee 100644 --- a/lib/asn1c/s1ap/S1AP_M3period.c +++ b/lib/asn1c/s1ap/S1AP_M3period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M3period.h" diff --git a/lib/asn1c/s1ap/S1AP_M3period.h b/lib/asn1c/s1ap/S1AP_M3period.h index 3cb3743fe5..c7263dd396 100644 --- a/lib/asn1c/s1ap/S1AP_M3period.h +++ b/lib/asn1c/s1ap/S1AP_M3period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M3period_H_ @@ -45,7 +45,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M3period_specs_1; asn_struct_free_f S1AP_M3period_free; asn_struct_print_f S1AP_M3period_print; asn_constr_check_f S1AP_M3period_constraint; -jer_type_encoder_f S1AP_M3period_encode_jer; per_type_decoder_f S1AP_M3period_decode_aper; per_type_encoder_f S1AP_M3period_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M4Configuration.c b/lib/asn1c/s1ap/S1AP_M4Configuration.c index 0b469cc610..fe30a3ff3b 100644 --- a/lib/asn1c/s1ap/S1AP_M4Configuration.c +++ b/lib/asn1c/s1ap/S1AP_M4Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M4Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_M4Configuration.h b/lib/asn1c/s1ap/S1AP_M4Configuration.h index d24efd6d68..b3e490fdd7 100644 --- a/lib/asn1c/s1ap/S1AP_M4Configuration.h +++ b/lib/asn1c/s1ap/S1AP_M4Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M4Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_M4period.c b/lib/asn1c/s1ap/S1AP_M4period.c index 025e6ad9b1..95cd322f8e 100644 --- a/lib/asn1c/s1ap/S1AP_M4period.c +++ b/lib/asn1c/s1ap/S1AP_M4period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M4period.h" diff --git a/lib/asn1c/s1ap/S1AP_M4period.h b/lib/asn1c/s1ap/S1AP_M4period.h index de12dcb4b4..1030c87878 100644 --- a/lib/asn1c/s1ap/S1AP_M4period.h +++ b/lib/asn1c/s1ap/S1AP_M4period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M4period_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M4period_specs_1; asn_struct_free_f S1AP_M4period_free; asn_struct_print_f S1AP_M4period_print; asn_constr_check_f S1AP_M4period_constraint; -jer_type_encoder_f S1AP_M4period_encode_jer; per_type_decoder_f S1AP_M4period_decode_aper; per_type_encoder_f S1AP_M4period_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M5Configuration.c b/lib/asn1c/s1ap/S1AP_M5Configuration.c index 1e2ebeb2e2..b368d0ee14 100644 --- a/lib/asn1c/s1ap/S1AP_M5Configuration.c +++ b/lib/asn1c/s1ap/S1AP_M5Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M5Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_M5Configuration.h b/lib/asn1c/s1ap/S1AP_M5Configuration.h index f2fd72eb06..ed7178a7e3 100644 --- a/lib/asn1c/s1ap/S1AP_M5Configuration.h +++ b/lib/asn1c/s1ap/S1AP_M5Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M5Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_M5period.c b/lib/asn1c/s1ap/S1AP_M5period.c index a3cd91bd13..4e4973f90d 100644 --- a/lib/asn1c/s1ap/S1AP_M5period.c +++ b/lib/asn1c/s1ap/S1AP_M5period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M5period.h" diff --git a/lib/asn1c/s1ap/S1AP_M5period.h b/lib/asn1c/s1ap/S1AP_M5period.h index 6d214b4e80..451f71f246 100644 --- a/lib/asn1c/s1ap/S1AP_M5period.h +++ b/lib/asn1c/s1ap/S1AP_M5period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M5period_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M5period_specs_1; asn_struct_free_f S1AP_M5period_free; asn_struct_print_f S1AP_M5period_print; asn_constr_check_f S1AP_M5period_constraint; -jer_type_encoder_f S1AP_M5period_encode_jer; per_type_decoder_f S1AP_M5period_decode_aper; per_type_encoder_f S1AP_M5period_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M6Configuration.c b/lib/asn1c/s1ap/S1AP_M6Configuration.c index bc4e9d9fad..050f3fb688 100644 --- a/lib/asn1c/s1ap/S1AP_M6Configuration.c +++ b/lib/asn1c/s1ap/S1AP_M6Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M6Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_M6Configuration.h b/lib/asn1c/s1ap/S1AP_M6Configuration.h index b971451374..566757e83b 100644 --- a/lib/asn1c/s1ap/S1AP_M6Configuration.h +++ b/lib/asn1c/s1ap/S1AP_M6Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M6Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_M6delay-threshold.c b/lib/asn1c/s1ap/S1AP_M6delay-threshold.c index 1003dda6da..199d10e5aa 100644 --- a/lib/asn1c/s1ap/S1AP_M6delay-threshold.c +++ b/lib/asn1c/s1ap/S1AP_M6delay-threshold.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M6delay-threshold.h" diff --git a/lib/asn1c/s1ap/S1AP_M6delay-threshold.h b/lib/asn1c/s1ap/S1AP_M6delay-threshold.h index 1af0dae3b9..0b92e866b8 100644 --- a/lib/asn1c/s1ap/S1AP_M6delay-threshold.h +++ b/lib/asn1c/s1ap/S1AP_M6delay-threshold.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M6delay_threshold_H_ @@ -47,7 +47,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M6delay_threshold_specs_1; asn_struct_free_f S1AP_M6delay_threshold_free; asn_struct_print_f S1AP_M6delay_threshold_print; asn_constr_check_f S1AP_M6delay_threshold_constraint; -jer_type_encoder_f S1AP_M6delay_threshold_encode_jer; per_type_decoder_f S1AP_M6delay_threshold_decode_aper; per_type_encoder_f S1AP_M6delay_threshold_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M6report-Interval.c b/lib/asn1c/s1ap/S1AP_M6report-Interval.c index 872c8c8e42..b8f7b3bed3 100644 --- a/lib/asn1c/s1ap/S1AP_M6report-Interval.c +++ b/lib/asn1c/s1ap/S1AP_M6report-Interval.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M6report-Interval.h" diff --git a/lib/asn1c/s1ap/S1AP_M6report-Interval.h b/lib/asn1c/s1ap/S1AP_M6report-Interval.h index 414ac34aef..baad88772e 100644 --- a/lib/asn1c/s1ap/S1AP_M6report-Interval.h +++ b/lib/asn1c/s1ap/S1AP_M6report-Interval.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M6report_Interval_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_M6report_Interval_specs_1; asn_struct_free_f S1AP_M6report_Interval_free; asn_struct_print_f S1AP_M6report_Interval_print; asn_constr_check_f S1AP_M6report_Interval_constraint; -jer_type_encoder_f S1AP_M6report_Interval_encode_jer; per_type_decoder_f S1AP_M6report_Interval_decode_aper; per_type_encoder_f S1AP_M6report_Interval_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_M7Configuration.c b/lib/asn1c/s1ap/S1AP_M7Configuration.c index 578f0b858c..17506c3f60 100644 --- a/lib/asn1c/s1ap/S1AP_M7Configuration.c +++ b/lib/asn1c/s1ap/S1AP_M7Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M7Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_M7Configuration.h b/lib/asn1c/s1ap/S1AP_M7Configuration.h index 9207b55326..0d6789c98b 100644 --- a/lib/asn1c/s1ap/S1AP_M7Configuration.h +++ b/lib/asn1c/s1ap/S1AP_M7Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M7Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_M7period.c b/lib/asn1c/s1ap/S1AP_M7period.c index a5e4619e96..130fb447d9 100644 --- a/lib/asn1c/s1ap/S1AP_M7period.c +++ b/lib/asn1c/s1ap/S1AP_M7period.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_M7period.h" diff --git a/lib/asn1c/s1ap/S1AP_M7period.h b/lib/asn1c/s1ap/S1AP_M7period.h index d0ab309080..caa751f650 100644 --- a/lib/asn1c/s1ap/S1AP_M7period.h +++ b/lib/asn1c/s1ap/S1AP_M7period.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_M7period_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_M7period; asn_struct_free_f S1AP_M7period_free; asn_struct_print_f S1AP_M7period_print; asn_constr_check_f S1AP_M7period_constraint; -jer_type_encoder_f S1AP_M7period_encode_jer; per_type_decoder_f S1AP_M7period_decode_aper; per_type_encoder_f S1AP_M7period_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.c b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.c index 8ce805588e..87f724fcdd 100644 --- a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.c +++ b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MBSFN-ResultToLog.h" diff --git a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.h b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.h index 057cfbe4a3..c9c6954a92 100644 --- a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.h +++ b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLog.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MBSFN_ResultToLog_H_ diff --git a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.c b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.c index 6cd689c3d7..241e58313a 100644 --- a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.c +++ b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MBSFN-ResultToLogInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.h b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.h index 1788e70ae1..592c1aa06e 100644 --- a/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.h +++ b/lib/asn1c/s1ap/S1AP_MBSFN-ResultToLogInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MBSFN_ResultToLogInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_MDT-Activation.c b/lib/asn1c/s1ap/S1AP_MDT-Activation.c index d25e689e91..0cd7182d3a 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Activation.c +++ b/lib/asn1c/s1ap/S1AP_MDT-Activation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDT-Activation.h" diff --git a/lib/asn1c/s1ap/S1AP_MDT-Activation.h b/lib/asn1c/s1ap/S1AP_MDT-Activation.h index 9eaae257ed..f2e3338d18 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Activation.h +++ b/lib/asn1c/s1ap/S1AP_MDT-Activation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDT_Activation_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_MDT_Activation_specs_1; asn_struct_free_f S1AP_MDT_Activation_free; asn_struct_print_f S1AP_MDT_Activation_print; asn_constr_check_f S1AP_MDT_Activation_constraint; -jer_type_encoder_f S1AP_MDT_Activation_encode_jer; per_type_decoder_f S1AP_MDT_Activation_decode_aper; per_type_encoder_f S1AP_MDT_Activation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MDT-Configuration.c b/lib/asn1c/s1ap/S1AP_MDT-Configuration.c index 59cb96eb1a..bd506a1e7c 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Configuration.c +++ b/lib/asn1c/s1ap/S1AP_MDT-Configuration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDT-Configuration.h" diff --git a/lib/asn1c/s1ap/S1AP_MDT-Configuration.h b/lib/asn1c/s1ap/S1AP_MDT-Configuration.h index 9e847c4a9a..8623b862ee 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Configuration.h +++ b/lib/asn1c/s1ap/S1AP_MDT-Configuration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDT_Configuration_H_ diff --git a/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.c b/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.c index 7bf13fa451..5f74c06480 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.c +++ b/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDT-ConfigurationNR.h" diff --git a/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.h b/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.h index 9ffe33b471..024afa89d3 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.h +++ b/lib/asn1c/s1ap/S1AP_MDT-ConfigurationNR.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDT_ConfigurationNR_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MDT_ConfigurationNR; asn_struct_free_f S1AP_MDT_ConfigurationNR_free; asn_struct_print_f S1AP_MDT_ConfigurationNR_print; asn_constr_check_f S1AP_MDT_ConfigurationNR_constraint; -jer_type_encoder_f S1AP_MDT_ConfigurationNR_encode_jer; per_type_decoder_f S1AP_MDT_ConfigurationNR_decode_aper; per_type_encoder_f S1AP_MDT_ConfigurationNR_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MDT-Location-Info.c b/lib/asn1c/s1ap/S1AP_MDT-Location-Info.c index 10883bca01..5e1b0dd6ea 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Location-Info.c +++ b/lib/asn1c/s1ap/S1AP_MDT-Location-Info.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDT-Location-Info.h" diff --git a/lib/asn1c/s1ap/S1AP_MDT-Location-Info.h b/lib/asn1c/s1ap/S1AP_MDT-Location-Info.h index 7e96662dfc..daa2e06061 100644 --- a/lib/asn1c/s1ap/S1AP_MDT-Location-Info.h +++ b/lib/asn1c/s1ap/S1AP_MDT-Location-Info.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDT_Location_Info_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MDT_Location_Info; asn_struct_free_f S1AP_MDT_Location_Info_free; asn_struct_print_f S1AP_MDT_Location_Info_print; asn_constr_check_f S1AP_MDT_Location_Info_constraint; -jer_type_encoder_f S1AP_MDT_Location_Info_encode_jer; per_type_decoder_f S1AP_MDT_Location_Info_decode_aper; per_type_encoder_f S1AP_MDT_Location_Info_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MDTMode-Extension.c b/lib/asn1c/s1ap/S1AP_MDTMode-Extension.c index e21425047d..91f5d99c6f 100644 --- a/lib/asn1c/s1ap/S1AP_MDTMode-Extension.c +++ b/lib/asn1c/s1ap/S1AP_MDTMode-Extension.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDTMode-Extension.h" diff --git a/lib/asn1c/s1ap/S1AP_MDTMode-Extension.h b/lib/asn1c/s1ap/S1AP_MDTMode-Extension.h index 7f3cdcd640..dce95f3649 100644 --- a/lib/asn1c/s1ap/S1AP_MDTMode-Extension.h +++ b/lib/asn1c/s1ap/S1AP_MDTMode-Extension.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDTMode_Extension_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MDTMode_Extension; asn_struct_free_f S1AP_MDTMode_Extension_free; asn_struct_print_f S1AP_MDTMode_Extension_print; asn_constr_check_f S1AP_MDTMode_Extension_constraint; -jer_type_encoder_f S1AP_MDTMode_Extension_encode_jer; per_type_decoder_f S1AP_MDTMode_Extension_decode_aper; per_type_encoder_f S1AP_MDTMode_Extension_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MDTMode.c b/lib/asn1c/s1ap/S1AP_MDTMode.c index 5a1e18fa97..51ee1f5dc6 100644 --- a/lib/asn1c/s1ap/S1AP_MDTMode.c +++ b/lib/asn1c/s1ap/S1AP_MDTMode.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDTMode.h" diff --git a/lib/asn1c/s1ap/S1AP_MDTMode.h b/lib/asn1c/s1ap/S1AP_MDTMode.h index 978b85624b..285d832178 100644 --- a/lib/asn1c/s1ap/S1AP_MDTMode.h +++ b/lib/asn1c/s1ap/S1AP_MDTMode.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDTMode_H_ diff --git a/lib/asn1c/s1ap/S1AP_MDTPLMNList.c b/lib/asn1c/s1ap/S1AP_MDTPLMNList.c index 4a15c84ecc..ac82eb90cc 100644 --- a/lib/asn1c/s1ap/S1AP_MDTPLMNList.c +++ b/lib/asn1c/s1ap/S1AP_MDTPLMNList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MDTPLMNList.h" diff --git a/lib/asn1c/s1ap/S1AP_MDTPLMNList.h b/lib/asn1c/s1ap/S1AP_MDTPLMNList.h index 8c1b73753d..4f0e04d674 100644 --- a/lib/asn1c/s1ap/S1AP_MDTPLMNList.h +++ b/lib/asn1c/s1ap/S1AP_MDTPLMNList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MDTPLMNList_H_ diff --git a/lib/asn1c/s1ap/S1AP_MME-Code.c b/lib/asn1c/s1ap/S1AP_MME-Code.c index 4fdef61edb..30f107b92f 100644 --- a/lib/asn1c/s1ap/S1AP_MME-Code.c +++ b/lib/asn1c/s1ap/S1AP_MME-Code.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MME-Code.h" diff --git a/lib/asn1c/s1ap/S1AP_MME-Code.h b/lib/asn1c/s1ap/S1AP_MME-Code.h index 283e182610..71bff76895 100644 --- a/lib/asn1c/s1ap/S1AP_MME-Code.h +++ b/lib/asn1c/s1ap/S1AP_MME-Code.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MME_Code_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MME_Code; asn_struct_free_f S1AP_MME_Code_free; asn_struct_print_f S1AP_MME_Code_print; asn_constr_check_f S1AP_MME_Code_constraint; -jer_type_encoder_f S1AP_MME_Code_encode_jer; per_type_decoder_f S1AP_MME_Code_decode_aper; per_type_encoder_f S1AP_MME_Code_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MME-Group-ID.c b/lib/asn1c/s1ap/S1AP_MME-Group-ID.c index 82d42c6d0f..7f6b608471 100644 --- a/lib/asn1c/s1ap/S1AP_MME-Group-ID.c +++ b/lib/asn1c/s1ap/S1AP_MME-Group-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MME-Group-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_MME-Group-ID.h b/lib/asn1c/s1ap/S1AP_MME-Group-ID.h index c76cfe68d3..6666114b46 100644 --- a/lib/asn1c/s1ap/S1AP_MME-Group-ID.h +++ b/lib/asn1c/s1ap/S1AP_MME-Group-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MME_Group_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MME_Group_ID; asn_struct_free_f S1AP_MME_Group_ID_free; asn_struct_print_f S1AP_MME_Group_ID_print; asn_constr_check_f S1AP_MME_Group_ID_constraint; -jer_type_encoder_f S1AP_MME_Group_ID_encode_jer; per_type_decoder_f S1AP_MME_Group_ID_decode_aper; per_type_encoder_f S1AP_MME_Group_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.c b/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.c index eff81eaa34..e348351205 100644 --- a/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.c +++ b/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MME-UE-S1AP-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.h b/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.h index d29624cf8d..8e05efabe5 100644 --- a/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.h +++ b/lib/asn1c/s1ap/S1AP_MME-UE-S1AP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MME_UE_S1AP_ID_H_ @@ -28,7 +28,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_MME_UE_S1AP_ID_specs_1; asn_struct_free_f S1AP_MME_UE_S1AP_ID_free; asn_struct_print_f S1AP_MME_UE_S1AP_ID_print; asn_constr_check_f S1AP_MME_UE_S1AP_ID_constraint; -jer_type_encoder_f S1AP_MME_UE_S1AP_ID_encode_jer; per_type_decoder_f S1AP_MME_UE_S1AP_ID_decode_aper; per_type_encoder_f S1AP_MME_UE_S1AP_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.c b/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.c index 4ab596959a..7d0c9ccd1d 100644 --- a/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.c +++ b/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMECPRelocationIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.h b/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.h index 1cd84e8c0d..d5f33fc806 100644 --- a/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.h +++ b/lib/asn1c/s1ap/S1AP_MMECPRelocationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMECPRelocationIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.c b/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.c index d108c497e9..6e93a7b929 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEConfigurationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.h b/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.h index 3e7bcde403..1a631524c9 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEConfigurationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.c b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.c index 431f4b81f6..813f970083 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.c +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEConfigurationUpdate.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.h b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.h index edde7130ad..a8302a7fe5 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.h +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEConfigurationUpdate_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.c b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.c index 7a8e03397a..aa8ed5abf0 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEConfigurationUpdateAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.h b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.h index 2716a069ea..d8c71ebdc8 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEConfigurationUpdateAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.c b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.c index f60cccbfbf..844b5eb6d2 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.c +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEConfigurationUpdateFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.h b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.h index 31b1e96c91..8f92c53419 100644 --- a/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.h +++ b/lib/asn1c/s1ap/S1AP_MMEConfigurationUpdateFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEConfigurationUpdateFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.c b/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.c index c4fd921a85..1b5ac36607 100644 --- a/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEDirectInformationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.h b/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.h index 7e7b45a2bd..b017433a31 100644 --- a/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_MMEDirectInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEDirectInformationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.c b/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.c index d860326757..3fc759603a 100644 --- a/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.c +++ b/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEEarlyStatusTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.h b/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.h index 4ca9c94a37..0022e813a4 100644 --- a/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.h +++ b/lib/asn1c/s1ap/S1AP_MMEEarlyStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEEarlyStatusTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEPagingTarget.c b/lib/asn1c/s1ap/S1AP_MMEPagingTarget.c index 13e6ecc6a7..1f001e6d67 100644 --- a/lib/asn1c/s1ap/S1AP_MMEPagingTarget.c +++ b/lib/asn1c/s1ap/S1AP_MMEPagingTarget.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEPagingTarget.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEPagingTarget.h b/lib/asn1c/s1ap/S1AP_MMEPagingTarget.h index 7735584d14..980d79a7f1 100644 --- a/lib/asn1c/s1ap/S1AP_MMEPagingTarget.h +++ b/lib/asn1c/s1ap/S1AP_MMEPagingTarget.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEPagingTarget_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.c b/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.c index eb245fe6ac..7c176a23fa 100644 --- a/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.c +++ b/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMERelaySupportIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.h b/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.h index 76a447807e..2fd8fe5721 100644 --- a/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.h +++ b/lib/asn1c/s1ap/S1AP_MMERelaySupportIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMERelaySupportIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_MMERelaySupportIndicator_specs asn_struct_free_f S1AP_MMERelaySupportIndicator_free; asn_struct_print_f S1AP_MMERelaySupportIndicator_print; asn_constr_check_f S1AP_MMERelaySupportIndicator_constraint; -jer_type_encoder_f S1AP_MMERelaySupportIndicator_encode_jer; per_type_decoder_f S1AP_MMERelaySupportIndicator_decode_aper; per_type_encoder_f S1AP_MMERelaySupportIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.c b/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.c index 066b4bddda..3f7edec65b 100644 --- a/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.c +++ b/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEStatusTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.h b/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.h index 6d5670af31..07b116372e 100644 --- a/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.h +++ b/lib/asn1c/s1ap/S1AP_MMEStatusTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEStatusTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_MMEname.c b/lib/asn1c/s1ap/S1AP_MMEname.c index 11c38bd458..2e8be4f8ac 100644 --- a/lib/asn1c/s1ap/S1AP_MMEname.c +++ b/lib/asn1c/s1ap/S1AP_MMEname.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MMEname.h" diff --git a/lib/asn1c/s1ap/S1AP_MMEname.h b/lib/asn1c/s1ap/S1AP_MMEname.h index c12ec1caf3..4b8caa084f 100644 --- a/lib/asn1c/s1ap/S1AP_MMEname.h +++ b/lib/asn1c/s1ap/S1AP_MMEname.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MMEname_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MMEname; asn_struct_free_f S1AP_MMEname_free; asn_struct_print_f S1AP_MMEname_print; asn_constr_check_f S1AP_MMEname_constraint; -jer_type_encoder_f S1AP_MMEname_encode_jer; per_type_decoder_f S1AP_MMEname_decode_aper; per_type_encoder_f S1AP_MMEname_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MSClassmark2.c b/lib/asn1c/s1ap/S1AP_MSClassmark2.c index 2d83b60ac3..db73ea5ff8 100644 --- a/lib/asn1c/s1ap/S1AP_MSClassmark2.c +++ b/lib/asn1c/s1ap/S1AP_MSClassmark2.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MSClassmark2.h" diff --git a/lib/asn1c/s1ap/S1AP_MSClassmark2.h b/lib/asn1c/s1ap/S1AP_MSClassmark2.h index 902d36c1be..e2800f6bdc 100644 --- a/lib/asn1c/s1ap/S1AP_MSClassmark2.h +++ b/lib/asn1c/s1ap/S1AP_MSClassmark2.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MSClassmark2_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MSClassmark2; asn_struct_free_f S1AP_MSClassmark2_free; asn_struct_print_f S1AP_MSClassmark2_print; asn_constr_check_f S1AP_MSClassmark2_constraint; -jer_type_encoder_f S1AP_MSClassmark2_encode_jer; per_type_decoder_f S1AP_MSClassmark2_decode_aper; per_type_encoder_f S1AP_MSClassmark2_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MSClassmark3.c b/lib/asn1c/s1ap/S1AP_MSClassmark3.c index 3e25e8bbf5..030ed1fd7e 100644 --- a/lib/asn1c/s1ap/S1AP_MSClassmark3.c +++ b/lib/asn1c/s1ap/S1AP_MSClassmark3.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MSClassmark3.h" diff --git a/lib/asn1c/s1ap/S1AP_MSClassmark3.h b/lib/asn1c/s1ap/S1AP_MSClassmark3.h index 15d57f3be8..edb6c75932 100644 --- a/lib/asn1c/s1ap/S1AP_MSClassmark3.h +++ b/lib/asn1c/s1ap/S1AP_MSClassmark3.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MSClassmark3_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MSClassmark3; asn_struct_free_f S1AP_MSClassmark3_free; asn_struct_print_f S1AP_MSClassmark3_print; asn_constr_check_f S1AP_MSClassmark3_constraint; -jer_type_encoder_f S1AP_MSClassmark3_encode_jer; per_type_decoder_f S1AP_MSClassmark3_decode_aper; per_type_encoder_f S1AP_MSClassmark3_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.c b/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.c index e1d21ee7ed..b84e4f6004 100644 --- a/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.c +++ b/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ManagementBasedMDTAllowed.h" diff --git a/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.h b/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.h index 57bf77b7a5..78d0bcf58c 100644 --- a/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.h +++ b/lib/asn1c/s1ap/S1AP_ManagementBasedMDTAllowed.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ManagementBasedMDTAllowed_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ManagementBasedMDTAllowed_spec asn_struct_free_f S1AP_ManagementBasedMDTAllowed_free; asn_struct_print_f S1AP_ManagementBasedMDTAllowed_print; asn_constr_check_f S1AP_ManagementBasedMDTAllowed_constraint; -jer_type_encoder_f S1AP_ManagementBasedMDTAllowed_encode_jer; per_type_decoder_f S1AP_ManagementBasedMDTAllowed_decode_aper; per_type_encoder_f S1AP_ManagementBasedMDTAllowed_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Masked-IMEISV.c b/lib/asn1c/s1ap/S1AP_Masked-IMEISV.c index 9fd97689e0..5afec4785e 100644 --- a/lib/asn1c/s1ap/S1AP_Masked-IMEISV.c +++ b/lib/asn1c/s1ap/S1AP_Masked-IMEISV.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Masked-IMEISV.h" diff --git a/lib/asn1c/s1ap/S1AP_Masked-IMEISV.h b/lib/asn1c/s1ap/S1AP_Masked-IMEISV.h index 653beb8d96..ce580b3e1d 100644 --- a/lib/asn1c/s1ap/S1AP_Masked-IMEISV.h +++ b/lib/asn1c/s1ap/S1AP_Masked-IMEISV.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Masked_IMEISV_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Masked_IMEISV; asn_struct_free_f S1AP_Masked_IMEISV_free; asn_struct_print_f S1AP_Masked_IMEISV_print; asn_constr_check_f S1AP_Masked_IMEISV_constraint; -jer_type_encoder_f S1AP_Masked_IMEISV_encode_jer; per_type_decoder_f S1AP_Masked_IMEISV_decode_aper; per_type_encoder_f S1AP_Masked_IMEISV_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.c b/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.c index 22accfcc31..2f90d2d11a 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.c +++ b/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MeasurementThresholdA2.h" diff --git a/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.h b/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.h index b99b07bfaa..75d8d0024d 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.h +++ b/lib/asn1c/s1ap/S1AP_MeasurementThresholdA2.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MeasurementThresholdA2_H_ diff --git a/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.c b/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.c index 8ae674ae1a..3506c8a2b1 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.c +++ b/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MeasurementThresholdL1LoggedMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.h b/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.h index e5dc2c9301..6e71f13e08 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.h +++ b/lib/asn1c/s1ap/S1AP_MeasurementThresholdL1LoggedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MeasurementThresholdL1LoggedMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.c b/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.c index 8385648295..ffc01cc50b 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.c +++ b/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MeasurementsToActivate.h" diff --git a/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.h b/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.h index 0b97abc1f4..5210dd5d87 100644 --- a/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.h +++ b/lib/asn1c/s1ap/S1AP_MeasurementsToActivate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MeasurementsToActivate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MeasurementsToActivate; asn_struct_free_f S1AP_MeasurementsToActivate_free; asn_struct_print_f S1AP_MeasurementsToActivate_print; asn_constr_check_f S1AP_MeasurementsToActivate_constraint; -jer_type_encoder_f S1AP_MeasurementsToActivate_encode_jer; per_type_decoder_f S1AP_MeasurementsToActivate_decode_aper; per_type_encoder_f S1AP_MeasurementsToActivate_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MessageIdentifier.c b/lib/asn1c/s1ap/S1AP_MessageIdentifier.c index 37ed18fedd..9f3b42eb7a 100644 --- a/lib/asn1c/s1ap/S1AP_MessageIdentifier.c +++ b/lib/asn1c/s1ap/S1AP_MessageIdentifier.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MessageIdentifier.h" diff --git a/lib/asn1c/s1ap/S1AP_MessageIdentifier.h b/lib/asn1c/s1ap/S1AP_MessageIdentifier.h index 50360ffeec..1e28851bfd 100644 --- a/lib/asn1c/s1ap/S1AP_MessageIdentifier.h +++ b/lib/asn1c/s1ap/S1AP_MessageIdentifier.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MessageIdentifier_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MessageIdentifier; asn_struct_free_f S1AP_MessageIdentifier_free; asn_struct_print_f S1AP_MessageIdentifier_print; asn_constr_check_f S1AP_MessageIdentifier_constraint; -jer_type_encoder_f S1AP_MessageIdentifier_encode_jer; per_type_decoder_f S1AP_MessageIdentifier_decode_aper; per_type_encoder_f S1AP_MessageIdentifier_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MobilityInformation.c b/lib/asn1c/s1ap/S1AP_MobilityInformation.c index 735c771736..5d4da2ce42 100644 --- a/lib/asn1c/s1ap/S1AP_MobilityInformation.c +++ b/lib/asn1c/s1ap/S1AP_MobilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MobilityInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_MobilityInformation.h b/lib/asn1c/s1ap/S1AP_MobilityInformation.h index 354ae696be..22373de7c7 100644 --- a/lib/asn1c/s1ap/S1AP_MobilityInformation.h +++ b/lib/asn1c/s1ap/S1AP_MobilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MobilityInformation_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_MobilityInformation; asn_struct_free_f S1AP_MobilityInformation_free; asn_struct_print_f S1AP_MobilityInformation_print; asn_constr_check_f S1AP_MobilityInformation_constraint; -jer_type_encoder_f S1AP_MobilityInformation_encode_jer; per_type_decoder_f S1AP_MobilityInformation_decode_aper; per_type_encoder_f S1AP_MobilityInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.c b/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.c index 0e5097510f..81bfd51d72 100644 --- a/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.c +++ b/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MutingAvailabilityIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.h b/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.h index 4d0cb6f07a..7c13fd24ec 100644 --- a/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.h +++ b/lib/asn1c/s1ap/S1AP_MutingAvailabilityIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MutingAvailabilityIndication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_MutingAvailabilityIndication_s asn_struct_free_f S1AP_MutingAvailabilityIndication_free; asn_struct_print_f S1AP_MutingAvailabilityIndication_print; asn_constr_check_f S1AP_MutingAvailabilityIndication_constraint; -jer_type_encoder_f S1AP_MutingAvailabilityIndication_encode_jer; per_type_decoder_f S1AP_MutingAvailabilityIndication_decode_aper; per_type_encoder_f S1AP_MutingAvailabilityIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_MutingPatternInformation.c b/lib/asn1c/s1ap/S1AP_MutingPatternInformation.c index 175c56ba41..1e784dd738 100644 --- a/lib/asn1c/s1ap/S1AP_MutingPatternInformation.c +++ b/lib/asn1c/s1ap/S1AP_MutingPatternInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_MutingPatternInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_MutingPatternInformation.h b/lib/asn1c/s1ap/S1AP_MutingPatternInformation.h index 57525373c4..189f37a92e 100644 --- a/lib/asn1c/s1ap/S1AP_MutingPatternInformation.h +++ b/lib/asn1c/s1ap/S1AP_MutingPatternInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_MutingPatternInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_NAS-PDU.c b/lib/asn1c/s1ap/S1AP_NAS-PDU.c index 918ebb3856..9896c87ecc 100644 --- a/lib/asn1c/s1ap/S1AP_NAS-PDU.c +++ b/lib/asn1c/s1ap/S1AP_NAS-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NAS-PDU.h" diff --git a/lib/asn1c/s1ap/S1AP_NAS-PDU.h b/lib/asn1c/s1ap/S1AP_NAS-PDU.h index dcfbfa3d2a..131592bf94 100644 --- a/lib/asn1c/s1ap/S1AP_NAS-PDU.h +++ b/lib/asn1c/s1ap/S1AP_NAS-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NAS_PDU_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NAS_PDU; asn_struct_free_f S1AP_NAS_PDU_free; asn_struct_print_f S1AP_NAS_PDU_print; asn_constr_check_f S1AP_NAS_PDU_constraint; -jer_type_encoder_f S1AP_NAS_PDU_encode_jer; per_type_decoder_f S1AP_NAS_PDU_decode_aper; per_type_encoder_f S1AP_NAS_PDU_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.c b/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.c index 679662da43..bf8a76f374 100644 --- a/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.c +++ b/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NASDeliveryIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.h b/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.h index b3b32b8141..bf7ed875e4 100644 --- a/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.h +++ b/lib/asn1c/s1ap/S1AP_NASDeliveryIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NASDeliveryIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.c b/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.c index 195e1d8301..ca8704824c 100644 --- a/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.c +++ b/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NASNonDeliveryIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.h b/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.h index 83374601fa..83edd2e29d 100644 --- a/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.h +++ b/lib/asn1c/s1ap/S1AP_NASNonDeliveryIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NASNonDeliveryIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.c b/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.c index 6c65159671..34b4865f5c 100644 --- a/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.c +++ b/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NASSecurityParametersfromE-UTRAN.h" diff --git a/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.h b/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.h index c4a556481e..16ca1bdfd5 100644 --- a/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.h +++ b/lib/asn1c/s1ap/S1AP_NASSecurityParametersfromE-UTRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NASSecurityParametersfromE_UTRAN_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NASSecurityParametersfromE_UTRAN; asn_struct_free_f S1AP_NASSecurityParametersfromE_UTRAN_free; asn_struct_print_f S1AP_NASSecurityParametersfromE_UTRAN_print; asn_constr_check_f S1AP_NASSecurityParametersfromE_UTRAN_constraint; -jer_type_encoder_f S1AP_NASSecurityParametersfromE_UTRAN_encode_jer; per_type_decoder_f S1AP_NASSecurityParametersfromE_UTRAN_decode_aper; per_type_encoder_f S1AP_NASSecurityParametersfromE_UTRAN_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.c b/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.c index 795292908d..d80c9fbea1 100644 --- a/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.c +++ b/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NASSecurityParameterstoE-UTRAN.h" diff --git a/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.h b/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.h index bba52f3256..85d983a0de 100644 --- a/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.h +++ b/lib/asn1c/s1ap/S1AP_NASSecurityParameterstoE-UTRAN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NASSecurityParameterstoE_UTRAN_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NASSecurityParameterstoE_UTRAN; asn_struct_free_f S1AP_NASSecurityParameterstoE_UTRAN_free; asn_struct_print_f S1AP_NASSecurityParameterstoE_UTRAN_print; asn_constr_check_f S1AP_NASSecurityParameterstoE_UTRAN_constraint; -jer_type_encoder_f S1AP_NASSecurityParameterstoE_UTRAN_encode_jer; per_type_decoder_f S1AP_NASSecurityParameterstoE_UTRAN_decode_aper; per_type_encoder_f S1AP_NASSecurityParameterstoE_UTRAN_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.c b/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.c index c3e6f5adfa..be4d06d636 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-DefaultPagingDRX.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.h b/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.h index dccb4b7a73..bd50ee0bd8 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-DefaultPagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_DefaultPagingDRX_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NB_IoT_DefaultPagingDRX_specs_ asn_struct_free_f S1AP_NB_IoT_DefaultPagingDRX_free; asn_struct_print_f S1AP_NB_IoT_DefaultPagingDRX_print; asn_constr_check_f S1AP_NB_IoT_DefaultPagingDRX_constraint; -jer_type_encoder_f S1AP_NB_IoT_DefaultPagingDRX_encode_jer; per_type_decoder_f S1AP_NB_IoT_DefaultPagingDRX_decode_aper; per_type_encoder_f S1AP_NB_IoT_DefaultPagingDRX_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.c b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.c index abead68f6b..d8e2232845 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-Paging-eDRX-Cycle.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.h b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.h index 47257bf7b5..eec827ecec 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRX-Cycle.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_Paging_eDRX_Cycle_H_ @@ -49,7 +49,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NB_IoT_Paging_eDRX_Cycle_specs asn_struct_free_f S1AP_NB_IoT_Paging_eDRX_Cycle_free; asn_struct_print_f S1AP_NB_IoT_Paging_eDRX_Cycle_print; asn_constr_check_f S1AP_NB_IoT_Paging_eDRX_Cycle_constraint; -jer_type_encoder_f S1AP_NB_IoT_Paging_eDRX_Cycle_encode_jer; per_type_decoder_f S1AP_NB_IoT_Paging_eDRX_Cycle_decode_aper; per_type_encoder_f S1AP_NB_IoT_Paging_eDRX_Cycle_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.c b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.c index abc3e2a548..8d3f279236 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-Paging-eDRXInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.h b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.h index 4cf0ce35c8..7b633f0195 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-Paging-eDRXInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_Paging_eDRXInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.c b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.c index 60d3e046bf..dbe9ccdc66 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-PagingDRX.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.h b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.h index d33c58fed7..a3d1a76b0f 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_PagingDRX_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NB_IoT_PagingDRX_specs_1; asn_struct_free_f S1AP_NB_IoT_PagingDRX_free; asn_struct_print_f S1AP_NB_IoT_PagingDRX_print; asn_constr_check_f S1AP_NB_IoT_PagingDRX_constraint; -jer_type_encoder_f S1AP_NB_IoT_PagingDRX_encode_jer; per_type_decoder_f S1AP_NB_IoT_PagingDRX_decode_aper; per_type_encoder_f S1AP_NB_IoT_PagingDRX_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.c b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.c index 9f97c7c627..ad4f4a6be4 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-PagingTimeWindow.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.h b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.h index 62b57acc07..ce07e21111 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-PagingTimeWindow.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_PagingTimeWindow_H_ @@ -51,7 +51,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NB_IoT_PagingTimeWindow_specs_ asn_struct_free_f S1AP_NB_IoT_PagingTimeWindow_free; asn_struct_print_f S1AP_NB_IoT_PagingTimeWindow_print; asn_constr_check_f S1AP_NB_IoT_PagingTimeWindow_constraint; -jer_type_encoder_f S1AP_NB_IoT_PagingTimeWindow_encode_jer; per_type_decoder_f S1AP_NB_IoT_PagingTimeWindow_decode_aper; per_type_encoder_f S1AP_NB_IoT_PagingTimeWindow_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.c b/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.c index 322a8bee87..9a74be3709 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-RLF-Report-Container.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.h b/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.h index 5a1deba9a6..02fc3c733f 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-RLF-Report-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_RLF_Report_Container_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NB_IoT_RLF_Report_Container; asn_struct_free_f S1AP_NB_IoT_RLF_Report_Container_free; asn_struct_print_f S1AP_NB_IoT_RLF_Report_Container_print; asn_constr_check_f S1AP_NB_IoT_RLF_Report_Container_constraint; -jer_type_encoder_f S1AP_NB_IoT_RLF_Report_Container_encode_jer; per_type_decoder_f S1AP_NB_IoT_RLF_Report_Container_decode_aper; per_type_encoder_f S1AP_NB_IoT_RLF_Report_Container_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.c b/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.c index 805fc4078a..561b7b5d00 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.c +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NB-IoT-UEIdentityIndexValue.h" diff --git a/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.h b/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.h index 4eb8166683..570c305688 100644 --- a/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.h +++ b/lib/asn1c/s1ap/S1AP_NB-IoT-UEIdentityIndexValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NB_IoT_UEIdentityIndexValue_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NB_IoT_UEIdentityIndexValue; asn_struct_free_f S1AP_NB_IoT_UEIdentityIndexValue_free; asn_struct_print_f S1AP_NB_IoT_UEIdentityIndexValue_print; asn_constr_check_f S1AP_NB_IoT_UEIdentityIndexValue_constraint; -jer_type_encoder_f S1AP_NB_IoT_UEIdentityIndexValue_encode_jer; per_type_decoder_f S1AP_NB_IoT_UEIdentityIndexValue_decode_aper; per_type_encoder_f S1AP_NB_IoT_UEIdentityIndexValue_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NG-eNB.c b/lib/asn1c/s1ap/S1AP_NG-eNB.c index 0a78cbcdfb..64ef08169e 100644 --- a/lib/asn1c/s1ap/S1AP_NG-eNB.c +++ b/lib/asn1c/s1ap/S1AP_NG-eNB.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NG-eNB.h" diff --git a/lib/asn1c/s1ap/S1AP_NG-eNB.h b/lib/asn1c/s1ap/S1AP_NG-eNB.h index 217efeeb1d..359424cf97 100644 --- a/lib/asn1c/s1ap/S1AP_NG-eNB.h +++ b/lib/asn1c/s1ap/S1AP_NG-eNB.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NG_eNB_H_ diff --git a/lib/asn1c/s1ap/S1AP_NR-CGI.c b/lib/asn1c/s1ap/S1AP_NR-CGI.c index 7253a8bb4b..b4f5aedf89 100644 --- a/lib/asn1c/s1ap/S1AP_NR-CGI.c +++ b/lib/asn1c/s1ap/S1AP_NR-CGI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NR-CGI.h" diff --git a/lib/asn1c/s1ap/S1AP_NR-CGI.h b/lib/asn1c/s1ap/S1AP_NR-CGI.h index fa8b98b090..51f77a8c30 100644 --- a/lib/asn1c/s1ap/S1AP_NR-CGI.h +++ b/lib/asn1c/s1ap/S1AP_NR-CGI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NR_CGI_H_ diff --git a/lib/asn1c/s1ap/S1AP_NRCellIdentity.c b/lib/asn1c/s1ap/S1AP_NRCellIdentity.c index ba9714d5a9..2babb66e00 100644 --- a/lib/asn1c/s1ap/S1AP_NRCellIdentity.c +++ b/lib/asn1c/s1ap/S1AP_NRCellIdentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRCellIdentity.h" diff --git a/lib/asn1c/s1ap/S1AP_NRCellIdentity.h b/lib/asn1c/s1ap/S1AP_NRCellIdentity.h index 5acb985f64..64c3003cc2 100644 --- a/lib/asn1c/s1ap/S1AP_NRCellIdentity.h +++ b/lib/asn1c/s1ap/S1AP_NRCellIdentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRCellIdentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NRCellIdentity; asn_struct_free_f S1AP_NRCellIdentity_free; asn_struct_print_f S1AP_NRCellIdentity_print; asn_constr_check_f S1AP_NRCellIdentity_constraint; -jer_type_encoder_f S1AP_NRCellIdentity_encode_jer; per_type_decoder_f S1AP_NRCellIdentity_decode_aper; per_type_encoder_f S1AP_NRCellIdentity_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.c b/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.c index de0278c9bd..9cdd04a321 100644 --- a/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.c +++ b/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRUESecurityCapabilities.h" diff --git a/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.h b/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.h index eaf24371cc..25ef419a77 100644 --- a/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.h +++ b/lib/asn1c/s1ap/S1AP_NRUESecurityCapabilities.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRUESecurityCapabilities_H_ diff --git a/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.c b/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.c index 197bbdf5d0..8acd2cc25f 100644 --- a/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.c +++ b/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRUESidelinkAggregateMaximumBitrate.h" diff --git a/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.h b/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.h index 2f89e5a28c..f58aac460b 100644 --- a/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.h +++ b/lib/asn1c/s1ap/S1AP_NRUESidelinkAggregateMaximumBitrate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRUESidelinkAggregateMaximumBitrate_H_ diff --git a/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.c b/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.c index 8515da971f..7324b97d7b 100644 --- a/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.c +++ b/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRV2XServicesAuthorized.h" diff --git a/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.h b/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.h index f1f42cf7c6..567a53cc73 100644 --- a/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.h +++ b/lib/asn1c/s1ap/S1AP_NRV2XServicesAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRV2XServicesAuthorized_H_ diff --git a/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.c b/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.c index fb0b5e2f47..57765c5397 100644 --- a/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.c +++ b/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRencryptionAlgorithms.h" diff --git a/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.h b/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.h index f1ed10c3ee..16ac0d9faa 100644 --- a/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.h +++ b/lib/asn1c/s1ap/S1AP_NRencryptionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRencryptionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NRencryptionAlgorithms; asn_struct_free_f S1AP_NRencryptionAlgorithms_free; asn_struct_print_f S1AP_NRencryptionAlgorithms_print; asn_constr_check_f S1AP_NRencryptionAlgorithms_constraint; -jer_type_encoder_f S1AP_NRencryptionAlgorithms_encode_jer; per_type_decoder_f S1AP_NRencryptionAlgorithms_decode_aper; per_type_encoder_f S1AP_NRencryptionAlgorithms_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.c b/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.c index b4e47ea376..b6ef0cf1cc 100644 --- a/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.c +++ b/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRintegrityProtectionAlgorithms.h" diff --git a/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.h b/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.h index bc5c540480..c2c6e898d4 100644 --- a/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.h +++ b/lib/asn1c/s1ap/S1AP_NRintegrityProtectionAlgorithms.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRintegrityProtectionAlgorithms_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NRintegrityProtectionAlgorithms; asn_struct_free_f S1AP_NRintegrityProtectionAlgorithms_free; asn_struct_print_f S1AP_NRintegrityProtectionAlgorithms_print; asn_constr_check_f S1AP_NRintegrityProtectionAlgorithms_constraint; -jer_type_encoder_f S1AP_NRintegrityProtectionAlgorithms_encode_jer; per_type_decoder_f S1AP_NRintegrityProtectionAlgorithms_decode_aper; per_type_encoder_f S1AP_NRintegrityProtectionAlgorithms_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.c b/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.c index 0f7bfdfeb8..93a4320844 100644 --- a/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.c +++ b/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRrestrictionin5GS.h" diff --git a/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.h b/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.h index 6ec59da9ed..160de270ee 100644 --- a/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.h +++ b/lib/asn1c/s1ap/S1AP_NRrestrictionin5GS.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRrestrictionin5GS_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NRrestrictionin5GS_specs_1; asn_struct_free_f S1AP_NRrestrictionin5GS_free; asn_struct_print_f S1AP_NRrestrictionin5GS_print; asn_constr_check_f S1AP_NRrestrictionin5GS_constraint; -jer_type_encoder_f S1AP_NRrestrictionin5GS_encode_jer; per_type_decoder_f S1AP_NRrestrictionin5GS_decode_aper; per_type_encoder_f S1AP_NRrestrictionin5GS_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.c b/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.c index c94774c87f..7b9727da8e 100644 --- a/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.c +++ b/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NRrestrictioninEPSasSecondaryRAT.h" diff --git a/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.h b/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.h index 5017e92e84..7a45d54673 100644 --- a/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.h +++ b/lib/asn1c/s1ap/S1AP_NRrestrictioninEPSasSecondaryRAT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NRrestrictioninEPSasSecondaryRAT_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NRrestrictioninEPSasSecondaryR asn_struct_free_f S1AP_NRrestrictioninEPSasSecondaryRAT_free; asn_struct_print_f S1AP_NRrestrictioninEPSasSecondaryRAT_print; asn_constr_check_f S1AP_NRrestrictioninEPSasSecondaryRAT_constraint; -jer_type_encoder_f S1AP_NRrestrictioninEPSasSecondaryRAT_encode_jer; per_type_decoder_f S1AP_NRrestrictioninEPSasSecondaryRAT_decode_aper; per_type_encoder_f S1AP_NRrestrictioninEPSasSecondaryRAT_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.c b/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.c index 81a5c8ff26..6064a2831c 100644 --- a/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.c +++ b/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NextPagingAreaScope.h" diff --git a/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.h b/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.h index 52db6f4eff..1357fcc2aa 100644 --- a/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.h +++ b/lib/asn1c/s1ap/S1AP_NextPagingAreaScope.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NextPagingAreaScope_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NextPagingAreaScope_specs_1; asn_struct_free_f S1AP_NextPagingAreaScope_free; asn_struct_print_f S1AP_NextPagingAreaScope_print; asn_constr_check_f S1AP_NextPagingAreaScope_constraint; -jer_type_encoder_f S1AP_NextPagingAreaScope_encode_jer; per_type_decoder_f S1AP_NextPagingAreaScope_decode_aper; per_type_encoder_f S1AP_NextPagingAreaScope_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NotifySourceeNB.c b/lib/asn1c/s1ap/S1AP_NotifySourceeNB.c index 726dd3c371..38591735b9 100644 --- a/lib/asn1c/s1ap/S1AP_NotifySourceeNB.c +++ b/lib/asn1c/s1ap/S1AP_NotifySourceeNB.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NotifySourceeNB.h" diff --git a/lib/asn1c/s1ap/S1AP_NotifySourceeNB.h b/lib/asn1c/s1ap/S1AP_NotifySourceeNB.h index bb36b0b17d..f208e5aa80 100644 --- a/lib/asn1c/s1ap/S1AP_NotifySourceeNB.h +++ b/lib/asn1c/s1ap/S1AP_NotifySourceeNB.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NotifySourceeNB_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_NotifySourceeNB_specs_1; asn_struct_free_f S1AP_NotifySourceeNB_free; asn_struct_print_f S1AP_NotifySourceeNB_print; asn_constr_check_f S1AP_NotifySourceeNB_constraint; -jer_type_encoder_f S1AP_NotifySourceeNB_encode_jer; per_type_decoder_f S1AP_NotifySourceeNB_decode_aper; per_type_encoder_f S1AP_NotifySourceeNB_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.c b/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.c index eeab721ea4..a83e3ff0c9 100644 --- a/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.c +++ b/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NumberOfBroadcasts.h" diff --git a/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.h b/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.h index 12c1f52ef7..c4c94c79c2 100644 --- a/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.h +++ b/lib/asn1c/s1ap/S1AP_NumberOfBroadcasts.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NumberOfBroadcasts_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NumberOfBroadcasts; asn_struct_free_f S1AP_NumberOfBroadcasts_free; asn_struct_print_f S1AP_NumberOfBroadcasts_print; asn_constr_check_f S1AP_NumberOfBroadcasts_constraint; -jer_type_encoder_f S1AP_NumberOfBroadcasts_encode_jer; per_type_decoder_f S1AP_NumberOfBroadcasts_decode_aper; per_type_encoder_f S1AP_NumberOfBroadcasts_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.c b/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.c index d834d56499..131430562c 100644 --- a/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.c +++ b/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_NumberofBroadcastRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.h b/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.h index f83e6aab12..350ca29434 100644 --- a/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.h +++ b/lib/asn1c/s1ap/S1AP_NumberofBroadcastRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_NumberofBroadcastRequest_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_NumberofBroadcastRequest; asn_struct_free_f S1AP_NumberofBroadcastRequest_free; asn_struct_print_f S1AP_NumberofBroadcastRequest_print; asn_constr_check_f S1AP_NumberofBroadcastRequest_constraint; -jer_type_encoder_f S1AP_NumberofBroadcastRequest_encode_jer; per_type_decoder_f S1AP_NumberofBroadcastRequest_decode_aper; per_type_encoder_f S1AP_NumberofBroadcastRequest_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.c b/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.c index 3099e6f8aa..15cc89eed1 100644 --- a/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.c +++ b/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_OldBSS-ToNewBSS-Information.h" diff --git a/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.h b/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.h index c709f6da9f..2e0daaf5d7 100644 --- a/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.h +++ b/lib/asn1c/s1ap/S1AP_OldBSS-ToNewBSS-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_OldBSS_ToNewBSS_Information_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_OldBSS_ToNewBSS_Information; asn_struct_free_f S1AP_OldBSS_ToNewBSS_Information_free; asn_struct_print_f S1AP_OldBSS_ToNewBSS_Information_print; asn_constr_check_f S1AP_OldBSS_ToNewBSS_Information_constraint; -jer_type_encoder_f S1AP_OldBSS_ToNewBSS_Information_encode_jer; per_type_decoder_f S1AP_OldBSS_ToNewBSS_Information_decode_aper; per_type_encoder_f S1AP_OldBSS_ToNewBSS_Information_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_OverloadAction.c b/lib/asn1c/s1ap/S1AP_OverloadAction.c index 342875ba7b..0bec9caf97 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadAction.c +++ b/lib/asn1c/s1ap/S1AP_OverloadAction.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_OverloadAction.h" diff --git a/lib/asn1c/s1ap/S1AP_OverloadAction.h b/lib/asn1c/s1ap/S1AP_OverloadAction.h index 4c4d088d68..ddcfc25b8e 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadAction.h +++ b/lib/asn1c/s1ap/S1AP_OverloadAction.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_OverloadAction_H_ @@ -42,7 +42,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_OverloadAction_specs_1; asn_struct_free_f S1AP_OverloadAction_free; asn_struct_print_f S1AP_OverloadAction_print; asn_constr_check_f S1AP_OverloadAction_constraint; -jer_type_encoder_f S1AP_OverloadAction_encode_jer; per_type_decoder_f S1AP_OverloadAction_decode_aper; per_type_encoder_f S1AP_OverloadAction_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_OverloadResponse.c b/lib/asn1c/s1ap/S1AP_OverloadResponse.c index b456211ac1..b93151e794 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadResponse.c +++ b/lib/asn1c/s1ap/S1AP_OverloadResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_OverloadResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_OverloadResponse.h b/lib/asn1c/s1ap/S1AP_OverloadResponse.h index f28170c1eb..44e34557de 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadResponse.h +++ b/lib/asn1c/s1ap/S1AP_OverloadResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_OverloadResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_OverloadStart.c b/lib/asn1c/s1ap/S1AP_OverloadStart.c index 9aeb033167..b288c31631 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadStart.c +++ b/lib/asn1c/s1ap/S1AP_OverloadStart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_OverloadStart.h" diff --git a/lib/asn1c/s1ap/S1AP_OverloadStart.h b/lib/asn1c/s1ap/S1AP_OverloadStart.h index fd30f099ec..fec195a247 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadStart.h +++ b/lib/asn1c/s1ap/S1AP_OverloadStart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_OverloadStart_H_ diff --git a/lib/asn1c/s1ap/S1AP_OverloadStop.c b/lib/asn1c/s1ap/S1AP_OverloadStop.c index 609a3f7db0..077fcd9578 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadStop.c +++ b/lib/asn1c/s1ap/S1AP_OverloadStop.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_OverloadStop.h" diff --git a/lib/asn1c/s1ap/S1AP_OverloadStop.h b/lib/asn1c/s1ap/S1AP_OverloadStop.h index 25bcb77a10..7589716d5e 100644 --- a/lib/asn1c/s1ap/S1AP_OverloadStop.h +++ b/lib/asn1c/s1ap/S1AP_OverloadStop.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_OverloadStop_H_ diff --git a/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.c b/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.c index 30cf689860..1a6b84e3f0 100644 --- a/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.c +++ b/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PC5FlowBitRates.h" diff --git a/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.h b/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.h index aa3b3b56db..a36f60385d 100644 --- a/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.h +++ b/lib/asn1c/s1ap/S1AP_PC5FlowBitRates.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PC5FlowBitRates_H_ diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.c b/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.c index 2fe7d2ab81..b484ba3800 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.c +++ b/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PC5QoSFlowItem.h" diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.h b/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.h index cb1b3c2aa4..b20301bdf6 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.h +++ b/lib/asn1c/s1ap/S1AP_PC5QoSFlowItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PC5QoSFlowItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.c b/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.c index ef23b42d32..5f4e84191c 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.c +++ b/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PC5QoSFlowList.h" diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.h b/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.h index 259f0a407d..d2a11c267c 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.h +++ b/lib/asn1c/s1ap/S1AP_PC5QoSFlowList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PC5QoSFlowList_H_ diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSParameters.c b/lib/asn1c/s1ap/S1AP_PC5QoSParameters.c index 90c089a97a..a33f3ece88 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSParameters.c +++ b/lib/asn1c/s1ap/S1AP_PC5QoSParameters.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PC5QoSParameters.h" diff --git a/lib/asn1c/s1ap/S1AP_PC5QoSParameters.h b/lib/asn1c/s1ap/S1AP_PC5QoSParameters.h index b8489aa570..9fbb5ad6d1 100644 --- a/lib/asn1c/s1ap/S1AP_PC5QoSParameters.h +++ b/lib/asn1c/s1ap/S1AP_PC5QoSParameters.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PC5QoSParameters_H_ diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SN.c b/lib/asn1c/s1ap/S1AP_PDCP-SN.c index b44f6a5656..d6b636d677 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SN.c +++ b/lib/asn1c/s1ap/S1AP_PDCP-SN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PDCP-SN.h" diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SN.h b/lib/asn1c/s1ap/S1AP_PDCP-SN.h index 6afe943305..3eb863361a 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SN.h +++ b/lib/asn1c/s1ap/S1AP_PDCP-SN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PDCP_SN_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PDCP_SN; asn_struct_free_f S1AP_PDCP_SN_free; asn_struct_print_f S1AP_PDCP_SN_print; asn_constr_check_f S1AP_PDCP_SN_constraint; -jer_type_encoder_f S1AP_PDCP_SN_encode_jer; per_type_decoder_f S1AP_PDCP_SN_decode_aper; per_type_encoder_f S1AP_PDCP_SN_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.c b/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.c index 4c6754819f..70339df2ab 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.c +++ b/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PDCP-SNExtended.h" diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.h b/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.h index 9ff2a95984..de80111c4a 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.h +++ b/lib/asn1c/s1ap/S1AP_PDCP-SNExtended.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PDCP_SNExtended_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PDCP_SNExtended; asn_struct_free_f S1AP_PDCP_SNExtended_free; asn_struct_print_f S1AP_PDCP_SNExtended_print; asn_constr_check_f S1AP_PDCP_SNExtended_constraint; -jer_type_encoder_f S1AP_PDCP_SNExtended_encode_jer; per_type_decoder_f S1AP_PDCP_SNExtended_decode_aper; per_type_encoder_f S1AP_PDCP_SNExtended_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.c b/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.c index c0447a436d..7fb7fd2fee 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.c +++ b/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PDCP-SNlength18.h" diff --git a/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.h b/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.h index 112cd635a8..3c4301abd1 100644 --- a/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.h +++ b/lib/asn1c/s1ap/S1AP_PDCP-SNlength18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PDCP_SNlength18_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PDCP_SNlength18; asn_struct_free_f S1AP_PDCP_SNlength18_free; asn_struct_print_f S1AP_PDCP_SNlength18_print; asn_constr_check_f S1AP_PDCP_SNlength18_constraint; -jer_type_encoder_f S1AP_PDCP_SNlength18_encode_jer; per_type_decoder_f S1AP_PDCP_SNlength18_decode_aper; per_type_encoder_f S1AP_PDCP_SNlength18_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.c b/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.c index 1b27081093..99b1952b31 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.c +++ b/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PLMNAreaBasedQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.h b/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.h index f1caab4a1b..0a83c92acf 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.h +++ b/lib/asn1c/s1ap/S1AP_PLMNAreaBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PLMNAreaBasedQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_PLMNListforQMC.c b/lib/asn1c/s1ap/S1AP_PLMNListforQMC.c index f1eaa9f9d7..f18da49688 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNListforQMC.c +++ b/lib/asn1c/s1ap/S1AP_PLMNListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PLMNListforQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_PLMNListforQMC.h b/lib/asn1c/s1ap/S1AP_PLMNListforQMC.h index 595eb11b3e..873d8e7668 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNListforQMC.h +++ b/lib/asn1c/s1ap/S1AP_PLMNListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PLMNListforQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_PLMNidentity.c b/lib/asn1c/s1ap/S1AP_PLMNidentity.c index d01efe0cd9..60c4cffb56 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNidentity.c +++ b/lib/asn1c/s1ap/S1AP_PLMNidentity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PLMNidentity.h" diff --git a/lib/asn1c/s1ap/S1AP_PLMNidentity.h b/lib/asn1c/s1ap/S1AP_PLMNidentity.h index d8e763389d..5147b9a2b9 100644 --- a/lib/asn1c/s1ap/S1AP_PLMNidentity.h +++ b/lib/asn1c/s1ap/S1AP_PLMNidentity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PLMNidentity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PLMNidentity; asn_struct_free_f S1AP_PLMNidentity_free; asn_struct_print_f S1AP_PLMNidentity_print; asn_constr_check_f S1AP_PLMNidentity_constraint; -jer_type_encoder_f S1AP_PLMNidentity_encode_jer; per_type_decoder_f S1AP_PLMNidentity_decode_aper; per_type_encoder_f S1AP_PLMNidentity_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.c b/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.c index e6ad4279d3..700b5e0c59 100644 --- a/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.c +++ b/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PS-ServiceNotAvailable.h" diff --git a/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.h b/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.h index 9a77c98405..bdc8a3fad1 100644 --- a/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.h +++ b/lib/asn1c/s1ap/S1AP_PS-ServiceNotAvailable.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PS_ServiceNotAvailable_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PS_ServiceNotAvailable_specs_1 asn_struct_free_f S1AP_PS_ServiceNotAvailable_free; asn_struct_print_f S1AP_PS_ServiceNotAvailable_print; asn_constr_check_f S1AP_PS_ServiceNotAvailable_constraint; -jer_type_encoder_f S1AP_PS_ServiceNotAvailable_encode_jer; per_type_decoder_f S1AP_PS_ServiceNotAvailable_decode_aper; per_type_encoder_f S1AP_PS_ServiceNotAvailable_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PSCellInformation.c b/lib/asn1c/s1ap/S1AP_PSCellInformation.c index 92e24fe40f..1f3a3b1cfe 100644 --- a/lib/asn1c/s1ap/S1AP_PSCellInformation.c +++ b/lib/asn1c/s1ap/S1AP_PSCellInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PSCellInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_PSCellInformation.h b/lib/asn1c/s1ap/S1AP_PSCellInformation.h index af14f16026..7ca8cfda33 100644 --- a/lib/asn1c/s1ap/S1AP_PSCellInformation.h +++ b/lib/asn1c/s1ap/S1AP_PSCellInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PSCellInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_PWSFailureIndication.c b/lib/asn1c/s1ap/S1AP_PWSFailureIndication.c index e63078a29d..95cce958dd 100644 --- a/lib/asn1c/s1ap/S1AP_PWSFailureIndication.c +++ b/lib/asn1c/s1ap/S1AP_PWSFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PWSFailureIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_PWSFailureIndication.h b/lib/asn1c/s1ap/S1AP_PWSFailureIndication.h index fd61830a1f..adc5fa4c4a 100644 --- a/lib/asn1c/s1ap/S1AP_PWSFailureIndication.h +++ b/lib/asn1c/s1ap/S1AP_PWSFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PWSFailureIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_PWSRestartIndication.c b/lib/asn1c/s1ap/S1AP_PWSRestartIndication.c index 57c50bcb57..bd7463d053 100644 --- a/lib/asn1c/s1ap/S1AP_PWSRestartIndication.c +++ b/lib/asn1c/s1ap/S1AP_PWSRestartIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PWSRestartIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_PWSRestartIndication.h b/lib/asn1c/s1ap/S1AP_PWSRestartIndication.h index 88431341f6..6ab0494341 100644 --- a/lib/asn1c/s1ap/S1AP_PWSRestartIndication.h +++ b/lib/asn1c/s1ap/S1AP_PWSRestartIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PWSRestartIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.c b/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.c index 930ddf6d6f..d5e99a060c 100644 --- a/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.c +++ b/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PWSfailedECGIList.h" diff --git a/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.h b/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.h index d7cefae98f..4ae924943c 100644 --- a/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.h +++ b/lib/asn1c/s1ap/S1AP_PWSfailedECGIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PWSfailedECGIList_H_ diff --git a/lib/asn1c/s1ap/S1AP_Packet-LossRate.c b/lib/asn1c/s1ap/S1AP_Packet-LossRate.c index 523b8b7b8d..e7564e9888 100644 --- a/lib/asn1c/s1ap/S1AP_Packet-LossRate.c +++ b/lib/asn1c/s1ap/S1AP_Packet-LossRate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Packet-LossRate.h" diff --git a/lib/asn1c/s1ap/S1AP_Packet-LossRate.h b/lib/asn1c/s1ap/S1AP_Packet-LossRate.h index 14ba9a2605..cb7d5b10b6 100644 --- a/lib/asn1c/s1ap/S1AP_Packet-LossRate.h +++ b/lib/asn1c/s1ap/S1AP_Packet-LossRate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Packet_LossRate_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Packet_LossRate; asn_struct_free_f S1AP_Packet_LossRate_free; asn_struct_print_f S1AP_Packet_LossRate_print; asn_constr_check_f S1AP_Packet_LossRate_constraint; -jer_type_encoder_f S1AP_Packet_LossRate_encode_jer; per_type_decoder_f S1AP_Packet_LossRate_decode_aper; per_type_encoder_f S1AP_Packet_LossRate_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.c b/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.c index 7e6b743bd9..a157c3c7b5 100644 --- a/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.c +++ b/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Paging-eDRX-Cycle.h" diff --git a/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.h b/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.h index d9faa11e60..60b25565d4 100644 --- a/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.h +++ b/lib/asn1c/s1ap/S1AP_Paging-eDRX-Cycle.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Paging_eDRX_Cycle_H_ @@ -49,7 +49,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Paging_eDRX_Cycle_specs_1; asn_struct_free_f S1AP_Paging_eDRX_Cycle_free; asn_struct_print_f S1AP_Paging_eDRX_Cycle_print; asn_constr_check_f S1AP_Paging_eDRX_Cycle_constraint; -jer_type_encoder_f S1AP_Paging_eDRX_Cycle_encode_jer; per_type_decoder_f S1AP_Paging_eDRX_Cycle_decode_aper; per_type_encoder_f S1AP_Paging_eDRX_Cycle_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.c b/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.c index e7e625328c..d05876cc09 100644 --- a/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.c +++ b/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Paging-eDRXInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.h b/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.h index c8701eefb1..86c1f23dea 100644 --- a/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.h +++ b/lib/asn1c/s1ap/S1AP_Paging-eDRXInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Paging_eDRXInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_Paging.c b/lib/asn1c/s1ap/S1AP_Paging.c index cdfddd7129..bb0039f599 100644 --- a/lib/asn1c/s1ap/S1AP_Paging.c +++ b/lib/asn1c/s1ap/S1AP_Paging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Paging.h" diff --git a/lib/asn1c/s1ap/S1AP_Paging.h b/lib/asn1c/s1ap/S1AP_Paging.h index 74da09512c..17c08e8d9b 100644 --- a/lib/asn1c/s1ap/S1AP_Paging.h +++ b/lib/asn1c/s1ap/S1AP_Paging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Paging_H_ diff --git a/lib/asn1c/s1ap/S1AP_PagingAttemptCount.c b/lib/asn1c/s1ap/S1AP_PagingAttemptCount.c index 9d8fce0eb2..dae1f91576 100644 --- a/lib/asn1c/s1ap/S1AP_PagingAttemptCount.c +++ b/lib/asn1c/s1ap/S1AP_PagingAttemptCount.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingAttemptCount.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingAttemptCount.h b/lib/asn1c/s1ap/S1AP_PagingAttemptCount.h index ce3d85edc2..1ffca0d03b 100644 --- a/lib/asn1c/s1ap/S1AP_PagingAttemptCount.h +++ b/lib/asn1c/s1ap/S1AP_PagingAttemptCount.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingAttemptCount_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PagingAttemptCount; asn_struct_free_f S1AP_PagingAttemptCount_free; asn_struct_print_f S1AP_PagingAttemptCount_print; asn_constr_check_f S1AP_PagingAttemptCount_constraint; -jer_type_encoder_f S1AP_PagingAttemptCount_encode_jer; per_type_decoder_f S1AP_PagingAttemptCount_decode_aper; per_type_encoder_f S1AP_PagingAttemptCount_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.c b/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.c index fce991e344..80725d66f4 100644 --- a/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.c +++ b/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingAttemptInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.h b/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.h index ba4624e201..581df657df 100644 --- a/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.h +++ b/lib/asn1c/s1ap/S1AP_PagingAttemptInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingAttemptInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_PagingCause.c b/lib/asn1c/s1ap/S1AP_PagingCause.c index a24c616fa1..5593ecffe8 100644 --- a/lib/asn1c/s1ap/S1AP_PagingCause.c +++ b/lib/asn1c/s1ap/S1AP_PagingCause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingCause.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingCause.h b/lib/asn1c/s1ap/S1AP_PagingCause.h index 289a9e1170..c303caaa31 100644 --- a/lib/asn1c/s1ap/S1AP_PagingCause.h +++ b/lib/asn1c/s1ap/S1AP_PagingCause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingCause_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PagingCause_specs_1; asn_struct_free_f S1AP_PagingCause_free; asn_struct_print_f S1AP_PagingCause_print; asn_constr_check_f S1AP_PagingCause_constraint; -jer_type_encoder_f S1AP_PagingCause_encode_jer; per_type_decoder_f S1AP_PagingCause_decode_aper; per_type_encoder_f S1AP_PagingCause_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PagingDRX.c b/lib/asn1c/s1ap/S1AP_PagingDRX.c index 80f51ee3ad..7d5d9bcf6c 100644 --- a/lib/asn1c/s1ap/S1AP_PagingDRX.c +++ b/lib/asn1c/s1ap/S1AP_PagingDRX.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingDRX.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingDRX.h b/lib/asn1c/s1ap/S1AP_PagingDRX.h index 1bbb459866..32da2ddd0f 100644 --- a/lib/asn1c/s1ap/S1AP_PagingDRX.h +++ b/lib/asn1c/s1ap/S1AP_PagingDRX.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingDRX_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PagingDRX_specs_1; asn_struct_free_f S1AP_PagingDRX_free; asn_struct_print_f S1AP_PagingDRX_print; asn_constr_check_f S1AP_PagingDRX_constraint; -jer_type_encoder_f S1AP_PagingDRX_encode_jer; per_type_decoder_f S1AP_PagingDRX_decode_aper; per_type_encoder_f S1AP_PagingDRX_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PagingPriority.c b/lib/asn1c/s1ap/S1AP_PagingPriority.c index ce1ebc1ea4..986a7e7e09 100644 --- a/lib/asn1c/s1ap/S1AP_PagingPriority.c +++ b/lib/asn1c/s1ap/S1AP_PagingPriority.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingPriority.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingPriority.h b/lib/asn1c/s1ap/S1AP_PagingPriority.h index 6d4a5c6241..6a4e328e8d 100644 --- a/lib/asn1c/s1ap/S1AP_PagingPriority.h +++ b/lib/asn1c/s1ap/S1AP_PagingPriority.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingPriority_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PagingPriority_specs_1; asn_struct_free_f S1AP_PagingPriority_free; asn_struct_print_f S1AP_PagingPriority_print; asn_constr_check_f S1AP_PagingPriority_constraint; -jer_type_encoder_f S1AP_PagingPriority_encode_jer; per_type_decoder_f S1AP_PagingPriority_decode_aper; per_type_encoder_f S1AP_PagingPriority_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.c b/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.c index 891c9dcadb..01eb14f3ef 100644 --- a/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.c +++ b/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingProbabilityInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.h b/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.h index 5a869f734a..44f4b2c92a 100644 --- a/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.h +++ b/lib/asn1c/s1ap/S1AP_PagingProbabilityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingProbabilityInformation_H_ @@ -56,7 +56,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PagingProbabilityInformation_s asn_struct_free_f S1AP_PagingProbabilityInformation_free; asn_struct_print_f S1AP_PagingProbabilityInformation_print; asn_constr_check_f S1AP_PagingProbabilityInformation_constraint; -jer_type_encoder_f S1AP_PagingProbabilityInformation_encode_jer; per_type_decoder_f S1AP_PagingProbabilityInformation_decode_aper; per_type_encoder_f S1AP_PagingProbabilityInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PagingTimeWindow.c b/lib/asn1c/s1ap/S1AP_PagingTimeWindow.c index 3420ccd3db..98a01f07f2 100644 --- a/lib/asn1c/s1ap/S1AP_PagingTimeWindow.c +++ b/lib/asn1c/s1ap/S1AP_PagingTimeWindow.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PagingTimeWindow.h" diff --git a/lib/asn1c/s1ap/S1AP_PagingTimeWindow.h b/lib/asn1c/s1ap/S1AP_PagingTimeWindow.h index dd1c423455..56c0b4d9a6 100644 --- a/lib/asn1c/s1ap/S1AP_PagingTimeWindow.h +++ b/lib/asn1c/s1ap/S1AP_PagingTimeWindow.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PagingTimeWindow_H_ @@ -51,7 +51,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PagingTimeWindow_specs_1; asn_struct_free_f S1AP_PagingTimeWindow_free; asn_struct_print_f S1AP_PagingTimeWindow_print; asn_constr_check_f S1AP_PagingTimeWindow_constraint; -jer_type_encoder_f S1AP_PagingTimeWindow_encode_jer; per_type_decoder_f S1AP_PagingTimeWindow_decode_aper; per_type_encoder_f S1AP_PagingTimeWindow_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequest.c b/lib/asn1c/s1ap/S1AP_PathSwitchRequest.c index adffab8962..fc7c6bf3a1 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequest.c +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PathSwitchRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequest.h b/lib/asn1c/s1ap/S1AP_PathSwitchRequest.h index 3f2ee033f0..2f256d5c63 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequest.h +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PathSwitchRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.c b/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.c index 933a2253fb..0dd2f9041f 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PathSwitchRequestAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.h b/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.h index a948b81825..376784f181 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequestAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PathSwitchRequestAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.c b/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.c index 902786d11a..97b6661e55 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.c +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PathSwitchRequestFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.h b/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.h index 10847c9bcb..b743b2a033 100644 --- a/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.h +++ b/lib/asn1c/s1ap/S1AP_PathSwitchRequestFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PathSwitchRequestFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_PedestrianUE.c b/lib/asn1c/s1ap/S1AP_PedestrianUE.c index e54f93ed52..7ea0a06204 100644 --- a/lib/asn1c/s1ap/S1AP_PedestrianUE.c +++ b/lib/asn1c/s1ap/S1AP_PedestrianUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PedestrianUE.h" diff --git a/lib/asn1c/s1ap/S1AP_PedestrianUE.h b/lib/asn1c/s1ap/S1AP_PedestrianUE.h index 2f19ca095d..07f2695c02 100644 --- a/lib/asn1c/s1ap/S1AP_PedestrianUE.h +++ b/lib/asn1c/s1ap/S1AP_PedestrianUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PedestrianUE_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PedestrianUE_specs_1; asn_struct_free_f S1AP_PedestrianUE_free; asn_struct_print_f S1AP_PedestrianUE_print; asn_constr_check_f S1AP_PedestrianUE_constraint; -jer_type_encoder_f S1AP_PedestrianUE_encode_jer; per_type_decoder_f S1AP_PedestrianUE_decode_aper; per_type_encoder_f S1AP_PedestrianUE_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PendingDataIndication.c b/lib/asn1c/s1ap/S1AP_PendingDataIndication.c index 5440bc8088..cb6cb9bd63 100644 --- a/lib/asn1c/s1ap/S1AP_PendingDataIndication.c +++ b/lib/asn1c/s1ap/S1AP_PendingDataIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PendingDataIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_PendingDataIndication.h b/lib/asn1c/s1ap/S1AP_PendingDataIndication.h index 9b348e7f0c..0834a2956e 100644 --- a/lib/asn1c/s1ap/S1AP_PendingDataIndication.h +++ b/lib/asn1c/s1ap/S1AP_PendingDataIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PendingDataIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PendingDataIndication_specs_1; asn_struct_free_f S1AP_PendingDataIndication_free; asn_struct_print_f S1AP_PendingDataIndication_print; asn_constr_check_f S1AP_PendingDataIndication_constraint; -jer_type_encoder_f S1AP_PendingDataIndication_encode_jer; per_type_decoder_f S1AP_PendingDataIndication_decode_aper; per_type_encoder_f S1AP_PendingDataIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Port-Number.c b/lib/asn1c/s1ap/S1AP_Port-Number.c index 0da26956f7..42d958594d 100644 --- a/lib/asn1c/s1ap/S1AP_Port-Number.c +++ b/lib/asn1c/s1ap/S1AP_Port-Number.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Port-Number.h" diff --git a/lib/asn1c/s1ap/S1AP_Port-Number.h b/lib/asn1c/s1ap/S1AP_Port-Number.h index 11a22bce08..de2ff46932 100644 --- a/lib/asn1c/s1ap/S1AP_Port-Number.h +++ b/lib/asn1c/s1ap/S1AP_Port-Number.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Port_Number_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Port_Number; asn_struct_free_f S1AP_Port_Number_free; asn_struct_print_f S1AP_Port_Number_print; asn_constr_check_f S1AP_Port_Number_constraint; -jer_type_encoder_f S1AP_Port_Number_encode_jer; per_type_decoder_f S1AP_Port_Number_decode_aper; per_type_encoder_f S1AP_Port_Number_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.c b/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.c index 8d6344bbd2..35b1ceff06 100644 --- a/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.c +++ b/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Pre-emptionCapability.h" diff --git a/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.h b/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.h index 5ae8e1f95b..a42bbf6584 100644 --- a/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.h +++ b/lib/asn1c/s1ap/S1AP_Pre-emptionCapability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Pre_emptionCapability_H_ @@ -34,7 +34,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Pre_emptionCapability_specs_1; asn_struct_free_f S1AP_Pre_emptionCapability_free; asn_struct_print_f S1AP_Pre_emptionCapability_print; asn_constr_check_f S1AP_Pre_emptionCapability_constraint; -jer_type_encoder_f S1AP_Pre_emptionCapability_encode_jer; per_type_decoder_f S1AP_Pre_emptionCapability_decode_aper; per_type_encoder_f S1AP_Pre_emptionCapability_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.c b/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.c index 0ef68ea698..ebb92ca175 100644 --- a/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.c +++ b/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Pre-emptionVulnerability.h" diff --git a/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.h b/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.h index 549e5c3f69..09e323a7dc 100644 --- a/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.h +++ b/lib/asn1c/s1ap/S1AP_Pre-emptionVulnerability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Pre_emptionVulnerability_H_ @@ -34,7 +34,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Pre_emptionVulnerability_specs asn_struct_free_f S1AP_Pre_emptionVulnerability_free; asn_struct_print_f S1AP_Pre_emptionVulnerability_print; asn_constr_check_f S1AP_Pre_emptionVulnerability_constraint; -jer_type_encoder_f S1AP_Pre_emptionVulnerability_encode_jer; per_type_decoder_f S1AP_Pre_emptionVulnerability_decode_aper; per_type_encoder_f S1AP_Pre_emptionVulnerability_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Presence.c b/lib/asn1c/s1ap/S1AP_Presence.c index ce4c3e6b5a..0db54eebc1 100644 --- a/lib/asn1c/s1ap/S1AP_Presence.c +++ b/lib/asn1c/s1ap/S1AP_Presence.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Presence.h" diff --git a/lib/asn1c/s1ap/S1AP_Presence.h b/lib/asn1c/s1ap/S1AP_Presence.h index 603d917095..9a16e90276 100644 --- a/lib/asn1c/s1ap/S1AP_Presence.h +++ b/lib/asn1c/s1ap/S1AP_Presence.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Presence_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Presence_specs_1; asn_struct_free_f S1AP_Presence_free; asn_struct_print_f S1AP_Presence_print; asn_constr_check_f S1AP_Presence_constraint; -jer_type_encoder_f S1AP_Presence_encode_jer; per_type_decoder_f S1AP_Presence_decode_aper; per_type_encoder_f S1AP_Presence_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PriorityLevel.c b/lib/asn1c/s1ap/S1AP_PriorityLevel.c index f5231292e7..3bdbdd73cb 100644 --- a/lib/asn1c/s1ap/S1AP_PriorityLevel.c +++ b/lib/asn1c/s1ap/S1AP_PriorityLevel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PriorityLevel.h" diff --git a/lib/asn1c/s1ap/S1AP_PriorityLevel.h b/lib/asn1c/s1ap/S1AP_PriorityLevel.h index 345cea5c69..a87350e8f8 100644 --- a/lib/asn1c/s1ap/S1AP_PriorityLevel.h +++ b/lib/asn1c/s1ap/S1AP_PriorityLevel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PriorityLevel_H_ @@ -35,7 +35,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_PriorityLevel; asn_struct_free_f S1AP_PriorityLevel_free; asn_struct_print_f S1AP_PriorityLevel_print; asn_constr_check_f S1AP_PriorityLevel_constraint; -jer_type_encoder_f S1AP_PriorityLevel_encode_jer; per_type_decoder_f S1AP_PriorityLevel_decode_aper; per_type_encoder_f S1AP_PriorityLevel_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PrivacyIndicator.c b/lib/asn1c/s1ap/S1AP_PrivacyIndicator.c index 2a2b739f6c..1aa4c6c37d 100644 --- a/lib/asn1c/s1ap/S1AP_PrivacyIndicator.c +++ b/lib/asn1c/s1ap/S1AP_PrivacyIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PrivacyIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_PrivacyIndicator.h b/lib/asn1c/s1ap/S1AP_PrivacyIndicator.h index c9e6d35d6a..ce7670179e 100644 --- a/lib/asn1c/s1ap/S1AP_PrivacyIndicator.h +++ b/lib/asn1c/s1ap/S1AP_PrivacyIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PrivacyIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_PrivacyIndicator_specs_1; asn_struct_free_f S1AP_PrivacyIndicator_free; asn_struct_print_f S1AP_PrivacyIndicator_print; asn_constr_check_f S1AP_PrivacyIndicator_constraint; -jer_type_encoder_f S1AP_PrivacyIndicator_encode_jer; per_type_decoder_f S1AP_PrivacyIndicator_decode_aper; per_type_encoder_f S1AP_PrivacyIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-Container.c b/lib/asn1c/s1ap/S1AP_PrivateIE-Container.c index 4103fb63ce..4257cf6a0d 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-Container.c +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PrivateIE-Container.h" diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-Container.h b/lib/asn1c/s1ap/S1AP_PrivateIE-Container.h index d35096c5f6..54b6b60032 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-Container.h +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PrivateIE_Container_H_ diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-Field.c b/lib/asn1c/s1ap/S1AP_PrivateIE-Field.c index 26f9f38f0d..0e7893a936 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-Field.c +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-Field.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PrivateIE-Field.h" diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-Field.h b/lib/asn1c/s1ap/S1AP_PrivateIE-Field.h index fbfa8ec88d..d45b6dfeaf 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-Field.h +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-Field.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PrivateIE_Field_H_ diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-ID.c b/lib/asn1c/s1ap/S1AP_PrivateIE-ID.c index 89615bf649..dcaf8beb44 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-ID.c +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PrivateIE-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_PrivateIE-ID.h b/lib/asn1c/s1ap/S1AP_PrivateIE-ID.h index 7c6e1ce833..a120f0ca77 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateIE-ID.h +++ b/lib/asn1c/s1ap/S1AP_PrivateIE-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PrivateIE_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_PrivateMessage.c b/lib/asn1c/s1ap/S1AP_PrivateMessage.c index ec8e46d6c8..6e3b05b240 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateMessage.c +++ b/lib/asn1c/s1ap/S1AP_PrivateMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_PrivateMessage.h" diff --git a/lib/asn1c/s1ap/S1AP_PrivateMessage.h b/lib/asn1c/s1ap/S1AP_PrivateMessage.h index e2df555327..7c53be1c8c 100644 --- a/lib/asn1c/s1ap/S1AP_PrivateMessage.h +++ b/lib/asn1c/s1ap/S1AP_PrivateMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_PrivateMessage_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProSeAuthorized.c b/lib/asn1c/s1ap/S1AP_ProSeAuthorized.c index 6c030085fe..d762a8aeb1 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeAuthorized.c +++ b/lib/asn1c/s1ap/S1AP_ProSeAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProSeAuthorized.h" diff --git a/lib/asn1c/s1ap/S1AP_ProSeAuthorized.h b/lib/asn1c/s1ap/S1AP_ProSeAuthorized.h index 2602236545..fa53d60c97 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeAuthorized.h +++ b/lib/asn1c/s1ap/S1AP_ProSeAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProSeAuthorized_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.c b/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.c index f560793513..389a72bb68 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.c +++ b/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProSeDirectCommunication.h" diff --git a/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.h b/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.h index bccdc73cf4..6bf8648f20 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.h +++ b/lib/asn1c/s1ap/S1AP_ProSeDirectCommunication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProSeDirectCommunication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ProSeDirectCommunication_specs asn_struct_free_f S1AP_ProSeDirectCommunication_free; asn_struct_print_f S1AP_ProSeDirectCommunication_print; asn_constr_check_f S1AP_ProSeDirectCommunication_constraint; -jer_type_encoder_f S1AP_ProSeDirectCommunication_encode_jer; per_type_decoder_f S1AP_ProSeDirectCommunication_decode_aper; per_type_encoder_f S1AP_ProSeDirectCommunication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.c b/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.c index 0fc6d66057..c677c24b87 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.c +++ b/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProSeDirectDiscovery.h" diff --git a/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.h b/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.h index 1bbdb2cdf9..63195dcce6 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.h +++ b/lib/asn1c/s1ap/S1AP_ProSeDirectDiscovery.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProSeDirectDiscovery_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ProSeDirectDiscovery_specs_1; asn_struct_free_f S1AP_ProSeDirectDiscovery_free; asn_struct_print_f S1AP_ProSeDirectDiscovery_print; asn_constr_check_f S1AP_ProSeDirectDiscovery_constraint; -jer_type_encoder_f S1AP_ProSeDirectDiscovery_encode_jer; per_type_decoder_f S1AP_ProSeDirectDiscovery_decode_aper; per_type_encoder_f S1AP_ProSeDirectDiscovery_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.c b/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.c index 32370f6934..37820a8f7a 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.c +++ b/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProSeUEtoNetworkRelaying.h" diff --git a/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.h b/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.h index 86d1abeb94..84fce8e5f0 100644 --- a/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.h +++ b/lib/asn1c/s1ap/S1AP_ProSeUEtoNetworkRelaying.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProSeUEtoNetworkRelaying_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ProSeUEtoNetworkRelaying_specs asn_struct_free_f S1AP_ProSeUEtoNetworkRelaying_free; asn_struct_print_f S1AP_ProSeUEtoNetworkRelaying_print; asn_constr_check_f S1AP_ProSeUEtoNetworkRelaying_constraint; -jer_type_encoder_f S1AP_ProSeUEtoNetworkRelaying_encode_jer; per_type_decoder_f S1AP_ProSeUEtoNetworkRelaying_decode_aper; per_type_encoder_f S1AP_ProSeUEtoNetworkRelaying_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ProcedureCode.c b/lib/asn1c/s1ap/S1AP_ProcedureCode.c index 5425cdd740..869a60305a 100644 --- a/lib/asn1c/s1ap/S1AP_ProcedureCode.c +++ b/lib/asn1c/s1ap/S1AP_ProcedureCode.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProcedureCode.h" diff --git a/lib/asn1c/s1ap/S1AP_ProcedureCode.h b/lib/asn1c/s1ap/S1AP_ProcedureCode.h index efd6e6e8c0..c61af8f0ef 100644 --- a/lib/asn1c/s1ap/S1AP_ProcedureCode.h +++ b/lib/asn1c/s1ap/S1AP_ProcedureCode.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProcedureCode_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProcedureCode; asn_struct_free_f S1AP_ProcedureCode_free; asn_struct_print_f S1AP_ProcedureCode_print; asn_constr_check_f S1AP_ProcedureCode_constraint; -jer_type_encoder_f S1AP_ProcedureCode_encode_jer; per_type_decoder_f S1AP_ProcedureCode_decode_aper; per_type_encoder_f S1AP_ProcedureCode_encode_aper; #define S1AP_ProcedureCode_id_HandoverPreparation ((S1AP_ProcedureCode_t)0) diff --git a/lib/asn1c/s1ap/S1AP_ProtocolError-IE-ContainerList.h b/lib/asn1c/s1ap/S1AP_ProtocolError-IE-ContainerList.h index 0a85702fb3..a0c080c78c 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolError-IE-ContainerList.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolError-IE-ContainerList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolError_IE_ContainerList_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.c b/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.c index 465fb45e93..1fbcc262d6 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolExtensionContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.h b/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.h index bbb51fb8da..7b05d988e2 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolExtensionContainer_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.c b/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.c index 18dffa3b39..372217abcd 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolExtensionField.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.h b/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.h index 9515456e90..e113fd08fa 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionField.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolExtensionField_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.c b/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.c index dec17d088c..30a62be8e5 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolExtensionID.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.h b/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.h index f72e5dd035..46424ea174 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolExtensionID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolExtensionID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolExtensionID; asn_struct_free_f S1AP_ProtocolExtensionID_free; asn_struct_print_f S1AP_ProtocolExtensionID_print; asn_constr_check_f S1AP_ProtocolExtensionID_constraint; -jer_type_encoder_f S1AP_ProtocolExtensionID_encode_jer; per_type_decoder_f S1AP_ProtocolExtensionID_decode_aper; per_type_encoder_f S1AP_ProtocolExtensionID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.c b/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.c index 30302f36ce..eeee22b335 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolIE-Container.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.h index be7073ce14..aa0d5b01a6 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_Container_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.c b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.c index eda218db31..d92c435b86 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolIE-ContainerList.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.h index 3abc6d2b40..1b1bc6301c 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_ContainerList_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPair.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPair.h index 4fa82f5054..1e2c21757f 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPair.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPair.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_ContainerPair_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPairList.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPairList.h index bb1a6b3a08..4bc5c3ec57 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPairList.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ContainerPairList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_ContainerPairList_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.c b/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.c index 45cf25bb69..9b594863a0 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolIE-Field.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.h index 70b25782f7..e8ab01da2a 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-Field.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_Field_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-FieldPair.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-FieldPair.h index fcad70405a..0964fda8a7 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-FieldPair.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-FieldPair.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_FieldPair_H_ diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.c b/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.c index 8228a0756b..7d1e42e9ff 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolIE-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.h index 8c8d49ccfa..fdea19c436 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_ID; asn_struct_free_f S1AP_ProtocolIE_ID_free; asn_struct_print_f S1AP_ProtocolIE_ID_print; asn_constr_check_f S1AP_ProtocolIE_ID_constraint; -jer_type_encoder_f S1AP_ProtocolIE_ID_encode_jer; per_type_decoder_f S1AP_ProtocolIE_ID_decode_aper; per_type_encoder_f S1AP_ProtocolIE_ID_encode_aper; #define S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID ((S1AP_ProtocolIE_ID_t)0) diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.c b/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.c index f9c6204466..dea5d9b7d6 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.c +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ProtocolIE-SingleContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.h b/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.h index 66681a19ea..6aa2eba6ec 100644 --- a/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.h +++ b/lib/asn1c/s1ap/S1AP_ProtocolIE-SingleContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-Containers" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ProtocolIE_SingleContainer_H_ @@ -63,266 +63,228 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P0; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P0_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P0_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P0_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P0_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P0_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P0_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P1; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P1_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P1_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P1_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P1_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P1_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P1_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P2; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P2_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P2_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P2_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P2_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P2_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P2_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P3; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P3_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P3_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P3_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P3_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P3_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P3_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P4; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P4_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P4_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P4_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P4_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P4_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P4_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P5; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P5_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P5_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P5_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P5_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P5_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P5_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P6; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P6_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P6_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P6_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P6_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P6_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P6_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P7; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P7_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P7_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P7_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P7_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P7_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P7_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P8; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P8_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P8_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P8_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P8_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P8_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P8_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P9; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P9_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P9_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P9_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P9_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P9_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P9_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P10; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P10_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P10_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P10_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P10_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P10_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P10_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P11; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P11_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P11_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P11_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P11_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P11_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P11_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P12; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P12_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P12_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P12_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P12_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P12_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P12_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P13; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P13_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P13_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P13_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P13_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P13_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P13_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P14; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P14_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P14_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P14_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P14_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P14_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P14_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P15; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P15_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P15_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P15_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P15_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P15_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P15_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P16; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P16_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P16_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P16_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P16_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P16_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P16_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P17; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P17_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P17_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P17_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P17_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P17_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P17_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P18; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P18_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P18_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P18_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P18_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P18_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P18_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P19; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P19_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P19_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P19_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P19_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P19_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P19_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P20; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P20_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P20_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P20_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P20_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P20_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P20_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P21; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P21_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P21_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P21_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P21_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P21_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P21_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P22; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P22_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P22_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P22_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P22_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P22_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P22_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P23; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P23_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P23_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P23_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P23_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P23_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P23_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P24; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P24_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P24_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P24_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P24_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P24_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P24_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P25; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P25_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P25_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P25_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P25_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P25_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P25_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P26; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P26_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P26_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P26_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P26_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P26_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P26_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P27; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P27_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P27_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P27_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P27_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P27_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P27_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P28; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P28_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P28_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P28_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P28_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P28_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P28_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P29; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P29_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P29_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P29_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P29_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P29_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P29_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P30; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P30_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P30_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P30_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P30_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P30_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P30_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P31; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P31_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P31_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P31_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P31_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P31_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P31_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P32; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P32_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P32_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P32_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P32_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P32_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P32_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P33; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P33_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P33_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P33_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P33_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P33_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P33_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P34; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P34_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P34_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P34_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P34_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P34_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P34_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P35; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P35_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P35_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P35_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P35_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P35_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P35_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P36; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P36_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P36_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P36_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P36_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P36_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P36_encode_aper; extern asn_TYPE_descriptor_t asn_DEF_S1AP_ProtocolIE_SingleContainer_8146P37; asn_struct_free_f S1AP_ProtocolIE_SingleContainer_8146P37_free; asn_struct_print_f S1AP_ProtocolIE_SingleContainer_8146P37_print; asn_constr_check_f S1AP_ProtocolIE_SingleContainer_8146P37_constraint; -jer_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P37_encode_jer; per_type_decoder_f S1AP_ProtocolIE_SingleContainer_8146P37_decode_aper; per_type_encoder_f S1AP_ProtocolIE_SingleContainer_8146P37_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_QCI.c b/lib/asn1c/s1ap/S1AP_QCI.c index 60e394aa3f..e6106745c2 100644 --- a/lib/asn1c/s1ap/S1AP_QCI.c +++ b/lib/asn1c/s1ap/S1AP_QCI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_QCI.h" diff --git a/lib/asn1c/s1ap/S1AP_QCI.h b/lib/asn1c/s1ap/S1AP_QCI.h index 5b19d71025..18d0a2bd63 100644 --- a/lib/asn1c/s1ap/S1AP_QCI.h +++ b/lib/asn1c/s1ap/S1AP_QCI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_QCI_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_QCI; asn_struct_free_f S1AP_QCI_free; asn_struct_print_f S1AP_QCI_print; asn_constr_check_f S1AP_QCI_constraint; -jer_type_encoder_f S1AP_QCI_encode_jer; per_type_decoder_f S1AP_QCI_decode_aper; per_type_encoder_f S1AP_QCI_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RAC.c b/lib/asn1c/s1ap/S1AP_RAC.c index 46d7ad51c4..fe826b4cda 100644 --- a/lib/asn1c/s1ap/S1AP_RAC.c +++ b/lib/asn1c/s1ap/S1AP_RAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RAC.h" diff --git a/lib/asn1c/s1ap/S1AP_RAC.h b/lib/asn1c/s1ap/S1AP_RAC.h index 44be2d5bc2..0d25c4663d 100644 --- a/lib/asn1c/s1ap/S1AP_RAC.h +++ b/lib/asn1c/s1ap/S1AP_RAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RAC; asn_struct_free_f S1AP_RAC_free; asn_struct_print_f S1AP_RAC_print; asn_constr_check_f S1AP_RAC_constraint; -jer_type_encoder_f S1AP_RAC_encode_jer; per_type_decoder_f S1AP_RAC_decode_aper; per_type_encoder_f S1AP_RAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RACSIndication.c b/lib/asn1c/s1ap/S1AP_RACSIndication.c index 55c801ed77..49c616c6d5 100644 --- a/lib/asn1c/s1ap/S1AP_RACSIndication.c +++ b/lib/asn1c/s1ap/S1AP_RACSIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RACSIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_RACSIndication.h b/lib/asn1c/s1ap/S1AP_RACSIndication.h index 4db53e5d1f..cdc96d533e 100644 --- a/lib/asn1c/s1ap/S1AP_RACSIndication.h +++ b/lib/asn1c/s1ap/S1AP_RACSIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RACSIndication_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RACSIndication_specs_1; asn_struct_free_f S1AP_RACSIndication_free; asn_struct_print_f S1AP_RACSIndication_print; asn_constr_check_f S1AP_RACSIndication_constraint; -jer_type_encoder_f S1AP_RACSIndication_encode_jer; per_type_decoder_f S1AP_RACSIndication_decode_aper; per_type_encoder_f S1AP_RACSIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.c b/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.c index 1796b147f2..b325d3b5f1 100644 --- a/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.c +++ b/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RAN-UE-NGAP-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.h b/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.h index cdf7f49a7c..22647c6ec0 100644 --- a/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.h +++ b/lib/asn1c/s1ap/S1AP_RAN-UE-NGAP-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RAN_UE_NGAP_ID_H_ @@ -28,7 +28,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RAN_UE_NGAP_ID_specs_1; asn_struct_free_f S1AP_RAN_UE_NGAP_ID_free; asn_struct_print_f S1AP_RAN_UE_NGAP_ID_print; asn_constr_check_f S1AP_RAN_UE_NGAP_ID_constraint; -jer_type_encoder_f S1AP_RAN_UE_NGAP_ID_encode_jer; per_type_decoder_f S1AP_RAN_UE_NGAP_ID_decode_aper; per_type_encoder_f S1AP_RAN_UE_NGAP_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RAT-Restrictions.c b/lib/asn1c/s1ap/S1AP_RAT-Restrictions.c index 907ed9d49a..af908685be 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-Restrictions.c +++ b/lib/asn1c/s1ap/S1AP_RAT-Restrictions.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RAT-Restrictions.h" diff --git a/lib/asn1c/s1ap/S1AP_RAT-Restrictions.h b/lib/asn1c/s1ap/S1AP_RAT-Restrictions.h index 0d2d00a0ee..2edfd7ae2b 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-Restrictions.h +++ b/lib/asn1c/s1ap/S1AP_RAT-Restrictions.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RAT_Restrictions_H_ diff --git a/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.c b/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.c index 70b5fe5e4b..bb53ad40eb 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.c +++ b/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RAT-RestrictionsItem.h" diff --git a/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.h b/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.h index cfe8944bf0..7bd48d909d 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.h +++ b/lib/asn1c/s1ap/S1AP_RAT-RestrictionsItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RAT_RestrictionsItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_RAT-Type.c b/lib/asn1c/s1ap/S1AP_RAT-Type.c index 4dbc77a2fb..581b428eb4 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-Type.c +++ b/lib/asn1c/s1ap/S1AP_RAT-Type.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RAT-Type.h" diff --git a/lib/asn1c/s1ap/S1AP_RAT-Type.h b/lib/asn1c/s1ap/S1AP_RAT-Type.h index 9fc2b7f158..753cb726c2 100644 --- a/lib/asn1c/s1ap/S1AP_RAT-Type.h +++ b/lib/asn1c/s1ap/S1AP_RAT-Type.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RAT_Type_H_ @@ -44,7 +44,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RAT_Type_specs_1; asn_struct_free_f S1AP_RAT_Type_free; asn_struct_print_f S1AP_RAT_Type_print; asn_constr_check_f S1AP_RAT_Type_constraint; -jer_type_encoder_f S1AP_RAT_Type_encode_jer; per_type_decoder_f S1AP_RAT_Type_decode_aper; per_type_encoder_f S1AP_RAT_Type_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RIMInformation.c b/lib/asn1c/s1ap/S1AP_RIMInformation.c index 7f8feedeff..ae05c9d2d1 100644 --- a/lib/asn1c/s1ap/S1AP_RIMInformation.c +++ b/lib/asn1c/s1ap/S1AP_RIMInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RIMInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_RIMInformation.h b/lib/asn1c/s1ap/S1AP_RIMInformation.h index a6471492dd..15c15b1f79 100644 --- a/lib/asn1c/s1ap/S1AP_RIMInformation.h +++ b/lib/asn1c/s1ap/S1AP_RIMInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RIMInformation_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RIMInformation; asn_struct_free_f S1AP_RIMInformation_free; asn_struct_print_f S1AP_RIMInformation_print; asn_constr_check_f S1AP_RIMInformation_constraint; -jer_type_encoder_f S1AP_RIMInformation_encode_jer; per_type_decoder_f S1AP_RIMInformation_decode_aper; per_type_encoder_f S1AP_RIMInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.c b/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.c index e686fd68a9..4f4642f301 100644 --- a/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.c +++ b/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RIMRoutingAddress.h" diff --git a/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.h b/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.h index 1e676c3c70..b78039a1d4 100644 --- a/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.h +++ b/lib/asn1c/s1ap/S1AP_RIMRoutingAddress.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RIMRoutingAddress_H_ diff --git a/lib/asn1c/s1ap/S1AP_RIMTransfer.c b/lib/asn1c/s1ap/S1AP_RIMTransfer.c index 99b79cca89..de0c8eb2f0 100644 --- a/lib/asn1c/s1ap/S1AP_RIMTransfer.c +++ b/lib/asn1c/s1ap/S1AP_RIMTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RIMTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_RIMTransfer.h b/lib/asn1c/s1ap/S1AP_RIMTransfer.h index 6502a4c2f3..86c957d147 100644 --- a/lib/asn1c/s1ap/S1AP_RIMTransfer.h +++ b/lib/asn1c/s1ap/S1AP_RIMTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RIMTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_RLFReportInformation.c b/lib/asn1c/s1ap/S1AP_RLFReportInformation.c index a89827f3dc..9c394966f4 100644 --- a/lib/asn1c/s1ap/S1AP_RLFReportInformation.c +++ b/lib/asn1c/s1ap/S1AP_RLFReportInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RLFReportInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_RLFReportInformation.h b/lib/asn1c/s1ap/S1AP_RLFReportInformation.h index b646611a8f..a4f9d206d9 100644 --- a/lib/asn1c/s1ap/S1AP_RLFReportInformation.h +++ b/lib/asn1c/s1ap/S1AP_RLFReportInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RLFReportInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_RNC-ID.c b/lib/asn1c/s1ap/S1AP_RNC-ID.c index 224f178177..d1324ddce4 100644 --- a/lib/asn1c/s1ap/S1AP_RNC-ID.c +++ b/lib/asn1c/s1ap/S1AP_RNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RNC-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_RNC-ID.h b/lib/asn1c/s1ap/S1AP_RNC-ID.h index cc120cb5f2..82d93c3405 100644 --- a/lib/asn1c/s1ap/S1AP_RNC-ID.h +++ b/lib/asn1c/s1ap/S1AP_RNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RNC_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RNC_ID; asn_struct_free_f S1AP_RNC_ID_free; asn_struct_print_f S1AP_RNC_ID_print; asn_constr_check_f S1AP_RNC_ID_constraint; -jer_type_encoder_f S1AP_RNC_ID_encode_jer; per_type_decoder_f S1AP_RNC_ID_decode_aper; per_type_encoder_f S1AP_RNC_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RRC-Container.c b/lib/asn1c/s1ap/S1AP_RRC-Container.c index 35653e99ee..3337ee0380 100644 --- a/lib/asn1c/s1ap/S1AP_RRC-Container.c +++ b/lib/asn1c/s1ap/S1AP_RRC-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RRC-Container.h" diff --git a/lib/asn1c/s1ap/S1AP_RRC-Container.h b/lib/asn1c/s1ap/S1AP_RRC-Container.h index e277aff7ff..99e990cc99 100644 --- a/lib/asn1c/s1ap/S1AP_RRC-Container.h +++ b/lib/asn1c/s1ap/S1AP_RRC-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RRC_Container_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RRC_Container; asn_struct_free_f S1AP_RRC_Container_free; asn_struct_print_f S1AP_RRC_Container_print; asn_constr_check_f S1AP_RRC_Container_constraint; -jer_type_encoder_f S1AP_RRC_Container_encode_jer; per_type_decoder_f S1AP_RRC_Container_decode_aper; per_type_encoder_f S1AP_RRC_Container_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.c b/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.c index ad41aea271..e71fcb08a1 100644 --- a/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.c +++ b/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RRC-Establishment-Cause.h" diff --git a/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.h b/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.h index 3248832e14..8fadc2b10c 100644 --- a/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.h +++ b/lib/asn1c/s1ap/S1AP_RRC-Establishment-Cause.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RRC_Establishment_Cause_H_ @@ -43,7 +43,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RRC_Establishment_Cause_specs_ asn_struct_free_f S1AP_RRC_Establishment_Cause_free; asn_struct_print_f S1AP_RRC_Establishment_Cause_print; asn_constr_check_f S1AP_RRC_Establishment_Cause_constraint; -jer_type_encoder_f S1AP_RRC_Establishment_Cause_encode_jer; per_type_decoder_f S1AP_RRC_Establishment_Cause_decode_aper; per_type_encoder_f S1AP_RRC_Establishment_Cause_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Range.c b/lib/asn1c/s1ap/S1AP_Range.c index 0e0f18aeff..9399af78ad 100644 --- a/lib/asn1c/s1ap/S1AP_Range.c +++ b/lib/asn1c/s1ap/S1AP_Range.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Range.h" diff --git a/lib/asn1c/s1ap/S1AP_Range.h b/lib/asn1c/s1ap/S1AP_Range.h index 9dd86e122c..6b0c830ac3 100644 --- a/lib/asn1c/s1ap/S1AP_Range.h +++ b/lib/asn1c/s1ap/S1AP_Range.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Range_H_ @@ -44,7 +44,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_Range_specs_1; asn_struct_free_f S1AP_Range_free; asn_struct_print_f S1AP_Range_print; asn_constr_check_f S1AP_Range_constraint; -jer_type_encoder_f S1AP_Range_encode_jer; per_type_decoder_f S1AP_Range_decode_aper; per_type_encoder_f S1AP_Range_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.c b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.c index 6d33e2cc9a..8745475f34 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.c +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReceiveStatusOfULPDCPSDUsExtended.h" diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.h b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.h index e4853a82b5..2b4727187e 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.h +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsExtended.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReceiveStatusOfULPDCPSDUsExtended_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ReceiveStatusOfULPDCPSDUsExtended; asn_struct_free_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_free; asn_struct_print_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_print; asn_constr_check_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_constraint; -jer_type_encoder_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_encode_jer; per_type_decoder_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_decode_aper; per_type_encoder_f S1AP_ReceiveStatusOfULPDCPSDUsExtended_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c index 3cf3150f69..acf1bf4ad6 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h" diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h index 7168c46bdb..10fb0063e6 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength asn_struct_free_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_free; asn_struct_print_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_print; asn_constr_check_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_constraint; -jer_type_encoder_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_jer; per_type_decoder_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_aper; per_type_encoder_f S1AP_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.c b/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.c index f592b42c39..37d24171f1 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.c +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReceiveStatusofULPDCPSDUs.h" diff --git a/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.h b/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.h index d20e282bfc..d8e1e34159 100644 --- a/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.h +++ b/lib/asn1c/s1ap/S1AP_ReceiveStatusofULPDCPSDUs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReceiveStatusofULPDCPSDUs_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_ReceiveStatusofULPDCPSDUs; asn_struct_free_f S1AP_ReceiveStatusofULPDCPSDUs_free; asn_struct_print_f S1AP_ReceiveStatusofULPDCPSDUs_print; asn_constr_check_f S1AP_ReceiveStatusofULPDCPSDUs_constraint; -jer_type_encoder_f S1AP_ReceiveStatusofULPDCPSDUs_encode_jer; per_type_decoder_f S1AP_ReceiveStatusofULPDCPSDUs_decode_aper; per_type_encoder_f S1AP_ReceiveStatusofULPDCPSDUs_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellItem.c b/lib/asn1c/s1ap/S1AP_RecommendedCellItem.c index fd5333b535..1747ab447c 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellItem.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedCellItem.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellItem.h b/lib/asn1c/s1ap/S1AP_RecommendedCellItem.h index fbd3cbc6e9..fb3036e085 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellItem.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedCellItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellList.c b/lib/asn1c/s1ap/S1AP_RecommendedCellList.c index 00117b951a..68582e7553 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellList.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedCellList.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellList.h b/lib/asn1c/s1ap/S1AP_RecommendedCellList.h index b8d462cbb4..36f45b797c 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellList.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedCellList_H_ diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.c b/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.c index 57c4f8c76e..6e84493982 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedCellsForPaging.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.h b/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.h index 56aff5383f..3eab3263c6 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedCellsForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedCellsForPaging_H_ diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBItem.c b/lib/asn1c/s1ap/S1AP_RecommendedENBItem.c index ff11ea8ced..98052e29fa 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBItem.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedENBItem.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBItem.h b/lib/asn1c/s1ap/S1AP_RecommendedENBItem.h index 7378cab156..74d5120133 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBItem.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedENBItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBList.c b/lib/asn1c/s1ap/S1AP_RecommendedENBList.c index f4c5670331..5ead2d4268 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBList.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedENBList.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBList.h b/lib/asn1c/s1ap/S1AP_RecommendedENBList.h index 3a0361b21d..80f6565e3d 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBList.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedENBList_H_ diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.c b/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.c index e948b9f33f..5750d164e7 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.c +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RecommendedENBsForPaging.h" diff --git a/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.h b/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.h index 10b3922bee..39032dc00b 100644 --- a/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.h +++ b/lib/asn1c/s1ap/S1AP_RecommendedENBsForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RecommendedENBsForPaging_H_ diff --git a/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.c b/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.c index bf6f779606..be70e9fcb2 100644 --- a/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.c +++ b/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RelativeMMECapacity.h" diff --git a/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.h b/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.h index 68ca59f6da..368b5e6dc7 100644 --- a/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.h +++ b/lib/asn1c/s1ap/S1AP_RelativeMMECapacity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RelativeMMECapacity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RelativeMMECapacity; asn_struct_free_f S1AP_RelativeMMECapacity_free; asn_struct_print_f S1AP_RelativeMMECapacity_print; asn_constr_check_f S1AP_RelativeMMECapacity_constraint; -jer_type_encoder_f S1AP_RelativeMMECapacity_encode_jer; per_type_decoder_f S1AP_RelativeMMECapacity_decode_aper; per_type_encoder_f S1AP_RelativeMMECapacity_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.c b/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.c index 41b64d787a..775d1107a0 100644 --- a/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.c +++ b/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RelayNode-Indicator.h" diff --git a/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.h b/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.h index 80ef13cda0..72d9960a81 100644 --- a/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.h +++ b/lib/asn1c/s1ap/S1AP_RelayNode-Indicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RelayNode_Indicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RelayNode_Indicator_specs_1; asn_struct_free_f S1AP_RelayNode_Indicator_free; asn_struct_print_f S1AP_RelayNode_Indicator_print; asn_constr_check_f S1AP_RelayNode_Indicator_constraint; -jer_type_encoder_f S1AP_RelayNode_Indicator_encode_jer; per_type_decoder_f S1AP_RelayNode_Indicator_decode_aper; per_type_encoder_f S1AP_RelayNode_Indicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RepetitionPeriod.c b/lib/asn1c/s1ap/S1AP_RepetitionPeriod.c index 306bb79e14..f4744f1551 100644 --- a/lib/asn1c/s1ap/S1AP_RepetitionPeriod.c +++ b/lib/asn1c/s1ap/S1AP_RepetitionPeriod.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RepetitionPeriod.h" diff --git a/lib/asn1c/s1ap/S1AP_RepetitionPeriod.h b/lib/asn1c/s1ap/S1AP_RepetitionPeriod.h index 2915577a62..71dabf0daa 100644 --- a/lib/asn1c/s1ap/S1AP_RepetitionPeriod.h +++ b/lib/asn1c/s1ap/S1AP_RepetitionPeriod.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RepetitionPeriod_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_RepetitionPeriod; asn_struct_free_f S1AP_RepetitionPeriod_free; asn_struct_print_f S1AP_RepetitionPeriod_print; asn_constr_check_f S1AP_RepetitionPeriod_constraint; -jer_type_encoder_f S1AP_RepetitionPeriod_encode_jer; per_type_decoder_f S1AP_RepetitionPeriod_decode_aper; per_type_encoder_f S1AP_RepetitionPeriod_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReportAmountMDT.c b/lib/asn1c/s1ap/S1AP_ReportAmountMDT.c index 0a227443ef..b22866c239 100644 --- a/lib/asn1c/s1ap/S1AP_ReportAmountMDT.c +++ b/lib/asn1c/s1ap/S1AP_ReportAmountMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReportAmountMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_ReportAmountMDT.h b/lib/asn1c/s1ap/S1AP_ReportAmountMDT.h index 7d5ef0d2d1..b0444630bb 100644 --- a/lib/asn1c/s1ap/S1AP_ReportAmountMDT.h +++ b/lib/asn1c/s1ap/S1AP_ReportAmountMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReportAmountMDT_H_ @@ -40,7 +40,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ReportAmountMDT_specs_1; asn_struct_free_f S1AP_ReportAmountMDT_free; asn_struct_print_f S1AP_ReportAmountMDT_print; asn_constr_check_f S1AP_ReportAmountMDT_constraint; -jer_type_encoder_f S1AP_ReportAmountMDT_encode_jer; per_type_decoder_f S1AP_ReportAmountMDT_decode_aper; per_type_encoder_f S1AP_ReportAmountMDT_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReportArea.c b/lib/asn1c/s1ap/S1AP_ReportArea.c index e7ed6af860..67b68ebf66 100644 --- a/lib/asn1c/s1ap/S1AP_ReportArea.c +++ b/lib/asn1c/s1ap/S1AP_ReportArea.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReportArea.h" diff --git a/lib/asn1c/s1ap/S1AP_ReportArea.h b/lib/asn1c/s1ap/S1AP_ReportArea.h index a32c40a993..b49a5a8fda 100644 --- a/lib/asn1c/s1ap/S1AP_ReportArea.h +++ b/lib/asn1c/s1ap/S1AP_ReportArea.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReportArea_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ReportArea_specs_1; asn_struct_free_f S1AP_ReportArea_free; asn_struct_print_f S1AP_ReportArea_print; asn_constr_check_f S1AP_ReportArea_constraint; -jer_type_encoder_f S1AP_ReportArea_encode_jer; per_type_decoder_f S1AP_ReportArea_decode_aper; per_type_encoder_f S1AP_ReportArea_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.c b/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.c index e32bf0c1d5..c3f64277cd 100644 --- a/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.c +++ b/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ReportIntervalMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.h b/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.h index 2178f11ca8..d80a2482da 100644 --- a/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.h +++ b/lib/asn1c/s1ap/S1AP_ReportIntervalMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ReportIntervalMDT_H_ @@ -45,7 +45,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ReportIntervalMDT_specs_1; asn_struct_free_f S1AP_ReportIntervalMDT_free; asn_struct_print_f S1AP_ReportIntervalMDT_print; asn_constr_check_f S1AP_ReportIntervalMDT_constraint; -jer_type_encoder_f S1AP_ReportIntervalMDT_encode_jer; per_type_decoder_f S1AP_ReportIntervalMDT_decode_aper; per_type_encoder_f S1AP_ReportIntervalMDT_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RequestType.c b/lib/asn1c/s1ap/S1AP_RequestType.c index da08b57b62..9d4721eef5 100644 --- a/lib/asn1c/s1ap/S1AP_RequestType.c +++ b/lib/asn1c/s1ap/S1AP_RequestType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RequestType.h" diff --git a/lib/asn1c/s1ap/S1AP_RequestType.h b/lib/asn1c/s1ap/S1AP_RequestType.h index 8a05e220a5..f0bc73021f 100644 --- a/lib/asn1c/s1ap/S1AP_RequestType.h +++ b/lib/asn1c/s1ap/S1AP_RequestType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RequestType_H_ diff --git a/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.c b/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.c index 1042e661fb..81be2e16c8 100644 --- a/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.c +++ b/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RequestTypeAdditionalInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.h b/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.h index 0d0b9bfc21..5610baa5fd 100644 --- a/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.h +++ b/lib/asn1c/s1ap/S1AP_RequestTypeAdditionalInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RequestTypeAdditionalInfo_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_RequestTypeAdditionalInfo_spec asn_struct_free_f S1AP_RequestTypeAdditionalInfo_free; asn_struct_print_f S1AP_RequestTypeAdditionalInfo_print; asn_constr_check_f S1AP_RequestTypeAdditionalInfo_constraint; -jer_type_encoder_f S1AP_RequestTypeAdditionalInfo_encode_jer; per_type_decoder_f S1AP_RequestTypeAdditionalInfo_decode_aper; per_type_encoder_f S1AP_RequestTypeAdditionalInfo_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_RerouteNASRequest.c b/lib/asn1c/s1ap/S1AP_RerouteNASRequest.c index a7705aa1ee..7d0dc80798 100644 --- a/lib/asn1c/s1ap/S1AP_RerouteNASRequest.c +++ b/lib/asn1c/s1ap/S1AP_RerouteNASRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RerouteNASRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_RerouteNASRequest.h b/lib/asn1c/s1ap/S1AP_RerouteNASRequest.h index 650d87f2f7..a4a3e9ab51 100644 --- a/lib/asn1c/s1ap/S1AP_RerouteNASRequest.h +++ b/lib/asn1c/s1ap/S1AP_RerouteNASRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RerouteNASRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_Reset.c b/lib/asn1c/s1ap/S1AP_Reset.c index 79bccf8695..2154ff6861 100644 --- a/lib/asn1c/s1ap/S1AP_Reset.c +++ b/lib/asn1c/s1ap/S1AP_Reset.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Reset.h" diff --git a/lib/asn1c/s1ap/S1AP_Reset.h b/lib/asn1c/s1ap/S1AP_Reset.h index 0a07b1d3ad..4571184c70 100644 --- a/lib/asn1c/s1ap/S1AP_Reset.h +++ b/lib/asn1c/s1ap/S1AP_Reset.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Reset_H_ diff --git a/lib/asn1c/s1ap/S1AP_ResetAcknowledge.c b/lib/asn1c/s1ap/S1AP_ResetAcknowledge.c index 642c6a1ade..472b6e1b6a 100644 --- a/lib/asn1c/s1ap/S1AP_ResetAcknowledge.c +++ b/lib/asn1c/s1ap/S1AP_ResetAcknowledge.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ResetAcknowledge.h" diff --git a/lib/asn1c/s1ap/S1AP_ResetAcknowledge.h b/lib/asn1c/s1ap/S1AP_ResetAcknowledge.h index f19b1944fb..00488fb688 100644 --- a/lib/asn1c/s1ap/S1AP_ResetAcknowledge.h +++ b/lib/asn1c/s1ap/S1AP_ResetAcknowledge.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ResetAcknowledge_H_ diff --git a/lib/asn1c/s1ap/S1AP_ResetAll.c b/lib/asn1c/s1ap/S1AP_ResetAll.c index 0230524d73..447e19ba0a 100644 --- a/lib/asn1c/s1ap/S1AP_ResetAll.c +++ b/lib/asn1c/s1ap/S1AP_ResetAll.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ResetAll.h" diff --git a/lib/asn1c/s1ap/S1AP_ResetAll.h b/lib/asn1c/s1ap/S1AP_ResetAll.h index 79c3c5c3e9..1f3fc6182c 100644 --- a/lib/asn1c/s1ap/S1AP_ResetAll.h +++ b/lib/asn1c/s1ap/S1AP_ResetAll.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ResetAll_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ResetAll_specs_1; asn_struct_free_f S1AP_ResetAll_free; asn_struct_print_f S1AP_ResetAll_print; asn_constr_check_f S1AP_ResetAll_constraint; -jer_type_encoder_f S1AP_ResetAll_encode_jer; per_type_decoder_f S1AP_ResetAll_decode_aper; per_type_encoder_f S1AP_ResetAll_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ResetType.c b/lib/asn1c/s1ap/S1AP_ResetType.c index 6634438198..efd8b9e40c 100644 --- a/lib/asn1c/s1ap/S1AP_ResetType.c +++ b/lib/asn1c/s1ap/S1AP_ResetType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ResetType.h" diff --git a/lib/asn1c/s1ap/S1AP_ResetType.h b/lib/asn1c/s1ap/S1AP_ResetType.h index e928c766ad..34986aae94 100644 --- a/lib/asn1c/s1ap/S1AP_ResetType.h +++ b/lib/asn1c/s1ap/S1AP_ResetType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ResetType_H_ diff --git a/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.c b/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.c index d2f92497b6..910fb99482 100644 --- a/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.c +++ b/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_RetrieveUEInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.h b/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.h index deb9813de5..b4cedf2fce 100644 --- a/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.h +++ b/lib/asn1c/s1ap/S1AP_RetrieveUEInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_RetrieveUEInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_Routing-ID.c b/lib/asn1c/s1ap/S1AP_Routing-ID.c index 8e24cb5c73..7053b41366 100644 --- a/lib/asn1c/s1ap/S1AP_Routing-ID.c +++ b/lib/asn1c/s1ap/S1AP_Routing-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Routing-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_Routing-ID.h b/lib/asn1c/s1ap/S1AP_Routing-ID.h index 74631875d4..7946bbccc1 100644 --- a/lib/asn1c/s1ap/S1AP_Routing-ID.h +++ b/lib/asn1c/s1ap/S1AP_Routing-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Routing_ID_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Routing_ID; asn_struct_free_f S1AP_Routing_ID_free; asn_struct_print_f S1AP_Routing_ID_print; asn_constr_check_f S1AP_Routing_ID_constraint; -jer_type_encoder_f S1AP_Routing_ID_encode_jer; per_type_decoder_f S1AP_Routing_ID_decode_aper; per_type_encoder_f S1AP_Routing_ID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_S-TMSI.c b/lib/asn1c/s1ap/S1AP_S-TMSI.c index 5bbcf1252f..e58ee45b51 100644 --- a/lib/asn1c/s1ap/S1AP_S-TMSI.c +++ b/lib/asn1c/s1ap/S1AP_S-TMSI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_S-TMSI.h" diff --git a/lib/asn1c/s1ap/S1AP_S-TMSI.h b/lib/asn1c/s1ap/S1AP_S-TMSI.h index 4ed76a2349..4ac2adba9b 100644 --- a/lib/asn1c/s1ap/S1AP_S-TMSI.h +++ b/lib/asn1c/s1ap/S1AP_S-TMSI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_S_TMSI_H_ diff --git a/lib/asn1c/s1ap/S1AP_S1AP-PDU.c b/lib/asn1c/s1ap/S1AP_S1AP-PDU.c index 4fe2d4d506..add5c153b4 100644 --- a/lib/asn1c/s1ap/S1AP_S1AP-PDU.c +++ b/lib/asn1c/s1ap/S1AP_S1AP-PDU.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_S1AP-PDU.h" diff --git a/lib/asn1c/s1ap/S1AP_S1AP-PDU.h b/lib/asn1c/s1ap/S1AP_S1AP-PDU.h index 6ad891a05e..bb1528716b 100644 --- a/lib/asn1c/s1ap/S1AP_S1AP-PDU.h +++ b/lib/asn1c/s1ap/S1AP_S1AP-PDU.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_S1AP_PDU_H_ diff --git a/lib/asn1c/s1ap/S1AP_S1SetupFailure.c b/lib/asn1c/s1ap/S1AP_S1SetupFailure.c index f8b9add6ce..bb34a10760 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupFailure.c +++ b/lib/asn1c/s1ap/S1AP_S1SetupFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_S1SetupFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_S1SetupFailure.h b/lib/asn1c/s1ap/S1AP_S1SetupFailure.h index f174828ee3..f3274bc281 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupFailure.h +++ b/lib/asn1c/s1ap/S1AP_S1SetupFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_S1SetupFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_S1SetupRequest.c b/lib/asn1c/s1ap/S1AP_S1SetupRequest.c index ce6db68f1a..c957ab8008 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupRequest.c +++ b/lib/asn1c/s1ap/S1AP_S1SetupRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_S1SetupRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_S1SetupRequest.h b/lib/asn1c/s1ap/S1AP_S1SetupRequest.h index 217a988ae3..d473df1feb 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupRequest.h +++ b/lib/asn1c/s1ap/S1AP_S1SetupRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_S1SetupRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_S1SetupResponse.c b/lib/asn1c/s1ap/S1AP_S1SetupResponse.c index ea4f73d5bc..8df8466aee 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupResponse.c +++ b/lib/asn1c/s1ap/S1AP_S1SetupResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_S1SetupResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_S1SetupResponse.h b/lib/asn1c/s1ap/S1AP_S1SetupResponse.h index 597f0a0e7e..e81be8e525 100644 --- a/lib/asn1c/s1ap/S1AP_S1SetupResponse.h +++ b/lib/asn1c/s1ap/S1AP_S1SetupResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_S1SetupResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.c b/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.c index bdc61628d0..0b0f5c5128 100644 --- a/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONConfigurationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.h b/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.h index e6fb5c8372..fa01863a61 100644 --- a/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_SONConfigurationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONConfigurationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_SONInformation-Extension.c b/lib/asn1c/s1ap/S1AP_SONInformation-Extension.c index 4e421e78b7..7c6390cbad 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformation-Extension.c +++ b/lib/asn1c/s1ap/S1AP_SONInformation-Extension.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONInformation-Extension.h" diff --git a/lib/asn1c/s1ap/S1AP_SONInformation-Extension.h b/lib/asn1c/s1ap/S1AP_SONInformation-Extension.h index df294a03d4..2ca19042a7 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformation-Extension.h +++ b/lib/asn1c/s1ap/S1AP_SONInformation-Extension.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONInformation_Extension_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SONInformation_Extension; asn_struct_free_f S1AP_SONInformation_Extension_free; asn_struct_print_f S1AP_SONInformation_Extension_print; asn_constr_check_f S1AP_SONInformation_Extension_constraint; -jer_type_encoder_f S1AP_SONInformation_Extension_encode_jer; per_type_decoder_f S1AP_SONInformation_Extension_decode_aper; per_type_encoder_f S1AP_SONInformation_Extension_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SONInformation.c b/lib/asn1c/s1ap/S1AP_SONInformation.c index 8415d97058..c2c2f9e1ca 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformation.c +++ b/lib/asn1c/s1ap/S1AP_SONInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_SONInformation.h b/lib/asn1c/s1ap/S1AP_SONInformation.h index 6ed1b14265..40a42e61d2 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformation.h +++ b/lib/asn1c/s1ap/S1AP_SONInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_SONInformationReply.c b/lib/asn1c/s1ap/S1AP_SONInformationReply.c index 44d4967732..f6b17e9011 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationReply.c +++ b/lib/asn1c/s1ap/S1AP_SONInformationReply.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONInformationReply.h" diff --git a/lib/asn1c/s1ap/S1AP_SONInformationReply.h b/lib/asn1c/s1ap/S1AP_SONInformationReply.h index 0d45f34823..3db6fcaa95 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationReply.h +++ b/lib/asn1c/s1ap/S1AP_SONInformationReply.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONInformationReply_H_ diff --git a/lib/asn1c/s1ap/S1AP_SONInformationReport.c b/lib/asn1c/s1ap/S1AP_SONInformationReport.c index ad5f4a6b4d..65e742eba1 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationReport.c +++ b/lib/asn1c/s1ap/S1AP_SONInformationReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONInformationReport.h" diff --git a/lib/asn1c/s1ap/S1AP_SONInformationReport.h b/lib/asn1c/s1ap/S1AP_SONInformationReport.h index 4ef7facc42..0fa5fee445 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationReport.h +++ b/lib/asn1c/s1ap/S1AP_SONInformationReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONInformationReport_H_ diff --git a/lib/asn1c/s1ap/S1AP_SONInformationRequest.c b/lib/asn1c/s1ap/S1AP_SONInformationRequest.c index 9ab13bbda5..cfac88f1e9 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationRequest.c +++ b/lib/asn1c/s1ap/S1AP_SONInformationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SONInformationRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_SONInformationRequest.h b/lib/asn1c/s1ap/S1AP_SONInformationRequest.h index 4ff102201a..8c356460d4 100644 --- a/lib/asn1c/s1ap/S1AP_SONInformationRequest.h +++ b/lib/asn1c/s1ap/S1AP_SONInformationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SONInformationRequest_H_ @@ -39,7 +39,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SONInformationRequest_specs_1; asn_struct_free_f S1AP_SONInformationRequest_free; asn_struct_print_f S1AP_SONInformationRequest_print; asn_constr_check_f S1AP_SONInformationRequest_constraint; -jer_type_encoder_f S1AP_SONInformationRequest_encode_jer; per_type_decoder_f S1AP_SONInformationRequest_decode_aper; per_type_encoder_f S1AP_SONInformationRequest_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.c b/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.c index dd83b0cbd8..4289de5e47 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.c +++ b/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SRVCCHOIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.h b/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.h index 1746244403..7f42c60475 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.h +++ b/lib/asn1c/s1ap/S1AP_SRVCCHOIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SRVCCHOIndication_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SRVCCHOIndication_specs_1; asn_struct_free_f S1AP_SRVCCHOIndication_free; asn_struct_print_f S1AP_SRVCCHOIndication_print; asn_constr_check_f S1AP_SRVCCHOIndication_constraint; -jer_type_encoder_f S1AP_SRVCCHOIndication_encode_jer; per_type_decoder_f S1AP_SRVCCHOIndication_decode_aper; per_type_encoder_f S1AP_SRVCCHOIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.c b/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.c index 4046572e0c..7bd60599f0 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.c +++ b/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SRVCCOperationNotPossible.h" diff --git a/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.h b/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.h index 64d1358ecd..f5cf292c15 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.h +++ b/lib/asn1c/s1ap/S1AP_SRVCCOperationNotPossible.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SRVCCOperationNotPossible_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SRVCCOperationNotPossible_spec asn_struct_free_f S1AP_SRVCCOperationNotPossible_free; asn_struct_print_f S1AP_SRVCCOperationNotPossible_print; asn_constr_check_f S1AP_SRVCCOperationNotPossible_constraint; -jer_type_encoder_f S1AP_SRVCCOperationNotPossible_encode_jer; per_type_decoder_f S1AP_SRVCCOperationNotPossible_decode_aper; per_type_encoder_f S1AP_SRVCCOperationNotPossible_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.c b/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.c index 704ffbbfab..2266636852 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.c +++ b/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SRVCCOperationPossible.h" diff --git a/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.h b/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.h index 2ea62d9e67..6ae67bd0ea 100644 --- a/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.h +++ b/lib/asn1c/s1ap/S1AP_SRVCCOperationPossible.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SRVCCOperationPossible_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SRVCCOperationPossible_specs_1 asn_struct_free_f S1AP_SRVCCOperationPossible_free; asn_struct_print_f S1AP_SRVCCOperationPossible_print; asn_constr_check_f S1AP_SRVCCOperationPossible_constraint; -jer_type_encoder_f S1AP_SRVCCOperationPossible_encode_jer; per_type_decoder_f S1AP_SRVCCOperationPossible_decode_aper; per_type_encoder_f S1AP_SRVCCOperationPossible_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.c b/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.c index 5634d22539..d68797127e 100644 --- a/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.c +++ b/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ScheduledCommunicationTime.h" diff --git a/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.h b/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.h index f83b587b1c..e8b384805d 100644 --- a/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.h +++ b/lib/asn1c/s1ap/S1AP_ScheduledCommunicationTime.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ScheduledCommunicationTime_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.c b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.c index 25c2ae4fb8..d21be60082 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.c +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecondaryRATDataUsageReport.h" diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.h b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.h index abf121e805..5d51c69399 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.h +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecondaryRATDataUsageReport_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.c b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.c index c5bb9e7b77..7cea7e7db4 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.c +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecondaryRATDataUsageReportItem.h" diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.h b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.h index b9f4082a49..57f8295b65 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.h +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecondaryRATDataUsageReportItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.c b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.c index b8d90920a4..ee220d641d 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.c +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecondaryRATDataUsageReportList.h" diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.h b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.h index 871cce4c65..8548e47564 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.h +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageReportList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecondaryRATDataUsageReportList_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.c b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.c index 041d90f9fe..9af4fd55b4 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.c +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecondaryRATDataUsageRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.h b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.h index 3dbac82855..f1311db691 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.h +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATDataUsageRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecondaryRATDataUsageRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SecondaryRATDataUsageRequest_s asn_struct_free_f S1AP_SecondaryRATDataUsageRequest_free; asn_struct_print_f S1AP_SecondaryRATDataUsageRequest_print; asn_constr_check_f S1AP_SecondaryRATDataUsageRequest_constraint; -jer_type_encoder_f S1AP_SecondaryRATDataUsageRequest_encode_jer; per_type_decoder_f S1AP_SecondaryRATDataUsageRequest_decode_aper; per_type_encoder_f S1AP_SecondaryRATDataUsageRequest_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATType.c b/lib/asn1c/s1ap/S1AP_SecondaryRATType.c index 387f41fb15..396ce00695 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATType.c +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecondaryRATType.h" diff --git a/lib/asn1c/s1ap/S1AP_SecondaryRATType.h b/lib/asn1c/s1ap/S1AP_SecondaryRATType.h index 17958a0b36..b2c6cac3da 100644 --- a/lib/asn1c/s1ap/S1AP_SecondaryRATType.h +++ b/lib/asn1c/s1ap/S1AP_SecondaryRATType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecondaryRATType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SecondaryRATType_specs_1; asn_struct_free_f S1AP_SecondaryRATType_free; asn_struct_print_f S1AP_SecondaryRATType_print; asn_constr_check_f S1AP_SecondaryRATType_constraint; -jer_type_encoder_f S1AP_SecondaryRATType_encode_jer; per_type_decoder_f S1AP_SecondaryRATType_decode_aper; per_type_encoder_f S1AP_SecondaryRATType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SecurityContext.c b/lib/asn1c/s1ap/S1AP_SecurityContext.c index 8e26aa36be..38991a3b54 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityContext.c +++ b/lib/asn1c/s1ap/S1AP_SecurityContext.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecurityContext.h" diff --git a/lib/asn1c/s1ap/S1AP_SecurityContext.h b/lib/asn1c/s1ap/S1AP_SecurityContext.h index 273e159d52..0032a507a2 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityContext.h +++ b/lib/asn1c/s1ap/S1AP_SecurityContext.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecurityContext_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecurityIndication.c b/lib/asn1c/s1ap/S1AP_SecurityIndication.c index 87d307b30f..0f6ea4fa08 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityIndication.c +++ b/lib/asn1c/s1ap/S1AP_SecurityIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecurityIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_SecurityIndication.h b/lib/asn1c/s1ap/S1AP_SecurityIndication.h index 451131ba7e..93c6a394a2 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityIndication.h +++ b/lib/asn1c/s1ap/S1AP_SecurityIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecurityIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_SecurityKey.c b/lib/asn1c/s1ap/S1AP_SecurityKey.c index 225600baf3..b7aea6d271 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityKey.c +++ b/lib/asn1c/s1ap/S1AP_SecurityKey.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecurityKey.h" diff --git a/lib/asn1c/s1ap/S1AP_SecurityKey.h b/lib/asn1c/s1ap/S1AP_SecurityKey.h index 27500229c7..328703034c 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityKey.h +++ b/lib/asn1c/s1ap/S1AP_SecurityKey.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecurityKey_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SecurityKey; asn_struct_free_f S1AP_SecurityKey_free; asn_struct_print_f S1AP_SecurityKey_print; asn_constr_check_f S1AP_SecurityKey_constraint; -jer_type_encoder_f S1AP_SecurityKey_encode_jer; per_type_decoder_f S1AP_SecurityKey_decode_aper; per_type_encoder_f S1AP_SecurityKey_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SecurityResult.c b/lib/asn1c/s1ap/S1AP_SecurityResult.c index ce484d1526..31e7fbab1a 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityResult.c +++ b/lib/asn1c/s1ap/S1AP_SecurityResult.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SecurityResult.h" diff --git a/lib/asn1c/s1ap/S1AP_SecurityResult.h b/lib/asn1c/s1ap/S1AP_SecurityResult.h index 7b2738d8d3..9bf1f46b02 100644 --- a/lib/asn1c/s1ap/S1AP_SecurityResult.h +++ b/lib/asn1c/s1ap/S1AP_SecurityResult.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SecurityResult_H_ diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfig.c b/lib/asn1c/s1ap/S1AP_SensorMeasConfig.c index 04d192bbdf..b6d78ca2f7 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfig.c +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SensorMeasConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfig.h b/lib/asn1c/s1ap/S1AP_SensorMeasConfig.h index 9373a0938f..34484ca463 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfig.h +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SensorMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SensorMeasConfig_specs_1; asn_struct_free_f S1AP_SensorMeasConfig_free; asn_struct_print_f S1AP_SensorMeasConfig_print; asn_constr_check_f S1AP_SensorMeasConfig_constraint; -jer_type_encoder_f S1AP_SensorMeasConfig_encode_jer; per_type_decoder_f S1AP_SensorMeasConfig_decode_aper; per_type_encoder_f S1AP_SensorMeasConfig_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.c b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.c index f065c12459..c1939f290b 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.c +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SensorMeasConfigNameItem.h" diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.h b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.h index e3a288e3da..5e71727ccb 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.h +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SensorMeasConfigNameItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.c b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.c index 23c184416e..afbe80c247 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.c +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SensorMeasConfigNameList.h" diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.h b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.h index e7c5725ed6..d68ed7b68a 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.h +++ b/lib/asn1c/s1ap/S1AP_SensorMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SensorMeasConfigNameList_H_ diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.c b/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.c index aafe1a53e8..357a9c864c 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.c +++ b/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SensorMeasurementConfiguration.h" diff --git a/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.h b/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.h index 5b6b9123dd..04f93b0517 100644 --- a/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.h +++ b/lib/asn1c/s1ap/S1AP_SensorMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SensorMeasurementConfiguration_H_ diff --git a/lib/asn1c/s1ap/S1AP_SensorNameConfig.c b/lib/asn1c/s1ap/S1AP_SensorNameConfig.c index f53927c59d..e074a9fddf 100644 --- a/lib/asn1c/s1ap/S1AP_SensorNameConfig.c +++ b/lib/asn1c/s1ap/S1AP_SensorNameConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SensorNameConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_SensorNameConfig.h b/lib/asn1c/s1ap/S1AP_SensorNameConfig.h index 7f6473bdc4..4a904ba6a1 100644 --- a/lib/asn1c/s1ap/S1AP_SensorNameConfig.h +++ b/lib/asn1c/s1ap/S1AP_SensorNameConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SensorNameConfig_H_ diff --git a/lib/asn1c/s1ap/S1AP_SerialNumber.c b/lib/asn1c/s1ap/S1AP_SerialNumber.c index 0e3e2cf544..a48eff9768 100644 --- a/lib/asn1c/s1ap/S1AP_SerialNumber.c +++ b/lib/asn1c/s1ap/S1AP_SerialNumber.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SerialNumber.h" diff --git a/lib/asn1c/s1ap/S1AP_SerialNumber.h b/lib/asn1c/s1ap/S1AP_SerialNumber.h index dfe8a1f9d0..045afd275d 100644 --- a/lib/asn1c/s1ap/S1AP_SerialNumber.h +++ b/lib/asn1c/s1ap/S1AP_SerialNumber.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SerialNumber_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SerialNumber; asn_struct_free_f S1AP_SerialNumber_free; asn_struct_print_f S1AP_SerialNumber_print; asn_constr_check_f S1AP_SerialNumber_constraint; -jer_type_encoder_f S1AP_SerialNumber_encode_jer; per_type_decoder_f S1AP_SerialNumber_decode_aper; per_type_encoder_f S1AP_SerialNumber_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_ServedDCNs.c b/lib/asn1c/s1ap/S1AP_ServedDCNs.c index e1dd1b31f9..48acad52d6 100644 --- a/lib/asn1c/s1ap/S1AP_ServedDCNs.c +++ b/lib/asn1c/s1ap/S1AP_ServedDCNs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedDCNs.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedDCNs.h b/lib/asn1c/s1ap/S1AP_ServedDCNs.h index fdb558a7f7..6631de6542 100644 --- a/lib/asn1c/s1ap/S1AP_ServedDCNs.h +++ b/lib/asn1c/s1ap/S1AP_ServedDCNs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedDCNs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedDCNsItem.c b/lib/asn1c/s1ap/S1AP_ServedDCNsItem.c index 2ab2a10146..6401ae8fa6 100644 --- a/lib/asn1c/s1ap/S1AP_ServedDCNsItem.c +++ b/lib/asn1c/s1ap/S1AP_ServedDCNsItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedDCNsItem.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedDCNsItem.h b/lib/asn1c/s1ap/S1AP_ServedDCNsItem.h index 1db76b5c96..c65464ce13 100644 --- a/lib/asn1c/s1ap/S1AP_ServedDCNsItem.h +++ b/lib/asn1c/s1ap/S1AP_ServedDCNsItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedDCNsItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.c b/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.c index 68948fd58a..dcd74c5ed7 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.c +++ b/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedGUMMEIs.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.h b/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.h index a25938f335..3be5cc1087 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.h +++ b/lib/asn1c/s1ap/S1AP_ServedGUMMEIs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedGUMMEIs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.c b/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.c index 9ad21a42ff..1e6113a305 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.c +++ b/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedGUMMEIsItem.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.h b/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.h index f474222aa7..65493ce529 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.h +++ b/lib/asn1c/s1ap/S1AP_ServedGUMMEIsItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedGUMMEIsItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedGroupIDs.c b/lib/asn1c/s1ap/S1AP_ServedGroupIDs.c index fe9776c844..dcece5fe76 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGroupIDs.c +++ b/lib/asn1c/s1ap/S1AP_ServedGroupIDs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedGroupIDs.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedGroupIDs.h b/lib/asn1c/s1ap/S1AP_ServedGroupIDs.h index 1e354c1b24..948d8f59b2 100644 --- a/lib/asn1c/s1ap/S1AP_ServedGroupIDs.h +++ b/lib/asn1c/s1ap/S1AP_ServedGroupIDs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedGroupIDs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedMMECs.c b/lib/asn1c/s1ap/S1AP_ServedMMECs.c index 066d551be2..f9789a088e 100644 --- a/lib/asn1c/s1ap/S1AP_ServedMMECs.c +++ b/lib/asn1c/s1ap/S1AP_ServedMMECs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedMMECs.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedMMECs.h b/lib/asn1c/s1ap/S1AP_ServedMMECs.h index a2f7163d85..c8250324f0 100644 --- a/lib/asn1c/s1ap/S1AP_ServedMMECs.h +++ b/lib/asn1c/s1ap/S1AP_ServedMMECs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedMMECs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServedPLMNs.c b/lib/asn1c/s1ap/S1AP_ServedPLMNs.c index 6480d7d6bb..70b55e1f07 100644 --- a/lib/asn1c/s1ap/S1AP_ServedPLMNs.c +++ b/lib/asn1c/s1ap/S1AP_ServedPLMNs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServedPLMNs.h" diff --git a/lib/asn1c/s1ap/S1AP_ServedPLMNs.h b/lib/asn1c/s1ap/S1AP_ServedPLMNs.h index b890f87dae..33aa85d5c4 100644 --- a/lib/asn1c/s1ap/S1AP_ServedPLMNs.h +++ b/lib/asn1c/s1ap/S1AP_ServedPLMNs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServedPLMNs_H_ diff --git a/lib/asn1c/s1ap/S1AP_ServiceType.c b/lib/asn1c/s1ap/S1AP_ServiceType.c index 90e14b87e6..882c31dab1 100644 --- a/lib/asn1c/s1ap/S1AP_ServiceType.c +++ b/lib/asn1c/s1ap/S1AP_ServiceType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_ServiceType.h" diff --git a/lib/asn1c/s1ap/S1AP_ServiceType.h b/lib/asn1c/s1ap/S1AP_ServiceType.h index bcb453d417..a4a929ae42 100644 --- a/lib/asn1c/s1ap/S1AP_ServiceType.h +++ b/lib/asn1c/s1ap/S1AP_ServiceType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_ServiceType_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_ServiceType_specs_1; asn_struct_free_f S1AP_ServiceType_free; asn_struct_print_f S1AP_ServiceType_print; asn_constr_check_f S1AP_ServiceType_constraint; -jer_type_encoder_f S1AP_ServiceType_encode_jer; per_type_decoder_f S1AP_ServiceType_decode_aper; per_type_encoder_f S1AP_ServiceType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.c index 0f753fa82c..0ea062b77b 100644 --- a/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Source-ToTarget-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.h index 5b76efd013..653bf88dbd 100644 --- a/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_Source-ToTarget-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Source_ToTarget_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Source_ToTarget_TransparentContainer; asn_struct_free_f S1AP_Source_ToTarget_TransparentContainer_free; asn_struct_print_f S1AP_Source_ToTarget_TransparentContainer_print; asn_constr_check_f S1AP_Source_ToTarget_TransparentContainer_constraint; -jer_type_encoder_f S1AP_Source_ToTarget_TransparentContainer_encode_jer; per_type_decoder_f S1AP_Source_ToTarget_TransparentContainer_decode_aper; per_type_encoder_f S1AP_Source_ToTarget_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.c index 2a2a23010e..55c35de5c8 100644 --- a/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceBSS-ToTargetBSS-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.h index a1887d0a35..93f0121eff 100644 --- a/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_SourceBSS-ToTargetBSS-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceBSS_ToTargetBSS_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SourceBSS_ToTargetBSS_TransparentConta asn_struct_free_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_free; asn_struct_print_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_print; asn_constr_check_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_constraint; -jer_type_encoder_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_encode_jer; per_type_decoder_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_decode_aper; per_type_encoder_f S1AP_SourceBSS_ToTargetBSS_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.c b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.c index 167fc5323e..b8c8fe2ce8 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.c +++ b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceNgRanNode-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.h b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.h index 06fdcc39b9..0df991dca6 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.h +++ b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceNgRanNode_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.c index 13faaf8998..438ae384cb 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h index 7071eefa38..e7c2f65884 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SourceNgRanNode_ToTargetNgRanNode_Tran asn_struct_free_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_free; asn_struct_print_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_print; asn_constr_check_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_constraint; -jer_type_encoder_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_jer; per_type_decoder_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_aper; per_type_encoder_f S1AP_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.c b/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.c index 0a27667f41..9c3f5d301a 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.c +++ b/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceNodeID-Extension.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.h b/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.h index 215272fb01..357e74e6bc 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.h +++ b/lib/asn1c/s1ap/S1AP_SourceNodeID-Extension.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceNodeID_Extension_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SourceNodeID_Extension; asn_struct_free_f S1AP_SourceNodeID_Extension_free; asn_struct_print_f S1AP_SourceNodeID_Extension_print; asn_constr_check_f S1AP_SourceNodeID_Extension_constraint; -jer_type_encoder_f S1AP_SourceNodeID_Extension_encode_jer; per_type_decoder_f S1AP_SourceNodeID_Extension_decode_aper; per_type_encoder_f S1AP_SourceNodeID_Extension_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceNodeID.c b/lib/asn1c/s1ap/S1AP_SourceNodeID.c index 4f677d2d88..4aadae8673 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNodeID.c +++ b/lib/asn1c/s1ap/S1AP_SourceNodeID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceNodeID.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceNodeID.h b/lib/asn1c/s1ap/S1AP_SourceNodeID.h index 3d4d0d4ef6..a2a067be8f 100644 --- a/lib/asn1c/s1ap/S1AP_SourceNodeID.h +++ b/lib/asn1c/s1ap/S1AP_SourceNodeID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceNodeID_H_ diff --git a/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.c b/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.c index 47d27680a0..3e50e77ae1 100644 --- a/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.c +++ b/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceOfUEActivityBehaviourInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.h b/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.h index 1114eec0ad..25b31ed763 100644 --- a/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.h +++ b/lib/asn1c/s1ap/S1AP_SourceOfUEActivityBehaviourInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceOfUEActivityBehaviourInformation_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SourceOfUEActivityBehaviourInf asn_struct_free_f S1AP_SourceOfUEActivityBehaviourInformation_free; asn_struct_print_f S1AP_SourceOfUEActivityBehaviourInformation_print; asn_constr_check_f S1AP_SourceOfUEActivityBehaviourInformation_constraint; -jer_type_encoder_f S1AP_SourceOfUEActivityBehaviourInformation_encode_jer; per_type_decoder_f S1AP_SourceOfUEActivityBehaviourInformation_decode_aper; per_type_encoder_f S1AP_SourceOfUEActivityBehaviourInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.c index 87c9c4458b..b1424211d1 100644 --- a/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceRNC-ToTargetRNC-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.h index dca1da5ed6..6d4d914f86 100644 --- a/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_SourceRNC-ToTargetRNC-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceRNC_ToTargetRNC_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SourceRNC_ToTargetRNC_TransparentConta asn_struct_free_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_free; asn_struct_print_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_print; asn_constr_check_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_constraint; -jer_type_encoder_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_encode_jer; per_type_decoder_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_decode_aper; per_type_encoder_f S1AP_SourceRNC_ToTargetRNC_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SourceeNB-ID.c b/lib/asn1c/s1ap/S1AP_SourceeNB-ID.c index 1b49a145f4..33bc94ac53 100644 --- a/lib/asn1c/s1ap/S1AP_SourceeNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_SourceeNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceeNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceeNB-ID.h b/lib/asn1c/s1ap/S1AP_SourceeNB-ID.h index 67187c82bb..c30adb0da1 100644 --- a/lib/asn1c/s1ap/S1AP_SourceeNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_SourceeNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceeNB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.c index 138516522a..a09e52d4cb 100644 --- a/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SourceeNB-ToTargeteNB-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.h index 674b9a4021..026e934b63 100644 --- a/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_SourceeNB-ToTargeteNB-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SourceeNB_ToTargeteNB_TransparentContainer_H_ diff --git a/lib/asn1c/s1ap/S1AP_StratumLevel.c b/lib/asn1c/s1ap/S1AP_StratumLevel.c index 455a2805bd..b943768244 100644 --- a/lib/asn1c/s1ap/S1AP_StratumLevel.c +++ b/lib/asn1c/s1ap/S1AP_StratumLevel.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_StratumLevel.h" diff --git a/lib/asn1c/s1ap/S1AP_StratumLevel.h b/lib/asn1c/s1ap/S1AP_StratumLevel.h index 27dfdf887a..280fbb5ae7 100644 --- a/lib/asn1c/s1ap/S1AP_StratumLevel.h +++ b/lib/asn1c/s1ap/S1AP_StratumLevel.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_StratumLevel_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_StratumLevel; asn_struct_free_f S1AP_StratumLevel_free; asn_struct_print_f S1AP_StratumLevel_print; asn_constr_check_f S1AP_StratumLevel_constraint; -jer_type_encoder_f S1AP_StratumLevel_encode_jer; per_type_decoder_f S1AP_StratumLevel_decode_aper; per_type_encoder_f S1AP_StratumLevel_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.c b/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.c index 931b5afd9a..2b4abc1e33 100644 --- a/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.c +++ b/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SubscriberProfileIDforRFP.h" diff --git a/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.h b/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.h index 62e6069757..216b93fbd2 100644 --- a/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.h +++ b/lib/asn1c/s1ap/S1AP_SubscriberProfileIDforRFP.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SubscriberProfileIDforRFP_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_SubscriberProfileIDforRFP; asn_struct_free_f S1AP_SubscriberProfileIDforRFP_free; asn_struct_print_f S1AP_SubscriberProfileIDforRFP_print; asn_constr_check_f S1AP_SubscriberProfileIDforRFP_constraint; -jer_type_encoder_f S1AP_SubscriberProfileIDforRFP_encode_jer; per_type_decoder_f S1AP_SubscriberProfileIDforRFP_decode_aper; per_type_encoder_f S1AP_SubscriberProfileIDforRFP_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.c b/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.c index 36266a2453..400be86485 100644 --- a/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.c +++ b/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Subscription-Based-UE-DifferentiationInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.h b/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.h index c53539f0c2..558b863286 100644 --- a/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.h +++ b/lib/asn1c/s1ap/S1AP_Subscription-Based-UE-DifferentiationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Subscription_Based_UE_DifferentiationInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.c b/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.c index e1860c6e95..8d68e9254a 100644 --- a/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.c +++ b/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SuccessfulOutcome.h" diff --git a/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.h b/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.h index 423203d7c6..719c4a13b6 100644 --- a/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.h +++ b/lib/asn1c/s1ap/S1AP_SuccessfulOutcome.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SuccessfulOutcome_H_ diff --git a/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.c b/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.c index 99a7639998..18cbf0ba89 100644 --- a/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.c +++ b/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SupportedTAs-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.h b/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.h index f74f3921f6..b32deab7eb 100644 --- a/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.h +++ b/lib/asn1c/s1ap/S1AP_SupportedTAs-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SupportedTAs_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_SupportedTAs.c b/lib/asn1c/s1ap/S1AP_SupportedTAs.c index 6da52b88df..a5a95cbbdd 100644 --- a/lib/asn1c/s1ap/S1AP_SupportedTAs.c +++ b/lib/asn1c/s1ap/S1AP_SupportedTAs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SupportedTAs.h" diff --git a/lib/asn1c/s1ap/S1AP_SupportedTAs.h b/lib/asn1c/s1ap/S1AP_SupportedTAs.h index 22578db766..0a68d1a904 100644 --- a/lib/asn1c/s1ap/S1AP_SupportedTAs.h +++ b/lib/asn1c/s1ap/S1AP_SupportedTAs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SupportedTAs_H_ diff --git a/lib/asn1c/s1ap/S1AP_SynchronisationInformation.c b/lib/asn1c/s1ap/S1AP_SynchronisationInformation.c index c31176fabb..07b1db72ed 100644 --- a/lib/asn1c/s1ap/S1AP_SynchronisationInformation.c +++ b/lib/asn1c/s1ap/S1AP_SynchronisationInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SynchronisationInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_SynchronisationInformation.h b/lib/asn1c/s1ap/S1AP_SynchronisationInformation.h index 4ad9c3bb85..7c5faa58b9 100644 --- a/lib/asn1c/s1ap/S1AP_SynchronisationInformation.h +++ b/lib/asn1c/s1ap/S1AP_SynchronisationInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SynchronisationInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_SynchronisationStatus.c b/lib/asn1c/s1ap/S1AP_SynchronisationStatus.c index 20ad76a5cd..b0fce978d9 100644 --- a/lib/asn1c/s1ap/S1AP_SynchronisationStatus.c +++ b/lib/asn1c/s1ap/S1AP_SynchronisationStatus.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_SynchronisationStatus.h" diff --git a/lib/asn1c/s1ap/S1AP_SynchronisationStatus.h b/lib/asn1c/s1ap/S1AP_SynchronisationStatus.h index d5452ddb99..650d34634f 100644 --- a/lib/asn1c/s1ap/S1AP_SynchronisationStatus.h +++ b/lib/asn1c/s1ap/S1AP_SynchronisationStatus.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_SynchronisationStatus_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_SynchronisationStatus_specs_1; asn_struct_free_f S1AP_SynchronisationStatus_free; asn_struct_print_f S1AP_SynchronisationStatus_print; asn_constr_check_f S1AP_SynchronisationStatus_constraint; -jer_type_encoder_f S1AP_SynchronisationStatus_encode_jer; per_type_decoder_f S1AP_SynchronisationStatus_decode_aper; per_type_encoder_f S1AP_SynchronisationStatus_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TABasedMDT.c b/lib/asn1c/s1ap/S1AP_TABasedMDT.c index bf73c59a36..99b5af65d3 100644 --- a/lib/asn1c/s1ap/S1AP_TABasedMDT.c +++ b/lib/asn1c/s1ap/S1AP_TABasedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TABasedMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_TABasedMDT.h b/lib/asn1c/s1ap/S1AP_TABasedMDT.h index 6759cbc23d..e817c2fe97 100644 --- a/lib/asn1c/s1ap/S1AP_TABasedMDT.h +++ b/lib/asn1c/s1ap/S1AP_TABasedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TABasedMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_TABasedQMC.c b/lib/asn1c/s1ap/S1AP_TABasedQMC.c index f9c5408c20..18d7a31ec2 100644 --- a/lib/asn1c/s1ap/S1AP_TABasedQMC.c +++ b/lib/asn1c/s1ap/S1AP_TABasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TABasedQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_TABasedQMC.h b/lib/asn1c/s1ap/S1AP_TABasedQMC.h index 610e2473f1..ef03d57799 100644 --- a/lib/asn1c/s1ap/S1AP_TABasedQMC.h +++ b/lib/asn1c/s1ap/S1AP_TABasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TABasedQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAC.c b/lib/asn1c/s1ap/S1AP_TAC.c index 80b274f3da..b996cba509 100644 --- a/lib/asn1c/s1ap/S1AP_TAC.c +++ b/lib/asn1c/s1ap/S1AP_TAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAC.h" diff --git a/lib/asn1c/s1ap/S1AP_TAC.h b/lib/asn1c/s1ap/S1AP_TAC.h index e5ca113260..88981a2bc6 100644 --- a/lib/asn1c/s1ap/S1AP_TAC.h +++ b/lib/asn1c/s1ap/S1AP_TAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TAC; asn_struct_free_f S1AP_TAC_free; asn_struct_print_f S1AP_TAC_print; asn_constr_check_f S1AP_TAC_constraint; -jer_type_encoder_f S1AP_TAC_encode_jer; per_type_decoder_f S1AP_TAC_decode_aper; per_type_encoder_f S1AP_TAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.c b/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.c index 20e9bdf565..6071b69cdd 100644 --- a/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.c +++ b/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TACList-In-LTE-NTN.h" diff --git a/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.h b/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.h index 33a19b12d0..9feafe651b 100644 --- a/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.h +++ b/lib/asn1c/s1ap/S1AP_TACList-In-LTE-NTN.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TACList_In_LTE_NTN_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.c b/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.c index 7de02e750d..fef1a565f0 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.c +++ b/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAI-Broadcast-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.h b/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.h index 11c712b486..99753d6e7d 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.h +++ b/lib/asn1c/s1ap/S1AP_TAI-Broadcast-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAI_Broadcast_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAI-Broadcast.c b/lib/asn1c/s1ap/S1AP_TAI-Broadcast.c index 7d9bece69c..9b95b61bf1 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Broadcast.c +++ b/lib/asn1c/s1ap/S1AP_TAI-Broadcast.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAI-Broadcast.h" diff --git a/lib/asn1c/s1ap/S1AP_TAI-Broadcast.h b/lib/asn1c/s1ap/S1AP_TAI-Broadcast.h index a6821dff92..c6a2e3170d 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Broadcast.h +++ b/lib/asn1c/s1ap/S1AP_TAI-Broadcast.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAI_Broadcast_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.c b/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.c index 71aa71a299..cb3a7919c5 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.c +++ b/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAI-Cancelled-Item.h" diff --git a/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.h b/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.h index 256a671136..e17fd6a094 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.h +++ b/lib/asn1c/s1ap/S1AP_TAI-Cancelled-Item.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAI_Cancelled_Item_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAI-Cancelled.c b/lib/asn1c/s1ap/S1AP_TAI-Cancelled.c index 3099b41783..b3b072a66c 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Cancelled.c +++ b/lib/asn1c/s1ap/S1AP_TAI-Cancelled.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAI-Cancelled.h" diff --git a/lib/asn1c/s1ap/S1AP_TAI-Cancelled.h b/lib/asn1c/s1ap/S1AP_TAI-Cancelled.h index ea3988b53b..5154008dcf 100644 --- a/lib/asn1c/s1ap/S1AP_TAI-Cancelled.h +++ b/lib/asn1c/s1ap/S1AP_TAI-Cancelled.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAI_Cancelled_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAI.c b/lib/asn1c/s1ap/S1AP_TAI.c index 224e5e7625..60448f01c9 100644 --- a/lib/asn1c/s1ap/S1AP_TAI.c +++ b/lib/asn1c/s1ap/S1AP_TAI.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAI.h" diff --git a/lib/asn1c/s1ap/S1AP_TAI.h b/lib/asn1c/s1ap/S1AP_TAI.h index c43b6ea2d3..6e7edc5e7e 100644 --- a/lib/asn1c/s1ap/S1AP_TAI.h +++ b/lib/asn1c/s1ap/S1AP_TAI.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAI_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIBasedMDT.c b/lib/asn1c/s1ap/S1AP_TAIBasedMDT.c index 2ababef43f..fb4f83a9bf 100644 --- a/lib/asn1c/s1ap/S1AP_TAIBasedMDT.c +++ b/lib/asn1c/s1ap/S1AP_TAIBasedMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIBasedMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIBasedMDT.h b/lib/asn1c/s1ap/S1AP_TAIBasedMDT.h index e48e4670dd..8e216f21c4 100644 --- a/lib/asn1c/s1ap/S1AP_TAIBasedMDT.h +++ b/lib/asn1c/s1ap/S1AP_TAIBasedMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIBasedMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIBasedQMC.c b/lib/asn1c/s1ap/S1AP_TAIBasedQMC.c index 22693af0ee..2681ad162e 100644 --- a/lib/asn1c/s1ap/S1AP_TAIBasedQMC.c +++ b/lib/asn1c/s1ap/S1AP_TAIBasedQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIBasedQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIBasedQMC.h b/lib/asn1c/s1ap/S1AP_TAIBasedQMC.h index e6a683c1b4..6c9176cc5a 100644 --- a/lib/asn1c/s1ap/S1AP_TAIBasedQMC.h +++ b/lib/asn1c/s1ap/S1AP_TAIBasedQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIBasedQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIItem.c b/lib/asn1c/s1ap/S1AP_TAIItem.c index e521904e4e..3532bee326 100644 --- a/lib/asn1c/s1ap/S1AP_TAIItem.c +++ b/lib/asn1c/s1ap/S1AP_TAIItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIItem.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIItem.h b/lib/asn1c/s1ap/S1AP_TAIItem.h index d11be7a7ed..81840fd1d0 100644 --- a/lib/asn1c/s1ap/S1AP_TAIItem.h +++ b/lib/asn1c/s1ap/S1AP_TAIItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIList.c b/lib/asn1c/s1ap/S1AP_TAIList.c index c70c8145d7..ee4fa062a6 100644 --- a/lib/asn1c/s1ap/S1AP_TAIList.c +++ b/lib/asn1c/s1ap/S1AP_TAIList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIList.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIList.h b/lib/asn1c/s1ap/S1AP_TAIList.h index d844ab6cbf..3f03028fdd 100644 --- a/lib/asn1c/s1ap/S1AP_TAIList.h +++ b/lib/asn1c/s1ap/S1AP_TAIList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIList_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIListForRestart.c b/lib/asn1c/s1ap/S1AP_TAIListForRestart.c index c54692eab2..124879b379 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListForRestart.c +++ b/lib/asn1c/s1ap/S1AP_TAIListForRestart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIListForRestart.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIListForRestart.h b/lib/asn1c/s1ap/S1AP_TAIListForRestart.h index 5e9800baac..aa3fec844b 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListForRestart.h +++ b/lib/asn1c/s1ap/S1AP_TAIListForRestart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIListForRestart_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIListforMDT.c b/lib/asn1c/s1ap/S1AP_TAIListforMDT.c index bbdb9936ec..0bf9881343 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforMDT.c +++ b/lib/asn1c/s1ap/S1AP_TAIListforMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIListforMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIListforMDT.h b/lib/asn1c/s1ap/S1AP_TAIListforMDT.h index ec96b81fda..97b1967e14 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforMDT.h +++ b/lib/asn1c/s1ap/S1AP_TAIListforMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIListforMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIListforQMC.c b/lib/asn1c/s1ap/S1AP_TAIListforQMC.c index 1c87564de7..f502d419e1 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforQMC.c +++ b/lib/asn1c/s1ap/S1AP_TAIListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIListforQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIListforQMC.h b/lib/asn1c/s1ap/S1AP_TAIListforQMC.h index 8bd76e329d..eb7533311b 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforQMC.h +++ b/lib/asn1c/s1ap/S1AP_TAIListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIListforQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAIListforWarning.c b/lib/asn1c/s1ap/S1AP_TAIListforWarning.c index 86ec494f30..ddd298d12c 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforWarning.c +++ b/lib/asn1c/s1ap/S1AP_TAIListforWarning.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAIListforWarning.h" diff --git a/lib/asn1c/s1ap/S1AP_TAIListforWarning.h b/lib/asn1c/s1ap/S1AP_TAIListforWarning.h index 7efc57132f..a77dbb0b86 100644 --- a/lib/asn1c/s1ap/S1AP_TAIListforWarning.h +++ b/lib/asn1c/s1ap/S1AP_TAIListforWarning.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAIListforWarning_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAListforMDT.c b/lib/asn1c/s1ap/S1AP_TAListforMDT.c index 895391d28b..c5e9a04fdc 100644 --- a/lib/asn1c/s1ap/S1AP_TAListforMDT.c +++ b/lib/asn1c/s1ap/S1AP_TAListforMDT.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAListforMDT.h" diff --git a/lib/asn1c/s1ap/S1AP_TAListforMDT.h b/lib/asn1c/s1ap/S1AP_TAListforMDT.h index 27b9d00407..98dc2b3816 100644 --- a/lib/asn1c/s1ap/S1AP_TAListforMDT.h +++ b/lib/asn1c/s1ap/S1AP_TAListforMDT.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAListforMDT_H_ diff --git a/lib/asn1c/s1ap/S1AP_TAListforQMC.c b/lib/asn1c/s1ap/S1AP_TAListforQMC.c index 6f1a5b4b6f..ac5237510c 100644 --- a/lib/asn1c/s1ap/S1AP_TAListforQMC.c +++ b/lib/asn1c/s1ap/S1AP_TAListforQMC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TAListforQMC.h" diff --git a/lib/asn1c/s1ap/S1AP_TAListforQMC.h b/lib/asn1c/s1ap/S1AP_TAListforQMC.h index 7e72c0e98c..ceaf572eec 100644 --- a/lib/asn1c/s1ap/S1AP_TAListforQMC.h +++ b/lib/asn1c/s1ap/S1AP_TAListforQMC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TAListforQMC_H_ diff --git a/lib/asn1c/s1ap/S1AP_TBCD-STRING.c b/lib/asn1c/s1ap/S1AP_TBCD-STRING.c index 5db281cba5..e88e06d959 100644 --- a/lib/asn1c/s1ap/S1AP_TBCD-STRING.c +++ b/lib/asn1c/s1ap/S1AP_TBCD-STRING.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TBCD-STRING.h" diff --git a/lib/asn1c/s1ap/S1AP_TBCD-STRING.h b/lib/asn1c/s1ap/S1AP_TBCD-STRING.h index dddf170d0e..2d416f6234 100644 --- a/lib/asn1c/s1ap/S1AP_TBCD-STRING.h +++ b/lib/asn1c/s1ap/S1AP_TBCD-STRING.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TBCD_STRING_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TBCD_STRING; asn_struct_free_f S1AP_TBCD_STRING_free; asn_struct_print_f S1AP_TBCD_STRING_print; asn_constr_check_f S1AP_TBCD_STRING_constraint; -jer_type_encoder_f S1AP_TBCD_STRING_encode_jer; per_type_decoder_f S1AP_TBCD_STRING_decode_aper; per_type_encoder_f S1AP_TBCD_STRING_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.c index 5f0c6a7abe..04ebd8c788 100644 --- a/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Target-ToSource-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.h index 0d175a7aa6..1cb759c0de 100644 --- a/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_Target-ToSource-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Target_ToSource_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Target_ToSource_TransparentContainer; asn_struct_free_f S1AP_Target_ToSource_TransparentContainer_free; asn_struct_print_f S1AP_Target_ToSource_TransparentContainer_print; asn_constr_check_f S1AP_Target_ToSource_TransparentContainer_constraint; -jer_type_encoder_f S1AP_Target_ToSource_TransparentContainer_encode_jer; per_type_decoder_f S1AP_Target_ToSource_TransparentContainer_decode_aper; per_type_encoder_f S1AP_Target_ToSource_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.c index 4cdc20b91d..41f29d6725 100644 --- a/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetBSS-ToSourceBSS-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.h index 1aef7bf78d..8a54d5f21e 100644 --- a/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_TargetBSS-ToSourceBSS-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetBSS_ToSourceBSS_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TargetBSS_ToSourceBSS_TransparentConta asn_struct_free_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_free; asn_struct_print_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_print; asn_constr_check_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_constraint; -jer_type_encoder_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_encode_jer; per_type_decoder_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_decode_aper; per_type_encoder_f S1AP_TargetBSS_ToSourceBSS_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TargetID.c b/lib/asn1c/s1ap/S1AP_TargetID.c index cd9b0c8f05..becc9e3b70 100644 --- a/lib/asn1c/s1ap/S1AP_TargetID.c +++ b/lib/asn1c/s1ap/S1AP_TargetID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetID.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetID.h b/lib/asn1c/s1ap/S1AP_TargetID.h index 7ad4ec5d4b..062eed6c49 100644 --- a/lib/asn1c/s1ap/S1AP_TargetID.h +++ b/lib/asn1c/s1ap/S1AP_TargetID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetID_H_ diff --git a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.c b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.c index 34972e3ed1..ac6615c0b7 100644 --- a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.c +++ b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetNgRanNode-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.h b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.h index 71f87ea83e..694d7e5d5d 100644 --- a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.h +++ b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetNgRanNode_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.c index 7893763e47..68dc81601a 100644 --- a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h index 911cc0a5ff..71f5cbab63 100644 --- a/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TargetNgRanNode_ToSourceNgRanNode_Tran asn_struct_free_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_free; asn_struct_print_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_print; asn_constr_check_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_constraint; -jer_type_encoder_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_jer; per_type_decoder_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_aper; per_type_encoder_f S1AP_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TargetRNC-ID.c b/lib/asn1c/s1ap/S1AP_TargetRNC-ID.c index 244d1159a0..eafd29d113 100644 --- a/lib/asn1c/s1ap/S1AP_TargetRNC-ID.c +++ b/lib/asn1c/s1ap/S1AP_TargetRNC-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetRNC-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetRNC-ID.h b/lib/asn1c/s1ap/S1AP_TargetRNC-ID.h index af7fe06a3b..2f985fea5d 100644 --- a/lib/asn1c/s1ap/S1AP_TargetRNC-ID.h +++ b/lib/asn1c/s1ap/S1AP_TargetRNC-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetRNC_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.c index 54ccb8ffed..20ef0b09ab 100644 --- a/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargetRNC-ToSourceRNC-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.h index dbb49bf8c2..09bae724af 100644 --- a/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_TargetRNC-ToSourceRNC-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargetRNC_ToSourceRNC_TransparentContainer_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TargetRNC_ToSourceRNC_TransparentConta asn_struct_free_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_free; asn_struct_print_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_print; asn_constr_check_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_constraint; -jer_type_encoder_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_encode_jer; per_type_decoder_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_decode_aper; per_type_encoder_f S1AP_TargetRNC_ToSourceRNC_TransparentContainer_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TargeteNB-ID.c b/lib/asn1c/s1ap/S1AP_TargeteNB-ID.c index fb45fcbfb3..4fe7d088ef 100644 --- a/lib/asn1c/s1ap/S1AP_TargeteNB-ID.c +++ b/lib/asn1c/s1ap/S1AP_TargeteNB-ID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargeteNB-ID.h" diff --git a/lib/asn1c/s1ap/S1AP_TargeteNB-ID.h b/lib/asn1c/s1ap/S1AP_TargeteNB-ID.h index 6f1291560a..c33fabc1ff 100644 --- a/lib/asn1c/s1ap/S1AP_TargeteNB-ID.h +++ b/lib/asn1c/s1ap/S1AP_TargeteNB-ID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargeteNB_ID_H_ diff --git a/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.c b/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.c index faace5feee..ced8c028fb 100644 --- a/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.c +++ b/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TargeteNB-ToSourceeNB-TransparentContainer.h" diff --git a/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.h b/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.h index 9c1405a5b4..62ba7d436f 100644 --- a/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.h +++ b/lib/asn1c/s1ap/S1AP_TargeteNB-ToSourceeNB-TransparentContainer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TargeteNB_ToSourceeNB_TransparentContainer_H_ diff --git a/lib/asn1c/s1ap/S1AP_Threshold-RSRP.c b/lib/asn1c/s1ap/S1AP_Threshold-RSRP.c index c2afbfebfc..ed3cb70675 100644 --- a/lib/asn1c/s1ap/S1AP_Threshold-RSRP.c +++ b/lib/asn1c/s1ap/S1AP_Threshold-RSRP.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Threshold-RSRP.h" diff --git a/lib/asn1c/s1ap/S1AP_Threshold-RSRP.h b/lib/asn1c/s1ap/S1AP_Threshold-RSRP.h index 4042c8244c..852f128eb3 100644 --- a/lib/asn1c/s1ap/S1AP_Threshold-RSRP.h +++ b/lib/asn1c/s1ap/S1AP_Threshold-RSRP.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Threshold_RSRP_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Threshold_RSRP; asn_struct_free_f S1AP_Threshold_RSRP_free; asn_struct_print_f S1AP_Threshold_RSRP_print; asn_constr_check_f S1AP_Threshold_RSRP_constraint; -jer_type_encoder_f S1AP_Threshold_RSRP_encode_jer; per_type_decoder_f S1AP_Threshold_RSRP_decode_aper; per_type_encoder_f S1AP_Threshold_RSRP_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.c b/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.c index 89363571b1..e5ca522e85 100644 --- a/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.c +++ b/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Threshold-RSRQ.h" diff --git a/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.h b/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.h index 9600338694..f8bcf3af61 100644 --- a/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.h +++ b/lib/asn1c/s1ap/S1AP_Threshold-RSRQ.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Threshold_RSRQ_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Threshold_RSRQ; asn_struct_free_f S1AP_Threshold_RSRQ_free; asn_struct_print_f S1AP_Threshold_RSRQ_print; asn_constr_check_f S1AP_Threshold_RSRQ_constraint; -jer_type_encoder_f S1AP_Threshold_RSRQ_encode_jer; per_type_decoder_f S1AP_Threshold_RSRQ_decode_aper; per_type_encoder_f S1AP_Threshold_RSRQ_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.c b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.c index f1b669d04b..0d7b956766 100644 --- a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.c +++ b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Time-UE-StayedInCell-EnhancedGranularity.h" diff --git a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.h b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.h index 016ae66a5f..d14ed90ece 100644 --- a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.h +++ b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell-EnhancedGranularity.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Time_UE_StayedInCell_EnhancedGranularity_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Time_UE_StayedInCell_EnhancedGranulari asn_struct_free_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_free; asn_struct_print_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_print; asn_constr_check_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_constraint; -jer_type_encoder_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_encode_jer; per_type_decoder_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_decode_aper; per_type_encoder_f S1AP_Time_UE_StayedInCell_EnhancedGranularity_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.c b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.c index 8e5eb065eb..39b7a127aa 100644 --- a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.c +++ b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_Time-UE-StayedInCell.h" diff --git a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.h b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.h index 44322209fd..2358c8de6d 100644 --- a/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.h +++ b/lib/asn1c/s1ap/S1AP_Time-UE-StayedInCell.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_Time_UE_StayedInCell_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_Time_UE_StayedInCell; asn_struct_free_f S1AP_Time_UE_StayedInCell_free; asn_struct_print_f S1AP_Time_UE_StayedInCell_print; asn_constr_check_f S1AP_Time_UE_StayedInCell_constraint; -jer_type_encoder_f S1AP_Time_UE_StayedInCell_encode_jer; per_type_decoder_f S1AP_Time_UE_StayedInCell_decode_aper; per_type_encoder_f S1AP_Time_UE_StayedInCell_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.c b/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.c index 44d9314cf9..30b261f7a7 100644 --- a/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.c +++ b/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TimeSinceSecondaryNodeRelease.h" diff --git a/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.h b/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.h index 869f872717..f693d9ce0a 100644 --- a/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.h +++ b/lib/asn1c/s1ap/S1AP_TimeSinceSecondaryNodeRelease.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TimeSinceSecondaryNodeRelease_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TimeSinceSecondaryNodeRelease; asn_struct_free_f S1AP_TimeSinceSecondaryNodeRelease_free; asn_struct_print_f S1AP_TimeSinceSecondaryNodeRelease_print; asn_constr_check_f S1AP_TimeSinceSecondaryNodeRelease_constraint; -jer_type_encoder_f S1AP_TimeSinceSecondaryNodeRelease_encode_jer; per_type_decoder_f S1AP_TimeSinceSecondaryNodeRelease_decode_aper; per_type_encoder_f S1AP_TimeSinceSecondaryNodeRelease_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.c b/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.c index 088b95a0db..e894f4587e 100644 --- a/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.c +++ b/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TimeSynchronisationInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.h b/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.h index d70c887daa..379afb0481 100644 --- a/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.h +++ b/lib/asn1c/s1ap/S1AP_TimeSynchronisationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TimeSynchronisationInfo_H_ diff --git a/lib/asn1c/s1ap/S1AP_TimeToTrigger.c b/lib/asn1c/s1ap/S1AP_TimeToTrigger.c index 922e998a3f..415e61f209 100644 --- a/lib/asn1c/s1ap/S1AP_TimeToTrigger.c +++ b/lib/asn1c/s1ap/S1AP_TimeToTrigger.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TimeToTrigger.h" diff --git a/lib/asn1c/s1ap/S1AP_TimeToTrigger.h b/lib/asn1c/s1ap/S1AP_TimeToTrigger.h index 863bb30c0d..650d5c2274 100644 --- a/lib/asn1c/s1ap/S1AP_TimeToTrigger.h +++ b/lib/asn1c/s1ap/S1AP_TimeToTrigger.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TimeToTrigger_H_ @@ -48,7 +48,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_TimeToTrigger_specs_1; asn_struct_free_f S1AP_TimeToTrigger_free; asn_struct_print_f S1AP_TimeToTrigger_print; asn_constr_check_f S1AP_TimeToTrigger_constraint; -jer_type_encoder_f S1AP_TimeToTrigger_encode_jer; per_type_decoder_f S1AP_TimeToTrigger_decode_aper; per_type_encoder_f S1AP_TimeToTrigger_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TimeToWait.c b/lib/asn1c/s1ap/S1AP_TimeToWait.c index d9fa843c3b..c559ca074e 100644 --- a/lib/asn1c/s1ap/S1AP_TimeToWait.c +++ b/lib/asn1c/s1ap/S1AP_TimeToWait.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TimeToWait.h" diff --git a/lib/asn1c/s1ap/S1AP_TimeToWait.h b/lib/asn1c/s1ap/S1AP_TimeToWait.h index 29f74ad108..8f5f517b95 100644 --- a/lib/asn1c/s1ap/S1AP_TimeToWait.h +++ b/lib/asn1c/s1ap/S1AP_TimeToWait.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TimeToWait_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_TimeToWait_specs_1; asn_struct_free_f S1AP_TimeToWait_free; asn_struct_print_f S1AP_TimeToWait_print; asn_constr_check_f S1AP_TimeToWait_constraint; -jer_type_encoder_f S1AP_TimeToWait_encode_jer; per_type_decoder_f S1AP_TimeToWait_decode_aper; per_type_encoder_f S1AP_TimeToWait_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TraceActivation.c b/lib/asn1c/s1ap/S1AP_TraceActivation.c index 779d0f0194..70a1c2b39a 100644 --- a/lib/asn1c/s1ap/S1AP_TraceActivation.c +++ b/lib/asn1c/s1ap/S1AP_TraceActivation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TraceActivation.h" diff --git a/lib/asn1c/s1ap/S1AP_TraceActivation.h b/lib/asn1c/s1ap/S1AP_TraceActivation.h index 1afbd89b9f..d9b509119e 100644 --- a/lib/asn1c/s1ap/S1AP_TraceActivation.h +++ b/lib/asn1c/s1ap/S1AP_TraceActivation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TraceActivation_H_ diff --git a/lib/asn1c/s1ap/S1AP_TraceDepth.c b/lib/asn1c/s1ap/S1AP_TraceDepth.c index 77f9e495f4..d9af694347 100644 --- a/lib/asn1c/s1ap/S1AP_TraceDepth.c +++ b/lib/asn1c/s1ap/S1AP_TraceDepth.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TraceDepth.h" diff --git a/lib/asn1c/s1ap/S1AP_TraceDepth.h b/lib/asn1c/s1ap/S1AP_TraceDepth.h index 26905f2415..0b90fac58e 100644 --- a/lib/asn1c/s1ap/S1AP_TraceDepth.h +++ b/lib/asn1c/s1ap/S1AP_TraceDepth.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TraceDepth_H_ @@ -41,7 +41,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_TraceDepth_specs_1; asn_struct_free_f S1AP_TraceDepth_free; asn_struct_print_f S1AP_TraceDepth_print; asn_constr_check_f S1AP_TraceDepth_constraint; -jer_type_encoder_f S1AP_TraceDepth_encode_jer; per_type_decoder_f S1AP_TraceDepth_decode_aper; per_type_encoder_f S1AP_TraceDepth_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TraceFailureIndication.c b/lib/asn1c/s1ap/S1AP_TraceFailureIndication.c index b201bfcf62..5e944eb60f 100644 --- a/lib/asn1c/s1ap/S1AP_TraceFailureIndication.c +++ b/lib/asn1c/s1ap/S1AP_TraceFailureIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TraceFailureIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_TraceFailureIndication.h b/lib/asn1c/s1ap/S1AP_TraceFailureIndication.h index fc556d675a..90ba0e854d 100644 --- a/lib/asn1c/s1ap/S1AP_TraceFailureIndication.h +++ b/lib/asn1c/s1ap/S1AP_TraceFailureIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TraceFailureIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_TraceStart.c b/lib/asn1c/s1ap/S1AP_TraceStart.c index 1c906f6ebc..ead3c5d5b7 100644 --- a/lib/asn1c/s1ap/S1AP_TraceStart.c +++ b/lib/asn1c/s1ap/S1AP_TraceStart.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TraceStart.h" diff --git a/lib/asn1c/s1ap/S1AP_TraceStart.h b/lib/asn1c/s1ap/S1AP_TraceStart.h index e46a0da43d..68d62cdc20 100644 --- a/lib/asn1c/s1ap/S1AP_TraceStart.h +++ b/lib/asn1c/s1ap/S1AP_TraceStart.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TraceStart_H_ diff --git a/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.c b/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.c index 99e31755b4..610805e0e4 100644 --- a/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.c +++ b/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TrafficLoadReductionIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.h b/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.h index 85a7dd8b17..238d7c88b2 100644 --- a/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.h +++ b/lib/asn1c/s1ap/S1AP_TrafficLoadReductionIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TrafficLoadReductionIndication_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TrafficLoadReductionIndication; asn_struct_free_f S1AP_TrafficLoadReductionIndication_free; asn_struct_print_f S1AP_TrafficLoadReductionIndication_print; asn_constr_check_f S1AP_TrafficLoadReductionIndication_constraint; -jer_type_encoder_f S1AP_TrafficLoadReductionIndication_encode_jer; per_type_decoder_f S1AP_TrafficLoadReductionIndication_decode_aper; per_type_encoder_f S1AP_TrafficLoadReductionIndication_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TransportInformation.c b/lib/asn1c/s1ap/S1AP_TransportInformation.c index bfb3e11597..e6fb0996e4 100644 --- a/lib/asn1c/s1ap/S1AP_TransportInformation.c +++ b/lib/asn1c/s1ap/S1AP_TransportInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TransportInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_TransportInformation.h b/lib/asn1c/s1ap/S1AP_TransportInformation.h index c16a330362..921b5092ca 100644 --- a/lib/asn1c/s1ap/S1AP_TransportInformation.h +++ b/lib/asn1c/s1ap/S1AP_TransportInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TransportInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_TransportLayerAddress.c b/lib/asn1c/s1ap/S1AP_TransportLayerAddress.c index c4c12557c2..bd75da0ae2 100644 --- a/lib/asn1c/s1ap/S1AP_TransportLayerAddress.c +++ b/lib/asn1c/s1ap/S1AP_TransportLayerAddress.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TransportLayerAddress.h" diff --git a/lib/asn1c/s1ap/S1AP_TransportLayerAddress.h b/lib/asn1c/s1ap/S1AP_TransportLayerAddress.h index 89c036b0bd..7b89e0168a 100644 --- a/lib/asn1c/s1ap/S1AP_TransportLayerAddress.h +++ b/lib/asn1c/s1ap/S1AP_TransportLayerAddress.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TransportLayerAddress_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_TransportLayerAddress; asn_struct_free_f S1AP_TransportLayerAddress_free; asn_struct_print_f S1AP_TransportLayerAddress_print; asn_constr_check_f S1AP_TransportLayerAddress_constraint; -jer_type_encoder_f S1AP_TransportLayerAddress_encode_jer; per_type_decoder_f S1AP_TransportLayerAddress_decode_aper; per_type_encoder_f S1AP_TransportLayerAddress_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TriggeringMessage.c b/lib/asn1c/s1ap/S1AP_TriggeringMessage.c index 09cda6be1e..d6a4e45b8c 100644 --- a/lib/asn1c/s1ap/S1AP_TriggeringMessage.c +++ b/lib/asn1c/s1ap/S1AP_TriggeringMessage.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TriggeringMessage.h" diff --git a/lib/asn1c/s1ap/S1AP_TriggeringMessage.h b/lib/asn1c/s1ap/S1AP_TriggeringMessage.h index ef0074aea2..7f83582d59 100644 --- a/lib/asn1c/s1ap/S1AP_TriggeringMessage.h +++ b/lib/asn1c/s1ap/S1AP_TriggeringMessage.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-CommonDataTypes" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TriggeringMessage_H_ @@ -35,7 +35,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_TriggeringMessage_specs_1; asn_struct_free_f S1AP_TriggeringMessage_free; asn_struct_print_f S1AP_TriggeringMessage_print; asn_constr_check_f S1AP_TriggeringMessage_constraint; -jer_type_encoder_f S1AP_TriggeringMessage_encode_jer; per_type_decoder_f S1AP_TriggeringMessage_decode_aper; per_type_encoder_f S1AP_TriggeringMessage_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_TunnelInformation.c b/lib/asn1c/s1ap/S1AP_TunnelInformation.c index 02bc279af1..a4793ce900 100644 --- a/lib/asn1c/s1ap/S1AP_TunnelInformation.c +++ b/lib/asn1c/s1ap/S1AP_TunnelInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TunnelInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_TunnelInformation.h b/lib/asn1c/s1ap/S1AP_TunnelInformation.h index a15b4df17a..522a77dd2d 100644 --- a/lib/asn1c/s1ap/S1AP_TunnelInformation.h +++ b/lib/asn1c/s1ap/S1AP_TunnelInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TunnelInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_TypeOfError.c b/lib/asn1c/s1ap/S1AP_TypeOfError.c index e03c920cf8..2be6dabe09 100644 --- a/lib/asn1c/s1ap/S1AP_TypeOfError.c +++ b/lib/asn1c/s1ap/S1AP_TypeOfError.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_TypeOfError.h" diff --git a/lib/asn1c/s1ap/S1AP_TypeOfError.h b/lib/asn1c/s1ap/S1AP_TypeOfError.h index 8f926b2548..ba94c8ff97 100644 --- a/lib/asn1c/s1ap/S1AP_TypeOfError.h +++ b/lib/asn1c/s1ap/S1AP_TypeOfError.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_TypeOfError_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_TypeOfError_specs_1; asn_struct_free_f S1AP_TypeOfError_free; asn_struct_print_f S1AP_TypeOfError_print; asn_constr_check_f S1AP_TypeOfError_constraint; -jer_type_encoder_f S1AP_TypeOfError_encode_jer; per_type_decoder_f S1AP_TypeOfError_decode_aper; per_type_encoder_f S1AP_TypeOfError_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.c b/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.c index 91213734ee..f9c2029a2b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.c +++ b/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-Application-Layer-Measurement-Capability.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.h b/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.h index 0d4b4ec75d..c3239d942b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.h +++ b/lib/asn1c/s1ap/S1AP_UE-Application-Layer-Measurement-Capability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_Application_Layer_Measurement_Capability_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UE_Application_Layer_Measurement_Capab asn_struct_free_f S1AP_UE_Application_Layer_Measurement_Capability_free; asn_struct_print_f S1AP_UE_Application_Layer_Measurement_Capability_print; asn_constr_check_f S1AP_UE_Application_Layer_Measurement_Capability_constraint; -jer_type_encoder_f S1AP_UE_Application_Layer_Measurement_Capability_encode_jer; per_type_decoder_f S1AP_UE_Application_Layer_Measurement_Capability_decode_aper; per_type_encoder_f S1AP_UE_Application_Layer_Measurement_Capability_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.c b/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.c index 67c503b7bf..a045c0aa1c 100644 --- a/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.c +++ b/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-HistoryInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.h b/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.h index 9f8fd66509..61de3adab7 100644 --- a/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.h +++ b/lib/asn1c/s1ap/S1AP_UE-HistoryInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_HistoryInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.c b/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.c index b2ab9cff7b..22d922fc0d 100644 --- a/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.c +++ b/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-HistoryInformationFromTheUE.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.h b/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.h index b2f85cfd5e..c601fb3e1a 100644 --- a/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.h +++ b/lib/asn1c/s1ap/S1AP_UE-HistoryInformationFromTheUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_HistoryInformationFromTheUE_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UE_HistoryInformationFromTheUE; asn_struct_free_f S1AP_UE_HistoryInformationFromTheUE_free; asn_struct_print_f S1AP_UE_HistoryInformationFromTheUE_print; asn_constr_check_f S1AP_UE_HistoryInformationFromTheUE_constraint; -jer_type_encoder_f S1AP_UE_HistoryInformationFromTheUE_encode_jer; per_type_decoder_f S1AP_UE_HistoryInformationFromTheUE_decode_aper; per_type_encoder_f S1AP_UE_HistoryInformationFromTheUE_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.c b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.c index eff1009d1d..481e4b747f 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.c +++ b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-RLF-Report-Container-for-extended-bands.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.h b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.h index 19ce59ed51..624c5c3a37 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.h +++ b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container-for-extended-bands.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_RLF_Report_Container_for_extended_bands_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UE_RLF_Report_Container_for_extended_b asn_struct_free_f S1AP_UE_RLF_Report_Container_for_extended_bands_free; asn_struct_print_f S1AP_UE_RLF_Report_Container_for_extended_bands_print; asn_constr_check_f S1AP_UE_RLF_Report_Container_for_extended_bands_constraint; -jer_type_encoder_f S1AP_UE_RLF_Report_Container_for_extended_bands_encode_jer; per_type_decoder_f S1AP_UE_RLF_Report_Container_for_extended_bands_decode_aper; per_type_encoder_f S1AP_UE_RLF_Report_Container_for_extended_bands_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.c b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.c index 554270b557..6748920719 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.c +++ b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-RLF-Report-Container.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.h b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.h index 5d53c36ad6..ac54765b7b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.h +++ b/lib/asn1c/s1ap/S1AP_UE-RLF-Report-Container.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_RLF_Report_Container_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UE_RLF_Report_Container; asn_struct_free_f S1AP_UE_RLF_Report_Container_free; asn_struct_print_f S1AP_UE_RLF_Report_Container_print; asn_constr_check_f S1AP_UE_RLF_Report_Container_constraint; -jer_type_encoder_f S1AP_UE_RLF_Report_Container_encode_jer; per_type_decoder_f S1AP_UE_RLF_Report_Container_decode_aper; per_type_encoder_f S1AP_UE_RLF_Report_Container_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.c b/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.c index 4875662e81..fb888c960d 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.c +++ b/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-RetentionInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.h b/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.h index c40b69563b..bbde0d5271 100644 --- a/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.h +++ b/lib/asn1c/s1ap/S1AP_UE-RetentionInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_RetentionInformation_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_UE_RetentionInformation_specs_ asn_struct_free_f S1AP_UE_RetentionInformation_free; asn_struct_print_f S1AP_UE_RetentionInformation_print; asn_constr_check_f S1AP_UE_RetentionInformation_constraint; -jer_type_encoder_f S1AP_UE_RetentionInformation_encode_jer; per_type_decoder_f S1AP_UE_RetentionInformation_decode_aper; per_type_encoder_f S1AP_UE_RetentionInformation_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.c b/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.c index 4cddd5865c..0b499a0df8 100644 --- a/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.c +++ b/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-S1AP-ID-pair.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.h b/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.h index bddaa8f986..7da3ff0197 100644 --- a/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.h +++ b/lib/asn1c/s1ap/S1AP_UE-S1AP-ID-pair.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_S1AP_ID_pair_H_ diff --git a/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.c b/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.c index bf72cb87aa..b602dc495b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.c +++ b/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-S1AP-IDs.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.h b/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.h index ca1a0e841d..2fd67af10f 100644 --- a/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.h +++ b/lib/asn1c/s1ap/S1AP_UE-S1AP-IDs.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_S1AP_IDs_H_ diff --git a/lib/asn1c/s1ap/S1AP_UE-Usage-Type.c b/lib/asn1c/s1ap/S1AP_UE-Usage-Type.c index d3c322dd47..38e4172eec 100644 --- a/lib/asn1c/s1ap/S1AP_UE-Usage-Type.c +++ b/lib/asn1c/s1ap/S1AP_UE-Usage-Type.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-Usage-Type.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-Usage-Type.h b/lib/asn1c/s1ap/S1AP_UE-Usage-Type.h index 54f05a3426..7163f60e40 100644 --- a/lib/asn1c/s1ap/S1AP_UE-Usage-Type.h +++ b/lib/asn1c/s1ap/S1AP_UE-Usage-Type.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_Usage_Type_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UE_Usage_Type; asn_struct_free_f S1AP_UE_Usage_Type_free; asn_struct_print_f S1AP_UE_Usage_Type_print; asn_constr_check_f S1AP_UE_Usage_Type_constraint; -jer_type_encoder_f S1AP_UE_Usage_Type_encode_jer; per_type_decoder_f S1AP_UE_Usage_Type_decode_aper; per_type_encoder_f S1AP_UE_Usage_Type_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.c b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.c index cbdf67b0e3..4f7b8c2f67 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.c +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-associatedLogicalS1-ConnectionItem.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.h b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.h index 46c590e7f1..aa9bc8519b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.h +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionItem.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_associatedLogicalS1_ConnectionItem_H_ diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.c b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.c index 8c1888f90c..57768647ad 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.c +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-associatedLogicalS1-ConnectionListRes.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.h b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.h index ae4a80315c..e67ecda60b 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.h +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListRes.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_associatedLogicalS1_ConnectionListRes_H_ diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.c b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.c index c9c410641f..b323f6e909 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.c +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UE-associatedLogicalS1-ConnectionListResAck.h" diff --git a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.h b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.h index f5713aa813..81e8c2bbf8 100644 --- a/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.h +++ b/lib/asn1c/s1ap/S1AP_UE-associatedLogicalS1-ConnectionListResAck.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UE_associatedLogicalS1_ConnectionListResAck_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.c b/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.c index 2026519bc2..38a09ed3ca 100644 --- a/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.c +++ b/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEAggregateMaximumBitrate.h" diff --git a/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.h b/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.h index 94d567a32e..300dbfb6bc 100644 --- a/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.h +++ b/lib/asn1c/s1ap/S1AP_UEAggregateMaximumBitrate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEAggregateMaximumBitrate_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.c b/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.c index fce5023b43..8da88a4c73 100644 --- a/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.c +++ b/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEAppLayerMeasConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.h b/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.h index e1a139cb0e..bbf07cab70 100644 --- a/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.h +++ b/lib/asn1c/s1ap/S1AP_UEAppLayerMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEAppLayerMeasConfig_H_ diff --git a/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.c b/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.c index 031ba29332..fbb4027bce 100644 --- a/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.c +++ b/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UECapabilityInfoIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.h b/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.h index 70eff3b91c..fd98856cc4 100644 --- a/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.h +++ b/lib/asn1c/s1ap/S1AP_UECapabilityInfoIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UECapabilityInfoIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.c b/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.c index e72cd1d2e5..a183510caa 100644 --- a/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.c +++ b/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UECapabilityInfoRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.h b/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.h index 038436fc05..09868ef614 100644 --- a/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.h +++ b/lib/asn1c/s1ap/S1AP_UECapabilityInfoRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UECapabilityInfoRequest_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_UECapabilityInfoRequest_specs_ asn_struct_free_f S1AP_UECapabilityInfoRequest_free; asn_struct_print_f S1AP_UECapabilityInfoRequest_print; asn_constr_check_f S1AP_UECapabilityInfoRequest_constraint; -jer_type_encoder_f S1AP_UECapabilityInfoRequest_encode_jer; per_type_decoder_f S1AP_UECapabilityInfoRequest_decode_aper; per_type_encoder_f S1AP_UECapabilityInfoRequest_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.c b/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.c index bc98019149..de67856a3c 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.c +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextModificationConfirm.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.h b/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.h index 2a7e911a73..2b40687481 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.h +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationConfirm.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextModificationConfirm_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.c b/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.c index 4c09fa302f..214cd1394e 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.c +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextModificationFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.h b/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.h index f0b67c75e9..6ef9475d72 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.h +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextModificationFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.c b/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.c index b53fed2573..14c5b039ea 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.c +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextModificationIndication.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.h b/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.h index 7ed8c7ac26..82ba739ddc 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.h +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationIndication.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextModificationIndication_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.c b/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.c index 50336ac66b..ec6f6822a2 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.c +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextModificationRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.h b/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.h index b8ce5bf3dc..7521ab90b6 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.h +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextModificationRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.c b/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.c index 111b4355d6..0c92bdb1d3 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.c +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextModificationResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.h b/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.h index 43130de5a6..08a9acd417 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.h +++ b/lib/asn1c/s1ap/S1AP_UEContextModificationResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextModificationResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.c b/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.c index 14c5f02b06..84b627bd95 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.c +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextReleaseCommand.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.h b/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.h index b59d8025c1..d17e51e2cf 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.h +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseCommand.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextReleaseCommand_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.c b/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.c index b19d9d6947..5294d4f000 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.c +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextReleaseComplete.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.h b/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.h index 55d63991d8..d7c5c81488 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.h +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseComplete.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextReleaseComplete_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.c b/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.c index b2ac74df96..613510da32 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.c +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextReleaseRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.h b/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.h index 779f977bbe..40ce665cdc 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.h +++ b/lib/asn1c/s1ap/S1AP_UEContextReleaseRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextReleaseRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.c b/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.c index 81a5d5f237..64682da136 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.c +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextResumeFailure.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.h b/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.h index 974b323c5f..63dc79d638 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.h +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeFailure.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextResumeFailure_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.c b/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.c index 03a78f7d4e..8fbb0dc9e0 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.c +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextResumeRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.h b/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.h index 2b4ca8babb..38104c28ec 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.h +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextResumeRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.c b/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.c index deab264954..eb3805f7c9 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.c +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextResumeResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.h b/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.h index 981f8c7664..ed4a31896f 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.h +++ b/lib/asn1c/s1ap/S1AP_UEContextResumeResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextResumeResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.c b/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.c index e71d64c38e..997632191c 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.c +++ b/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextSuspendRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.h b/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.h index 1d4bd26ad6..c0fbf5c8ae 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.h +++ b/lib/asn1c/s1ap/S1AP_UEContextSuspendRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextSuspendRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.c b/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.c index f93e4cf0a2..c97c98c559 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.c +++ b/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEContextSuspendResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.h b/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.h index e1e5f2b5ed..ea4914cf6d 100644 --- a/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.h +++ b/lib/asn1c/s1ap/S1AP_UEContextSuspendResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEContextSuspendResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.c b/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.c index d4036654df..58f96489e2 100644 --- a/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.c +++ b/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEIdentityIndexValue.h" diff --git a/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.h b/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.h index 76e3655c70..250e2cebda 100644 --- a/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.h +++ b/lib/asn1c/s1ap/S1AP_UEIdentityIndexValue.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEIdentityIndexValue_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UEIdentityIndexValue; asn_struct_free_f S1AP_UEIdentityIndexValue_free; asn_struct_print_f S1AP_UEIdentityIndexValue_print; asn_constr_check_f S1AP_UEIdentityIndexValue_constraint; -jer_type_encoder_f S1AP_UEIdentityIndexValue_encode_jer; per_type_decoder_f S1AP_UEIdentityIndexValue_decode_aper; per_type_encoder_f S1AP_UEIdentityIndexValue_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UEInformationTransfer.c b/lib/asn1c/s1ap/S1AP_UEInformationTransfer.c index 4dee56ca08..e192ff6465 100644 --- a/lib/asn1c/s1ap/S1AP_UEInformationTransfer.c +++ b/lib/asn1c/s1ap/S1AP_UEInformationTransfer.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEInformationTransfer.h" diff --git a/lib/asn1c/s1ap/S1AP_UEInformationTransfer.h b/lib/asn1c/s1ap/S1AP_UEInformationTransfer.h index 59aaea3681..2f055bff16 100644 --- a/lib/asn1c/s1ap/S1AP_UEInformationTransfer.h +++ b/lib/asn1c/s1ap/S1AP_UEInformationTransfer.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEInformationTransfer_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEPagingID.c b/lib/asn1c/s1ap/S1AP_UEPagingID.c index b096f6624d..b5ad6a0f69 100644 --- a/lib/asn1c/s1ap/S1AP_UEPagingID.c +++ b/lib/asn1c/s1ap/S1AP_UEPagingID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEPagingID.h" diff --git a/lib/asn1c/s1ap/S1AP_UEPagingID.h b/lib/asn1c/s1ap/S1AP_UEPagingID.h index 3fce41984e..9ca783e2b8 100644 --- a/lib/asn1c/s1ap/S1AP_UEPagingID.h +++ b/lib/asn1c/s1ap/S1AP_UEPagingID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEPagingID_H_ diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapability.c b/lib/asn1c/s1ap/S1AP_UERadioCapability.c index 02e3f55bc8..4caef58b23 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapability.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapability.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapability.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapability.h b/lib/asn1c/s1ap/S1AP_UERadioCapability.h index cb4b67843f..294f84d070 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapability.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapability.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapability_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UERadioCapability; asn_struct_free_f S1AP_UERadioCapability_free; asn_struct_print_f S1AP_UERadioCapability_print; asn_constr_check_f S1AP_UERadioCapability_constraint; -jer_type_encoder_f S1AP_UERadioCapability_encode_jer; per_type_decoder_f S1AP_UERadioCapability_decode_aper; per_type_encoder_f S1AP_UERadioCapability_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.c index 07e874848d..a1e2dc80e8 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityForPaging.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.h index d19d04161c..d50a4060d2 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityForPaging.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityForPaging_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UERadioCapabilityForPaging; asn_struct_free_f S1AP_UERadioCapabilityForPaging_free; asn_struct_print_f S1AP_UERadioCapabilityForPaging_print; asn_constr_check_f S1AP_UERadioCapabilityForPaging_constraint; -jer_type_encoder_f S1AP_UERadioCapabilityForPaging_encode_jer; per_type_decoder_f S1AP_UERadioCapabilityForPaging_decode_aper; per_type_encoder_f S1AP_UERadioCapabilityForPaging_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.c index dec3f76ea0..3647c662fe 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityID.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.h index b412e02ed2..c74a93ff2e 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityID.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityID_H_ @@ -26,7 +26,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UERadioCapabilityID; asn_struct_free_f S1AP_UERadioCapabilityID_free; asn_struct_print_f S1AP_UERadioCapabilityID_print; asn_constr_check_f S1AP_UERadioCapabilityID_constraint; -jer_type_encoder_f S1AP_UERadioCapabilityID_encode_jer; per_type_decoder_f S1AP_UERadioCapabilityID_decode_aper; per_type_encoder_f S1AP_UERadioCapabilityID_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.c index 664a7ec8ba..85c6e3b08e 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityIDMappingRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.h index 2e618fda92..74dca428ae 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityIDMappingRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.c index dbd837beb0..af5aaa983c 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityIDMappingResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.h index f375b83fd1..1149585c38 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityIDMappingResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityIDMappingResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.c index 848a1d99b8..9e4fb1e04c 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityMatchRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.h index fdc6ccb406..fbb94e6560 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityMatchRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.c b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.c index a97e073cd1..60ca48c176 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.c +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UERadioCapabilityMatchResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.h b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.h index 5863e59cb0..237abf0e93 100644 --- a/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.h +++ b/lib/asn1c/s1ap/S1AP_UERadioCapabilityMatchResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UERadioCapabilityMatchResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.c b/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.c index 4700de3350..381e4023f3 100644 --- a/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.c +++ b/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UESecurityCapabilities.h" diff --git a/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.h b/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.h index f9784cfeb5..f0f341a62b 100644 --- a/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.h +++ b/lib/asn1c/s1ap/S1AP_UESecurityCapabilities.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UESecurityCapabilities_H_ diff --git a/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.c b/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.c index 60e4a160a8..7ca433e27c 100644 --- a/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.c +++ b/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UESidelinkAggregateMaximumBitrate.h" diff --git a/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.h b/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.h index cc4c30233d..7f2c89f686 100644 --- a/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.h +++ b/lib/asn1c/s1ap/S1AP_UESidelinkAggregateMaximumBitrate.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UESidelinkAggregateMaximumBitrate_H_ diff --git a/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.c b/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.c index 9ebd4f87af..3c23ade5af 100644 --- a/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.c +++ b/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UEUserPlaneCIoTSupportIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.h b/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.h index 47844b8236..ef6f3a733e 100644 --- a/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.h +++ b/lib/asn1c/s1ap/S1AP_UEUserPlaneCIoTSupportIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UEUserPlaneCIoTSupportIndicator_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_UEUserPlaneCIoTSupportIndicato asn_struct_free_f S1AP_UEUserPlaneCIoTSupportIndicator_free; asn_struct_print_f S1AP_UEUserPlaneCIoTSupportIndicator_print; asn_constr_check_f S1AP_UEUserPlaneCIoTSupportIndicator_constraint; -jer_type_encoder_f S1AP_UEUserPlaneCIoTSupportIndicator_encode_jer; per_type_decoder_f S1AP_UEUserPlaneCIoTSupportIndicator_decode_aper; per_type_encoder_f S1AP_UEUserPlaneCIoTSupportIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.c b/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.c index 0eac5277e1..b239f25d1b 100644 --- a/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.c +++ b/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UL-CP-SecurityInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.h b/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.h index b363b6511f..2e4c3ee597 100644 --- a/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.h +++ b/lib/asn1c/s1ap/S1AP_UL-CP-SecurityInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UL_CP_SecurityInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_UL-NAS-Count.c b/lib/asn1c/s1ap/S1AP_UL-NAS-Count.c index 605beacad2..aa3e6e3286 100644 --- a/lib/asn1c/s1ap/S1AP_UL-NAS-Count.c +++ b/lib/asn1c/s1ap/S1AP_UL-NAS-Count.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UL-NAS-Count.h" diff --git a/lib/asn1c/s1ap/S1AP_UL-NAS-Count.h b/lib/asn1c/s1ap/S1AP_UL-NAS-Count.h index 83365b8cd9..ed229b1103 100644 --- a/lib/asn1c/s1ap/S1AP_UL-NAS-Count.h +++ b/lib/asn1c/s1ap/S1AP_UL-NAS-Count.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UL_NAS_Count_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UL_NAS_Count; asn_struct_free_f S1AP_UL_NAS_Count_free; asn_struct_print_f S1AP_UL_NAS_Count_print; asn_constr_check_f S1AP_UL_NAS_Count_constraint; -jer_type_encoder_f S1AP_UL_NAS_Count_encode_jer; per_type_decoder_f S1AP_UL_NAS_Count_decode_aper; per_type_encoder_f S1AP_UL_NAS_Count_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.c b/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.c index 57c8466203..2f7e108a5d 100644 --- a/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.c +++ b/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UL-NAS-MAC.h" diff --git a/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.h b/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.h index 8379c37856..f0c36b7e85 100644 --- a/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.h +++ b/lib/asn1c/s1ap/S1AP_UL-NAS-MAC.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UL_NAS_MAC_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_UL_NAS_MAC; asn_struct_free_f S1AP_UL_NAS_MAC_free; asn_struct_print_f S1AP_UL_NAS_MAC_print; asn_constr_check_f S1AP_UL_NAS_MAC_constraint; -jer_type_encoder_f S1AP_UL_NAS_MAC_encode_jer; per_type_decoder_f S1AP_UL_NAS_MAC_decode_aper; per_type_encoder_f S1AP_UL_NAS_MAC_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_URI-Address.c b/lib/asn1c/s1ap/S1AP_URI-Address.c index a78b509f97..16b5a33588 100644 --- a/lib/asn1c/s1ap/S1AP_URI-Address.c +++ b/lib/asn1c/s1ap/S1AP_URI-Address.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_URI-Address.h" diff --git a/lib/asn1c/s1ap/S1AP_URI-Address.h b/lib/asn1c/s1ap/S1AP_URI-Address.h index 148ea3efb1..6422792cc7 100644 --- a/lib/asn1c/s1ap/S1AP_URI-Address.h +++ b/lib/asn1c/s1ap/S1AP_URI-Address.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_URI_Address_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_URI_Address; asn_struct_free_f S1AP_URI_Address_free; asn_struct_print_f S1AP_URI_Address_print; asn_constr_check_f S1AP_URI_Address_constraint; -jer_type_encoder_f S1AP_URI_Address_encode_jer; per_type_decoder_f S1AP_URI_Address_decode_aper; per_type_encoder_f S1AP_URI_Address_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.c b/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.c index 41c38247f3..c1d10af18b 100644 --- a/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.c +++ b/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UnlicensedSpectrumRestriction.h" diff --git a/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.h b/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.h index d57b8327bf..7d94d2f88a 100644 --- a/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.h +++ b/lib/asn1c/s1ap/S1AP_UnlicensedSpectrumRestriction.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UnlicensedSpectrumRestriction_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_UnlicensedSpectrumRestriction_ asn_struct_free_f S1AP_UnlicensedSpectrumRestriction_free; asn_struct_print_f S1AP_UnlicensedSpectrumRestriction_print; asn_constr_check_f S1AP_UnlicensedSpectrumRestriction_constraint; -jer_type_encoder_f S1AP_UnlicensedSpectrumRestriction_encode_jer; per_type_decoder_f S1AP_UnlicensedSpectrumRestriction_decode_aper; per_type_encoder_f S1AP_UnlicensedSpectrumRestriction_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.c b/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.c index ddd7355c54..43bf92c9df 100644 --- a/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.c +++ b/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UnsuccessfulOutcome.h" diff --git a/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.h b/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.h index a55f28c19a..c3e59e92b1 100644 --- a/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.h +++ b/lib/asn1c/s1ap/S1AP_UnsuccessfulOutcome.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Descriptions" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UnsuccessfulOutcome_H_ diff --git a/lib/asn1c/s1ap/S1AP_UplinkNASTransport.c b/lib/asn1c/s1ap/S1AP_UplinkNASTransport.c index 4804d3afce..d1193856df 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkNASTransport.c +++ b/lib/asn1c/s1ap/S1AP_UplinkNASTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UplinkNASTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_UplinkNASTransport.h b/lib/asn1c/s1ap/S1AP_UplinkNASTransport.h index 3033c6c54b..908c31ef19 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkNASTransport.h +++ b/lib/asn1c/s1ap/S1AP_UplinkNASTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UplinkNASTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.c b/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.c index 8c96735a10..70ce04f8f6 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.c +++ b/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UplinkNonUEAssociatedLPPaTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.h b/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.h index 8795f050f8..e0abdb740c 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.h +++ b/lib/asn1c/s1ap/S1AP_UplinkNonUEAssociatedLPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UplinkNonUEAssociatedLPPaTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.c b/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.c index 8a6e2bf59f..a2b47f2df5 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.c +++ b/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UplinkS1cdma2000tunnelling.h" diff --git a/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.h b/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.h index 951de5715d..4c726cdb41 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.h +++ b/lib/asn1c/s1ap/S1AP_UplinkS1cdma2000tunnelling.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UplinkS1cdma2000tunnelling_H_ diff --git a/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.c b/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.c index 0fdf7b4aed..154dfaa213 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.c +++ b/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UplinkUEAssociatedLPPaTransport.h" diff --git a/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.h b/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.h index c19b3f3915..6744ec37c3 100644 --- a/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.h +++ b/lib/asn1c/s1ap/S1AP_UplinkUEAssociatedLPPaTransport.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UplinkUEAssociatedLPPaTransport_H_ diff --git a/lib/asn1c/s1ap/S1AP_UserLocationInformation.c b/lib/asn1c/s1ap/S1AP_UserLocationInformation.c index 55647b602d..289356033c 100644 --- a/lib/asn1c/s1ap/S1AP_UserLocationInformation.c +++ b/lib/asn1c/s1ap/S1AP_UserLocationInformation.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_UserLocationInformation.h" diff --git a/lib/asn1c/s1ap/S1AP_UserLocationInformation.h b/lib/asn1c/s1ap/S1AP_UserLocationInformation.h index 8d57bb04f4..3e65a4b80b 100644 --- a/lib/asn1c/s1ap/S1AP_UserLocationInformation.h +++ b/lib/asn1c/s1ap/S1AP_UserLocationInformation.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_UserLocationInformation_H_ diff --git a/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.c b/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.c index b5363f9779..83f748d407 100644 --- a/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.c +++ b/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_V2XServicesAuthorized.h" diff --git a/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.h b/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.h index 9c46b7b3a1..df840869e9 100644 --- a/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.h +++ b/lib/asn1c/s1ap/S1AP_V2XServicesAuthorized.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_V2XServicesAuthorized_H_ diff --git a/lib/asn1c/s1ap/S1AP_VehicleUE.c b/lib/asn1c/s1ap/S1AP_VehicleUE.c index ac464137f8..a8f48e5558 100644 --- a/lib/asn1c/s1ap/S1AP_VehicleUE.c +++ b/lib/asn1c/s1ap/S1AP_VehicleUE.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_VehicleUE.h" diff --git a/lib/asn1c/s1ap/S1AP_VehicleUE.h b/lib/asn1c/s1ap/S1AP_VehicleUE.h index ac974fe191..db54d96791 100644 --- a/lib/asn1c/s1ap/S1AP_VehicleUE.h +++ b/lib/asn1c/s1ap/S1AP_VehicleUE.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_VehicleUE_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_VehicleUE_specs_1; asn_struct_free_f S1AP_VehicleUE_free; asn_struct_print_f S1AP_VehicleUE_print; asn_constr_check_f S1AP_VehicleUE_constraint; -jer_type_encoder_f S1AP_VehicleUE_encode_jer; per_type_decoder_f S1AP_VehicleUE_decode_aper; per_type_encoder_f S1AP_VehicleUE_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.c b/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.c index 22db813649..4a59ebb27f 100644 --- a/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.c +++ b/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_VoiceSupportMatchIndicator.h" diff --git a/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.h b/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.h index 2a9cb3c6b0..698c67eaab 100644 --- a/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.h +++ b/lib/asn1c/s1ap/S1AP_VoiceSupportMatchIndicator.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_VoiceSupportMatchIndicator_H_ @@ -37,7 +37,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_VoiceSupportMatchIndicator_spe asn_struct_free_f S1AP_VoiceSupportMatchIndicator_free; asn_struct_print_f S1AP_VoiceSupportMatchIndicator_print; asn_constr_check_f S1AP_VoiceSupportMatchIndicator_constraint; -jer_type_encoder_f S1AP_VoiceSupportMatchIndicator_encode_jer; per_type_decoder_f S1AP_VoiceSupportMatchIndicator_decode_aper; per_type_encoder_f S1AP_VoiceSupportMatchIndicator_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasConfig.c b/lib/asn1c/s1ap/S1AP_WLANMeasConfig.c index 34a9105ae8..643a477ae3 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasConfig.c +++ b/lib/asn1c/s1ap/S1AP_WLANMeasConfig.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WLANMeasConfig.h" diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasConfig.h b/lib/asn1c/s1ap/S1AP_WLANMeasConfig.h index 8c615c30ce..1bb985c169 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasConfig.h +++ b/lib/asn1c/s1ap/S1AP_WLANMeasConfig.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WLANMeasConfig_H_ @@ -36,7 +36,6 @@ extern const asn_INTEGER_specifics_t asn_SPC_S1AP_WLANMeasConfig_specs_1; asn_struct_free_f S1AP_WLANMeasConfig_free; asn_struct_print_f S1AP_WLANMeasConfig_print; asn_constr_check_f S1AP_WLANMeasConfig_constraint; -jer_type_encoder_f S1AP_WLANMeasConfig_encode_jer; per_type_decoder_f S1AP_WLANMeasConfig_decode_aper; per_type_encoder_f S1AP_WLANMeasConfig_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.c b/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.c index 96d889c564..7e965832fc 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.c +++ b/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WLANMeasConfigNameList.h" diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.h b/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.h index 0a7311e478..567c68ad98 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.h +++ b/lib/asn1c/s1ap/S1AP_WLANMeasConfigNameList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WLANMeasConfigNameList_H_ diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.c b/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.c index 4377878a89..2eb0bc6943 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.c +++ b/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WLANMeasurementConfiguration.h" diff --git a/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.h b/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.h index 656a0fbc02..4cb0f56754 100644 --- a/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.h +++ b/lib/asn1c/s1ap/S1AP_WLANMeasurementConfiguration.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WLANMeasurementConfiguration_H_ diff --git a/lib/asn1c/s1ap/S1AP_WLANName.c b/lib/asn1c/s1ap/S1AP_WLANName.c index a7bc42a868..2d0e92dcb8 100644 --- a/lib/asn1c/s1ap/S1AP_WLANName.c +++ b/lib/asn1c/s1ap/S1AP_WLANName.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WLANName.h" diff --git a/lib/asn1c/s1ap/S1AP_WLANName.h b/lib/asn1c/s1ap/S1AP_WLANName.h index 568c149fed..d16d3e57e3 100644 --- a/lib/asn1c/s1ap/S1AP_WLANName.h +++ b/lib/asn1c/s1ap/S1AP_WLANName.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WLANName_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_WLANName; asn_struct_free_f S1AP_WLANName_free; asn_struct_print_f S1AP_WLANName_print; asn_constr_check_f S1AP_WLANName_constraint; -jer_type_encoder_f S1AP_WLANName_encode_jer; per_type_decoder_f S1AP_WLANName_decode_aper; per_type_encoder_f S1AP_WLANName_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.c b/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.c index 7926cdf3f3..dbbe7d8774 100644 --- a/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.c +++ b/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WUS-Assistance-Information.h" diff --git a/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.h b/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.h index de6393eaf9..9e594b38e4 100644 --- a/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.h +++ b/lib/asn1c/s1ap/S1AP_WUS-Assistance-Information.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WUS_Assistance_Information_H_ diff --git a/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.c b/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.c index bfa19555d5..bea908a21d 100644 --- a/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.c +++ b/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WarningAreaCoordinates.h" diff --git a/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.h b/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.h index 6d51ed77ae..9f62b30ecf 100644 --- a/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.h +++ b/lib/asn1c/s1ap/S1AP_WarningAreaCoordinates.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WarningAreaCoordinates_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_WarningAreaCoordinates; asn_struct_free_f S1AP_WarningAreaCoordinates_free; asn_struct_print_f S1AP_WarningAreaCoordinates_print; asn_constr_check_f S1AP_WarningAreaCoordinates_constraint; -jer_type_encoder_f S1AP_WarningAreaCoordinates_encode_jer; per_type_decoder_f S1AP_WarningAreaCoordinates_decode_aper; per_type_encoder_f S1AP_WarningAreaCoordinates_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WarningAreaList.c b/lib/asn1c/s1ap/S1AP_WarningAreaList.c index 33dfbdbec9..1c7bb54ef0 100644 --- a/lib/asn1c/s1ap/S1AP_WarningAreaList.c +++ b/lib/asn1c/s1ap/S1AP_WarningAreaList.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WarningAreaList.h" diff --git a/lib/asn1c/s1ap/S1AP_WarningAreaList.h b/lib/asn1c/s1ap/S1AP_WarningAreaList.h index 04a571ef3b..8b523f1a24 100644 --- a/lib/asn1c/s1ap/S1AP_WarningAreaList.h +++ b/lib/asn1c/s1ap/S1AP_WarningAreaList.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WarningAreaList_H_ diff --git a/lib/asn1c/s1ap/S1AP_WarningMessageContents.c b/lib/asn1c/s1ap/S1AP_WarningMessageContents.c index b298d57487..1cc4161bf6 100644 --- a/lib/asn1c/s1ap/S1AP_WarningMessageContents.c +++ b/lib/asn1c/s1ap/S1AP_WarningMessageContents.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WarningMessageContents.h" diff --git a/lib/asn1c/s1ap/S1AP_WarningMessageContents.h b/lib/asn1c/s1ap/S1AP_WarningMessageContents.h index 02e89a2517..79e7d679e8 100644 --- a/lib/asn1c/s1ap/S1AP_WarningMessageContents.h +++ b/lib/asn1c/s1ap/S1AP_WarningMessageContents.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WarningMessageContents_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_WarningMessageContents; asn_struct_free_f S1AP_WarningMessageContents_free; asn_struct_print_f S1AP_WarningMessageContents_print; asn_constr_check_f S1AP_WarningMessageContents_constraint; -jer_type_encoder_f S1AP_WarningMessageContents_encode_jer; per_type_decoder_f S1AP_WarningMessageContents_decode_aper; per_type_encoder_f S1AP_WarningMessageContents_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.c b/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.c index 082e6abbb9..559b563c88 100644 --- a/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.c +++ b/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WarningSecurityInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.h b/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.h index 815df2ef7f..54b4624d28 100644 --- a/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.h +++ b/lib/asn1c/s1ap/S1AP_WarningSecurityInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WarningSecurityInfo_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_WarningSecurityInfo; asn_struct_free_f S1AP_WarningSecurityInfo_free; asn_struct_print_f S1AP_WarningSecurityInfo_print; asn_constr_check_f S1AP_WarningSecurityInfo_constraint; -jer_type_encoder_f S1AP_WarningSecurityInfo_encode_jer; per_type_decoder_f S1AP_WarningSecurityInfo_decode_aper; per_type_encoder_f S1AP_WarningSecurityInfo_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WarningType.c b/lib/asn1c/s1ap/S1AP_WarningType.c index b2fad7d5eb..3d597eefe7 100644 --- a/lib/asn1c/s1ap/S1AP_WarningType.c +++ b/lib/asn1c/s1ap/S1AP_WarningType.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WarningType.h" diff --git a/lib/asn1c/s1ap/S1AP_WarningType.h b/lib/asn1c/s1ap/S1AP_WarningType.h index d36b04575f..a29e0fd9d1 100644 --- a/lib/asn1c/s1ap/S1AP_WarningType.h +++ b/lib/asn1c/s1ap/S1AP_WarningType.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WarningType_H_ @@ -27,7 +27,6 @@ extern asn_TYPE_descriptor_t asn_DEF_S1AP_WarningType; asn_struct_free_f S1AP_WarningType_free; asn_struct_print_f S1AP_WarningType_print; asn_constr_check_f S1AP_WarningType_constraint; -jer_type_encoder_f S1AP_WarningType_encode_jer; per_type_decoder_f S1AP_WarningType_decode_aper; per_type_encoder_f S1AP_WarningType_encode_aper; diff --git a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.c b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.c index 3ecc6b65a7..4109ad23a7 100644 --- a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.c +++ b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WriteReplaceWarningRequest.h" diff --git a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.h b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.h index eb8a8c1345..fdecde2995 100644 --- a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.h +++ b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningRequest.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WriteReplaceWarningRequest_H_ diff --git a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.c b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.c index c6a8868b33..ab394e18c3 100644 --- a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.c +++ b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_WriteReplaceWarningResponse.h" diff --git a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.h b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.h index 7bd480ec37..38d6d6bfdb 100644 --- a/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.h +++ b/lib/asn1c/s1ap/S1AP_WriteReplaceWarningResponse.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-PDU-Contents" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_WriteReplaceWarningResponse_H_ diff --git a/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.c b/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.c index 343a5253e8..c343ab4ddb 100644 --- a/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.c +++ b/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.c @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #include "S1AP_X2TNLConfigurationInfo.h" diff --git a/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.h b/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.h index f739c00d57..b451b8b4b4 100644 --- a/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.h +++ b/lib/asn1c/s1ap/S1AP_X2TNLConfigurationInfo.h @@ -2,7 +2,7 @@ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "S1AP-IEs" * found in "../support/s1ap-r17.3.0/36413-h30.asn" - * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER` + * `asn1c -pdu=all -fcompound-names -findirect-choice -fno-include-deps -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER` */ #ifndef _S1AP_X2TNLConfigurationInfo_H_ diff --git a/lib/asn1c/support/README.md b/lib/asn1c/support/README.md index 7ccaa4cbe9..a3a8326987 100644 --- a/lib/asn1c/support/README.md +++ b/lib/asn1c/support/README.md @@ -1,25 +1,31 @@ Use mounse07410(vlm_master) git's fork for asn1c -commit 3e6592bd840b42a2e16cc6286449f286b118ae8b (HEAD, origin/vlm_master, origin/HEAD, vlm_master) -Merge: 29ef59bb 4e28be09 +commit e0c4a3eafa9f1861dd7dac1000953eb2850e47e4 (HEAD -> vlm_master, origin/vlm_master, origin/HEAD) +Merge: ce10a57a 665a2278 Author: Mouse <mouse07410@users.noreply.github.com> -Date: Mon Nov 13 21:08:35 2023 -0500 +Date: Sun Feb 11 17:13:22 2024 -0500 - Merge pull request #140 from velichkov/mouse07410_issues134 + Merge pull request #177 from v0-e/integer-2-int64 -commit 4e28be09549f3ad6ee4fd5e84996899671591a36 -Author: Vasil Velichkov <vvvelichkov@gmail.com> -Date: Mon Nov 13 21:42:39 2023 +0200 + INTEGER to 64-bit native integer methods - aper: Check CHOICE present value is not greater than elements count +commit 665a227804e18c3fa6b46ab55aeedd7379f1ed29 +Author: v0-e <xyz.vieira@gmail.com> +Date: Wed Feb 7 15:29:18 2024 +0000 - Fixes mouse07410/asn1c#134 + INTEGER <-> (u)int64_t tests + +commit 81cc4e47a665c51faff2d2c2fb2ba39066009356 +Author: v0-e <xyz.vieira@gmail.com> +Date: Wed Feb 7 15:28:09 2024 +0000 + + INTEGER to (u)int64_t =========================================== user@host ~/Documents/git/my$ \ git clone https://github.com/mouse07410/asn1c.git user@host ~/Documents/git/my$ \ - git checkout ebed802c88b3049cfe67326e4df780cefc6da49e + git checkout e0c4a3eafa9f1861dd7dac1000953eb2850e47e4 OR @@ -27,7 +33,7 @@ user@host ~/Documents/git/my$ \ git clone https://github.com/open5gs/asn1c.git user@host Documents/git/my/asn1c$ \ - autoreconf -fi;./configure;make -j4 + autoreconf -fi;./configure;make -j8 Modify 36413-h30.txt to 36413-h30.asn =========================================== @@ -44,13 +50,13 @@ ASN.1 encoder/decoder user@host ~/documents/git/open5gs/lib/asn1c/s1ap$ \ ASN1C_PREFIX=S1AP_ ../../../../my/asn1c/asn1c/asn1c -pdu=all \ -fcompound-names -findirect-choice -fno-include-deps \ - -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER \ + -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER \ ../support/s1ap-r17.3.0/36413-h30.asn user@host ~/Documents/git/open5gs/lib/asn1c/ngap$ \ ASN1C_PREFIX=NGAP_ ../../../../my/asn1c/asn1c/asn1c -pdu=all \ -fcompound-names -findirect-choice -fno-include-deps \ - -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER \ + -no-gen-BER -no-gen-XER -no-gen-OER -no-gen-UPER -no-gen-JER \ ../support/ngap-r17.3.0/38413-h30.asn Fix NGAP_RANNodeNameUTF8String.c (Issues #994 - APC_EXTENSIBLE) diff --git a/lib/ngap/build.c b/lib/ngap/build.c index d306a534f5..492c3f4e3c 100644 --- a/lib/ngap/build.c +++ b/lib/ngap/build.c @@ -235,8 +235,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack( } if (item->aMF_UE_NGAP_ID) - asn_INTEGER2ulong(item->aMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id); + asn_INTEGER2uint64(item->aMF_UE_NGAP_ID, &amf_ue_ngap_id); if (item->rAN_UE_NGAP_ID) ran_ue_ngap_id = *item->rAN_UE_NGAP_ID; diff --git a/lib/sctp/ogs-sctp.c b/lib/sctp/ogs-sctp.c index 6f39a84c04..4cd46989de 100644 --- a/lib/sctp/ogs-sctp.c +++ b/lib/sctp/ogs-sctp.c @@ -32,20 +32,25 @@ int ogs_sctp_recvdata(ogs_sock_t *sock, void *msg, size_t len, do { size = ogs_sctp_recvmsg(sock, msg, len, from, sinfo, &flags); - if (size < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sctp_recvdata(%d)", size); + if (size < 0 || size >= OGS_MAX_SDU_LEN) { + ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s)", + size, errno, strerror(errno)); return size; } if (flags & MSG_NOTIFICATION) { /* Nothing */ - } - else if (flags & MSG_EOR) { + } else if (flags & MSG_EOR) { break; - } - else { - ogs_assert_if_reached(); + } else { + if (ogs_socket_errno != OGS_EAGAIN) { + ogs_fatal("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", + size, errno, strerror(errno), flags); + ogs_assert_if_reached(); + } else { + ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", + size, errno, strerror(errno), flags); + } } } while(1); diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 8237e72f1d..51b73a1efa 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -640,8 +640,7 @@ void ngap_handle_uplink_nas_transport( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -803,8 +802,7 @@ void ngap_handle_ue_radio_capability_info_indication( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -908,8 +906,7 @@ void ngap_handle_initial_context_setup_response( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -1187,8 +1184,7 @@ void ngap_handle_initial_context_setup_failure( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -1320,8 +1316,7 @@ void ngap_handle_ue_context_modification_response( if (AMF_UE_NGAP_ID) { - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_warn("Invalid AMF_UE_NGAP_ID"); } @@ -1388,8 +1383,7 @@ void ngap_handle_ue_context_modification_failure( if (AMF_UE_NGAP_ID) { - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_warn("Invalid AMF_UE_NGAP_ID"); } @@ -1483,8 +1477,7 @@ void ngap_handle_ue_context_release_request( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -1655,8 +1648,7 @@ void ngap_handle_ue_context_release_complete( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -1886,8 +1878,7 @@ void ngap_handle_pdu_session_resource_setup_response( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -2208,8 +2199,7 @@ void ngap_handle_pdu_session_resource_modify_response( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -2395,8 +2385,7 @@ void ngap_handle_pdu_session_resource_release_response( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -2747,8 +2736,7 @@ void ngap_handle_path_switch_request( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -3074,8 +3062,7 @@ void ngap_handle_handover_required( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -3413,8 +3400,7 @@ void ngap_handle_handover_request_ack( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -3629,8 +3615,7 @@ void ngap_handle_handover_failure( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, NULL, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -3753,8 +3738,7 @@ void ngap_handle_handover_cancel( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -3904,8 +3888,7 @@ void ngap_handle_uplink_ran_status_transfer( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -4025,8 +4008,7 @@ void ngap_handle_handover_notification( return; } - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); @@ -4512,8 +4494,8 @@ void ngap_handle_ng_reset( } if (item->aMF_UE_NGAP_ID) { - if (asn_INTEGER2ulong(item->aMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(item->aMF_UE_NGAP_ID, + &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); continue; } @@ -4650,8 +4632,7 @@ void ngap_handle_error_indication(amf_gnb_t *gnb, ogs_ngap_message_t *message) if (AMF_UE_NGAP_ID) { - if (asn_INTEGER2ulong(AMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id) != 0) { + if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_warn("Invalid AMF_UE_NGAP_ID"); } diff --git a/src/mme/sgsap-sctp.c b/src/mme/sgsap-sctp.c index 988db28d76..d14c9287e9 100644 --- a/src/mme/sgsap-sctp.c +++ b/src/mme/sgsap-sctp.c @@ -200,8 +200,14 @@ static void recv_handler(ogs_sock_t *sock) sgsap_event_push(MME_EVENT_SGSAP_MESSAGE, sock, addr, pkbuf, 0, 0); return; } else { - ogs_fatal("Invalid flag(0x%x)", flags); - ogs_assert_if_reached(); + if (ogs_socket_errno != OGS_EAGAIN) { + ogs_fatal("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", + size, errno, strerror(errno), flags); + ogs_assert_if_reached(); + } else { + ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", + size, errno, strerror(errno), flags); + } } ogs_pkbuf_free(pkbuf); } diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index e5d5ad751a..abd56150c2 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -1129,7 +1129,7 @@ bool pcf_npcf_policyauthorization_handle_update( OpenAPI_list_t *SubComponentList = NULL; OpenAPI_map_t *SubComponentMap = NULL; - OpenAPI_media_sub_component_t *SubComponent = NULL; + OpenAPI_media_sub_component_rm_t *SubComponent = NULL; OpenAPI_list_t *fDescList = NULL; diff --git a/src/smf/s5c-build.c b/src/smf/s5c-build.c index b779dca185..5db78cb3d1 100644 --- a/src/smf/s5c-build.c +++ b/src/smf/s5c-build.c @@ -303,7 +303,6 @@ ogs_pkbuf_t *smf_s5c_build_delete_session_response( gtp_message.h.type = type; pkbuf = ogs_gtp2_build_msg(&gtp_message); -cleanup: if (epco_buf) ogs_free(epco_buf); diff --git a/tests/common/ngap-handler.c b/tests/common/ngap-handler.c index 0154b9ca08..496b48c0af 100644 --- a/tests/common/ngap-handler.c +++ b/tests/common/ngap-handler.c @@ -106,9 +106,7 @@ void testngap_handle_downlink_nas_transport( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { test_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; @@ -179,9 +177,7 @@ void testngap_handle_initial_context_setup_request( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { test_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; @@ -299,12 +295,9 @@ void testngap_handle_ue_release_context_command( if (UE_NGAP_IDs) { if (UE_NGAP_IDs->present == NGAP_UE_NGAP_IDs_PR_uE_NGAP_ID_pair) { - uint64_t amf_ue_ngap_id; - uint64_t ran_ue_ngap_id; - asn_INTEGER2ulong( + asn_INTEGER2uint64( &UE_NGAP_IDs->choice.uE_NGAP_ID_pair->aMF_UE_NGAP_ID, - (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + &test_ue->amf_ue_ngap_id); test_ue->ran_ue_ngap_id = UE_NGAP_IDs->choice.uE_NGAP_ID_pair->rAN_UE_NGAP_ID; @@ -370,9 +363,7 @@ void testngap_handle_pdu_session_resource_setup_request( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { test_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; @@ -645,9 +636,7 @@ void testngap_handle_handover_request( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (PDUSessionList) { @@ -740,9 +729,7 @@ void testngap_handle_handover_command( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { @@ -840,9 +827,7 @@ void testngap_handle_handover_preparation_failure( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { @@ -889,9 +874,7 @@ void testngap_handle_handover_cancel_ack( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { @@ -937,9 +920,7 @@ void testngap_handle_downlink_ran_status_transfer( } if (AMF_UE_NGAP_ID) { - uint64_t amf_ue_ngap_id; - asn_INTEGER2ulong(AMF_UE_NGAP_ID, (unsigned long *)&amf_ue_ngap_id); - test_ue->amf_ue_ngap_id = (uint64_t)amf_ue_ngap_id; + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &test_ue->amf_ue_ngap_id); } if (RAN_UE_NGAP_ID) { test_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; diff --git a/tests/common/sctp.c b/tests/common/sctp.c index 96fdc48f7c..658f4966ba 100644 --- a/tests/common/sctp.c +++ b/tests/common/sctp.c @@ -136,7 +136,7 @@ ogs_pkbuf_t *testsctp_read(ogs_socknode_t *node, int type) size = ogs_sctp_recvdata(node->sock, recvbuf->data, OGS_MAX_SDU_LEN, type == 1 ? &last_addr : NULL, NULL); if (size <= 0) { - ogs_error("sgsap_recv() failed"); + ogs_error("ogs_sctp_recvdata() failed"); return NULL; } diff --git a/tests/unit/ngap-message-test.c b/tests/unit/ngap-message-test.c index d5d1ffe0de..f93a379c69 100644 --- a/tests/unit/ngap-message-test.c +++ b/tests/unit/ngap-message-test.c @@ -184,6 +184,194 @@ static void ngap_message_test4(abts_case *tc, void *data) ogs_pkbuf_free(pkbuf); } +static ogs_pkbuf_t *build_uplink_nas_transport( + uint32_t ran_ue_ngap_id, uint64_t amf_ue_ngap_id, ogs_pkbuf_t *gmmbuf) +{ + const char *payload = + "7e005c00 0d0199f9 07f0ff00 00000020" + "3190"; + char hexbuf[OGS_HUGE_LEN]; + + NGAP_NGAP_PDU_t pdu; + NGAP_InitiatingMessage_t *initiatingMessage = NULL; + NGAP_UplinkNASTransport_t *UplinkNASTransport = NULL; + + NGAP_UplinkNASTransport_IEs_t *ie = NULL; + NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; + NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; + NGAP_NAS_PDU_t *NAS_PDU = NULL; + NGAP_UserLocationInformation_t *UserLocationInformation = NULL; + NGAP_UserLocationInformationNR_t *userLocationInformationNR = NULL; + NGAP_NR_CGI_t *nR_CGI = NULL; + NGAP_TAI_t *tAI = NULL; + + ogs_nr_cgi_t nr_cgi; + ogs_5gs_tai_t nr_tai; + + ogs_assert(gmmbuf); + + memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); + pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage = + CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); + + initiatingMessage = pdu.choice.initiatingMessage; + initiatingMessage->procedureCode = + NGAP_ProcedureCode_id_UplinkNASTransport; + initiatingMessage->criticality = NGAP_Criticality_ignore; + initiatingMessage->value.present = + NGAP_InitiatingMessage__value_PR_UplinkNASTransport; + + UplinkNASTransport = + &initiatingMessage->value.choice.UplinkNASTransport; + + ie = CALLOC(1, sizeof(NGAP_UplinkNASTransport_IEs_t)); + ASN_SEQUENCE_ADD(&UplinkNASTransport->protocolIEs, ie); + + ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; + ie->criticality = NGAP_Criticality_reject; + ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_AMF_UE_NGAP_ID; + + AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; + + ie = CALLOC(1, sizeof(NGAP_UplinkNASTransport_IEs_t)); + ASN_SEQUENCE_ADD(&UplinkNASTransport->protocolIEs, ie); + + ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; + ie->criticality = NGAP_Criticality_reject; + ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_RAN_UE_NGAP_ID; + + RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; + + ie = CALLOC(1, sizeof(NGAP_UplinkNASTransport_IEs_t)); + ASN_SEQUENCE_ADD(&UplinkNASTransport->protocolIEs, ie); + + ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU; + ie->criticality = NGAP_Criticality_reject; + ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_NAS_PDU; + + NAS_PDU = &ie->value.choice.NAS_PDU; + + ie = CALLOC(1, sizeof(NGAP_UplinkNASTransport_IEs_t)); + ASN_SEQUENCE_ADD(&UplinkNASTransport->protocolIEs, ie); + + ie->id = NGAP_ProtocolIE_ID_id_UserLocationInformation; + ie->criticality = NGAP_Criticality_ignore; + ie->value.present = + NGAP_UplinkNASTransport_IEs__value_PR_UserLocationInformation; + + UserLocationInformation = &ie->value.choice.UserLocationInformation; + + asn_uint642INTEGER(AMF_UE_NGAP_ID, amf_ue_ngap_id); + *RAN_UE_NGAP_ID = ran_ue_ngap_id; + + NAS_PDU->size = gmmbuf->len; + NAS_PDU->buf = CALLOC(NAS_PDU->size, sizeof(uint8_t)); + memcpy(NAS_PDU->buf, gmmbuf->data, NAS_PDU->size); + ogs_pkbuf_free(gmmbuf); + + userLocationInformationNR = + CALLOC(1, sizeof(NGAP_UserLocationInformationNR_t)); + + nR_CGI = &userLocationInformationNR->nR_CGI; + ogs_ngap_nr_cgi_to_ASN(&nr_cgi, nR_CGI); + + tAI = &userLocationInformationNR->tAI; + ogs_ngap_5gs_tai_to_ASN(&nr_tai, tAI); + + UserLocationInformation->present = + NGAP_UserLocationInformation_PR_userLocationInformationNR; + UserLocationInformation->choice.userLocationInformationNR = + userLocationInformationNR; + + return ogs_ngap_encode(&pdu); +} + +static void ngap_message_test5_issues2934(abts_case *tc, void *data) +{ + const char *payload = + "7e005c00 0d0199f9 07f0ff00 00000020" + "3190"; + ogs_pkbuf_t *gmmbuf = NULL; + ogs_pkbuf_t *ngapbuf = NULL; + char hexbuf[OGS_HUGE_LEN]; + + ogs_ngap_message_t message, *struct_ptr = NULL; + size_t struct_size; + asn_dec_rval_t dec_ret = {0}; + + int i; + NGAP_InitiatingMessage_t *initiatingMessage = NULL; + NGAP_DownlinkNASTransport_t *DownlinkNASTransport = NULL; + + NGAP_DownlinkNASTransport_IEs_t *ie = NULL; + NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; + NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; + NGAP_NAS_PDU_t *NAS_PDU = NULL; + + uint64_t amf_ue_ngap_id; + +#define NGAPBUF_SIZE 18 + + gmmbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(gmmbuf); + ogs_pkbuf_put_data(gmmbuf, + ogs_hex_from_string(payload, hexbuf, sizeof(hexbuf)), NGAPBUF_SIZE); + + ngapbuf = build_uplink_nas_transport(1, 0xffffffff, gmmbuf); + ABTS_PTR_NOTNULL(tc, ngapbuf); + ogs_pkbuf_free(ngapbuf); + + gmmbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(gmmbuf); + ogs_pkbuf_put_data(gmmbuf, + ogs_hex_from_string(payload, hexbuf, sizeof(hexbuf)), NGAPBUF_SIZE); + + ngapbuf = build_uplink_nas_transport(1, 0xffffffffff, gmmbuf); + ABTS_PTR_NOTNULL(tc, ngapbuf); + + struct_ptr = &message; + struct_size = sizeof(ogs_ngap_message_t); + + memset(struct_ptr, 0, struct_size); + dec_ret = aper_decode(NULL, &asn_DEF_NGAP_NGAP_PDU, (void **)&struct_ptr, + ngapbuf->data, ngapbuf->len, 0, 0); + ABTS_INT_EQUAL(tc, 0, dec_ret.code); + ABTS_INT_EQUAL(tc, ngapbuf->len * 8, dec_ret.consumed); + + initiatingMessage = message.choice.initiatingMessage; + DownlinkNASTransport = + &initiatingMessage->value.choice.DownlinkNASTransport; + + for (i = 0; i < DownlinkNASTransport->protocolIEs.list.count; i++) { + ie = DownlinkNASTransport->protocolIEs.list.array[i]; + switch (ie->id) { + case NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID: + AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; + break; + case NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID: + RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; + break; + case NGAP_ProtocolIE_ID_id_NAS_PDU: + NAS_PDU = &ie->value.choice.NAS_PDU; + break; + default: + break; + } + } + + ABTS_PTR_NOTNULL(tc, AMF_UE_NGAP_ID); + asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id); + ABTS_TRUE(tc, 0xffffffffff == amf_ue_ngap_id); + ABTS_PTR_NOTNULL(tc, RAN_UE_NGAP_ID); + ABTS_INT_EQUAL(tc, 1, *RAN_UE_NGAP_ID); + ABTS_PTR_NOTNULL(tc, NAS_PDU); + + ogs_ngap_free(&message); + + ogs_pkbuf_free(ngapbuf); +} + abts_suite *test_ngap_message(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -194,6 +382,7 @@ abts_suite *test_ngap_message(abts_suite *suite) abts_run_test(suite, ngap_message_test2, NULL); abts_run_test(suite, ngap_message_test3, NULL); abts_run_test(suite, ngap_message_test4, NULL); + abts_run_test(suite, ngap_message_test5_issues2934, NULL); return suite; } From 41d8934677481c633ec13bda65d475449bae189c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 17 Feb 2024 20:40:08 +0100 Subject: [PATCH 027/323] [SMF] Added Bi-Directional Flow (#2909) For bi-directions, the rules are created in the same form as for downlink as shown below, so to apply them for uplink, we need to swap the rules according to the interface. RX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> RX : permit in from <UE_IP> <UE_PORT> to <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> --- lib/diameter/gx/message.h | 3 +- lib/ipfw/ogs-ipfw.c | 243 ++++++++++++++--------- lib/ipfw/ogs-ipfw.h | 4 +- lib/pfcp/build.c | 36 +++- lib/pfcp/context.h | 18 +- lib/proto/types.h | 42 +++- lib/sbi/conv.c | 3 + src/smf/binding.c | 6 +- src/smf/context.c | 27 ++- src/smf/context.h | 2 + src/smf/gsm-handler.c | 8 +- src/smf/gx-handler.c | 7 +- src/smf/gx-path.c | 5 +- src/smf/npcf-handler.c | 14 +- src/smf/s5c-handler.c | 8 +- tests/common/context.c | 101 ++++++++++ tests/common/context.h | 1 + tests/volte/bearer-test.c | 250 ++++++++++++++++++++++- tests/vonr/qos-flow-test.c | 393 ++++++++++++++++++++++++++++++++++++- 19 files changed, 1035 insertions(+), 136 deletions(-) diff --git a/lib/diameter/gx/message.h b/lib/diameter/gx/message.h index cba5dc2b48..68d1c07265 100644 --- a/lib/diameter/gx/message.h +++ b/lib/diameter/gx/message.h @@ -1,5 +1,5 @@ /* Gx Interface, 3GPP TS 29.212 section 4 - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -43,6 +43,7 @@ extern "C" { #define OGS_DIAM_GX_AVP_CODE_FLOW_STATUS (511) #define OGS_DIAM_GX_AVP_CODE_QOS_INFORMATION (1016) #define OGS_DIAM_GX_AVP_CODE_PRECEDENCE (1010) +#define OGS_DIAM_GX_AVP_CODE_RATING_GROUP (432) extern struct dict_object *ogs_diam_gx_application; diff --git a/lib/ipfw/ogs-ipfw.c b/lib/ipfw/ogs-ipfw.c index 0e0e2ced47..0140e94a97 100644 --- a/lib/ipfw/ogs-ipfw.c +++ b/lib/ipfw/ogs-ipfw.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -395,117 +395,167 @@ void ogs_pf_content_from_ipfw_rule( * Network support Local Address in TFTs. */ - if (rule->ipv4_src && (direction == OGS_FLOW_DOWNLINK_ONLY)) { - content->component[j].type = OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE; - content->component[j].ipv4.addr = rule->ip.src.addr[0]; - content->component[j].ipv4.mask = rule->ip.src.mask[0]; - j++; len += 9; - } - - if (rule->ipv4_src && (direction == OGS_FLOW_UPLINK_ONLY) && - !no_ipv4v6_local_addr_in_packet_filter) { - content->component[j].type = OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE; - content->component[j].ipv4.addr = rule->ip.src.addr[0]; - content->component[j].ipv4.mask = rule->ip.src.mask[0]; - j++; len += 9; - } - - if (rule->ipv4_dst && (direction == OGS_FLOW_DOWNLINK_ONLY) && - !no_ipv4v6_local_addr_in_packet_filter) { - content->component[j].type = OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE; - content->component[j].ipv4.addr = rule->ip.dst.addr[0]; - content->component[j].ipv4.mask = rule->ip.dst.mask[0]; - j++; len += 9; - } - - if (rule->ipv4_dst && (direction == OGS_FLOW_UPLINK_ONLY)) { - content->component[j].type = OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE; - content->component[j].ipv4.addr = rule->ip.dst.addr[0]; - content->component[j].ipv4.mask = rule->ip.dst.mask[0]; - j++; len += 9; - } - - if (rule->ipv6_src && (direction == OGS_FLOW_DOWNLINK_ONLY)) { - if (no_ipv4v6_local_addr_in_packet_filter) { - content->component[j].type = - OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE; - memcpy(content->component[j].ipv6_mask.addr, - rule->ip.src.addr, sizeof rule->ip.src.addr); - memcpy(content->component[j].ipv6_mask.mask, - rule->ip.src.mask, sizeof rule->ip.src.mask); - j++; len += 33; - } else { + if (rule->ipv4_src) { + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: content->component[j].type = - OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE; - memcpy(content->component[j].ipv6.addr, - rule->ip.src.addr, sizeof rule->ip.src.addr); - content->component[j].ipv6.prefixlen = - contigmask((uint8_t *)rule->ip.src.mask, 128); - j++; len += 18; + OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE; + content->component[j].ipv4.addr = rule->ip.src.addr[0]; + content->component[j].ipv4.mask = rule->ip.src.mask[0]; + j++; len += 9; + break; + case OGS_FLOW_UPLINK_ONLY: + if (!no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE; + content->component[j].ipv4.addr = rule->ip.src.addr[0]; + content->component[j].ipv4.mask = rule->ip.src.mask[0]; + j++; len += 9; + } + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); } } - if (rule->ipv6_src && (direction == OGS_FLOW_UPLINK_ONLY)) { - if (!no_ipv4v6_local_addr_in_packet_filter) { + if (rule->ipv4_dst) { + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: + if (!no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE; + content->component[j].ipv4.addr = rule->ip.dst.addr[0]; + content->component[j].ipv4.mask = rule->ip.dst.mask[0]; + j++; len += 9; + } + break; + case OGS_FLOW_UPLINK_ONLY: content->component[j].type = - OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE; - memcpy(content->component[j].ipv6.addr, - rule->ip.src.addr, sizeof rule->ip.src.addr); - content->component[j].ipv6.prefixlen = - contigmask((uint8_t *)rule->ip.src.mask, 128); - j++; len += 18; + OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE; + content->component[j].ipv4.addr = rule->ip.dst.addr[0]; + content->component[j].ipv4.mask = rule->ip.dst.mask[0]; + j++; len += 9; + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); } } - if (rule->ipv6_dst && (direction == OGS_FLOW_DOWNLINK_ONLY)) { - if (!no_ipv4v6_local_addr_in_packet_filter) { - content->component[j].type = - OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE; - memcpy(content->component[j].ipv6.addr, - rule->ip.dst.addr, sizeof rule->ip.dst.addr); - content->component[j].ipv6.prefixlen = - contigmask((uint8_t *)rule->ip.dst.mask, 128); - j++; len += 18; + if (rule->ipv6_src) { + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: + if (no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE; + memcpy(content->component[j].ipv6_mask.addr, + rule->ip.src.addr, sizeof rule->ip.src.addr); + memcpy(content->component[j].ipv6_mask.mask, + rule->ip.src.mask, sizeof rule->ip.src.mask); + j++; len += 33; + } else { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE; + memcpy(content->component[j].ipv6.addr, + rule->ip.src.addr, sizeof rule->ip.src.addr); + content->component[j].ipv6.prefixlen = + contigmask((uint8_t *)rule->ip.src.mask, 128); + j++; len += 18; + } + break; + case OGS_FLOW_UPLINK_ONLY: + if (!no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE; + memcpy(content->component[j].ipv6.addr, + rule->ip.src.addr, sizeof rule->ip.src.addr); + content->component[j].ipv6.prefixlen = + contigmask((uint8_t *)rule->ip.src.mask, 128); + j++; len += 18; + } + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); } } - if (rule->ipv6_dst && (direction == OGS_FLOW_UPLINK_ONLY)) { - if (no_ipv4v6_local_addr_in_packet_filter) { - content->component[j].type = - OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE; - memcpy(content->component[j].ipv6_mask.addr, - rule->ip.dst.addr, sizeof rule->ip.dst.addr); - memcpy(content->component[j].ipv6_mask.mask, - rule->ip.dst.mask, sizeof rule->ip.dst.mask); - j++; len += 33; - } else { - content->component[j].type = - OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE; - memcpy(content->component[j].ipv6.addr, + if (rule->ipv6_dst) { + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: + if (!no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE; + memcpy(content->component[j].ipv6.addr, rule->ip.dst.addr, sizeof rule->ip.dst.addr); - content->component[j].ipv6.prefixlen = - contigmask((uint8_t *)rule->ip.dst.mask, 128); - j++; len += 18; + content->component[j].ipv6.prefixlen = + contigmask((uint8_t *)rule->ip.dst.mask, 128); + j++; len += 18; + } + break; + case OGS_FLOW_UPLINK_ONLY: + if (no_ipv4v6_local_addr_in_packet_filter) { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE; + memcpy(content->component[j].ipv6_mask.addr, + rule->ip.dst.addr, sizeof rule->ip.dst.addr); + memcpy(content->component[j].ipv6_mask.mask, + rule->ip.dst.mask, sizeof rule->ip.dst.mask); + j++; len += 33; + } else { + content->component[j].type = + OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE; + memcpy(content->component[j].ipv6.addr, + rule->ip.dst.addr, sizeof rule->ip.dst.addr); + content->component[j].ipv6.prefixlen = + contigmask((uint8_t *)rule->ip.dst.mask, 128); + j++; len += 18; + } + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); } } if (rule->port.src.low) { if (rule->port.src.low == rule->port.src.high) { - if (direction == OGS_FLOW_DOWNLINK_ONLY) + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: content->component[j].type = OGS_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE; - else + break; + case OGS_FLOW_UPLINK_ONLY: content->component[j].type = OGS_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE; + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); + } content->component[j].port.low = rule->port.src.low; j++; len += 3; } else { - if (direction == OGS_FLOW_DOWNLINK_ONLY) + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: content->component[j].type = OGS_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE; - else + break; + case OGS_FLOW_UPLINK_ONLY: content->component[j].type = OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE; + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); + } content->component[j].port.low = rule->port.src.low; content->component[j].port.high = rule->port.src.high; j++; len += 5; @@ -514,21 +564,37 @@ void ogs_pf_content_from_ipfw_rule( if (rule->port.dst.low) { if (rule->port.dst.low == rule->port.dst.high) { - if (direction == OGS_FLOW_DOWNLINK_ONLY) + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: content->component[j].type = OGS_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE; - else + break; + case OGS_FLOW_UPLINK_ONLY: content->component[j].type = OGS_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE; + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); + } content->component[j].port.low = rule->port.dst.low; j++; len += 3; } else { - if (direction == OGS_FLOW_DOWNLINK_ONLY) + switch (direction) { + case OGS_FLOW_DOWNLINK_ONLY: + case OGS_FLOW_BIDIRECTIONAL: content->component[j].type = OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE; - else + break; + case OGS_FLOW_UPLINK_ONLY: content->component[j].type = OGS_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE; + break; + default: + ogs_fatal("Unsupported direction [%d]", direction); + ogs_assert_if_reached(); + } content->component[j].port.low = rule->port.dst.low; content->component[j].port.high = rule->port.dst.high; j++; len += 5; @@ -538,4 +604,3 @@ void ogs_pf_content_from_ipfw_rule( content->num_of_component = j; content->length = len; } - diff --git a/lib/ipfw/ogs-ipfw.h b/lib/ipfw/ogs-ipfw.h index 775d8594bb..80367a0356 100644 --- a/lib/ipfw/ogs-ipfw.h +++ b/lib/ipfw/ogs-ipfw.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -68,7 +68,7 @@ char *ogs_ipfw_encode_flow_description(ogs_ipfw_rule_t *ipfw_rule); * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL>> * RX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> * PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> diff --git a/lib/pfcp/build.c b/lib/pfcp/build.c index 56899bd767..663baa3d9c 100644 --- a/lib/pfcp/build.c +++ b/lib/pfcp/build.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -364,10 +364,19 @@ void ogs_pfcp_build_create_pdr( memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { - pfcp_sdf_filter[j].fd = 1; - pfcp_sdf_filter[j].flow_description_len = - strlen(pdr->flow_description[j]); - pfcp_sdf_filter[j].flow_description = pdr->flow_description[j]; + ogs_assert(pdr->flow[j].fd || pdr->flow[j].bid); + + if (pdr->flow[j].fd) { + pfcp_sdf_filter[j].fd = 1; + pfcp_sdf_filter[j].flow_description_len = + strlen(pdr->flow[j].description); + pfcp_sdf_filter[j].flow_description = pdr->flow[j].description; + } + if (pdr->flow[j].bid) { + pfcp_sdf_filter[j].bid = 1; + pfcp_sdf_filter[j].sdf_filter_id = pdr->flow[j].sdf_filter_id; + } + len = sizeof(ogs_pfcp_sdf_filter_t) + pfcp_sdf_filter[j].flow_description_len; @@ -493,10 +502,19 @@ void ogs_pfcp_build_update_pdr( memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { - pfcp_sdf_filter[j].fd = 1; - pfcp_sdf_filter[j].flow_description_len = - strlen(pdr->flow_description[j]); - pfcp_sdf_filter[j].flow_description = pdr->flow_description[j]; + ogs_assert(pdr->flow[j].fd || pdr->flow[j].bid); + + if (pdr->flow[j].fd) { + pfcp_sdf_filter[j].fd = 1; + pfcp_sdf_filter[j].flow_description_len = + strlen(pdr->flow[j].description); + pfcp_sdf_filter[j].flow_description = pdr->flow[j].description; + } + if (pdr->flow[j].bid) { + pfcp_sdf_filter[j].bid = 1; + pfcp_sdf_filter[j].sdf_filter_id = pdr->flow[j].sdf_filter_id; + } + len = sizeof(ogs_pfcp_sdf_filter_t) + pfcp_sdf_filter[j].flow_description_len; diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 0dcd98e4b0..679fc20ffe 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -186,7 +186,21 @@ typedef struct ogs_pfcp_pdr_s { ogs_pfcp_qer_t *qer; int num_of_flow; - char *flow_description[OGS_MAX_NUM_OF_FLOW_IN_PDR]; + struct { + union { + struct { + ED6(uint8_t spare1:3;, + uint8_t bid:1;, + uint8_t fl:1;, + uint8_t spi:1;, + uint8_t ttc:1;, + uint8_t fd:1;) + }; + uint8_t flags; + }; + char *description; + uint32_t sdf_filter_id; + } flow[OGS_MAX_NUM_OF_FLOW_IN_PDR];; ogs_list_t rule_list; /* Rule List */ diff --git a/lib/proto/types.h b/lib/proto/types.h index 3ae4295d97..fe71c796d4 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -459,9 +459,40 @@ typedef struct ogs_qos_s { int ogs_check_qos_conf(ogs_qos_t *qos); /********************************** - * Flow Structure */ + * TS29.212 + * Ch 5.3.65 Flow-Direction AVP + * + * The Flow-Direction AVP (AVP code 1080) is of type Enumerated. + * It indicates the direction/directions that a filter is applicable, + * downlink only, uplink only or both down- and uplink (bidirectional). + * + * UNSPECIFIED (0) + * The corresponding filter applies for traffic to the UE (downlink), + * but has no specific direction declared. The service data flow detection + * shall apply the filter for uplink traffic as if the filter was + * bidirectional. The PCRF shall not use the value UNSPECIFIED + * in filters created by the network in NW-initiated procedures. + * The PCRF shall only include the value UNSPECIFIED in filters + * in UE-initiated procedures if the same value is received from + * in the CCR request from the PCEF. + * + * DOWNLINK (1) + * The corresponding filter applies for traffic to the UE. + * + * UPLINK (2) + * The corresponding filter applies for traffic from the UE. + * + * BIDIRECTIONAL (3) + * The corresponding filter applies for traffic both to and from the UE. + * + * NOTE: The corresponding filter data is unidirectional. The filter + * for the opposite direction has the same parameters, but having + * the source and destination address/port parameters swapped. + */ +#define OGS_FLOW_UNSPECIFIED 0 #define OGS_FLOW_DOWNLINK_ONLY 1 #define OGS_FLOW_UPLINK_ONLY 2 +#define OGS_FLOW_BIDIRECTIONAL 3 typedef struct ogs_flow_s { uint8_t direction; char *description; @@ -477,7 +508,11 @@ typedef struct ogs_flow_s { } while(0) /********************************** - * PCC Rule Structure */ + * TS29.212 + * Ch 5.3.2 Charging-Rule-Install AVP + * + * PCC Rule Structure + */ typedef struct ogs_pcc_rule_s { #define OGS_PCC_RULE_TYPE_INSTALL 1 #define OGS_PCC_RULE_TYPE_REMOVE 2 @@ -491,6 +526,7 @@ typedef struct ogs_pcc_rule_s { int flow_status; uint32_t precedence; + uint32_t rating_group; ogs_qos_t qos; } ogs_pcc_rule_t; diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index 5fb0724816..e5a83fb89a 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -1466,6 +1466,9 @@ OpenAPI_pcc_rule_t *ogs_sbi_build_pcc_rule( else if (flow->direction == OGS_FLOW_DOWNLINK_ONLY) FlowInformation->flow_direction = OpenAPI_flow_direction_DOWNLINK; + else if (flow->direction == OGS_FLOW_BIDIRECTIONAL) + FlowInformation->flow_direction = + OpenAPI_flow_direction_BIDIRECTIONAL; else { ogs_fatal("Unsupported direction [%d]", flow->direction); ogs_assert_if_reached(); diff --git a/src/smf/binding.c b/src/smf/binding.c index 3484bc64e9..72ee3e5170 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -65,7 +65,7 @@ static void gtp_bearer_timeout(ogs_gtp_xact_t *xact, void *data) /* * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> * @@ -303,7 +303,7 @@ void smf_bearer_binding(smf_sess_t *sess) * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> @@ -632,7 +632,7 @@ void smf_qos_flow_binding(smf_sess_t *sess) * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> diff --git a/src/smf/context.c b/src/smf/context.c index c87df3a38e..69f59f3b19 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -2569,16 +2569,28 @@ void smf_bearer_tft_update(smf_bearer_t *bearer) ogs_list_for_each(&bearer->pf_list, pf) { if (pf->direction == OGS_FLOW_DOWNLINK_ONLY) { - dl_pdr->flow_description[dl_pdr->num_of_flow++] = + dl_pdr->flow[dl_pdr->num_of_flow].fd = 1; + dl_pdr->flow[dl_pdr->num_of_flow].description = pf->flow_description; - + dl_pdr->num_of_flow++; } else if (pf->direction == OGS_FLOW_UPLINK_ONLY) { - ul_pdr->flow_description[ul_pdr->num_of_flow++] = + ul_pdr->flow[ul_pdr->num_of_flow].fd = 1; + ul_pdr->flow[ul_pdr->num_of_flow].description = + pf->flow_description; + ul_pdr->num_of_flow++; + } else if (pf->direction == OGS_FLOW_BIDIRECTIONAL) { + dl_pdr->flow[dl_pdr->num_of_flow].fd = 1; + dl_pdr->flow[dl_pdr->num_of_flow].description = pf->flow_description; + dl_pdr->flow[dl_pdr->num_of_flow].bid = 1; + dl_pdr->flow[dl_pdr->num_of_flow].sdf_filter_id = pf->sdf_filter_id; + dl_pdr->num_of_flow++; + ul_pdr->flow[ul_pdr->num_of_flow].bid = 1; + ul_pdr->flow[ul_pdr->num_of_flow].sdf_filter_id = pf->sdf_filter_id; + ul_pdr->num_of_flow++; } else { + ogs_fatal("Unsupported direction [%d]", pf->direction); ogs_assert_if_reached(); - ogs_fatal("Flow Bidirectional is not supported[%d]", - pf->direction); } } } @@ -2677,6 +2689,9 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) ogs_assert(pf->precedence > 0 && pf->precedence <= (OGS_MAX_NUM_OF_BEARER * OGS_MAX_NUM_OF_FLOW_IN_BEARER)); + /* Re-use 'pf_precedence_pool' to generate SDF Filter ID */ + pf->sdf_filter_id = *(pf->precedence_node); + pf->bearer = bearer; ogs_list_add(&bearer->pf_list, pf); diff --git a/src/smf/context.h b/src/smf/context.h index 1cef8053f8..a9f2b73118 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -161,6 +161,8 @@ ED3(uint8_t spare:2;, uint8_t precedence; /* Only used in EPC */ + uint32_t sdf_filter_id; /* SDF Filter ID */ + uint8_t *identifier_node; /* Pool-Node for Identifier */ uint8_t *precedence_node; /* Pool-Node for Precedence */ diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 058de32609..d01252611e 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -261,7 +261,7 @@ int gsm_handle_pdu_session_modification_request( * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> @@ -280,7 +280,7 @@ int gsm_handle_pdu_session_modification_request( /* * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> * --> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> @@ -336,7 +336,7 @@ int gsm_handle_pdu_session_modification_request( * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> @@ -355,7 +355,7 @@ int gsm_handle_pdu_session_modification_request( /* * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> * --> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> diff --git a/src/smf/gx-handler.c b/src/smf/gx-handler.c index e40bab7316..65b5c9199f 100644 --- a/src/smf/gx-handler.c +++ b/src/smf/gx-handler.c @@ -1,5 +1,5 @@ /* Gx Interface, 3GPP TS 29.212 section 4 - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * * This file is part of Open5GS. @@ -162,8 +162,11 @@ uint32_t smf_gx_handle_cca_initial_request( &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); /* Set UE-to-CP Flow-Description and Outer-Header-Creation */ - up2cp_pdr->flow_description[up2cp_pdr->num_of_flow++] = + up2cp_pdr->flow[up2cp_pdr->num_of_flow].fd = 1; + up2cp_pdr->flow[up2cp_pdr->num_of_flow].description = (char *)"permit out 58 from ff02::2/128 to assigned"; + up2cp_pdr->num_of_flow++; + ogs_assert(OGS_OK == ogs_pfcp_ip_to_outer_header_creation( &ogs_gtp_self()->gtpu_ip, diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index 9e64d99e5a..b44a1ee6d1 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -1,5 +1,5 @@ /* Gx Interface, 3GPP TS 29.212 section 4 - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -1570,6 +1570,9 @@ static int decode_pcc_rule_definition( case OGS_DIAM_GX_AVP_CODE_PRECEDENCE: pcc_rule->precedence = hdr->avp_value->i32; break; + case OGS_DIAM_GX_AVP_CODE_RATING_GROUP: + pcc_rule->rating_group = hdr->avp_value->i32; + break; default: ogs_error("Not implemented(%d)", hdr->avp_code); break; diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index ff52427978..22441af2e1 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -197,10 +197,13 @@ static void update_authorized_pcc_rule_and_qos( else if (FlowInformation->flow_direction == OpenAPI_flow_direction_DOWNLINK) flow->direction = OGS_FLOW_DOWNLINK_ONLY; + else if (FlowInformation->flow_direction == + OpenAPI_flow_direction_BIDIRECTIONAL) + flow->direction = OGS_FLOW_BIDIRECTIONAL; else { - ogs_fatal("Unsupported direction [%d]", + ogs_error("Unsupported direction [%d]", FlowInformation->flow_direction); - ogs_assert_if_reached(); + continue; } flow->description = @@ -542,8 +545,11 @@ bool smf_npcf_smpolicycontrol_handle_create( sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : ""); /* Set UE-to-CP Flow-Description and Outer-Header-Creation */ - up2cp_pdr->flow_description[up2cp_pdr->num_of_flow++] = + up2cp_pdr->flow[up2cp_pdr->num_of_flow].fd = 1; + up2cp_pdr->flow[up2cp_pdr->num_of_flow].description = (char *)"permit out 58 from ff02::2/128 to assigned"; + up2cp_pdr->num_of_flow++; + ogs_assert(OGS_OK == ogs_pfcp_ip_to_outer_header_creation( &ogs_gtp_self()->gtpu_ip, diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 857c473d67..d194bf09a2 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1242,7 +1242,7 @@ void smf_s5c_handle_bearer_resource_command( * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> @@ -1260,7 +1260,7 @@ void smf_s5c_handle_bearer_resource_command( /* * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> * --> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> @@ -1311,7 +1311,7 @@ void smf_s5c_handle_bearer_resource_command( * Refer to lib/ipfw/ogs-ipfw.h * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> * --> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> @@ -1330,7 +1330,7 @@ void smf_s5c_handle_bearer_resource_command( /* * Issue #338 * - * <DOWNLINK> + * <DOWNLINK/BI-DIRECTIONAL> * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> * --> * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> diff --git a/tests/common/context.c b/tests/common/context.c index a4954e252d..8d797dfd4d 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -1671,6 +1671,107 @@ bson_t *test_db_new_qos_flow(test_ue_t *test_ue) return doc; } +bson_t *test_db_new_qos_flow_bi_directional(test_ue_t *test_ue) +{ + bson_t *doc = NULL; + + ogs_assert(test_ue); + + doc = BCON_NEW( + "imsi", BCON_UTF8(test_ue->imsi), + "msisdn", "[", + BCON_UTF8(TEST_MSISDN), + BCON_UTF8(TEST_ADDITIONAL_MSISDN), + "]", + "ambr", "{", + "downlink", "{", + "value", BCON_INT32(1), + "unit", BCON_INT32(3), + "}", + "uplink", "{", + "value", BCON_INT32(1), + "unit", BCON_INT32(3), + "}", + "}", + "slice", "[", "{", + "sst", BCON_INT32(1), + "default_indicator", BCON_BOOL(true), + "session", "[", "{", + "name", BCON_UTF8("internet"), + "type", BCON_INT32(3), + "ambr", "{", + "downlink", "{", + "value", BCON_INT32(1), + "unit", BCON_INT32(3), + "}", + "uplink", "{", + "value", BCON_INT32(1), + "unit", BCON_INT32(3), + "}", + "}", + "qos", "{", + "index", BCON_INT32(9), + "arp", "{", + "priority_level", BCON_INT32(8), + "pre_emption_vulnerability", BCON_INT32(1), + "pre_emption_capability", BCON_INT32(1), + "}", + "}", + "pcc_rule", "[", "{", + "qos", "{", + "index", BCON_INT32(1), + "arp", "{", + "priority_level", BCON_INT32(2), + "pre_emption_vulnerability", BCON_INT32(2), + "pre_emption_capability", BCON_INT32(2), + "}", + "mbr", "{", + "downlink", "{", + "value", BCON_INT32(64), + "unit", BCON_INT32(1), + "}", + "uplink", "{", + "value", BCON_INT32(44), + "unit", BCON_INT32(1), + "}", + "}", + "gbr", "{", + "downlink", "{", + "value", BCON_INT32(64), + "unit", BCON_INT32(1), + "}", + "uplink", "{", + "value", BCON_INT32(44), + "unit", BCON_INT32(1), + "}", + "}", + "}", + "flow", "[", + "{", "direction", BCON_INT32(3), + "description", BCON_UTF8("permit out icmp from any to assigned"), "}", + "{", "direction", BCON_INT32(3), + "description", BCON_UTF8("permit out udp from 10.200.136.98/32 23455 to assigned 1-65535"), "}", + "]", + "}", "]", + "}", "]", + "}", "]", + "security", "{", + "k", BCON_UTF8(test_ue->k_string), + "opc", BCON_UTF8(test_ue->opc_string), + "amf", BCON_UTF8("8000"), + "sqn", BCON_INT64(64), + "}", + "subscribed_rau_tau_timer", BCON_INT32(12), + "network_access_mode", BCON_INT32(0), + "subscriber_status", BCON_INT32(0), + "operator_determined_barring", BCON_INT32(0), + "access_restriction_data", BCON_INT32(32) + ); + ogs_assert(doc); + + return doc; +} + bson_t *test_db_new_session(test_ue_t *test_ue) { bson_t *doc = NULL; diff --git a/tests/common/context.h b/tests/common/context.h index d92466d078..fd957e08ed 100644 --- a/tests/common/context.h +++ b/tests/common/context.h @@ -530,6 +530,7 @@ int test_db_remove_ue(test_ue_t *test_ue); bson_t *test_db_new_simple(test_ue_t *test_ue); bson_t *test_db_new_qos_flow(test_ue_t *test_ue); +bson_t *test_db_new_qos_flow_bi_directional(test_ue_t *test_ue); bson_t *test_db_new_session(test_ue_t *test_ue); bson_t *test_db_new_ims(test_ue_t *test_ue); bson_t *test_db_new_slice_with_same_dnn(test_ue_t *test_ue); diff --git a/tests/volte/bearer-test.c b/tests/volte/bearer-test.c index 63c5dfff7c..8cbbdc6889 100644 --- a/tests/volte/bearer-test.c +++ b/tests/volte/bearer-test.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -19,7 +19,7 @@ #include "test-common.h" -static void test1_func(abts_case *tc, void *data) +static void uni_directional_func(abts_case *tc, void *data) { int rv; ogs_socknode_t *s1ap; @@ -262,11 +262,255 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void bi_directional_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "1032548691"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_qos_flow_bi_directional(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.pco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive E-RABSetupRequest + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + abts_suite *test_bearer(abts_suite *suite) { suite = ADD_SUITE(suite) - abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, uni_directional_func, NULL); + abts_run_test(suite, bi_directional_func, NULL); return suite; } diff --git a/tests/vonr/qos-flow-test.c b/tests/vonr/qos-flow-test.c index f003c0e953..087c28703c 100644 --- a/tests/vonr/qos-flow-test.c +++ b/tests/vonr/qos-flow-test.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -19,7 +19,7 @@ #include "test-common.h" -static void test1_func(abts_case *tc, void *data) +static void uni_directional_func(abts_case *tc, void *data) { int rv; ogs_socknode_t *ngap; @@ -411,11 +411,398 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void bi_directional_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_qos_flow_bi_directional(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Registration request */ + test_ue->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 1; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive PDUSessionResourceModifyRequest + + * DL NAS transport + + * PDU session modification command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceModify, + test_ue->ngap_procedure_code); + + /* Send PDU session resource modify response */ + qos_flow = test_qos_flow_find_by_qfi(sess, 2); + ogs_assert(qos_flow); + + sendbuf = testngap_build_qos_flow_resource_modify_response(qos_flow); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDU session resource modify complete */ + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_MODIFICATION_REQUEST; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_modification_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Waiting for creating dedicated QoS flow in PFCP protocol */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* + * Send InitialUEMessage + + * Service request + * - Uplink Data Status + */ + test_ue->service_request_param.uplink_data_status = 1; + test_ue->service_request_param.psimask.uplink_data_status = 1 << sess->psi; + test_ue->service_request_param.pdu_session_status = 0; + nasbuf = testgmm_build_service_request( + test_ue, OGS_NAS_SERVICE_TYPE_DATA, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + test_ue->service_request_param.uplink_data_status = 0; + test_ue->service_request_param.pdu_session_status = 0; + gmmbuf = testgmm_build_service_request( + test_ue, OGS_NAS_SERVICE_TYPE_DATA, nasbuf, true, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, true, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Service accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + ABTS_INT_EQUAL(tc, 0x0000, test_ue->pdu_session_status); + ABTS_INT_EQUAL(tc, 0x0000, test_ue->pdu_session_reactivation_result); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait to setup N3 data connection. + * Otherwise, network-triggered service request is initiated */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue, 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + abts_suite *test_qos_flow(abts_suite *suite) { suite = ADD_SUITE(suite) - abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, uni_directional_func, NULL); + abts_run_test(suite, bi_directional_func, NULL); return suite; } From 9a515e9b1db1a246ef5fd49c91e26410eb437dd7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 23 Feb 2024 19:55:58 +0000 Subject: [PATCH 028/323] [GTP-U] Fixed a stack overflow bug (#3003) --- lib/gtp/util.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/gtp/util.c b/lib/gtp/util.c index 3ec27d577f..1e59239d2a 100644 --- a/lib/gtp/util.c +++ b/lib/gtp/util.c @@ -65,7 +65,8 @@ int ogs_gtpu_parse_header( * then the value of the Next Extension Header Type shall be 0. */ i = 0; - while (*(ext_h = (((uint8_t *)gtp_h) + len - 1))) { + while (*(ext_h = (((uint8_t *)gtp_h) + len - 1)) && + i < OGS_GTP2_NUM_OF_EXTENSION_HEADER) { /* * The length of the Extension header shall be defined * in a variable length of 4 octets, i.e. m+1 = n*4 octets, @@ -125,6 +126,11 @@ int ogs_gtpu_parse_header( i++; } + if (i >= OGS_GTP2_NUM_OF_EXTENSION_HEADER) { + ogs_error("The number of extension headers is limited to [%d]", i); + return -1; + } + } else if (gtp_h->flags & (OGS_GTPU_FLAGS_S|OGS_GTPU_FLAGS_PN)) { /* * If and only if one or more of these three flags are set, From 0dd2ad6557e28d6c47bbf578243db1733790eff9 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 27 Feb 2024 21:16:50 +0900 Subject: [PATCH 029/323] [MME] Added log messages to find memory problem --- lib/sctp/ogs-sctp.c | 12 ++---- src/mme/emm-handler.c | 8 ++-- src/mme/emm-sm.c | 2 +- src/mme/esm-handler.c | 6 +-- src/mme/esm-sm.c | 2 +- src/mme/mme-context.c | 6 +-- src/mme/mme-context.h | 77 +++++++++++++++++---------------------- src/mme/mme-gtp-path.c | 2 + src/mme/mme-s11-build.c | 5 +++ src/mme/mme-s11-handler.c | 13 +++++-- src/mme/mme-sm.c | 2 +- src/mme/s1ap-handler.c | 14 ++++--- 12 files changed, 74 insertions(+), 75 deletions(-) diff --git a/lib/sctp/ogs-sctp.c b/lib/sctp/ogs-sctp.c index 4cd46989de..c91d144d8a 100644 --- a/lib/sctp/ogs-sctp.c +++ b/lib/sctp/ogs-sctp.c @@ -43,14 +43,10 @@ int ogs_sctp_recvdata(ogs_sock_t *sock, void *msg, size_t len, } else if (flags & MSG_EOR) { break; } else { - if (ogs_socket_errno != OGS_EAGAIN) { - ogs_fatal("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", - size, errno, strerror(errno), flags); - ogs_assert_if_reached(); - } else { - ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", - size, errno, strerror(errno), flags); - } + ogs_fatal("ogs_sctp_recvmsg(%d) failed(%d:%s-0x%x)", + size, errno, strerror(errno), flags); + ogs_fatal("Probably MME might be crashed"); + ogs_assert_if_reached(); } } while(1); diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 82059c8146..7fbaecb906 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -54,9 +54,9 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; - MME_UE_LIST_CHECK; - ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + enb_ue = enb_ue_cycle(mme_ue->enb_ue); ogs_assert(enb_ue); @@ -270,9 +270,9 @@ int emm_handle_attach_complete( struct tm gmt, local; ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); - MME_UE_LIST_CHECK; ogs_gettimeofday(&tv); ogs_gmtime(tv.tv_sec, &gmt); @@ -823,7 +823,7 @@ int emm_handle_security_mode_complete(mme_ue_t *mme_ue, ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv; ogs_assert(mme_ue); - MME_UE_LIST_CHECK; + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (security_mode_complete->presencemask & OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) { diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 29e737e945..55d51ce9ba 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -933,6 +933,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) mme_ue = e->mme_ue; ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -954,7 +955,6 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) authentication_response_parameter; ogs_debug("Authentication response"); - MME_UE_LIST_CHECK; ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd); CLEAR_MME_UE_TIMER(mme_ue->t3460); diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index e8b34f26ef..0f5bf377f6 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -36,13 +36,12 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, mme_sess_t *sess = NULL; uint8_t security_protected_required = 0; - MME_UE_LIST_CHECK; - ogs_assert(bearer); sess = bearer->sess; ogs_assert(sess); mme_ue = sess->mme_ue; ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(req); @@ -182,11 +181,10 @@ int esm_handle_information_response(mme_sess_t *sess, ogs_assert(sess); mme_ue = sess->mme_ue; ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(rsp); - MME_UE_LIST_CHECK; - if (rsp->presencemask & OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT) { sess->session = mme_session_find_by_apn( diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 3312159c74..75353d5942 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -89,6 +89,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_assert(sess); mme_ue = sess->mme_ue; ogs_assert(mme_ue); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -183,7 +184,6 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: ogs_debug("Activate default EPS bearer context accept"); - MME_UE_LIST_CHECK; ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); /* Check if Initial Context Setup Response or diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 7e059d913e..b612997ad3 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -4394,7 +4394,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", sess->mme_ue); } - MME_UE_LIST_CHECK; + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); } if (!sess) { @@ -4408,7 +4408,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( ogs_debug("[%s:%p]", sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", sess->mme_ue); - MME_UE_LIST_CHECK; + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); } else { sess->pti = pti; ogs_debug("[%s:%p]", mme_ue->imsi_bcd, mme_ue); @@ -4418,7 +4418,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( ogs_debug("[%s:%p]", sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", sess->mme_ue); - MME_UE_LIST_CHECK; + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); } } else { diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 11606364d9..dcfb8f1ae4 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -148,52 +148,43 @@ typedef struct mme_context_s { #define MME_UE_CHECK(level, __mME) \ do { \ - ogs_log_message(level, 0, "IMSI [%s] NAS-EPS Type[%d]", \ - (__mME) ? (__mME)->imsi_bcd : "No MME_UE", \ - (__mME) ? (__mME)->nas_eps.type : 0); \ - ogs_log_message(level, 0, "mme_ue[%p:%p]", \ + sgw_ue_t *__sGW = (((mme_ue_t *)__mME)->sgw_ue); \ + mme_sess_t *__sESS = NULL; \ + mme_bearer_t *__bEARER = NULL; \ + \ + ogs_log_message(level, 0, "MME-UE Context Memory[%p:%p]", \ (__mME), mme_ue_cycle((__mME))); \ - } while(0) - -#define MME_UE_LIST_CHECK \ - if (ogs_log_get_domain_level(OGS_LOG_DOMAIN) >= OGS_LOG_TRACE) { \ - mme_ue_t *mme_ue = NULL; \ - sgw_ue_t *sgw_ue = NULL; \ - enb_ue_t *enb_ue = NULL; \ - mme_sess_t *sess = NULL; \ - mme_bearer_t *bearer = NULL; \ - ogs_list_for_each(&mme_self()->mme_ue_list, mme_ue) { \ - ogs_trace("MME_UE(%p:%p) [%s] MME_S11_TEID[%d]", \ - mme_ue, mme_ue_cycle(mme_ue), \ - mme_ue->imsi_bcd, mme_ue->mme_s11_teid); \ - if (mme_ue->sgw_ue) { \ - sgw_ue = mme_ue->sgw_ue; \ - ogs_trace("SGW_UE(%p) MME_UE(%p) SGW_S11_TEID[%d]", \ - sgw_ue, mme_ue, sgw_ue->sgw_s11_teid); \ - } \ - if (mme_ue->enb_ue) { \ - enb_ue = mme_ue->enb_ue; \ - ogs_trace("ENB_UE(%p) MME_UE(%p) " \ - "[ENB_UE_S1AP_ID:%d MME_UE_S1AP_ID:%d]", \ - enb_ue, enb_ue->mme_ue, \ - enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); \ - } \ - ogs_list_for_each(&mme_ue->sess_list, sess) { \ - ogs_trace("SESS(%p) [%s:%d]", sess, \ - sess->session ? sess->session->name : "Unknown", \ - sess->pti); \ - ogs_assert(sess->mme_ue == mme_ue); \ - ogs_list_for_each(&sess->bearer_list, bearer) { \ - ogs_trace("BEARER(%p) [%d] " \ - "ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]", \ - bearer, bearer->ebi, \ - bearer->enb_s1u_teid, bearer->sgw_s1u_teid); \ - ogs_assert(bearer->sess == sess); \ - ogs_assert(bearer->mme_ue == mme_ue); \ - } \ + ogs_log_message(level, 0, "SGW-UE Context Memory[%p:%p]", \ + (__sGW), sgw_ue_cycle((__sGW))); \ + ogs_log_message(level, 0, \ + "IMSI [%s] NAS-EPS Type[%d]", \ + (__mME) ? ((mme_ue_t *)__mME)->imsi_bcd : "No MME_UE", \ + (__mME) ? ((mme_ue_t *)__mME)->nas_eps.type : 0); \ + ogs_log_message(level, 0, \ + "MME_S11_TEID[%d] SGW_S11_TEID[%d]", \ + (__mME) ? ((mme_ue_t *)__mME)->mme_s11_teid : 0, \ + (__sGW) ? (__sGW)->sgw_s11_teid : 0); \ + if (!mme_ue_cycle(__mME)) { \ + ogs_log_message(level, 0, \ + "MME-UE Context has already been removed"); \ + break; \ + } \ + ogs_list_for_each(&((mme_ue_t *)__mME)->sess_list, (__sESS)) { \ + ogs_log_message(level, 0, "SESS(%p) [%s:%d]", (__sESS), \ + (__sESS)->session ? (__sESS)->session->name : "Unknown", \ + (__sESS)->pti); \ + ogs_list_for_each(&(__sESS)->bearer_list, (__bEARER)) { \ + ogs_log_message(level, 0, \ + "BEARER(%p) [%d] ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]", \ + (__bEARER), (__bEARER)->ebi, \ + (__bEARER)->enb_s1u_teid, (__bEARER)->sgw_s1u_teid); \ + ogs_assert((__bEARER)->sess == (__sESS)); \ + ogs_assert((__bEARER)->mme_ue == (__mME)); \ } \ + ogs_assert((__sESS)->mme_ue == (__mME)); \ } \ - } + } while(0) + ogs_list_t mme_ue_list; ogs_hash_t *enb_addr_hash; /* hash table for ENB Address */ diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 9a9b0b0a4a..7d9e8f3f35 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -347,6 +347,7 @@ int mme_gtp_send_delete_session_request( } xact->delete_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + ogs_debug("delete_session_request - xact:%p, sess:%p", xact, sess); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -364,6 +365,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) ogs_assert(sgw_ue); ogs_assert(action); + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_for_each_safe(&mme_ue->sess_list, next_sess, sess) { if (MME_HAVE_SGW_S1U_PATH(sess)) { mme_gtp_send_delete_session_request(sgw_ue, sess, action); diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index 731eaa1e74..2101130ad9 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -479,14 +479,19 @@ ogs_pkbuf_t *mme_s11_build_delete_session_request( mme_bearer_t *bearer = NULL; mme_ue_t *mme_ue = NULL; + sgw_ue_t *sgw_ue = NULL; ogs_assert(sess); mme_ue = sess->mme_ue; ogs_assert(mme_ue); + sgw_ue = mme_ue->sgw_ue; + ogs_assert(sgw_ue); bearer = mme_default_bearer_in_sess(sess); ogs_assert(bearer); ogs_debug("Delete Session Request"); + ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", + mme_ue->mme_s11_teid, sgw_ue->sgw_s11_teid); memset(&gtp_message, 0, sizeof(ogs_gtp2_message_t)); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 7e50f2df55..04b448da0d 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -103,7 +103,6 @@ void mme_s11_handle_create_session_response( ogs_assert(rsp); ogs_debug("Create Session Response"); - MME_UE_LIST_CHECK; /******************** * Check Transaction @@ -112,6 +111,8 @@ void mme_s11_handle_create_session_response( create_action = xact->create_action; sess = xact->data; ogs_assert(sess); + + MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); mme_ue = mme_ue_cycle(sess->mme_ue); rv = ogs_gtp_xact_commit(xact); @@ -480,13 +481,14 @@ void mme_s11_handle_modify_bearer_response( ogs_assert(rsp); ogs_debug("Modify Bearer Response"); - MME_UE_LIST_CHECK; /******************** * Check Transaction ********************/ ogs_assert(xact); modify_action = xact->modify_action; + + MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); mme_ue = mme_ue_cycle(xact->data); rv = ogs_gtp_xact_commit(xact); @@ -592,7 +594,6 @@ void mme_s11_handle_delete_session_response( ogs_assert(rsp); ogs_debug("Delete Session Response"); - MME_UE_LIST_CHECK; /******************** * Check Transaction @@ -602,6 +603,9 @@ void mme_s11_handle_delete_session_response( ogs_assert(action); sess = xact->data; ogs_assert(sess); + + ogs_debug("delete_session_response - xact:%p, sess:%p", xact, sess); + MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); mme_ue = mme_ue_cycle(sess->mme_ue); rv = ogs_gtp_xact_commit(xact); @@ -1244,7 +1248,6 @@ void mme_s11_handle_release_access_bearers_response( ogs_assert(rsp); ogs_debug("Release Access Bearers Response"); - MME_UE_LIST_CHECK; /******************** * Check Transaction @@ -1252,6 +1255,8 @@ void mme_s11_handle_release_access_bearers_response( ogs_assert(xact); action = xact->release_action; ogs_assert(action); + + MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); mme_ue = mme_ue_cycle(xact->data); rv = ogs_gtp_xact_commit(xact); diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index b01d911744..dc5b101b3f 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -255,7 +255,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) mme_ue = mme_ue_find_by_message(&nas_message); if (!mme_ue) { mme_ue = mme_ue_add(enb_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (mme_ue == NULL) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_misc, @@ -267,6 +266,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) return; } + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(ECM_IDLE(mme_ue)); } else { /* Here, if the MME_UE Context is found, diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index c5cc7ef085..8f21475638 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -404,7 +404,6 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) ogs_assert(InitialUEMessage); ogs_info("InitialUEMessage"); - MME_UE_LIST_CHECK; for (i = 0; i < InitialUEMessage->protocolIEs.list.count; i++) { ie = InitialUEMessage->protocolIEs.list.array[i]; @@ -486,6 +485,7 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) ogs_info("Unknown UE by S_TMSI[G:%d,C:%d,M_TMSI:0x%x]", nas_guti.mme_gid, nas_guti.mme_code, nas_guti.m_tmsi); } else { + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" S_TMSI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]", mme_ue->current.guti.mme_gid, mme_ue->current.guti.mme_code, @@ -524,13 +524,15 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) } else { ogs_error("Known UE ENB_UE_S1AP_ID[%d] [%p:%p]", (int)*ENB_UE_S1AP_ID, enb_ue, enb_ue->mme_ue); - if (enb_ue->mme_ue) + if (enb_ue->mme_ue) { + MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); ogs_error(" S_TMSI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]", enb_ue->mme_ue->current.guti.mme_gid, enb_ue->mme_ue->current.guti.mme_code, enb_ue->mme_ue->current.guti.m_tmsi, MME_UE_HAVE_IMSI(enb_ue->mme_ue) ? enb_ue->mme_ue->imsi_bcd : "Unknown"); + } } if (!NAS_PDU) { @@ -625,7 +627,6 @@ void s1ap_handle_uplink_nas_transport( ogs_assert(UplinkNASTransport); ogs_debug("UplinkNASTransport"); - MME_UE_LIST_CHECK; for (i = 0; i < UplinkNASTransport->protocolIEs.list.count; i++) { ie = UplinkNASTransport->protocolIEs.list.array[i]; @@ -768,6 +769,7 @@ void s1ap_handle_uplink_nas_transport( if (enb_ue->mme_ue) { mme_ue_t *mme_ue = enb_ue->mme_ue; + MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); memcpy(&mme_ue->tai, &enb_ue->saved.tai, sizeof(ogs_eps_tai_t)); memcpy(&mme_ue->e_cgi, &enb_ue->saved.e_cgi, sizeof(ogs_e_cgi_t)); mme_ue->ue_location_timestamp = ogs_time_now(); @@ -808,7 +810,6 @@ void s1ap_handle_ue_capability_info_indication( ogs_assert(UECapabilityInfoIndication); ogs_debug("UECapabilityInfoIndication"); - MME_UE_LIST_CHECK; for (i = 0; i < UECapabilityInfoIndication->protocolIEs.list.count; i++) { ie = UECapabilityInfoIndication->protocolIEs.list.array[i]; @@ -874,6 +875,7 @@ void s1ap_handle_ue_capability_info_indication( if (enb_ue->mme_ue) { ogs_assert(UERadioCapability); + MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); OGS_ASN_STORE_DATA(&enb_ue->mme_ue->ueRadioCapability, UERadioCapability); } @@ -907,7 +909,6 @@ void s1ap_handle_initial_context_setup_response( ogs_assert(InitialContextSetupResponse); ogs_debug("InitialContextSetupResponse"); - MME_UE_LIST_CHECK; for (i = 0; i < InitialContextSetupResponse->protocolIEs.list.count; i++) { ie = InitialContextSetupResponse->protocolIEs.list.array[i]; @@ -978,6 +979,7 @@ void s1ap_handle_initial_context_setup_response( return; } + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (E_RABSetupListCtxtSURes) { int uli_presence = 0; @@ -2062,7 +2064,6 @@ void s1ap_handle_e_rab_modification_indication( ogs_assert(E_RABModificationIndication); ogs_info("E_RABModificationIndication"); - MME_UE_LIST_CHECK; for (i = 0; i < E_RABModificationIndication->protocolIEs.list.count; i++) { ie = E_RABModificationIndication->protocolIEs.list.array[i]; @@ -2142,6 +2143,7 @@ void s1ap_handle_e_rab_modification_indication( return; } + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_init(&mme_ue->bearer_to_modify_list); for (i = 0; i < E_RABToBeModifiedListBearerModInd->list.count; i++) { From 4aaac999f7bc337bcaed2789ccc6269c256564d2 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Feb 2024 15:49:54 +0100 Subject: [PATCH 030/323] [SMF] Handle APCO IE in S2b GTPv2C CreateSessionRequest/Response This IE is used by UEs registering through S2b interface (ePDG) to obtain DNS and P-CSCF server address information. --- src/smf/context.h | 1 + src/smf/s5c-build.c | 13 +++++++++++++ src/smf/s5c-handler.c | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/src/smf/context.h b/src/smf/context.h index a9f2b73118..64d7dc2c76 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -333,6 +333,7 @@ typedef struct smf_sess_s { struct { uint8_t version; /* GTPC version */ ogs_tlv_octet_t ue_pco; + ogs_tlv_octet_t ue_apco; ogs_tlv_octet_t ue_epco; ogs_tlv_octet_t user_location_information; ogs_tlv_octet_t ue_timezone; diff --git a/src/smf/s5c-build.c b/src/smf/s5c-build.c index 5db78cb3d1..84ce971261 100644 --- a/src/smf/s5c-build.c +++ b/src/smf/s5c-build.c @@ -47,6 +47,8 @@ ogs_pkbuf_t *smf_s5c_build_create_session_response( int len; uint8_t pco_buf[OGS_MAX_PCO_LEN]; int16_t pco_len; + uint8_t apco_buf[OGS_MAX_PCO_LEN]; + int16_t apco_len; uint8_t *epco_buf = NULL; int16_t epco_len; @@ -145,6 +147,17 @@ ogs_pkbuf_t *smf_s5c_build_create_session_response( rsp->protocol_configuration_options.len = pco_len; } + /* APCO */ + if (sess->gtp.ue_apco.presence && + sess->gtp.ue_apco.len && sess->gtp.ue_apco.data) { + apco_len = smf_pco_build( + apco_buf, sess->gtp.ue_apco.data, sess->gtp.ue_apco.len); + ogs_assert(apco_len > 0); + rsp->additional_protocol_configuration_options.presence = 1; + rsp->additional_protocol_configuration_options.data = apco_buf; + rsp->additional_protocol_configuration_options.len = apco_len; + } + /* ePCO */ if (sess->gtp.ue_epco.presence && sess->gtp.ue_epco.len && sess->gtp.ue_epco.data) { diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index d194bf09a2..da65704e70 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -378,6 +378,12 @@ uint8_t smf_s5c_handle_create_session_request( &req->protocol_configuration_options); } + /* APCO */ + if (req->additional_protocol_configuration_options.presence) { + OGS_TLV_STORE_DATA(&sess->gtp.ue_apco, + &req->additional_protocol_configuration_options); + } + /* Set User Location Information */ if (req->user_location_information.presence) { OGS_TLV_STORE_DATA(&sess->gtp.user_location_information, @@ -452,6 +458,8 @@ uint8_t smf_s5c_handle_delete_session_request( OGS_TLV_CLEAR_DATA(&sess->gtp.ue_pco); } + /* APCO not present in Session deletion procedure, hence no need to clear it here. */ + if (req->extended_protocol_configuration_options.presence) { OGS_TLV_STORE_DATA(&sess->gtp.ue_epco, &req->extended_protocol_configuration_options); From 32de75b1a50ffbd324b60f93103dbe2853a45bc5 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Feb 2024 12:21:59 +0100 Subject: [PATCH 031/323] [SMF] Setup Gy session when creating UE session over S2b interface So far the Gy session creation triggered by S2b interface (ePDG) was not implemented. Fix it. --- lib/diameter/s6b/message.h | 5 +++-- src/smf/context.h | 2 ++ src/smf/gsm-sm.c | 26 ++++++++++++++++++++++++- src/smf/s6b-path.c | 40 +++++++++++++++++++++++++++----------- src/smf/smf-sm.c | 1 + 5 files changed, 60 insertions(+), 14 deletions(-) diff --git a/lib/diameter/s6b/message.h b/lib/diameter/s6b/message.h index 25e19e26df..1431951096 100644 --- a/lib/diameter/s6b/message.h +++ b/lib/diameter/s6b/message.h @@ -1,4 +1,4 @@ -/* +/* 3GPP TS 29.273 section 9 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. @@ -35,7 +35,8 @@ extern struct dict_object *ogs_diam_s6b_application; extern struct dict_object *ogs_diam_s6b_mip6_feature_vector; typedef struct ogs_diam_s6b_message_s { -#define OGS_DIAM_S6B_CMD_SESSION_TERMINATION 1 +#define OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION 1 +#define OGS_DIAM_S6B_CMD_SESSION_TERMINATION 2 uint16_t cmd_code; uint32_t result_code; uint32_t *err; diff --git a/src/smf/context.h b/src/smf/context.h index 64d7dc2c76..06b9535fd0 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -228,6 +228,8 @@ typedef struct smf_sess_s { uint32_t gx_cca_init_err; /* Gx CCA RXed error code */ bool gy_ccr_init_in_flight; /* Waiting for Gy CCA */ uint32_t gy_cca_init_err; /* Gy CCA RXed error code */ + bool s6b_aar_in_flight; /* Waiting for S6B AAR */ + uint32_t s6b_aaa_err; /* S6B AAA RXed error code */ bool gx_ccr_term_in_flight; /* Waiting for Gx CCA */ uint32_t gx_cca_term_err; /* Gx CCA RXed error code */ bool gy_ccr_term_in_flight; /* Waiting for Gy CCA */ diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index be10244b94..3b938a65be 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -182,8 +182,10 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) switch (e->h.id) { case OGS_FSM_ENTRY_SIG: /* reset state: */ + sess->sm_data.s6b_aar_in_flight = false; sess->sm_data.gx_ccr_init_in_flight = false; sess->sm_data.gy_ccr_init_in_flight = false; + sess->sm_data.s6b_aaa_err = ER_DIAMETER_SUCCESS; sess->sm_data.gx_cca_init_err = ER_DIAMETER_SUCCESS; sess->sm_data.gy_cca_init_err = ER_DIAMETER_SUCCESS; break; @@ -229,7 +231,9 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) break; case OGS_GTP2_RAT_TYPE_WLAN: smf_s6b_send_aar(sess, e->gtp_xact); + sess->sm_data.s6b_aar_in_flight = true; OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); + /* Gx/Gy Init Req is done after s6b AAR + AAA */ break; default: ogs_error("Unknown RAT Type [%d]", sess->gtp_rat_type); @@ -327,6 +331,7 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) { smf_sess_t *sess = NULL; + ogs_diam_s6b_message_t *s6b_message = NULL; ogs_diam_gy_message_t *gy_message = NULL; ogs_diam_gx_message_t *gx_message = NULL; uint32_t diam_err; @@ -340,6 +345,22 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) ogs_assert(sess); switch (e->h.id) { + case SMF_EVT_S6B_MESSAGE: + s6b_message = e->s6b_message; + ogs_assert(s6b_message); + + switch(s6b_message->cmd_code) { + case OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION: + sess->sm_data.s6b_aar_in_flight = false; + sess->sm_data.s6b_aaa_err = s6b_message->result_code; + if (s6b_message->result_code == ER_DIAMETER_SUCCESS) { + send_ccr_init_req_gx_gy(sess, e); + return; + } + goto test_can_proceed; + } + break; + case SMF_EVT_GX_MESSAGE: gx_message = e->gx_message; ogs_assert(gx_message); @@ -382,9 +403,12 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) test_can_proceed: /* First wait for both Gx and Gy requests to be done: */ - if (!sess->sm_data.gx_ccr_init_in_flight && + if (!sess->sm_data.s6b_aar_in_flight && + !sess->sm_data.gx_ccr_init_in_flight && !sess->sm_data.gy_ccr_init_in_flight) { diam_err = ER_DIAMETER_SUCCESS; + if (sess->sm_data.s6b_aaa_err != ER_DIAMETER_SUCCESS) + diam_err = sess->sm_data.s6b_aaa_err; if (sess->sm_data.gx_cca_init_err != ER_DIAMETER_SUCCESS) diam_err = sess->sm_data.gx_cca_init_err; if (sess->sm_data.gy_cca_init_err != ER_DIAMETER_SUCCESS) diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index 0dff339010..09f080cd09 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -1,4 +1,4 @@ -/* +/* 3GPP TS 29.273 section 9 * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. @@ -344,11 +344,11 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) unsigned long dur; int error = 0; int new; - int result_code = 0; - int exp_result_code = 0; smf_sess_t *sess = NULL; ogs_gtp_xact_t *xact = NULL; + smf_event_t *e = NULL; + ogs_diam_s6b_message_t *s6b_message = NULL; ogs_debug("[AA-Answer]"); @@ -374,15 +374,20 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) xact = sess_data->xact; ogs_assert(xact); + s6b_message = ogs_calloc(1, sizeof(ogs_diam_s6b_message_t)); + ogs_assert(s6b_message); + /* Set Session Termination Command */ + s6b_message->cmd_code = OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION; + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); if (avp) { ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); - result_code = hdr->avp_value->i32; - if (result_code != ER_DIAMETER_SUCCESS) { - ogs_error("Result Code: %d", result_code); + s6b_message->result_code = hdr->avp_value->i32; + if (s6b_message->result_code != ER_DIAMETER_SUCCESS) { + ogs_error("Result Code: %d", s6b_message->result_code); error++; } } else { @@ -397,8 +402,8 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) if (avpch1) { ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); - exp_result_code = hdr->avp_value->i32; - ogs_error("Experimental Result Code: %d", exp_result_code); + s6b_message->result_code = hdr->avp_value->i32; + ogs_error("Experimental Result Code: %d", s6b_message->result_code); } } else { ogs_error("no Result-Code"); @@ -431,9 +436,22 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) error++; } - if (!error) { - smf_gx_send_ccr(sess, xact, - OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST); + e = smf_event_new(SMF_EVT_S6B_MESSAGE); + ogs_assert(e); + + if (error && s6b_message->result_code == ER_DIAMETER_SUCCESS) + s6b_message->result_code = error; + + e->sess = sess; + e->gtp_xact = xact; + e->s6b_message = s6b_message; + ret = ogs_queue_push(ogs_app()->queue, e); + if (ret != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)ret); + ogs_free(s6b_message); + ogs_event_free(e); + } else { + ogs_pollset_notify(ogs_app()->pollset); } /* Free the message */ diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index c0369fbea4..7c841dda00 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -365,6 +365,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(sess); switch(s6b_message->cmd_code) { + case OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION: case OGS_DIAM_S6B_CMD_SESSION_TERMINATION: ogs_fsm_dispatch(&sess->sm, e); break; From 4d7f2fb6619902ca822cbb64c1f721a58b6f4fb9 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 28 Feb 2024 20:51:20 +0900 Subject: [PATCH 032/323] [SMF] Memory leak in Handling APCO IE (#3010) --- src/smf/context.c | 1 + tests/non3gpp/s2b-handler.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/smf/context.c b/src/smf/context.c index 69f59f3b19..a61679626d 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1682,6 +1682,7 @@ void smf_sess_remove(smf_sess_t *sess) ogs_fsm_fini(&sess->sm, &e); OGS_TLV_CLEAR_DATA(&sess->gtp.ue_pco); + OGS_TLV_CLEAR_DATA(&sess->gtp.ue_apco); OGS_TLV_CLEAR_DATA(&sess->gtp.ue_epco); OGS_TLV_CLEAR_DATA(&sess->gtp.user_location_information); OGS_TLV_CLEAR_DATA(&sess->gtp.ue_timezone); diff --git a/tests/non3gpp/s2b-handler.c b/tests/non3gpp/s2b-handler.c index 92c00f5b23..0c91e3851e 100644 --- a/tests/non3gpp/s2b-handler.c +++ b/tests/non3gpp/s2b-handler.c @@ -45,6 +45,8 @@ void test_s2b_handle_create_session_response( cause_value = cause->value; if (cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { + } else if (cause_value == + OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE) { } else { ogs_error("GTP Failed [CAUSE:%d]", cause_value); return; From 24b9150c15d86a497da1f4ce20dee8adf593d396 Mon Sep 17 00:00:00 2001 From: Matej Gradisar <gradisar@iskratel.si> Date: Wed, 28 Feb 2024 12:24:53 +0100 Subject: [PATCH 033/323] [SMF] Check config file for overlapping UE subnets for subnets with no DNN --- lib/pfcp/context.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 401204ecea..352e04df27 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -154,7 +154,9 @@ static int ogs_pfcp_check_subnet_overlapping(void) ogs_list_for_each(&self.subnet_list, subnet){ for (next_subnet = ogs_list_next(subnet); (next_subnet); next_subnet = ogs_list_next(next_subnet)) { - if (strcmp(subnet->dnn, next_subnet->dnn) == 0 && + if ((strlen(subnet->dnn) == 0 || + strlen(next_subnet->dnn) == 0 || + (strcmp(subnet->dnn, next_subnet->dnn)) == 0) && subnet->gw.family == next_subnet->gw.family) { uint32_t *addr1 = subnet->sub.sub; uint32_t *addr2 = next_subnet->sub.sub; From 2ceca491615c96c7c935dce9ae22c371bb8c1a85 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 29 Feb 2024 23:00:06 +0900 Subject: [PATCH 034/323] [MME/AMF] Fixed crash following Handover Request (#3014) 1. HandoverRequired 2. HandoverRequest 3. HandoverFailure 4. UEContextReleaseCommand 5. HandoverPreparationFailure If UEContextReleaseComplete is not received, the Source-UE will have the Target-UE. 6. HandoverRequired There may be cases where the Source UE has a Target UE from a previous HandoverRequired process. In this case, it is recommended to force the deletion of the Target UE information when receiving a new HandoverRequired. 7. HandoverRequest 8. HandoverFailure 9. UEContextReleaseCommand 10. UEContextReleaseComplete 11. HandoverPreparationFailure ... Crashed ... --- lib/ngap/build.c | 12 +- lib/ngap/build.h | 4 +- src/amf/amf-sm.c | 4 +- src/amf/context.c | 9 +- src/amf/context.h | 18 ++- src/amf/ngap-build.c | 70 +++++---- src/amf/ngap-handler.c | 270 ++++++++++++++++++++------------- src/amf/ngap-path.c | 7 +- src/amf/ngap-path.h | 2 +- src/amf/sbi-path.c | 5 +- src/mme/s1ap-path.c | 38 ++++- src/smf/context.c | 9 +- tests/common/context.h | 2 +- tests/common/s1ap-path.c | 1 + tests/handover/5gc-n2-test.c | 39 ++++- tests/handover/epc-s1-test.c | 32 ++++ tests/registration/guti-test.c | 2 +- tests/registration/idle-test.c | 2 +- tests/unit/ngap-message-test.c | 4 +- 19 files changed, 360 insertions(+), 170 deletions(-) diff --git a/lib/ngap/build.c b/lib/ngap/build.c index 492c3f4e3c..8f2675862a 100644 --- a/lib/ngap/build.c +++ b/lib/ngap/build.c @@ -20,7 +20,7 @@ #include "ogs-ngap.h" ogs_pkbuf_t *ogs_ngap_build_error_indication( - uint32_t *ran_ue_ngap_id, + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause) { @@ -72,7 +72,7 @@ ogs_pkbuf_t *ogs_ngap_build_error_indication( RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; *RAN_UE_NGAP_ID = *ran_ue_ngap_id; - ogs_debug(" RAN_UE_NGAP_ID[%d]", (int)*ran_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld]", (long long)*ran_ue_ngap_id); } ie = CALLOC(1, sizeof(NGAP_ErrorIndicationIEs_t)); @@ -155,7 +155,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset( void ogs_ngap_build_part_of_ng_interface( NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface, - uint32_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id) + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id) { NGAP_UE_associatedLogicalNG_connectionItem_t *item = NULL; @@ -223,7 +223,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack( for (i = 0; i < partOfNG_Interface->list.count; i++) { NGAP_UE_associatedLogicalNG_connectionItem_t *item = NULL; uint64_t amf_ue_ngap_id = 0; - uint32_t ran_ue_ngap_id = 0; + uint64_t ran_ue_ngap_id = 0; item = partOfNG_Interface->list.array[i]; ogs_assert(item); @@ -245,8 +245,8 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack( item->rAN_UE_NGAP_ID ? &ran_ue_ngap_id : NULL, item->aMF_UE_NGAP_ID ? &amf_ue_ngap_id : NULL); - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - item->rAN_UE_NGAP_ID ? ran_ue_ngap_id : -1, + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + item->rAN_UE_NGAP_ID ? (long long)ran_ue_ngap_id : -1, item->aMF_UE_NGAP_ID ? (long long)amf_ue_ngap_id : -1); } } diff --git a/lib/ngap/build.h b/lib/ngap/build.h index ec45cbb399..b782568045 100644 --- a/lib/ngap/build.h +++ b/lib/ngap/build.h @@ -29,7 +29,7 @@ extern "C" { #endif ogs_pkbuf_t *ogs_ngap_build_error_indication( - uint32_t *ran_ue_ngap_id, + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause); @@ -39,7 +39,7 @@ ogs_pkbuf_t *ogs_ngap_build_ng_reset( void ogs_ngap_build_part_of_ng_interface( NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface, - uint32_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id); + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id); ogs_pkbuf_t *ogs_ngap_build_ng_reset_ack( NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface); diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 75b5747ff0..ebd59e6ba3 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -847,8 +847,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; case AMF_TIMER_NG_HOLDING: ogs_warn("Implicit NG release"); - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); ngap_handle_ue_context_release_action(ran_ue); break; diff --git a/src/amf/context.c b/src/amf/context.c index 6b8244bf80..12db2a8fc8 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1318,7 +1318,7 @@ amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb) } /** ran_ue_context handling function */ -ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) +ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) { ran_ue_t *ran_ue = NULL; @@ -1397,7 +1397,7 @@ void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb) } ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( - amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) + amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) { ran_ue_t *ran_ue = NULL; @@ -1978,8 +1978,9 @@ void amf_ue_set_suci(amf_ue_t *amf_ue, if (CM_CONNECTED(old_amf_ue)) { /* Implcit NG release */ ogs_warn("[%s] Implicit NG release", suci); - ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - old_amf_ue->suci, old_amf_ue->ran_ue->ran_ue_ngap_id, + ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + old_amf_ue->suci, + (long long)old_amf_ue->ran_ue->ran_ue_ngap_id, (long long)old_amf_ue->ran_ue->amf_ue_ngap_id); ran_ue_remove(old_amf_ue->ran_ue); } diff --git a/src/amf/context.h b/src/amf/context.h index 884be010ca..c141d2636a 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -164,8 +164,8 @@ struct ran_ue_s { uint32_t index; /* UE identity */ -#define INVALID_UE_NGAP_ID 0xffffffff /* Initial value of ran_ue_ngap_id */ - uint32_t ran_ue_ngap_id; /* eNB-UE-NGAP-ID received from eNB */ +#define INVALID_UE_NGAP_ID 0xffffffffffffffffULL /* Initial value of ran_ue_ngap_id */ + uint64_t ran_ue_ngap_id; /* RAN-UE-NGAP-ID received from RAN */ uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */ uint16_t gnb_ostream_id; /* SCTP output stream id for eNB */ @@ -389,8 +389,9 @@ struct amf_ue_s { (__aMF)->ran_ue_holding = ran_ue_cycle((__aMF)->ran_ue); \ if ((__aMF)->ran_ue_holding) { \ ogs_warn("[%s] Holding NG Context", (__aMF)->suci); \ - ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", \ - (__aMF)->suci, (__aMF)->ran_ue_holding->ran_ue_ngap_id, \ + ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \ + (__aMF)->suci, \ + (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ \ (__aMF)->ran_ue_holding->ue_ctx_rel_action = \ @@ -406,8 +407,9 @@ struct amf_ue_s { if (ran_ue_cycle((__aMF)->ran_ue_holding)) { \ int r; \ ogs_warn("[%s] Clear NG Context", (__aMF)->suci); \ - ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", \ - (__aMF)->suci, (__aMF)->ran_ue_holding->ran_ue_ngap_id, \ + ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \ + (__aMF)->suci, \ + (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ \ r = ngap_send_ran_ue_context_release_command( \ @@ -723,11 +725,11 @@ int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id); int amf_gnb_sock_type(ogs_sock_t *sock); amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb); -ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id); +ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); void ran_ue_remove(ran_ue_t *ran_ue); void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb); ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( - amf_gnb_t *gnb, uint32_t ran_ue_ngap_id); + amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); ran_ue_t *ran_ue_find(uint32_t index); ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id); ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue); diff --git a/src/amf/ngap-build.c b/src/amf/ngap-build.c index e41725fc0c..85872faa70 100644 --- a/src/amf/ngap-build.c +++ b/src/amf/ngap-build.c @@ -361,8 +361,9 @@ ogs_pkbuf_t *ngap_build_downlink_nas_transport( NAS_PDU = &ie->value.choice.NAS_PDU; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -623,8 +624,9 @@ ogs_pkbuf_t *ngap_ue_build_initial_context_setup_request( SecurityKey = &ie->value.choice.SecurityKey; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -858,8 +860,9 @@ ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue) SecurityKey = &ie->value.choice.SecurityKey; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1091,8 +1094,9 @@ ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request( SecurityKey = &ie->value.choice.SecurityKey; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1335,8 +1339,9 @@ ogs_pkbuf_t *ngap_ue_build_pdu_session_resource_setup_request( RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1511,8 +1516,9 @@ ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request( PDUSessionList = &ie->value.choice.PDUSessionResourceSetupListSUReq; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1653,8 +1659,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_modify_request( PDUSessionList = &ie->value.choice.PDUSessionResourceModifyListModReq; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1743,8 +1750,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command( RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -1991,8 +1999,9 @@ ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue) ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestAcknowledgeIEs__value_PR_PDUSessionResourceSwitchedList; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; @@ -2131,8 +2140,9 @@ ogs_pkbuf_t *ngap_build_handover_request(ran_ue_t *target_ue) AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, target_ue->amf_ue_ngap_id); @@ -2443,8 +2453,9 @@ ogs_pkbuf_t *ngap_build_handover_preparation_failure( RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; @@ -2524,8 +2535,9 @@ ogs_pkbuf_t *ngap_build_handover_command(ran_ue_t *source_ue) RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; @@ -2642,8 +2654,9 @@ ogs_pkbuf_t *ngap_build_handover_cancel_ack(ran_ue_t *source_ue) RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, source_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; @@ -2707,8 +2720,9 @@ ogs_pkbuf_t *ngap_build_downlink_ran_status_transfer( RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, target_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = target_ue->ran_ue_ngap_id; diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 51b73a1efa..8c6d852ef6 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -559,9 +559,9 @@ void ngap_handle_initial_ue_message(amf_gnb_t *gnb, ogs_ngap_message_t *message) ogs_ngap_ASN_to_5gs_tai( &UserLocationInformationNR->tAI, &ran_ue->saved.nr_tai); - ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] " + ogs_info(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] " "TAC[%d] CellID[0x%llx]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id, + (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id, ran_ue->saved.nr_tai.tac.v, (long long)ran_ue->saved.nr_cgi.cell_id); if (UEContextRequest) { @@ -633,7 +633,7 @@ void ngap_handle_uplink_nas_transport( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -642,7 +642,7 @@ void ngap_handle_uplink_nas_transport( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -654,7 +654,7 @@ void ngap_handle_uplink_nas_transport( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -729,9 +729,9 @@ void ngap_handle_uplink_nas_transport( ogs_ngap_ASN_to_5gs_tai( &UserLocationInformationNR->tAI, &ran_ue->saved.nr_tai); - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] " + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] " "TAC[%d] CellID[0x%llx]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id, + (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id, ran_ue->saved.nr_tai.tac.v, (long long)ran_ue->saved.nr_cgi.cell_id); /* Copy NR-TAI/NR-CGI from ran_ue */ @@ -795,7 +795,7 @@ void ngap_handle_ue_radio_capability_info_indication( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -804,7 +804,7 @@ void ngap_handle_ue_radio_capability_info_indication( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -816,7 +816,7 @@ void ngap_handle_ue_radio_capability_info_indication( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -824,8 +824,9 @@ void ngap_handle_ue_radio_capability_info_indication( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); if (!UERadioCapability) { ogs_error("No UERadioCapability"); @@ -899,7 +900,7 @@ void ngap_handle_initial_context_setup_response( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -908,7 +909,7 @@ void ngap_handle_initial_context_setup_response( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -920,7 +921,7 @@ void ngap_handle_initial_context_setup_response( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -928,8 +929,9 @@ void ngap_handle_initial_context_setup_response( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); ran_ue->initial_context_setup_response_received = true; @@ -1177,7 +1179,7 @@ void ngap_handle_initial_context_setup_failure( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1186,7 +1188,7 @@ void ngap_handle_initial_context_setup_failure( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1198,7 +1200,7 @@ void ngap_handle_initial_context_setup_failure( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -1206,8 +1208,9 @@ void ngap_handle_initial_context_setup_failure( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); if (!Cause) { ogs_error("No Cause"); @@ -1392,8 +1395,9 @@ void ngap_handle_ue_context_modification_failure( ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); else - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); } else if (RAN_UE_NGAP_ID) { ran_ue = ran_ue_find_by_ran_ue_ngap_id(gnb, *RAN_UE_NGAP_ID); @@ -1401,8 +1405,9 @@ void ngap_handle_ue_context_modification_failure( ogs_warn("No RAN UE Context : RAN_UE_NGAP_ID[%d]", (int)*RAN_UE_NGAP_ID); else - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); } if (Cause) { @@ -1470,7 +1475,7 @@ void ngap_handle_ue_context_release_request( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1479,7 +1484,7 @@ void ngap_handle_ue_context_release_request( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1491,7 +1496,7 @@ void ngap_handle_ue_context_release_request( ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -1499,8 +1504,9 @@ void ngap_handle_ue_context_release_request( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); if (!Cause) { ogs_error("No Cause"); @@ -1641,7 +1647,7 @@ void ngap_handle_ue_context_release_complete( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1650,7 +1656,7 @@ void ngap_handle_ue_context_release_complete( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1662,7 +1668,7 @@ void ngap_handle_ue_context_release_complete( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -1688,8 +1694,9 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue) amf_ue = ran_ue->amf_ue; ogs_info("UE Context Release [Action:%d]", ran_ue->ue_ctx_rel_action); - ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_info(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); if (amf_ue) { ogs_info(" SUCI[%s]", amf_ue->suci ? amf_ue->suci : "Unknown"); @@ -1871,7 +1878,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1880,7 +1887,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1892,7 +1899,7 @@ void ngap_handle_pdu_session_resource_setup_response( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -1900,8 +1907,9 @@ void ngap_handle_pdu_session_resource_setup_response( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); amf_ue = ran_ue->amf_ue; if (!amf_ue) { @@ -2192,7 +2200,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2201,7 +2209,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2213,7 +2221,7 @@ void ngap_handle_pdu_session_resource_modify_response( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -2221,8 +2229,9 @@ void ngap_handle_pdu_session_resource_modify_response( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); amf_ue = ran_ue->amf_ue; if (!amf_ue) { @@ -2378,7 +2387,7 @@ void ngap_handle_pdu_session_resource_release_response( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2387,7 +2396,7 @@ void ngap_handle_pdu_session_resource_release_response( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2399,7 +2408,7 @@ void ngap_handle_pdu_session_resource_release_response( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -2407,8 +2416,9 @@ void ngap_handle_pdu_session_resource_release_response( return; } - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); amf_ue = ran_ue->amf_ue; if (!amf_ue) { @@ -2729,7 +2739,7 @@ void ngap_handle_path_switch_request( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2738,7 +2748,7 @@ void ngap_handle_path_switch_request( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2750,7 +2760,7 @@ void ngap_handle_path_switch_request( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -2771,8 +2781,8 @@ void ngap_handle_path_switch_request( return; } - ogs_info(" [OLD] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_info(" [OLD] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); ogs_info(" [OLD] TAC[%d] CellID[0x%llx]", amf_ue->nr_tai.tac.v, (long long)amf_ue->nr_cgi.cell_id); @@ -2829,8 +2839,8 @@ void ngap_handle_path_switch_request( return; } - ogs_info(" [NEW] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_info(" [NEW] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); UserLocationInformationNR = UserLocationInformation->choice.userLocationInformationNR; @@ -3055,7 +3065,7 @@ void ngap_handle_handover_required( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3064,7 +3074,7 @@ void ngap_handle_handover_required( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3076,7 +3086,7 @@ void ngap_handle_handover_required( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -3084,8 +3094,9 @@ void ngap_handle_handover_required( return; } - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); amf_ue = source_ue->amf_ue; if (!amf_ue) { @@ -3205,6 +3216,46 @@ void ngap_handle_handover_required( return; } + target_ue = ran_ue_cycle(source_ue->target_ue); + if (target_ue) { + /* + * Issue #3014 + * + * 1. HandoverRequired + * 2. HandoverRequest + * 3. HandoverFailure + * 4. UEContextReleaseCommand + * 5. HandoverPreparationFailure + * + * If UEContextReleaseComplete is not received, + * the Source-UE will have the Target-UE. + * + * 6. HandoverRequired + * + * There may be cases where the Source UE has a Target UE + * from a previous HandoverRequired process. In this case, + * it is recommended to force the deletion of the Target UE information + * when receiving a new HandoverRequired. + * + * 7. HandoverRequest + * 8. HandoverFailure + * 9. UEContextReleaseCommand + * 10. UEContextReleaseComplete + * 11. HandoverPreparationFailure + * + * ... Crashed ... + */ + ogs_warn("DELETE the previously used TARGET in SOURCE"); + ogs_warn(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); + ogs_warn(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); + source_ue_deassociate_target_ue(target_ue); + ran_ue_remove(target_ue); + } + /* Target UE */ target_ue = ran_ue_add(target_gnb, INVALID_UE_NGAP_ID); if (target_ue == NULL) { @@ -3227,8 +3278,9 @@ void ngap_handle_handover_required( target_ue->psimask.activated = source_ue->psimask.activated; - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); /* Store HandoverType */ amf_ue->handover.type = *HandoverType; @@ -3393,7 +3445,7 @@ void ngap_handle_handover_request_ack( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3402,7 +3454,7 @@ void ngap_handle_handover_request_ack( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3414,7 +3466,7 @@ void ngap_handle_handover_request_ack( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -3458,10 +3510,12 @@ void ngap_handle_handover_request_ack( return; } - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); if (!PDUSessionList) { ogs_error("No PDUSessionList"); @@ -3650,10 +3704,12 @@ void ngap_handle_handover_failure( return; } - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); if (!Cause) { ogs_error("No Cause"); @@ -3731,7 +3787,7 @@ void ngap_handle_handover_cancel( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3740,7 +3796,7 @@ void ngap_handle_handover_cancel( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3752,7 +3808,7 @@ void ngap_handle_handover_cancel( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -3785,10 +3841,12 @@ void ngap_handle_handover_cancel( return; } - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); if (!Cause) { ogs_error("No Cause"); @@ -3881,7 +3939,7 @@ void ngap_handle_uplink_ran_status_transfer( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3890,7 +3948,7 @@ void ngap_handle_uplink_ran_status_transfer( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3902,7 +3960,7 @@ void ngap_handle_uplink_ran_status_transfer( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -3935,10 +3993,12 @@ void ngap_handle_uplink_ran_status_transfer( return; } - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); r = ngap_send_downlink_ran_status_transfer( target_ue, RANStatusTransfer_TransparentContainer); @@ -4001,7 +4061,7 @@ void ngap_handle_handover_notification( if (!AMF_UE_NGAP_ID) { ogs_error("No AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -4010,7 +4070,7 @@ void ngap_handle_handover_notification( if (asn_INTEGER2uint64(AMF_UE_NGAP_ID, &amf_ue_ngap_id) != 0) { ogs_error("Invalid AMF_UE_NGAP_ID"); - r = ngap_send_error_indication(gnb, (uint32_t *)RAN_UE_NGAP_ID, NULL, + r = ngap_send_error_indication(gnb, (uint64_t *)RAN_UE_NGAP_ID, NULL, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -4022,7 +4082,7 @@ void ngap_handle_handover_notification( ogs_error("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); r = ngap_send_error_indication( - gnb, (uint32_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, + gnb, (uint64_t *)RAN_UE_NGAP_ID, &amf_ue_ngap_id, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID); ogs_expect(r == OGS_OK); @@ -4085,13 +4145,15 @@ void ngap_handle_handover_notification( ogs_ngap_ASN_to_5gs_tai( &UserLocationInformationNR->tAI, &target_ue->saved.nr_tai); - ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); + ogs_debug(" Source : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)source_ue->ran_ue_ngap_id, + (long long)source_ue->amf_ue_ngap_id); ogs_debug(" Source : TAC[%d] CellID[0x%llx]", source_ue->saved.nr_tai.tac.v, (long long)source_ue->saved.nr_cgi.cell_id); - ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] ", - target_ue->ran_ue_ngap_id, (long long)target_ue->amf_ue_ngap_id); + ogs_debug(" Target : RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] ", + (long long)target_ue->ran_ue_ngap_id, + (long long)target_ue->amf_ue_ngap_id); ogs_debug(" Target : TAC[%d] CellID[0x%llx]", target_ue->saved.nr_tai.tac.v, (long long)target_ue->saved.nr_cgi.cell_id); @@ -4549,9 +4611,9 @@ void ngap_handle_ng_reset( new_xact_count = amf_sess_xact_count(amf_ue); } else { ogs_warn("UE(amf-ue) context has already been removed"); - ogs_warn(" AMF_UE_NGAP_ID[%lld] RAN_UE_NGAP_ID[%d]", + ogs_warn(" AMF_UE_NGAP_ID[%lld] RAN_UE_NGAP_ID[%lld]", (long long)ran_ue->amf_ue_ngap_id, - ran_ue->ran_ue_ngap_id); + (long long)ran_ue->ran_ue_ngap_id); } if (old_xact_count == new_xact_count) ran_ue_remove(ran_ue); @@ -4641,8 +4703,9 @@ void ngap_handle_error_indication(amf_gnb_t *gnb, ogs_ngap_message_t *message) ogs_warn("No RAN UE Context : AMF_UE_NGAP_ID[%lld]", (long long)amf_ue_ngap_id); else - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); } else if (RAN_UE_NGAP_ID) { ran_ue = ran_ue_find_by_ran_ue_ngap_id(gnb, *RAN_UE_NGAP_ID); @@ -4650,8 +4713,9 @@ void ngap_handle_error_indication(amf_gnb_t *gnb, ogs_ngap_message_t *message) ogs_warn("No RAN UE Context : RAN_UE_NGAP_ID[%d]", (int)*RAN_UE_NGAP_ID); else - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); } if (Cause) { diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index 65cf408a5b..b7094a0536 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -365,8 +365,9 @@ int ngap_send_ran_ue_context_release_command( } ogs_debug("UEContextReleaseCommand"); - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + ogs_debug(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); ogs_assert(action != NGAP_UE_CTX_REL_INVALID_ACTION); ran_ue->ue_ctx_rel_action = action; @@ -668,7 +669,7 @@ int ngap_send_downlink_ran_status_transfer( int ngap_send_error_indication( amf_gnb_t *gnb, - uint32_t *ran_ue_ngap_id, + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause) { diff --git a/src/amf/ngap-path.h b/src/amf/ngap-path.h index 9cfa74ab92..e734176ff4 100644 --- a/src/amf/ngap-path.h +++ b/src/amf/ngap-path.h @@ -78,7 +78,7 @@ int ngap_send_downlink_ran_status_transfer( int ngap_send_error_indication( amf_gnb_t *gnb, - uint32_t *ran_ue_ngap_id, + uint64_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause); int ngap_send_error_indication2( diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index ae00746502..409298850c 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -463,8 +463,9 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) } } else { ogs_warn("amf_sbi_send_deactivate_all_ue_in_gnb()"); - ogs_warn(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld] State[%d]", - ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id, + ogs_warn(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld] State[%d]", + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id, state); if (state == AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED || diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index a46f4b0c58..2123aad177 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -731,7 +731,43 @@ int s1ap_send_handover_request( return OGS_NOTFOUND; } - ogs_assert(source_ue->target_ue == NULL); + target_ue = enb_ue_cycle(source_ue->target_ue); + if (target_ue) { + /* + * Issue #3014 + * + * 1. HandoverRequired + * 2. HandoverRequest + * 3. HandoverFailure + * 4. UEContextReleaseCommand + * 5. HandoverPreparationFailure + * + * If UEContextReleaseComplete is not received, + * the Source-UE will have the Target-UE. + * + * 6. HandoverRequired + * + * There may be cases where the Source UE has a Target UE + * from a previous HandoverRequired process. In this case, + * it is recommended to force the deletion of the Target UE information + * when receiving a new HandoverRequired. + * + * 7. HandoverRequest + * 8. HandoverFailure + * 9. UEContextReleaseCommand + * 10. UEContextReleaseComplete + * 11. HandoverPreparationFailure + * + * ... Crashed ... + */ + ogs_warn("DELETE the previously used TARGET in SOURCE"); + ogs_warn(" Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id); + ogs_warn(" Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id); + enb_ue_source_deassociate_target(target_ue); + enb_ue_remove(target_ue); + } target_ue = enb_ue_add(target_enb, INVALID_UE_S1AP_ID); if (target_ue == NULL) { diff --git a/src/smf/context.c b/src/smf/context.c index a61679626d..125f8df694 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1548,10 +1548,15 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) subnet = ogs_pfcp_find_subnet_by_dnn(AF_INET, sess->session.name); subnet6 = ogs_pfcp_find_subnet_by_dnn(AF_INET6, sess->session.name); - if (subnet != NULL && subnet6 == NULL) + if (subnet != NULL && subnet6 == NULL) { sess->session.session_type = OGS_PDU_SESSION_TYPE_IPV4; - else if (subnet == NULL && subnet6 != NULL) + ogs_error("[%s] No IPv6 subnet or set to /63 or /64, " + "only IPv4 assigned", sess->session.name); + } else if (subnet == NULL && subnet6 != NULL) { sess->session.session_type = OGS_PDU_SESSION_TYPE_IPV6; + ogs_error("[%s] No IPv4 subnet or set to /31 or /32, " + "only IPv6 assigned", sess->session.name); + } } sess->session.paa.session_type = sess->session.session_type; diff --git a/tests/common/context.h b/tests/common/context.h index fd957e08ed..07d7e68225 100644 --- a/tests/common/context.h +++ b/tests/common/context.h @@ -288,7 +288,7 @@ typedef struct test_esm_information_param_s { typedef struct test_ue_s { ogs_lnode_t lnode; /**< A node of list_t */ - uint32_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */ + uint64_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */ uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */ uint32_t enb_ue_s1ap_id; /* eNB-UE-S1AP-ID received from eNB */ uint32_t mme_ue_s1ap_id; /* MME-UE-S1AP-ID received from MME */ diff --git a/tests/common/s1ap-path.c b/tests/common/s1ap-path.c index 770efd0e48..67b38401f8 100644 --- a/tests/common/s1ap-path.c +++ b/tests/common/s1ap-path.c @@ -126,6 +126,7 @@ void tests1ap_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf) case S1AP_ProcedureCode_id_S1Setup: break; case S1AP_ProcedureCode_id_HandoverPreparation: + tests1ap_handle_handover_preparation_failure(test_ue, pdu); break; default: ogs_error("Not implemented(choice:%d, proc:%d)", diff --git a/tests/handover/5gc-n2-test.c b/tests/handover/5gc-n2-test.c index f984b08adf..0a59f98d71 100644 --- a/tests/handover/5gc-n2-test.c +++ b/tests/handover/5gc-n2-test.c @@ -364,6 +364,39 @@ static void failure_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(test_ue, recvbuf); + /* Receive HandoverPreparationFailure */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send HandoverRequired */ + sendbuf = testngap_build_handover_required( + test_ue, NGAP_HandoverType_intra5gs, + 0x4001, 28, + NGAP_Cause_PR_radioNetwork, + NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason, + true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive HandoverRequest */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send HandoverFailure */ + sendbuf = testngap_build_handover_failure(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unspecified); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + /* Send UEContextReleaseComplete */ sendbuf = testngap_build_ue_context_release_complete(test_ue); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -437,7 +470,7 @@ static void direct_complete_func(abts_case *tc, void *data) test_sess_t *sess = NULL; test_bearer_t *qos_flow = NULL; - uint32_t ran_ue_ngap_id; + uint64_t ran_ue_ngap_id; uint64_t amf_ue_ngap_id; bson_t *doc = NULL; @@ -1465,7 +1498,7 @@ static void indirect_complete_func(abts_case *tc, void *data) test_sess_t *sess = NULL; test_bearer_t *qos_flow = NULL; - uint32_t ran_ue_ngap_id; + uint64_t ran_ue_ngap_id; uint64_t amf_ue_ngap_id; bson_t *doc = NULL; @@ -2118,7 +2151,7 @@ static void indirect_cancel_func(abts_case *tc, void *data) test_sess_t *sess = NULL; test_bearer_t *qos_flow = NULL; - uint32_t ran_ue_ngap_id; + uint64_t ran_ue_ngap_id; uint64_t amf_ue_ngap_id; bson_t *doc = NULL; diff --git a/tests/handover/epc-s1-test.c b/tests/handover/epc-s1-test.c index becee46ec9..5f0130ee39 100644 --- a/tests/handover/epc-s1-test.c +++ b/tests/handover/epc-s1-test.c @@ -1218,6 +1218,38 @@ static void test3_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); tests1ap_recv(test_ue, recvbuf); + /* Receive Handover Preparation Failure */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x43, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Failure */ + sendbuf = test_s1ap_build_handover_failure(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_unspecified); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + /* Send UE Context Release Complete */ sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index a3b5921430..c3c536e390 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -1233,7 +1233,7 @@ static void test4_issues2839_func(abts_case *tc, void *data) ogs_ngap_message_t message; int i; - uint32_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */ + uint64_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */ uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */ ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; diff --git a/tests/registration/idle-test.c b/tests/registration/idle-test.c index a72fc448dc..0836c1714f 100644 --- a/tests/registration/idle-test.c +++ b/tests/registration/idle-test.c @@ -1016,7 +1016,7 @@ static void test4_func(abts_case *tc, void *data) int i; /* for backup */ - uint32_t ran_ue_ngap_id; + uint64_t ran_ue_ngap_id; uint64_t amf_ue_ngap_id; ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; diff --git a/tests/unit/ngap-message-test.c b/tests/unit/ngap-message-test.c index f93a379c69..99ce598c4f 100644 --- a/tests/unit/ngap-message-test.c +++ b/tests/unit/ngap-message-test.c @@ -35,7 +35,7 @@ static void ngap_message_test1(abts_case *tc, void *data) size_t struct_size; asn_dec_rval_t dec_ret = {0}; - uint32_t ran_ue_ngap_id; + uint64_t ran_ue_ngap_id; uint64_t amf_ue_ngap_id; memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); @@ -185,7 +185,7 @@ static void ngap_message_test4(abts_case *tc, void *data) } static ogs_pkbuf_t *build_uplink_nas_transport( - uint32_t ran_ue_ngap_id, uint64_t amf_ue_ngap_id, ogs_pkbuf_t *gmmbuf) + uint64_t ran_ue_ngap_id, uint64_t amf_ue_ngap_id, ogs_pkbuf_t *gmmbuf) { const char *payload = "7e005c00 0d0199f9 07f0ff00 00000020" From 152b4400f849eccffb878503cdde7b429e852c8f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 2 Mar 2024 16:57:45 +0900 Subject: [PATCH 035/323] Fixed docs for changing WebUI port 3000 => 9999 --- docs/_docs/guide/01-quickstart.md | 2 +- docs/_docs/guide/02-building-open5gs-from-sources.md | 2 +- docs/_docs/tutorial/01-your-first-lte.md | 2 +- docs/_docs/tutorial/03-VoLTE-dockerized.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_docs/guide/01-quickstart.md b/docs/_docs/guide/01-quickstart.md index 0d7fcac081..e745dab398 100644 --- a/docs/_docs/guide/01-quickstart.md +++ b/docs/_docs/guide/01-quickstart.md @@ -432,7 +432,7 @@ $ sudo systemctl restart open5gs-upfd #### Register Subscriber Information --- -Connect to `http://localhost:3000` and login with **admin** account. +Connect to `http://localhost:9999` and login with **admin** account. > Username : admin > Password : 1423 diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index edeb73aebe..e22fdc7a55 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -495,7 +495,7 @@ $ PORT=7777 npm run dev ### Register Subscriber Information --- -Connect to `http://127.0.0.1:3000` and login with **admin** account. +Connect to `http://127.0.0.1:9999` and login with **admin** account. > Username : admin > Password : 1423 diff --git a/docs/_docs/tutorial/01-your-first-lte.md b/docs/_docs/tutorial/01-your-first-lte.md index fc7e98c58b..2b421c2d9c 100644 --- a/docs/_docs/tutorial/01-your-first-lte.md +++ b/docs/_docs/tutorial/01-your-first-lte.md @@ -229,7 +229,7 @@ K : 82E9053A1882085FF2C020359938DAE9 OPc : BFD5771AAF4F6728E9BC6EF2C2533BDB ``` -Connect to `http://localhost:3000` and login with **admin** account. +Connect to `http://localhost:9999` and login with **admin** account. > Username : admin > Password : 1423 diff --git a/docs/_docs/tutorial/03-VoLTE-dockerized.md b/docs/_docs/tutorial/03-VoLTE-dockerized.md index 33b33a5169..c3fcb859bd 100644 --- a/docs/_docs/tutorial/03-VoLTE-dockerized.md +++ b/docs/_docs/tutorial/03-VoLTE-dockerized.md @@ -147,7 +147,7 @@ If there is a need to change the Core Network component configuration, then corr - Provision SIM details in open5gs HSS -Open (http://<DOCKER_HOST_IP>:3000) in a web browser, where <DOCKER_HOST_IP> is the IP of the machine/VM running the open5gs containers. Login with following credentials +Open (http://<DOCKER_HOST_IP>:9999) in a web browser, where <DOCKER_HOST_IP> is the IP of the machine/VM running the open5gs containers. Login with following credentials ``` Username : admin From 199f4c7add495422985f9edfd230dd2b7e55505b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 4 Mar 2024 20:59:23 +0900 Subject: [PATCH 036/323] [AMF] Fixed crash in no context setup (#2999) Remove ogs_assert((__sESS)->gsm_message.n1buf) from AMF_SESS_STORE_5GSM_MESSAGE because N1 buffer can become NULL during PDU session release. --- lib/nas/common/types.h | 2 - src/amf/context.h | 4 +- tests/registration/abts-main.c | 2 - tests/registration/meson.build | 1 - tests/slice/abts-main.c | 2 + tests/slice/meson.build | 1 + tests/{registration => slice}/paging-test.c | 355 ++++++++++++++++++++ 7 files changed, 361 insertions(+), 6 deletions(-) rename tests/{registration => slice}/paging-test.c (90%) diff --git a/lib/nas/common/types.h b/lib/nas/common/types.h index 9c5497a334..c5f6538d7a 100644 --- a/lib/nas/common/types.h +++ b/lib/nas/common/types.h @@ -42,8 +42,6 @@ extern "C" { #define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_PARTICALLY_CIPHTERD 5 #define OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE 12 -#define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0 - #define OGS_NAS_CLEAR_DATA(__dATA) \ do { \ ogs_assert((__dATA)); \ diff --git a/src/amf/context.h b/src/amf/context.h index c141d2636a..83ab14b4a1 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -654,14 +654,16 @@ typedef struct amf_sess_s { ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \ } \ (__sESS)->gsm_message.n1buf = __n1Buf; \ - ogs_assert((__sESS)->gsm_message.n1buf); \ + \ if ((__sESS)->gsm_message.n2buf) { \ ogs_warn("[%s:%d] N2 message duplicated. Overwritten", \ ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \ } \ (__sESS)->gsm_message.n2buf = __n2Buf; \ + \ ogs_assert((__sESS)->gsm_message.n2buf); \ + \ (__sESS)->gsm_message.type = __tYPE; \ } while(0); diff --git a/tests/registration/abts-main.c b/tests/registration/abts-main.c index 7596b2f39a..1c438903db 100644 --- a/tests/registration/abts-main.c +++ b/tests/registration/abts-main.c @@ -25,7 +25,6 @@ abts_suite *test_auth(abts_suite *suite); abts_suite *test_ecc(abts_suite *suite); abts_suite *test_idle(abts_suite *suite); abts_suite *test_dereg(abts_suite *suite); -abts_suite *test_paging(abts_suite *suite); abts_suite *test_identity(abts_suite *suite); abts_suite *test_gmm_status(abts_suite *suite); abts_suite *test_ue_context(abts_suite *suite); @@ -42,7 +41,6 @@ const struct testlist { {test_ecc}, {test_idle}, {test_dereg}, - {test_paging}, {test_identity}, {test_gmm_status}, {test_ue_context}, diff --git a/tests/registration/meson.build b/tests/registration/meson.build index 76540e23a3..f49dae5b6c 100644 --- a/tests/registration/meson.build +++ b/tests/registration/meson.build @@ -23,7 +23,6 @@ test5gc_registration_sources = files(''' ecc-test.c idle-test.c dereg-test.c - paging-test.c identity-test.c gmm-status-test.c ue-context-test.c diff --git a/tests/slice/abts-main.c b/tests/slice/abts-main.c index d2ef2f36bd..5865dac027 100644 --- a/tests/slice/abts-main.c +++ b/tests/slice/abts-main.c @@ -21,12 +21,14 @@ abts_suite *test_same_dnn(abts_suite *suite); abts_suite *test_different_dnn(abts_suite *suite); +abts_suite *test_paging(abts_suite *suite); const struct testlist { abts_suite *(*func)(abts_suite *suite); } alltests[] = { {test_same_dnn}, {test_different_dnn}, + {test_paging}, {NULL}, }; diff --git a/tests/slice/meson.build b/tests/slice/meson.build index 77e0f8a3d1..3aee0f058f 100644 --- a/tests/slice/meson.build +++ b/tests/slice/meson.build @@ -19,6 +19,7 @@ test5gc_slice_sources = files(''' abts-main.c same-dnn-test.c different-dnn-test.c + paging-test.c '''.split()) test5gc_slice_exe = executable('slice', diff --git a/tests/registration/paging-test.c b/tests/slice/paging-test.c similarity index 90% rename from tests/registration/paging-test.c rename to tests/slice/paging-test.c index d601095ec1..782b361f13 100644 --- a/tests/registration/paging-test.c +++ b/tests/slice/paging-test.c @@ -1549,6 +1549,359 @@ static void cm_connected_error_indication_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void cm_context_setup_is_not_established_error_indication_func( + abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 23); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Registration request */ + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.s1_ue_network_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 1; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait to setup N3 data connection + * + * Otherwise, the following case could occur: + * + * 1. PDUSessionResourceSetupResponse + * 2. UEContextReleaseRequest + * 3. /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify + * 4. /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify + * 5. PFCP Session Modifcation Request (Deactivated) + * 6. PFCP Session Modifcation Request (OuterHeaderCreation) + * 7. PFCP Session Modifcation Response + * 8. PFCP Session Modifcation Response + * + * As such, N3 status could be activated. + * + * To prevent this situation, we'll use ogs_msleep(100). + */ + ogs_msleep(100); + + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* + * Send InitialUEMessage + + * Service request + * - Type: Mobile terminated services(2) + * - PDU Session Status + */ + test_ue->service_request_param.pdu_session_status = 0; + nasbuf = testgmm_build_service_request( + test_ue, OGS_NAS_SERVICE_TYPE_MOBILE_TERMINATED_SERVICES, + NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + test_ue->service_request_param.pdu_session_status = 0; + gmmbuf = testgmm_build_service_request( + test_ue, OGS_NAS_SERVICE_TYPE_MOBILE_TERMINATED_SERVICES, + nasbuf, true, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, true, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Service accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send Error Indication */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_error_indication(gtpu, qos_flow); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait to test CONTEXT_SETUP_ESTABLISHED() */ + ogs_msleep(100); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait to setup N3 data connection. + * Otherwise, network-triggered service request is initiated */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + static void vonr_qos_flow_test1_func(abts_case *tc, void *data) { int rv; @@ -3276,6 +3629,8 @@ abts_suite *test_paging(abts_suite *suite) abts_run_test(suite, cm_connected_paging_func, NULL); abts_run_test(suite, cm_idle_error_indication_func, NULL); abts_run_test(suite, cm_connected_error_indication_func, NULL); + abts_run_test(suite, + cm_context_setup_is_not_established_error_indication_func, NULL); abts_run_test(suite, vonr_qos_flow_test1_func, NULL); abts_run_test(suite, vonr_session_test2_func, NULL); abts_run_test(suite, registration_ue_context_test4_func, NULL); From 322719f3e729aafacf531e85552d7a977fff3e2a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 6 Mar 2024 07:19:28 +0900 Subject: [PATCH 037/323] [SEC] Vulnerabilities have been resolved (#2945) Reachable assertion in amf_ue_set_suci Location: src/amf/context.c:1968 ``` void amf_ue_set_suci(amf_ue_t *amf_ue, ogs_nas_5gs_mobile_identity_t *mobile_identity) { amf_ue_t *old_amf_ue = NULL; amf_sess_t *old_sess = NULL; char *suci = NULL; ogs_assert(amf_ue); ogs_assert(mobile_identity); suci = ogs_nas_5gs_suci_from_mobile_identity(mobile_identity); ogs_assert(suci); ``` Exploitable by: Base Station Severity: denial of service --- lib/nas/5gs/conv.c | 9 ++++++++- src/amf/gmm-handler.c | 12 ++++++++++++ src/amf/gmm-sm.c | 12 +++++++++++- tests/common/ngap-build.c | 27 ++++++++++++++++++++++++++ tests/common/ngap-build.h | 1 + tests/registration/crash-test.c | 34 +++++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 2 deletions(-) diff --git a/lib/nas/5gs/conv.c b/lib/nas/5gs/conv.c index 8185393d17..f9d9057f98 100644 --- a/lib/nas/5gs/conv.c +++ b/lib/nas/5gs/conv.c @@ -110,6 +110,7 @@ char *ogs_nas_5gs_suci_from_mobile_identity( ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id)); if (!suci) { ogs_error("ogs_mstrcatf() failed"); + ogs_free(suci); return NULL; } } else { @@ -117,6 +118,7 @@ char *ogs_nas_5gs_suci_from_mobile_identity( ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id)); if (!suci) { ogs_error("ogs_mstrcatf() failed"); + ogs_free(suci); return NULL; } } @@ -152,9 +154,14 @@ char *ogs_nas_5gs_suci_from_mobile_identity( scheme_output = (uint8_t *)mobile_identity->buffer + OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE; + if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) { + ogs_error("The length of Mobile Identity(%d) is less then the min(%d)", + mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE); + ogs_free(suci); + return NULL; + } scheme_output_size = mobile_identity->length - OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE; - ogs_assert(scheme_output_size); scheme_output_string_or_bcd = ogs_calloc(1, scheme_output_size*2+1); ogs_assert(scheme_output_string_or_bcd); diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 46110e3bbf..4a57a6aa84 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -130,6 +130,12 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE; } + if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) { + ogs_error("The length of Mobile Identity(%d) is less then the min(%d)", + mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE); + return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE; + } + mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; @@ -886,6 +892,12 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE; } + if (mobile_identity->length < OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE) { + ogs_error("The length of Mobile Identity(%d) is less then the min(%d)", + mobile_identity->length, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE); + return OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE; + } + mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index a1d3668b8e..a35425206d 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1365,7 +1365,17 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_error("gmm_handle_identity_response() " "failed [%d] in type [%d]", gmm_cause, amf_ue->nas.message_type); - r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); + if (amf_ue->nas.message_type == + OGS_NAS_5GS_REGISTRATION_REQUEST || + amf_ue->nas.message_type == + OGS_NAS_5GS_SERVICE_REQUEST) + r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); + else + r = ngap_send_error_indication2( + ran_ue, + NGAP_Cause_PR_protocol, + NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index 84432701f1..82e837b466 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -2661,3 +2661,30 @@ ogs_pkbuf_t *test_ngap_build_amf_configuration_ack(int i) return pkbuf; } + +ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i) +{ + ogs_pkbuf_t *pkbuf = NULL; + const char *payload[TEST_NGAP_MAX_MESSAGE] = { + "000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209" + "00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078" + "954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10" + "de5f5f765f000000 0000000000000000 00000000000000" + "", + "", + + }; + uint16_t len[TEST_NGAP_MAX_MESSAGE] = { + 119, + 0, + 0, + }; + char hexbuf[OGS_HUGE_LEN]; + + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_put_data(pkbuf, + ogs_hex_from_string(payload[i], hexbuf, sizeof(hexbuf)), len[i]); + + return pkbuf; +} diff --git a/tests/common/ngap-build.h b/tests/common/ngap-build.h index 47e3615ba4..ec29d5dcaa 100644 --- a/tests/common/ngap-build.h +++ b/tests/common/ngap-build.h @@ -80,6 +80,7 @@ ogs_pkbuf_t *testngap_build_handover_cancel(test_ue_t *test_ue, NGAP_Cause_PR group, long cause); ogs_pkbuf_t *test_ngap_build_amf_configuration_ack(int i); +ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i); #ifdef __cplusplus } diff --git a/tests/registration/crash-test.c b/tests/registration/crash-test.c index 79a452c81e..8c5871f457 100644 --- a/tests/registration/crash-test.c +++ b/tests/registration/crash-test.c @@ -1401,6 +1401,39 @@ static void test4_issues2842_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test5_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + sendbuf = test_ngap_build_malformed_initial_ue_message(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + testgnb_ngap_close(ngap); +} + abts_suite *test_crash(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -1409,6 +1442,7 @@ abts_suite *test_crash(abts_suite *suite) abts_run_test(suite, test2_func, NULL); abts_run_test(suite, test3_func, NULL); abts_run_test(suite, test4_issues2842_func, NULL); + abts_run_test(suite, test5_func, NULL); return suite; } From 054323ba8d2cd338df3fb3a59b93d76325428017 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Thu, 7 Mar 2024 21:22:45 +0100 Subject: [PATCH 038/323] [mme] cosmetic: Document spec references stating NSAPI=EBI --- src/mme/mme-gn-build.c | 4 ++-- src/mme/mme-gn-handler.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 1b35a10ed8..53dfd83898 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -147,7 +147,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ .asi = OGS_GTP1_PDPCTX_ACTIVITY_STATUS_IND_NO, .order = OGS_GTP1_PDPCTX_REORDERING_REQUIRED_NO, /* 3GPP TS 23.401 Annex D3.5.5 2b.: - * "The GTP equence numbers received from the old 3G-SGSN are only relevant if + * "The GTP sequence numbers received from the old 3G-SGSN are only relevant if * delivery order is required for the PDP context (QoS profile)." * NOTE 4: "The GTP and PDCP sequence numbers are not relevant" */ .snd = 0, @@ -165,7 +165,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ ogs_cpystrn(pdpctx_dec->apn, sess->session->name, sizeof(pdpctx_dec->apn)); ogs_list_for_each(&sess->bearer_list, bearer) { - pdpctx_dec->nsapi = bearer->ebi; + pdpctx_dec->nsapi = bearer->ebi; /* 3GPP TS 23.401 5.2.1, TS 23.060 14.4 */ pdpctx_dec->sapi = 3; /* FIXME. Using 3 = default for now. Maybe use 0 = UNASSIGNED ?*/ build_qos_profile_from_session(&pdpctx_dec->qos_sub, sess, bearer); //FIXME: sort out where to get each one: diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index 4cc0e860e2..acdd382842 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -279,6 +279,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ } sess->request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + /* NSAPI = EBI: 3GPP TS 23.401 5.2.1, TS 23.060 14.4A */ bearer = mme_bearer_find_by_sess_ebi(sess, gtp1_pdp_ctx->nsapi); if (!bearer) { bearer = mme_default_bearer_in_sess(sess); From a2b0284172508406fac17065da9421b0b10a83b4 Mon Sep 17 00:00:00 2001 From: mitmitmitm <ois@oasd8i.at> Date: Mon, 4 Mar 2024 13:29:39 +0100 Subject: [PATCH 039/323] [SMF] Don't FSM_TRAN smf-sm into incorrect state --- src/smf/smf-sm.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 7c841dda00..d81cded0ab 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -870,8 +870,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); ogs_free(strerror); - - OGS_FSM_TRAN(s, smf_gsm_state_exception); break; } From b31fc343d123acd69109cebb2d9b15560530399f Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 8 Mar 2024 13:48:23 +0100 Subject: [PATCH 040/323] cosmetic: Document spec references for unassigned identity values --- lib/proto/types.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/proto/types.h b/lib/proto/types.h index fe71c796d4..e081bea74e 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -118,7 +118,9 @@ extern "C" { #define OGS_TIME_TO_BCD(x) \ (((((x) % 10) << 4) & 0xf0) | (((x) / 10) & 0x0f)) +/* 3GPP TS 24.007 Table 11.6: */ #define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0 +/* 3GPP TS 24.007 Table 11.2.3.1c.1: */ #define OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED 0 #define OGS_ACCESS_TYPE_3GPP 1 From a1bd80515bcd8c7436de53e3a9d52fc8eedb061f Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 8 Mar 2024 17:04:16 +0100 Subject: [PATCH 041/323] [MME] Assign valid PTI to sess created by mobility from 2G Transaction Identity doesn't map 1-to-1 with Procedure Transaction Identity: The value ranges change, and PTI cannot use value 0 8which means unused). Hence, for now let's simply set the PTI to a valid default value instead of asserting during mme_sess_add: Assertion `pti != OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED' Related: https://github.com/open5gs/open5gs/issues/3020 --- src/mme/mme-gn-handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index acdd382842..f8485b5e80 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -225,7 +225,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; const ogs_gtp1_qos_profile_decoded_t *qos_pdec = &gtp1_pdp_ctx->qos_sub; - uint8_t pti = gtp1_pdp_ctx->trans_id; + uint8_t pti = 1; /* Default PTI : 1 */ uint8_t qci = 0; ogs_session_t *ogs_sess; From a1a0a8c0a6fc34ac5fa019de96fd0a709ec699f2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 16 Mar 2024 22:59:36 +0900 Subject: [PATCH 042/323] [MME] Race condition between S1AP and S6A Assume the UE has Attached, the session has been created, and is in the IDLE state with the UEContextRelease process. This could result in the following call flow. 1. TAU request without Integrity Protected 2. Authentication request/response 3. Security-mode command/complete MME can be performed simultaneously by the HSS(S6A) and UE(S1AP). Update-Location-Request Service request Service reject Delete Session Request Delete Session Response Update-Location-Answer UEContextReleaseCommand for Service reject TAU reject UEContextReleaseCommand for TAU reject UEContextReleaseComplete UEContextReleaseComplete MME crashes when UE sends a service request(S1AP) during ULR/ULA(S6A) with HSS, which has been fixed. --- src/amf/gmm-sm.c | 2 +- src/amf/nas-path.c | 31 ++-- src/amf/nas-path.h | 2 +- src/mme/emm-handler.c | 24 +-- src/mme/emm-sm.c | 93 ++++++----- src/mme/esm-sm.c | 4 +- src/mme/mme-context.c | 8 +- src/mme/mme-fd-path.c | 232 +++++++++++++++------------ src/mme/mme-fd-path.h | 6 +- src/mme/mme-gn-handler.c | 4 +- src/mme/mme-s11-handler.c | 17 +- src/mme/mme-s6a-handler.c | 10 ++ src/mme/mme-sm.c | 46 +++--- src/mme/nas-path.c | 66 ++++---- src/mme/nas-path.h | 9 +- src/mme/sgsap-handler.c | 4 +- tests/attach/crash-test.c | 305 +++++++++++++++++++++++++++++++++++- tests/common/nas-path.c | 2 + tests/common/s1ap-handler.c | 12 ++ 19 files changed, 630 insertions(+), 247 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index a35425206d..8972db01f7 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1440,7 +1440,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, amf_ue->explict_de_registered.n1_done = true; if (amf_ue->explict_de_registered.sbi_done == true) { - r = ngap_send_ran_ue_context_release_command(amf_ue->ran_ue, + r = ngap_send_ran_ue_context_release_command(ran_ue, NGAP_Cause_PR_misc, NGAP_CauseMisc_om_intervention, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); diff --git a/src/amf/nas-path.c b/src/amf/nas-path.c index aa341c55ad..7ddb346662 100644 --- a/src/amf/nas-path.c +++ b/src/amf/nas-path.c @@ -41,13 +41,12 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) } int nas_5gs_send_to_downlink_nas_transport( - ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) + ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf) { int rv; ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(ran_ue_cycle(ran_ue)); - ogs_assert(amf_ue_cycle(amf_ue)); ogs_assert(pkbuf); ngapbuf = ngap_build_downlink_nas_transport(ran_ue, pkbuf, false, false); @@ -211,7 +210,7 @@ int nas_5gs_send_registration_reject( return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -290,8 +289,7 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue) rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_5gs_send_to_downlink_nas_transport( - amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); } } @@ -316,7 +314,7 @@ int nas_5gs_send_service_reject( return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -351,8 +349,7 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport( - amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); if (rv != OGS_OK) { ogs_error("nas_5gs_send_to_downlink_nas_transport() failed"); return rv; @@ -410,8 +407,7 @@ int nas_5gs_send_de_registration_request( ogs_timer_start(amf_ue->t3522.timer, amf_timer_cfg(AMF_TIMER_T3522)->duration); - rv = nas_5gs_send_to_downlink_nas_transport( - amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -453,8 +449,7 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3570.timer, amf_timer_cfg(AMF_TIMER_T3570)->duration); - rv = nas_5gs_send_to_downlink_nas_transport( - amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -498,7 +493,7 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REQ); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -529,7 +524,7 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REJECT); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -571,7 +566,7 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3560.timer, amf_timer_cfg(AMF_TIMER_T3560)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -632,7 +627,7 @@ int nas_5gs_send_configuration_update_command( amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_MM_CONF_UPDATE); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -887,7 +882,7 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -1004,7 +999,7 @@ int nas_5gs_send_dl_nas_transport(ran_ue_t *ran_ue, amf_sess_t *sess, ogs_error("gmm_build_dl_nas_transport() failed"); return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; diff --git a/src/amf/nas-path.h b/src/amf/nas-path.h index 0c86ca35ae..a1a8816a17 100644 --- a/src/amf/nas-path.h +++ b/src/amf/nas-path.h @@ -30,7 +30,7 @@ extern "C" { int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); int nas_5gs_send_to_downlink_nas_transport( - ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); + ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf); int nas_5gs_send_registration_accept(amf_ue_t *amf_ue); int nas_5gs_send_registration_reject( diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 7fbaecb906..7620f50562 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -63,7 +63,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, ogs_assert(esm_message_container); if (!esm_message_container->length) { ogs_error("No ESM Message Container"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -143,7 +143,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, /* Send Attach Reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -187,7 +187,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, "but Integrity[0x%x] cannot be bypassed with EIA0", mme_selected_enc_algorithm(mme_ue), mme_selected_int_algorithm(mme_ue)); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -210,7 +210,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -358,7 +358,7 @@ int emm_handle_attach_complete( return OGS_ERROR; } - r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + r = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -391,7 +391,7 @@ int emm_handle_identity_response( ogs_error("mobile_identity length (%d != %d)", (int)sizeof(ogs_nas_mobile_identity_imsi_t), mobile_identity->length); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -404,7 +404,7 @@ int emm_handle_identity_response( emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -417,7 +417,7 @@ int emm_handle_identity_response( if (mme_ue->imsi_len != OGS_MAX_IMSI_LEN) { ogs_error("Invalid IMSI LEN[%d]", mme_ue->imsi_len); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -656,8 +656,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, /* Send TAU reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject( - mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); + r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; @@ -793,8 +793,8 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue, /* Send TAU reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject( - mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); + r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 55d51ce9ba..c35b142f06 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -318,7 +318,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (state != EMM_COMMON_STATE_REGISTERED) { ogs_info("Service request : Not registered[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -336,7 +336,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_info("Service request : Unknown UE"); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -346,7 +346,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -356,7 +356,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { ogs_error("No Session Context : IMSI[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -366,7 +366,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) { ogs_error("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -413,7 +413,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } OGS_FSM_TRAN(s, &emm_state_authentication); @@ -455,7 +455,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -474,7 +474,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } OGS_FSM_TRAN(s, &emm_state_authentication); @@ -502,7 +502,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_warn("No SGSN route matching RAI[MCC:%u MNC:%u LAC:%u RAC:%u]", ogs_plmn_id_mcc(&plmn_id), ogs_plmn_id_mnc(&plmn_id), rai.lai.lac, rai.rac); - r = nas_eps_send_tau_reject(mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -514,7 +514,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_info("TAU request : Unknown UE"); - r = nas_eps_send_tau_reject(mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -524,7 +524,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_tau_reject(mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -534,7 +534,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) { ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_tau_reject(mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -543,7 +543,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(mme_ue)) { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_authentication); break; } @@ -686,7 +686,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_warn("Extended Service request : Unknown UE"); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -696,7 +696,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -706,7 +706,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -726,7 +726,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -753,7 +753,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } else { ogs_warn(" Unknown CSFB Service Type[%d]", mme_ue->nas_eps.service.value); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -771,7 +771,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -796,7 +796,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } else { ogs_warn(" Unknown CSFB Service Type[%d]", mme_ue->nas_eps.service.value); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -830,7 +830,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_warn("Detach request : Unknown UE"); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -839,7 +839,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -924,6 +924,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_nas_eps_message_t *message = NULL; ogs_assert(s); @@ -944,6 +945,9 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_cycle(mme_ue->enb_ue); + ogs_assert(enb_ue); + switch (message->emm.h.message_type) { case OGS_NAS_EPS_AUTHENTICATION_RESPONSE: { @@ -1003,7 +1007,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EMM_CAUSE_SYNCH_FAILURE: ogs_info("Authentication failure(Synch failure)"); - mme_s6a_send_air(mme_ue, + mme_s6a_send_air(enb_ue, mme_ue, authentication_failure_parameter); return; default: @@ -1030,7 +1034,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) break; } - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); OGS_FSM_TRAN(s, &emm_state_authentication); break; case OGS_NAS_EPS_EMM_STATUS: @@ -1050,7 +1054,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_warn("Detach request : Unknown UE"); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1059,7 +1063,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1120,6 +1124,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_nas_eps_message_t *message = NULL; ogs_nas_security_header_type_t h; @@ -1144,10 +1149,13 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_cycle(mme_ue->enb_ue); + ogs_assert(enb_ue); + if (message->emm.h.security_header_type == OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { ogs_debug("Service request"); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1207,7 +1215,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) /* Create New GUTI */ mme_ue_new_guti(mme_ue); - mme_s6a_send_ulr(mme_ue); + mme_s6a_send_ulr(enb_ue, mme_ue); if (mme_ue->next.m_tmsi) { OGS_FSM_TRAN(s, &emm_state_initial_context_setup); @@ -1234,12 +1242,12 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) break; } - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); OGS_FSM_TRAN(s, &emm_state_authentication); break; case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST: ogs_debug("Tracking area update request"); - r = nas_eps_send_tau_reject(mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1262,7 +1270,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_warn("Detach request : Unknown UE"); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1271,7 +1279,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1306,7 +1314,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) "Stop retransmission", mme_ue->imsi_bcd); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -1334,6 +1342,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) { int r, rv, xact_count; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_nas_eps_message_t *message = NULL; ogs_nas_security_header_type_t h; @@ -1354,12 +1363,15 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_cycle(mme_ue->enb_ue); + ogs_assert(enb_ue); + xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); if (message->emm.h.security_header_type == OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { ogs_debug("Service request"); - r = nas_eps_send_service_reject(mme_ue, + r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1489,7 +1501,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } OGS_FSM_TRAN(s, &emm_state_authentication); @@ -1512,7 +1524,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) if (!MME_UE_HAVE_IMSI(mme_ue)) { ogs_warn("Detach request : Unknown UE"); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1521,7 +1533,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_error("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_assert(OGS_OK == - nas_eps_send_service_reject(mme_ue, + nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); OGS_FSM_TRAN(s, &emm_state_exception); break; @@ -1580,7 +1592,8 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) ogs_timer_start(mme_ue->t3450.timer, mme_timer_cfg(MME_TIMER_T3450)->duration); - r = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + r = nas_eps_send_to_downlink_nas_transport( + mme_ue->enb_ue, emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1670,7 +1683,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -1689,7 +1702,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } OGS_FSM_TRAN(s, &emm_state_authentication); diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 75353d5942..f676beee09 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -143,7 +143,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) h.type = e->nas_type; if (h.integrity_protected == 0) { ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -160,7 +160,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index b612997ad3..0308c27dd0 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -4275,7 +4275,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); if (!bearer) { ogs_error("No Bearer : EBI[%d]", ebi); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4288,7 +4288,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4307,7 +4307,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (!bearer) { ogs_error("No Bearer : Linked-EBI[%d]", linked_eps_bearer_identity->eps_bearer_identity); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4426,7 +4426,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (!sess) { ogs_error("No Session : ESM message type[%d], PTI[%d]", message->esm.h.message_type, pti); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index b799c20e05..bd2b2684db 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -35,6 +35,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, struct sess_state { mme_ue_t *mme_ue; + enb_ue_t *enb_ue; struct timespec ts; /* Time of sending the message */ }; @@ -667,7 +668,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, } /* MME Sends Authentication Information Request to HSS */ -void mme_s6a_send_air(mme_ue_t *mme_ue, +void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter) { @@ -683,7 +684,15 @@ void mme_s6a_send_air(mme_ue_t *mme_ue, uint8_t resync[OGS_AUTS_LEN + OGS_RAND_LEN]; - ogs_assert(mme_ue); + if (!mme_ue_cycle(mme_ue)) { + ogs_error("UE(mme-ue) context has already been removed"); + return; + } + + if (!enb_ue_cycle(enb_ue)) { + ogs_error("S1 context has already been removed"); + return; + } ogs_debug("[MME] Authentication-Information-Request"); @@ -695,6 +704,7 @@ void mme_s6a_send_air(mme_ue_t *mme_ue, ogs_assert(sess_data); sess_data->mme_ue = mme_ue; + sess_data->enb_ue = enb_ue; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req); @@ -831,6 +841,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) mme_event_t *e = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_diam_s6a_message_t *s6a_message = NULL; ogs_diam_s6a_aia_message_t *aia_message = NULL; ogs_diam_e_utran_vector_t *e_utran_vector = NULL; @@ -867,6 +878,8 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) mme_ue = sess_data->mme_ue; ogs_assert(mme_ue); + enb_ue = sess_data->enb_ue; + ogs_assert(enb_ue); /* Set Authentication-Information Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1022,6 +1035,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); e->mme_ue = mme_ue; + e->enb_ue = enb_ue; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1078,7 +1092,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) } /* MME Sends Update Location Request to HSS */ -void mme_s6a_send_ulr(mme_ue_t *mme_ue) +void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int ret; @@ -1089,7 +1103,15 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue) struct session *session = NULL; ogs_nas_plmn_id_t nas_plmn_id; - ogs_assert(mme_ue); + if (!mme_ue_cycle(mme_ue)) { + ogs_error("UE(mme-ue) context has already been removed"); + return; + } + + if (!enb_ue_cycle(enb_ue)) { + ogs_error("S1 context has already been removed"); + return; + } ogs_debug("[MME] Update-Location-Request"); @@ -1097,6 +1119,7 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue) sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data); sess_data->mme_ue = mme_ue; + sess_data->enb_ue = enb_ue; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_ulr, MSGFL_ALLOC_ETEID, &req); @@ -1234,98 +1257,6 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue) ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); } -/* MME Sends Purge UE Request to HSS */ -void mme_s6a_send_pur(mme_ue_t *mme_ue) -{ - int ret; - - struct msg *req = NULL; - struct avp *avp; - union avp_value val; - struct sess_state *sess_data = NULL, *svg; - struct session *session = NULL; - - ogs_assert(mme_ue); - - ogs_debug("[MME] Purge-UE-Request"); - - /* Create the random value to store with the session */ - sess_data = ogs_calloc(1, sizeof(*sess_data)); - ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - - /* Create the request */ - ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req); - ogs_assert(ret == 0); - - /* Create a new session */ - #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" - ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, - CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); - ogs_assert(ret == 0); - ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); - ogs_assert(ret == 0); - - /* Set the Auth-Session-State AVP */ - ret = fd_msg_avp_new(ogs_diam_auth_session_state, 0, &avp); - ogs_assert(ret == 0); - val.i32 = OGS_DIAM_AUTH_SESSION_NO_STATE_MAINTAINED; - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); - - /* Set Origin-Host & Origin-Realm */ - ret = fd_msg_add_origin(req, 0); - ogs_assert(ret == 0); - - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); - - /* Set the User-Name AVP */ - ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (uint8_t *)mme_ue->imsi_bcd; - val.os.len = strlen(mme_ue->imsi_bcd); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); - - /* Set Vendor-Specific-Application-Id AVP */ - ret = ogs_diam_message_vendor_specific_appid_set( - req, OGS_DIAM_S6A_APPLICATION_ID); - ogs_assert(ret == 0); - - ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts); - ogs_assert(ret == 0); - - /* Keep a pointer to the session data for debug purpose, - * in real life we would not need it */ - svg = sess_data; - - /* Store this value in the session */ - ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); - ogs_assert(ret == 0); - ogs_assert(sess_data == 0); - - /* Send the request */ - ret = fd_msg_send(&req, mme_s6a_pua_cb, svg); - ogs_assert(ret == 0); - - /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); -} - /* MME received Update Location Answer from HSS */ static void mme_s6a_ula_cb(void *data, struct msg **msg) { @@ -1342,6 +1273,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) mme_event_t *e = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_diam_s6a_message_t *s6a_message = NULL; ogs_diam_s6a_ula_message_t *ula_message = NULL; ogs_subscription_data_t *subscription_data = NULL; @@ -1378,6 +1310,8 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) mme_ue = sess_data->mme_ue; ogs_assert(mme_ue); + enb_ue = sess_data->enb_ue; + ogs_assert(enb_ue); /* Set Update-Location Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1519,6 +1453,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); e->mme_ue = mme_ue; + e->enb_ue = enb_ue; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1579,6 +1514,107 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) return; } +/* MME Sends Purge UE Request to HSS */ +void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue) +{ + int ret; + + struct msg *req = NULL; + struct avp *avp; + union avp_value val; + struct sess_state *sess_data = NULL, *svg; + struct session *session = NULL; + + if (!mme_ue_cycle(mme_ue)) { + ogs_error("UE(mme-ue) context has already been removed"); + return; + } + + if (!enb_ue_cycle(enb_ue)) { + ogs_error("S1 context has already been removed"); + return; + } + + ogs_debug("[MME] Purge-UE-Request"); + + /* Create the random value to store with the session */ + sess_data = ogs_calloc(1, sizeof(*sess_data)); + ogs_assert(sess_data); + sess_data->mme_ue = mme_ue; + sess_data->enb_ue = enb_ue; + + /* Create the request */ + ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req); + ogs_assert(ret == 0); + + /* Create a new session */ + #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" + ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, + CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); + ogs_assert(ret == 0); + ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); + ogs_assert(ret == 0); + + /* Set the Auth-Session-State AVP */ + ret = fd_msg_avp_new(ogs_diam_auth_session_state, 0, &avp); + ogs_assert(ret == 0); + val.i32 = OGS_DIAM_AUTH_SESSION_NO_STATE_MAINTAINED; + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + + /* Set Origin-Host & Origin-Realm */ + ret = fd_msg_add_origin(req, 0); + ogs_assert(ret == 0); + + /* Set the Destination-Realm AVP */ + ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); + val.os.len = strlen(fd_g_config->cnf_diamrlm); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + + /* Set the User-Name AVP */ + ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (uint8_t *)mme_ue->imsi_bcd; + val.os.len = strlen(mme_ue->imsi_bcd); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + + /* Set Vendor-Specific-Application-Id AVP */ + ret = ogs_diam_message_vendor_specific_appid_set( + req, OGS_DIAM_S6A_APPLICATION_ID); + ogs_assert(ret == 0); + + ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts); + ogs_assert(ret == 0); + + /* Keep a pointer to the session data for debug purpose, + * in real life we would not need it */ + svg = sess_data; + + /* Store this value in the session */ + ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); + ogs_assert(ret == 0); + ogs_assert(sess_data == 0); + + /* Send the request */ + ret = fd_msg_send(&req, mme_s6a_pua_cb, svg); + ogs_assert(ret == 0); + + /* Increment the counter */ + ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_diam_logger_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); +} + /* MME received Purge UE Answer from HSS */ static void mme_s6a_pua_cb(void *data, struct msg **msg) { @@ -1595,6 +1631,7 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) mme_event_t *e = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_diam_s6a_message_t *s6a_message = NULL; ogs_diam_s6a_pua_message_t *pua_message = NULL; @@ -1630,6 +1667,8 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) mme_ue = sess_data->mme_ue; ogs_assert(mme_ue); + enb_ue = sess_data->enb_ue; + ogs_assert(enb_ue); /* Set Purge-UE Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1727,6 +1766,7 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); e->mme_ue = mme_ue; + e->enb_ue = enb_ue; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/mme/mme-fd-path.h b/src/mme/mme-fd-path.h index 4b455afcc3..68c571b454 100644 --- a/src/mme/mme-fd-path.h +++ b/src/mme/mme-fd-path.h @@ -30,13 +30,13 @@ int mme_fd_init(void); void mme_fd_final(void); /* MME Sends Authentication Information Request to HSS */ -void mme_s6a_send_air(mme_ue_t *mme_ue, +void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter); /* MME Sends Update Location Request to HSS */ -void mme_s6a_send_ulr(mme_ue_t *mme_ue); +void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue); /* MME Sends Purge UE Request to HSS */ -void mme_s6a_send_pur(mme_ue_t *mme_ue); +void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue); #ifdef __cplusplus } diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index f8485b5e80..b9b6a60c10 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -344,7 +344,7 @@ int mme_gn_handle_sgsn_context_response( if (resp->cause.u8 != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { ogs_error("[Gn] Rx SGSN Context Response cause:%u", resp->cause.u8); - rv = nas_eps_send_tau_reject(mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } @@ -434,7 +434,7 @@ int mme_gn_handle_sgsn_context_response( nack_and_reject: rv = mme_gtp1_send_sgsn_context_ack(mme_ue, gtp1_cause, xact); ogs_info("[%s] TAU Reject [OGS_NAS_EMM_CAUSE:%d]", mme_ue->imsi_bcd, emm_cause); - rv = nas_eps_send_tau_reject(mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 04b448da0d..0886541fec 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -160,7 +160,7 @@ void mme_s11_handle_create_session_response( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -228,7 +228,7 @@ void mme_s11_handle_create_session_response( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -236,7 +236,8 @@ void mme_s11_handle_create_session_response( } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { ogs_error("[%s] TAU reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_tau_reject(mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE); + r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + OGS_NAS_EMM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -266,7 +267,7 @@ void mme_s11_handle_create_session_response( mme_ue->imsi_bcd, bearer_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -286,7 +287,7 @@ void mme_s11_handle_create_session_response( ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -441,7 +442,7 @@ void mme_s11_handle_create_session_response( } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { /* 3GPP TS 23.401 D.3.6 step 13, 14: */ - mme_s6a_send_ulr(mme_ue); + mme_s6a_send_ulr(mme_ue->enb_ue, mme_ue); } else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) { ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); r = nas_eps_send_activate_default_bearer_context_request( @@ -680,7 +681,7 @@ void mme_s11_handle_delete_session_response( * of the detach accept from UE */ } else if (action == OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - mme_s6a_send_air(mme_ue, NULL); + mme_s6a_send_air(mme_ue->enb_ue, mme_ue, NULL); } } else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) { @@ -742,7 +743,7 @@ void mme_s11_handle_delete_session_response( &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index 2c138091b0..069900418b 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -118,6 +118,16 @@ uint8_t mme_s6a_handle_ula( return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; } } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { + ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd); + return OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK; + } + + if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) { + ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd); + return OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED; + } + r = nas_eps_send_tau_accept(mme_ue, S1AP_ProcedureCode_id_InitialContextSetup); ogs_expect(r == OGS_OK); diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index dc5b101b3f..6962e4266b 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -566,6 +566,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) goto cleanup; } + enb_ue = enb_ue_cycle(e->enb_ue); + /* + * The 'enb_ue' context is not checked + * because the status is checked in the sending routine. + */ + switch (s6a_message->cmd_code) { case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION"); @@ -573,12 +579,8 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", mme_ue->imsi_bcd, emm_cause); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); - if (!enb_ue) { - ogs_error("S1 context has already been removed"); - break; - } - r = nas_eps_send_attach_reject(mme_ue, emm_cause, + r = nas_eps_send_attach_reject( + enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -594,21 +596,29 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_debug("OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION"); emm_cause = mme_s6a_handle_ula(mme_ue, s6a_message); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { - ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", - mme_ue->imsi_bcd, emm_cause); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); - if (!enb_ue) { - ogs_error("S1 context has already been removed"); - break; - } - r = nas_eps_send_attach_reject(mme_ue, emm_cause, - OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", + mme_ue->imsi_bcd, emm_cause); + r = nas_eps_send_attach_reject( + enb_ue, mme_ue, emm_cause, + OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + ogs_info("[%s] TAU reject [OGS_NAS_EMM_CAUSE:%d]", + mme_ue->imsi_bcd, emm_cause); + r = nas_eps_send_tau_reject( + enb_ue, mme_ue, emm_cause); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else + ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type); r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); + mme_ue_cycle(enb_ue->mme_ue) ? + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE : + S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index c31e41f1c2..bf8cd8095b 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -76,32 +76,27 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue, return rv; } -int nas_eps_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf) +int nas_eps_send_to_downlink_nas_transport( + enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf) { int rv; ogs_pkbuf_t *s1apbuf = NULL; ogs_assert(pkbuf); - if (!mme_ue_cycle(mme_ue)) { - ogs_error("UE(mme-ue) context has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } - - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_cycle(enb_ue)) { ogs_error("S1 context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - s1apbuf = s1ap_build_downlink_nas_transport(mme_ue->enb_ue, pkbuf); + s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf); if (!s1apbuf) { ogs_error("s1ap_build_downlink_nas_transport() failed"); return OGS_ERROR; } - rv = nas_eps_send_to_enb(mme_ue, s1apbuf); + rv = s1ap_send_to_enb_ue(enb_ue, s1apbuf); ogs_expect(rv == OGS_OK); return rv; @@ -183,7 +178,7 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue) return rv; } -int nas_eps_send_attach_reject(mme_ue_t *mme_ue, +int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause) { int rv; @@ -195,7 +190,7 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue, return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_cycle(enb_ue)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -218,7 +213,7 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue, ogs_error("emm_build_attach_reject() failed"); return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -260,7 +255,7 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3470.timer, mme_timer_cfg(MME_TIMER_T3470)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -302,7 +297,7 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -344,7 +339,7 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -373,7 +368,7 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -415,7 +410,7 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3422.timer, mme_timer_cfg(MME_TIMER_T3422)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -447,7 +442,7 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); if (rv != OGS_OK) { ogs_error("nas_eps_send_to_downlink_nas_transport() failed"); return rv; @@ -485,7 +480,7 @@ int nas_eps_send_pdn_connectivity_reject( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* During the UE-attach process, we'll send Attach-Reject * with pyggybacking PDN-connectivity-Reject */ - rv = nas_eps_send_attach_reject(mme_ue, + rv = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_ESM_FAILURE, esm_cause); if (rv != OGS_OK) { ogs_error("nas_eps_send_attach_reject() failed"); @@ -504,7 +499,7 @@ int nas_eps_send_pdn_connectivity_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -549,7 +544,7 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer) ogs_timer_start(bearer->t3489.timer, mme_timer_cfg(MME_TIMER_T3489)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -691,7 +686,7 @@ int nas_eps_send_modify_bearer_context_request( rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -763,7 +758,7 @@ int nas_eps_send_bearer_resource_allocation_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -794,7 +789,7 @@ int nas_eps_send_bearer_resource_modification_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -847,7 +842,7 @@ int nas_eps_send_tau_accept( rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport) { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); } else ogs_assert_if_reached(); @@ -855,7 +850,8 @@ int nas_eps_send_tau_accept( return rv; } -int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause) +int nas_eps_send_tau_reject( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause) { int rv; ogs_pkbuf_t *emmbuf = NULL; @@ -865,7 +861,7 @@ int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause) return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_cycle(enb_ue)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -879,14 +875,14 @@ int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; } -int nas_eps_send_service_reject(mme_ue_t *mme_ue, - ogs_nas_emm_cause_t emm_cause) +int nas_eps_send_service_reject( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause) { int rv; ogs_pkbuf_t *emmbuf = NULL; @@ -896,7 +892,7 @@ int nas_eps_send_service_reject(mme_ue_t *mme_ue, return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_cycle(enb_ue)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -910,7 +906,7 @@ int nas_eps_send_service_reject(mme_ue_t *mme_ue, return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -939,7 +935,7 @@ int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -972,7 +968,7 @@ int nas_eps_send_downlink_nas_transport( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; diff --git a/src/mme/nas-path.h b/src/mme/nas-path.h index 3e31834854..fc8de96b72 100644 --- a/src/mme/nas-path.h +++ b/src/mme/nas-path.h @@ -30,10 +30,10 @@ int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf); int nas_eps_send_emm_to_esm( mme_ue_t *mme_ue, ogs_nas_esm_message_container_t *esm_message_container); int nas_eps_send_to_downlink_nas_transport( - mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf); + enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf); int nas_eps_send_attach_accept(mme_ue_t *mme_ue); -int nas_eps_send_attach_reject(mme_ue_t *mme_ue, +int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause); int nas_eps_send_identity_request(mme_ue_t *mme_ue); @@ -64,10 +64,11 @@ int nas_eps_send_bearer_resource_modification_reject( int nas_eps_send_tau_accept( mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode); -int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause); +int nas_eps_send_tau_reject( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause); int nas_eps_send_service_reject( - mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause); int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue); int nas_eps_send_downlink_nas_transport( diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index 2e4ef767d4..ea0384a78f 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -124,7 +124,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) return; error: - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -210,7 +210,7 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); } - r = nas_eps_send_attach_reject(mme_ue, + r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/tests/attach/crash-test.c b/tests/attach/crash-test.c index 9f2ea24220..a6654657ba 100644 --- a/tests/attach/crash-test.c +++ b/tests/attach/crash-test.c @@ -103,15 +103,318 @@ static void test3_func(abts_case *tc, void *data) } #endif +static void test4_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf0; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.epco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, OGS_NAS_EPS_UPDATE_TYPE_TA_UPDATING, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Service Request */ + emmbuf = testemm_build_service_request(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Service Reject */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id; + + /* TAU Reject */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete for TAU Reject */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UEContextReleaseComplete for Service Reject */ + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id; + + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + abts_suite *test_crash(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); abts_run_test(suite, test2_func, NULL); -#if 0 +#if 0 /* Commenting to suppress error messages */ abts_run_test(suite, test3_func, NULL); #endif + abts_run_test(suite, test4_func, NULL); return suite; } diff --git a/tests/common/nas-path.c b/tests/common/nas-path.c index 8db4a2d02f..f46bb50912 100644 --- a/tests/common/nas-path.c +++ b/tests/common/nas-path.c @@ -165,6 +165,8 @@ void testemm_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf) testemm_handle_tau_accept(test_ue, &message.emm.tracking_area_update_accept); break; + case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT: + break; case OGS_NAS_EPS_EMM_INFORMATION: break; case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION: diff --git a/tests/common/s1ap-handler.c b/tests/common/s1ap-handler.c index f371999f73..62e1e475c7 100644 --- a/tests/common/s1ap-handler.c +++ b/tests/common/s1ap-handler.c @@ -47,6 +47,7 @@ void tests1ap_handle_downlink_nas_transport( S1AP_DownlinkNASTransport_IEs_t *ie = NULL; S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL; + S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; S1AP_NAS_PDU_t *NAS_PDU = NULL; ogs_assert(test_ue); @@ -64,6 +65,9 @@ void tests1ap_handle_downlink_nas_transport( case S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID: MME_UE_S1AP_ID = &ie->value.choice.MME_UE_S1AP_ID; break; + case S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID: + ENB_UE_S1AP_ID = &ie->value.choice.ENB_UE_S1AP_ID; + break; case S1AP_ProtocolIE_ID_id_NAS_PDU: NAS_PDU = &ie->value.choice.NAS_PDU; break; @@ -74,6 +78,8 @@ void tests1ap_handle_downlink_nas_transport( if (MME_UE_S1AP_ID) test_ue->mme_ue_s1ap_id = *MME_UE_S1AP_ID; + if (ENB_UE_S1AP_ID) + test_ue->enb_ue_s1ap_id = *ENB_UE_S1AP_ID; if (NAS_PDU) tests1ap_send_to_nas(test_ue, NAS_PDU); @@ -91,6 +97,7 @@ void tests1ap_handle_initial_context_setup_request( S1AP_InitialContextSetupRequestIEs_t *ie = NULL; S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL; + S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; S1AP_NAS_PDU_t *NAS_PDU = NULL; S1AP_E_RABToBeSetupListCtxtSUReq_t *E_RABToBeSetupListCtxtSUReq = NULL; @@ -109,6 +116,9 @@ void tests1ap_handle_initial_context_setup_request( case S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID: MME_UE_S1AP_ID = &ie->value.choice.MME_UE_S1AP_ID; break; + case S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID: + ENB_UE_S1AP_ID = &ie->value.choice.ENB_UE_S1AP_ID; + break; case S1AP_ProtocolIE_ID_id_E_RABToBeSetupListCtxtSUReq: E_RABToBeSetupListCtxtSUReq = &ie->value.choice.E_RABToBeSetupListCtxtSUReq; @@ -120,6 +130,8 @@ void tests1ap_handle_initial_context_setup_request( if (MME_UE_S1AP_ID) test_ue->mme_ue_s1ap_id = *MME_UE_S1AP_ID; + if (ENB_UE_S1AP_ID) + test_ue->enb_ue_s1ap_id = *ENB_UE_S1AP_ID; for (i = 0; i < E_RABToBeSetupListCtxtSUReq->list.count; i++) { S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t *ie2 = NULL; From 7063d853e7fe42a1984dda68b3cbad143b193215 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 17 Mar 2024 10:30:04 +0900 Subject: [PATCH 043/323] [SBI] Preamble parsing issues in MIME (#3058) When building the MIME Multipart Media Encapsulation format within an SBI message in the NF of a third-party product, Open5GS does not parse properly if it contains a Preamble CRLF. For example, ``` TCP/HTTP2 Stream: Data, Stream ID: 1, Length 841 MIME Multipart Media Encapsulation, Type: multipart/related, Boundary: "gc0pJq08jU534c" --->Preamble: 0d0a First boundary: --gc0pJq08jU534c\r\n Encapsulated multipart part: (application/json) Boundary: \r\n--gc0pJq08jU534c\r\n Encapsulated multipart part: (application/vnd.3gpp.5gnas) Boundary: \r\n--gc0pJq08jU534c\r\n Encapsulated multipart part: (application/vnd.3gpp.ngap) Last Boundary: \r\n--gc0pJq08jU534c--\r\n ``` --- lib/sbi/message.c | 19 +++- tests/unit/sbi-message-test.c | 188 ++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+), 5 deletions(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index f7c99a4b3f..cedb76be65 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -2627,7 +2627,7 @@ static int parse_multipart( ogs_sbi_message_t *message, ogs_sbi_http_message_t *http) { char *boundary = NULL; - int i; + int i, preamble; multipart_parser_settings settings; multipart_parser_data_t data; @@ -2643,19 +2643,23 @@ static int parse_multipart( settings.on_part_data = &on_part_data; settings.on_part_data_end = &on_part_data_end; - for (i = 0; i < http->content_length; i++) { + preamble = 0; + if (http->content[0] == '\r' && http->content[1] == '\n') + preamble = 2; + + for (i = preamble; i < (http->content_length-preamble); i++) { if (http->content[i] == '\r' && http->content[i+1] == '\n') break; } - if (i >= http->content_length) { + if (i >= (http->content_length-preamble)) { ogs_error("Invalid HTTP content [%d]", i); ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)http->content, http->content_length); return OGS_ERROR; } - boundary = ogs_strndup(http->content, i); + boundary = ogs_strndup(http->content+preamble, i-preamble); ogs_assert(boundary); parser = multipart_parser_init(boundary, &settings); @@ -2663,7 +2667,8 @@ static int parse_multipart( memset(&data, 0, sizeof(data)); multipart_parser_set_data(parser, &data); - multipart_parser_execute(parser, http->content, http->content_length); + multipart_parser_execute(parser, + http->content+preamble, http->content_length-preamble); multipart_parser_free(parser); ogs_free(boundary); @@ -2788,6 +2793,10 @@ static bool build_multipart( } last = p + OGS_MAX_SDU_LEN; +#if SBI_MIME_PREAMBLE_CRLF /* Preamble CLRF */ + p = ogs_slprintf(p, last, "\r\n"); +#endif + /* First boundary */ p = ogs_slprintf(p, last, "--%s\r\n", boundary); diff --git a/tests/unit/sbi-message-test.c b/tests/unit/sbi-message-test.c index 8d0c91457b..357fa0cf22 100644 --- a/tests/unit/sbi-message-test.c +++ b/tests/unit/sbi-message-test.c @@ -18,6 +18,7 @@ */ #include "ogs-sbi.h" +#include "contrib/multipart_parser.h" #include "core/abts.h" static void sbi_message_test1(abts_case *tc, void *data) @@ -834,6 +835,192 @@ static void sbi_message_test9(abts_case *tc, void *data) ogs_free(decoded); } +typedef struct multipart_parser_data_s { + int num_of_part; + struct { + char *content_type; + char *content_id; + char *content; + size_t content_length; + } part[OGS_SBI_MAX_NUM_OF_PART]; + + char *header_field; +} multipart_parser_data_t; + +static int on_header_field( + multipart_parser *parser, const char *at, size_t length) +{ + return 0; +} + +static int on_header_value( + multipart_parser *parser, const char *at, size_t length) +{ + return 0; +} + +static int on_part_data( + multipart_parser *parser, const char *at, size_t length) +{ + return 0; +} + +static int on_part_data_end(multipart_parser *parser) +{ + multipart_parser_data_t *data = NULL; + + ogs_assert(parser); + data = multipart_parser_get_data(parser); + ogs_assert(data); + + if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART) { + data->num_of_part++; + } + + return 0; +} +static void sbi_message_test10(abts_case *tc, void *param) +{ +#define TEST_SBI_MAX_MESSAGE 16 + ogs_pkbuf_t *pkbuf = NULL; + const char *payload[TEST_SBI_MAX_MESSAGE] = { + /* No Preamble CRLF */ + "2d2d3d2d42" + "5876585878326357 4276755951577237 45573477513d3d0d 0a436f6e74656e74" + "2d547970653a2061 70706c6963617469 6f6e2f6a736f6e0d 0a0d0a7b0a092273" + "757069223a092269 6d73692d32303630 3135353030303030 303030222c0a0922" + "706569223a092269 6d656973762d3433 3730383136313235 383136313531222c" + "0a09227064755365 7373696f6e496422 3a09312c0a092264 6e6e223a09226465" + "6d6f2e6e6f6b6961 2e6d6e633030312e 6d63633230362e67 707273222c0a0922" + "734e73736169223a 097b0a0909227373 74223a09312c0a09 09227364223a0922" + "616263646566220a 097d2c0a09227365 7276696e674e6649 64223a0922333037" + "63653332342d6434 32372d343165652d 393235392d353339 6262383833363465" + "32222c0a09226775 616d69223a097b0a 090922706c6d6e49 64223a097b0a0909" + "09226d6363223a09 22323036222c0a09 0909226d6e63223a 09223031220a0909" + "7d2c0a090922616d 664964223a092230 3230303430220a09 7d2c0a0922736572" + "76696e674e657477 6f726b223a097b0a 0909226d6363223a 0922323036222c0a" + "0909226d6e63223a 09223031220a097d 2c0a09226e31536d 4d7367223a097b0a" + "090922636f6e7465 6e744964223a0922 35676e61732d736d 220a097d2c0a0922" + "616e54797065223a 0922334750505f41 4343455353222c0a 0922726174547970" + "65223a09224e5222 2c0a092275654c6f 636174696f6e223a 097b0a0909226e72" + "4c6f636174696f6e 223a097b0a090909 22746169223a097b 0a0909090922706c" + "6d6e4964223a097b 0a0909090909226d 6363223a09223230 36222c0a09090909" + "09226d6e63223a09 223031220a090909 097d2c0a09090909 22746163223a0922" + "303030303032220a 0909097d2c0a0909 09226e636769223a 097b0a0909090922" + "706c6d6e4964223a 097b0a0909090909 226d6363223a0922 323036222c0a0909" + "090909226d6e6322 3a09223031220a09 0909097d2c0a0909 0909226e7243656c" + "6c4964223a092230 3030303030303130 220a0909097d2c0a 0909092275654c6f" + "636174696f6e5469 6d657374616d7022 3a0922323032342d 30322d3235543231" + "3a34363a35332e31 34383839305a220a 09097d0a097d2c0a 0922756554696d65" + "5a6f6e65223a0922 2b30303a3030222c 0a0922736d436f6e 7465787453746174" + "7573557269223a09 22687474703a2f2f 31302e35302e312e 323a383038302f6e" + "616d662d63616c6c 6261636b2f76312f 696d73692d323036 3031353530303030" + "303030302f736d2d 636f6e746578742d 7374617475732f31 222c0a0922706366" + "4964223a09226238 3666613934652d64 3432352d34316565 2d623030302d3133" + "6265303937343265 3539220a7d0d0a2d 2d3d2d4258765858 7832635742767559" + "5157723745573477 513d3d0d0a436f6e 74656e742d49643a 2035676e61732d73" + "6d0d0a436f6e7465 6e742d547970653a 206170706c696361 74696f6e2f766e64" + "2e336770702e3567 6e61730d0a0d0a2e 0101c1ffff91a128 01007b000780000a" + "00000d000d0a2d2d 3d2d425876585878 3263574276755951 5772374557347751" + "3d3d2d2d0d0a", + + "0d0a" /* WITH Preamble CRLF */ + "2d2d67" + "6330704a7130386a 55353334630d0a43 6f6e74656e742d54 7970653a20617070" + "6c69636174696f6e 2f6a736f6e0d0a0d 0a7b226e314d6573 73616765436f6e74" + "61696e6572223a7b 226e314d65737361 6765436c61737322 3a22534d222c226e" + "314d657373616765 436f6e74656e7422 3a7b22636f6e7465 6e744964223a226e" + "31436f6e74656e74 496431227d7d2c22 6e32496e666f436f 6e7461696e657222" + "3a7b226e32496e66 6f726d6174696f6e 436c617373223a22 534d222c22736d49" + "6e666f223a7b2270 647553657373696f 6e4964223a312c22 6e32496e666f436f" + "6e74656e74223a7b 226e676170496554 797065223a225044 555f5245535f5345" + "5455505f52455122 2c226e6761704461 7461223a7b22636f 6e74656e74496422" + "3a226e32436f6e74 656e74496431227d 7d2c22734e737361 69223a7b22737374" + "223a312c22736422 3a22414243444546 227d7d7d2c226c61 73744d7367496e64" + "69636174696f6e22 3a66616c73652c22 7064755365737369 6f6e4964223a312c" + "226e316e32466169 6c7572655478664e 6f74696655524922 3a22687474703a2f" + "2f312e312e312e31 3a36353532302f6e 616d662d636f6d6d 2f76312f75652d63" + "6f6e74657874732f 3030303135313230 222c22736d665265 616c6c6f63617469" + "6f6e496e64223a66 616c73657d0d0a2d 2d676330704a7130 386a55353334630d" + "0a436f6e74656e74 2d547970653a2061 70706c6963617469 6f6e2f766e642e33" + "6770702e35676e61 730d0a436f6e7465 6e742d49643a206e 31436f6e74656e74" + "4964310d0a0d0a2e 0101c21100090100 0631310101fe0106 0b00010b00012905" + "012b000801220401 abcdef7900060120 410101097b000f80 000d04d043fefe00" + "0d04d043ffff251e 0464656d6f056e6f 6b6961066d6e6330 3031066d63633230" + "3604677072730d0a 2d2d676330704a71 30386a5535333463 0d0a436f6e74656e" + "742d547970653a20 6170706c69636174 696f6e2f766e642e 336770702e6e6761" + "700d0a436f6e7465 6e742d49643a206e 32436f6e74656e74 4964310d0a0d0a00" + "00040082000a0c3b 9aca00303b9aca00 008b000a01f00101 0168003800000086" + "0001000088000700 010000091c000d0a 2d2d676330704a71 30386a5535333463" + "2d2d0d0a" + "", + + }; + uint16_t len[TEST_SBI_MAX_MESSAGE] = { + 1163, + 841, + 0, + }; + int num_of_part[TEST_SBI_MAX_MESSAGE] = { + 2, + 3, + 0, + }; + char hexbuf[OGS_HUGE_LEN]; + + char *boundary = NULL; + int i, num; + + multipart_parser_settings settings; + multipart_parser_data_t data; + + multipart_parser *parser = NULL; + + for (num = 0; num < 2; num++) { + int preamble = 0; + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_put_data(pkbuf, + ogs_hex_from_string(payload[num], hexbuf, sizeof(hexbuf)), len[num]); + + memset(&settings, 0, sizeof(settings)); + settings.on_header_field = &on_header_field; + settings.on_header_value = &on_header_value; + settings.on_part_data = &on_part_data; + settings.on_part_data_end = &on_part_data_end; + + if (pkbuf->data[0] == '\r' && pkbuf->data[1] == '\n') + preamble = 2; + + for (i = preamble; i < (pkbuf->len-preamble); i++) { + if (pkbuf->data[i] == '\r' && pkbuf->data[i+1] == '\n') + break; + } + + ogs_assert(i < pkbuf->len); + + boundary = ogs_strndup((char *)pkbuf->data+preamble, i-preamble); + ogs_assert(boundary); + + parser = multipart_parser_init(boundary, &settings); + ogs_assert(parser); + + memset(&data, 0, sizeof(data)); + multipart_parser_set_data(parser, &data); + multipart_parser_execute(parser, + (char *)pkbuf->data+preamble, pkbuf->len-preamble); + + multipart_parser_free(parser); + ogs_free(boundary); + + ogs_assert(data.num_of_part <= OGS_SBI_MAX_NUM_OF_PART); + + ABTS_INT_EQUAL(tc, num_of_part[num], data.num_of_part); + + ogs_pkbuf_free(pkbuf); + } +} + abts_suite *test_sbi_message(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -847,6 +1034,7 @@ abts_suite *test_sbi_message(abts_suite *suite) abts_run_test(suite, sbi_message_test7, NULL); abts_run_test(suite, sbi_message_test8, NULL); abts_run_test(suite, sbi_message_test9, NULL); + abts_run_test(suite, sbi_message_test10, NULL); return suite; } From 4ee3ea08c4523e16d85ae988baa37909060ba0f6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 18 Mar 2024 06:49:28 +0900 Subject: [PATCH 044/323] Add special sponsors mobi --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 7d7637c5cf..6ce235a621 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,16 @@ Please follow the [documentation](https://open5gs.org/open5gs/docs/) at [open5gs If you find Open5GS useful for work, please consider supporting this Open Source project by [Becoming a sponsor](https://github.com/sponsors/acetcom). To manage the funding transactions transparently, you can donate through [OpenCollective](https://opencollective.com/open5gs). +<p align="center"> + <h3 align="center">Special Sponsor</h3> +</p> + +<p align="center"> + <a target="_blank" href="https://mobi.com"> + <img alt="special sponsor mobi" src="https://open5gs.org/assets/img/mobi-open5GS.png" width="400"> + </a> +</p> + <p align="center"> <a target="_blank" href="https://open5gs.org/#sponsors"> <img alt="sponsors" src="https://open5gs.org/assets/img/sponsors.svg"> From f66c65b9cf4d66fecd8a32f5e71b269e74f425b3 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 14 Mar 2024 15:11:09 +0100 Subject: [PATCH 045/323] [SBI] Fix handling "dnn" URL parameter Split handling discovery and other URL parameters into 2 distinct sets, to prevent bugs with overlaps. --- lib/sbi/message.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index cedb76be65..3e663a144a 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -856,9 +856,10 @@ int ogs_sbi_parse_request( ogs_uint64_from_string(v); discovery_option_presence = true; } + } /* URL Query Parameter */ - } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) { + if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) { message->param.nf_id = ogs_hash_this_val(hi); } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_TYPE)) { message->param.nf_type = From 10a0647f09cd29966e1e356c35851b5b8cf41272 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 19 Mar 2024 16:00:47 +0100 Subject: [PATCH 046/323] [SMF] Gy: Tear down session when CCR-Update is rejected by OCS --- src/smf/gsm-sm.c | 21 +++++++++++++++++++++ src/smf/gy-handler.c | 9 ++++----- src/smf/gy-handler.h | 2 +- src/smf/smf-sm.c | 18 +----------------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 3b938a65be..7c8b30d0f1 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -716,6 +716,9 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_xact_t *pfcp_xact = NULL; ogs_pfcp_message_t *pfcp_message = NULL; + ogs_diam_gy_message_t *gy_message = NULL; + uint32_t diam_err; + ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; @@ -829,6 +832,24 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) } break; + case SMF_EVT_GY_MESSAGE: + gy_message = e->gy_message; + ogs_assert(gy_message); + + switch(gy_message->cmd_code) { + case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: + switch (gy_message->cc_request_type) { + case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: + ogs_assert(e->pfcp_xact); + diam_err = smf_gy_handle_cca_update_request(sess, gy_message, e->pfcp_xact); + if (diam_err != ER_DIAMETER_SUCCESS) + OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); + break; + } + break; + } + break; + case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index d3480e2044..dd754501f2 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -149,7 +149,7 @@ uint32_t smf_gy_handle_cca_initial_request( return ER_DIAMETER_SUCCESS; } -void smf_gy_handle_cca_update_request( +uint32_t smf_gy_handle_cca_update_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_pfcp_xact_t *pfcp_xact) { @@ -175,10 +175,8 @@ void smf_gy_handle_cca_update_request( if (gy_message->result_code != ER_DIAMETER_SUCCESS) { ogs_warn("Gy CCA Update Diameter failure: res=%u err=%u", gy_message->result_code, *gy_message->err); - // TODO: generate new gtp_xact from sess here? */ - //ogs_assert(OGS_OK == - // smf_epc_pfcp_send_session_deletion_request(sess, gtp_xact)); - return; + return gy_message->err ? *gy_message->err : + ER_DIAMETER_AUTHENTICATION_REJECTED; } bearer = smf_default_bearer_in_sess(sess); @@ -234,6 +232,7 @@ void smf_gy_handle_cca_update_request( OGS_GTP1_CAUSE_REACTIACTION_REQUESTED); ogs_assert(rv == OGS_OK); } + return ER_DIAMETER_SUCCESS; } uint32_t smf_gy_handle_cca_termination_request( diff --git a/src/smf/gy-handler.h b/src/smf/gy-handler.h index 87983b9c3e..019d9b29d9 100644 --- a/src/smf/gy-handler.h +++ b/src/smf/gy-handler.h @@ -30,7 +30,7 @@ extern "C" { uint32_t smf_gy_handle_cca_initial_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_gtp_xact_t *gtp_xact); -void smf_gy_handle_cca_update_request( +uint32_t smf_gy_handle_cca_update_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_pfcp_xact_t *pfcp_xact); uint32_t smf_gy_handle_cca_termination_request( diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index d81cded0ab..60fc8f0a8f 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -328,23 +328,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: - switch(gy_message->cc_request_type) { - case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_fsm_dispatch(&sess->sm, e); - break; - case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: - ogs_assert(e->pfcp_xact); - smf_gy_handle_cca_update_request( - sess, gy_message, e->pfcp_xact); - break; - case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST: - ogs_fsm_dispatch(&sess->sm, e); - break; - default: - ogs_error("Not implemented(%d)", gy_message->cc_request_type); - break; - } - + ogs_fsm_dispatch(&sess->sm, e); break; case OGS_DIAM_GY_CMD_RE_AUTH: smf_gy_handle_re_auth_request(sess, gy_message); From 32a275b9a831b43236ea29dd9c60daeadab8422b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 19 Mar 2024 17:06:24 +0100 Subject: [PATCH 047/323] [SMF] smf_gy_send_ccr: Allow NULL xact The xact may well be NULL, eg. when tearin down the session (send_ccr_termination_req_gx_gy_s6b()) because OCS rejected an update: Hence there's no GTP xact originating the tear down, aka e->gtp-xact passed to the function is NULL. smf_gx_send_ccr() is already handling this case properly, contrary to smf_gf_send_ccr(). --- src/smf/gy-path.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 7f09b889ed..db1827111d 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -612,7 +612,6 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact, const char *service_context_id = "32251@3gpp.org"; uint32_t timestamp, req_slot; - ogs_assert(xact); ogs_assert(sess); ogs_assert(sess->ipv4 || sess->ipv6); From ea122da9fc076b6005c07ca5163c26d895f3f93c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 19 Mar 2024 17:11:21 +0100 Subject: [PATCH 048/323] [SMF] Allow Gy CCA event to contain NULL gtp_xact This happens for instance when the session is terminated due to a rejection coming from the OCS, hence no originating GTP xact producing the tear down. --- src/smf/gsm-sm.c | 1 - src/smf/gy-handler.c | 1 - 2 files changed, 2 deletions(-) diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 7c8b30d0f1..d1226ca9ea 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -1486,7 +1486,6 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e) case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch(gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST: - ogs_assert(e->gtp_xact); diam_err = smf_gy_handle_cca_termination_request(sess, gy_message, e->gtp_xact); sess->sm_data.gy_ccr_term_in_flight = false; diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index dd754501f2..159d7f63c5 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -241,7 +241,6 @@ uint32_t smf_gy_handle_cca_termination_request( { ogs_assert(sess); ogs_assert(gy_message); - ogs_assert(gtp_xact); ogs_debug("[SMF] Delete Session Response"); ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]", From e1820e4e54647720db7a9ed04dffb554ed7ca793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Gradi=C5=A1ar?= <120629867+matejGradisar@users.noreply.github.com> Date: Wed, 20 Mar 2024 23:07:25 +0100 Subject: [PATCH 049/323] UE context transfer (#3052) * [SBI] Handle and store AMF info * [SBI] Add "target GUAMI" discovery option * [SBI] Handle UeContextTransfer request and response messages * [AMF] Handle NF discovery from AMF to AMF * [AMF] Add UE Context Transfer Request/Response from AMF to AMF * [SCP] Handle UeContextTransfer * Follow-up on #3052 * [AMF] force authentication after 'Ue context transfer' for now * [AMF] force authentication after 'Ue context transfer' for now --------- Co-authored-by: Sukchan Lee <acetcom@gmail.com> --- lib/nas/5gs/types.c | 18 ++ lib/nas/5gs/types.h | 2 + lib/proto/types.h | 5 +- lib/sbi/context.c | 38 +++- lib/sbi/context.h | 6 +- lib/sbi/message.c | 120 ++++++++++++- lib/sbi/message.h | 13 ++ lib/sbi/nnrf-handler.c | 103 +++++++++++ lib/sbi/ogs-sbi.h | 2 + lib/sbi/path.c | 27 +++ src/amf/amf-sm.c | 17 ++ src/amf/context.c | 100 +++++++++++ src/amf/context.h | 1 + src/amf/gmm-handler.c | 237 +++++++++++++++++++++++++ src/amf/gmm-handler.h | 1 + src/amf/gmm-sm.c | 121 +++++++++++++ src/amf/meson.build | 1 + src/amf/namf-build.c | 100 +++++++++++ src/amf/namf-build.h | 36 ++++ src/amf/namf-handler.c | 393 +++++++++++++++++++++++++++++++++++++++++ src/amf/namf-handler.h | 4 + src/amf/sbi-path.c | 2 + src/nrf/nnrf-handler.c | 7 + src/scp/sbi-path.c | 3 + 24 files changed, 1352 insertions(+), 5 deletions(-) create mode 100644 src/amf/namf-build.c create mode 100644 src/amf/namf-build.h diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index 18d739e7ec..ce0d65f512 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -968,3 +968,21 @@ int ogs_nas_parse_qos_rules( return (int)(rule-first); } + +bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti) +{ + if ((guti->amf_id.region !=0) && + (guti->amf_id.set2 !=0) && + (guti->m_tmsi != 0) && + ((guti->nas_plmn_id.mcc1) !=0 || + (guti->nas_plmn_id.mcc2) !=0 || + (guti->nas_plmn_id.mcc3) !=0) && + ((guti->nas_plmn_id.mnc1) !=0 || + (guti->nas_plmn_id.mnc2) !=0 || + (guti->nas_plmn_id.mnc3) !=0)) { + + return true; + } + + return false; +} diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index cc35611dbc..8262f616b0 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -1192,6 +1192,8 @@ typedef struct ogs_nas_rsn_s { uint8_t value; } __attribute__ ((packed)) ogs_nas_rsn_t; +bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti); + #ifdef __cplusplus } #endif diff --git a/lib/proto/types.h b/lib/proto/types.h index e081bea74e..1c186d7f26 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -85,6 +85,8 @@ extern "C" { #define OGS_MAX_NUM_OF_ALGORITHM 8 +#define OGS_MAX_5G_GUTI_LEN 28 + #define OGS_MAX_NUM_OF_SERVED_GUMMEI 8 /* maxnoofRATs: 8 */ #define OGS_MAX_NUM_OF_SERVED_GUAMI 256 /* maxnoofServedGUAMIs: 256 */ #define OGS_MAX_NUM_OF_SUPPORTED_TA 256 /* maxnoofTACs: 256 */ @@ -271,10 +273,11 @@ ogs_amf_id_t *ogs_amf_id_build(ogs_amf_id_t *amf_id, #define OGS_PROTECTION_SCHEME_PROFILE_B 2 /************************************ - * SUPI/GPSI */ + * SUPI/GPSI/GUTI */ #define OGS_ID_SUPI_TYPE_IMSI "imsi" #define OGS_ID_GPSI_TYPE_MSISDN "msisdn" #define OGS_ID_SUPI_TYPE_IMEISV "imeisv" +#define OGS_ID_5G_GUTI_TYPE "5g-guti" char *ogs_id_get_type(const char *str); char *ogs_id_get_value(const char *str); diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 87c47a5743..daa84d60b0 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -29,6 +29,7 @@ static OGS_POOL(xact_pool, ogs_sbi_xact_t); static OGS_POOL(subscription_spec_pool, ogs_sbi_subscription_spec_t); static OGS_POOL(subscription_data_pool, ogs_sbi_subscription_data_t); static OGS_POOL(smf_info_pool, ogs_sbi_smf_info_t); +static OGS_POOL(amf_info_pool, ogs_sbi_amf_info_t); static OGS_POOL(nf_info_pool, ogs_sbi_nf_info_t); void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type) @@ -61,6 +62,7 @@ void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type) ogs_pool_init(&subscription_data_pool, ogs_app()->pool.subscription); ogs_pool_init(&smf_info_pool, ogs_app()->pool.nf); + ogs_pool_init(&amf_info_pool, ogs_app()->pool.nf); ogs_pool_init(&nf_info_pool, ogs_app()->pool.nf * OGS_MAX_NUM_OF_NF_INFO); @@ -107,6 +109,7 @@ void ogs_sbi_context_final(void) ogs_pool_final(&nf_instance_pool); ogs_pool_final(&nf_service_pool); ogs_pool_final(&smf_info_pool); + ogs_pool_final(&amf_info_pool); ogs_pool_final(&nf_info_pool); @@ -1530,7 +1533,13 @@ ogs_sbi_nf_info_t *ogs_sbi_nf_info_add( static void amf_info_free(ogs_sbi_amf_info_t *amf_info) { - /* Nothing */ + ogs_assert(amf_info); + + amf_info->num_of_guami = 0; + amf_info->num_of_nr_tai = 0; + amf_info->num_of_nr_tai_range = 0; + + ogs_pool_free(&amf_info_pool, amf_info); } static void smf_info_free(ogs_sbi_smf_info_t *smf_info) @@ -1621,6 +1630,26 @@ ogs_sbi_nf_info_t *ogs_sbi_nf_info_find( return NULL; } +bool ogs_sbi_check_amf_info_guami( + ogs_sbi_amf_info_t *amf_info, ogs_guami_t *guami) +{ + int i; + + ogs_assert(amf_info); + ogs_assert(guami); + + for (i = 0; i < amf_info->num_of_guami; i++) { + if ((memcmp(&amf_info->guami[i].amf_id, &guami->amf_id, + sizeof(ogs_amf_id_t)) == 0) && + (memcmp(&amf_info->guami[i].plmn_id, &guami->plmn_id, + OGS_PLMN_ID_LEN) == 0)) { + return true; + } + } + + return false; +} + bool ogs_sbi_check_smf_info_slice( ogs_sbi_smf_info_t *smf_info, ogs_s_nssai_t *s_nssai, char *dnn) { @@ -1964,6 +1993,13 @@ bool ogs_sbi_discovery_option_is_matched( } switch (nf_info->nf_type) { + case OpenAPI_nf_type_AMF: + if (requester_nf_type == OpenAPI_nf_type_AMF && + discovery_option->target_guami && + ogs_sbi_check_amf_info_guami(&nf_info->amf, + discovery_option->target_guami) == false) + return false; + break; case OpenAPI_nf_type_SMF: if (discovery_option->num_of_snssais && discovery_option->dnn && ogs_sbi_check_smf_info_slice(&nf_info->smf, diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 2537403ca2..1c22f7c476 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -341,8 +341,8 @@ typedef struct ogs_sbi_sepp_info_s { } ogs_sbi_sepp_info_t; typedef struct ogs_sbi_amf_info_s { - int amf_set_id; - int amf_region_id; + uint8_t amf_set_id; + uint16_t amf_region_id; int num_of_guami; ogs_guami_t guami[OGS_MAX_NUM_OF_SERVED_GUAMI]; @@ -437,6 +437,8 @@ void ogs_sbi_nf_info_remove_all(ogs_list_t *list); ogs_sbi_nf_info_t *ogs_sbi_nf_info_find( ogs_list_t *list, OpenAPI_nf_type_e nf_type); +bool ogs_sbi_check_amf_info_guami( + ogs_sbi_amf_info_t *amf_info, ogs_guami_t *guami); bool ogs_sbi_check_smf_info_slice( ogs_sbi_smf_info_t *smf_info, ogs_s_nssai_t *s_nssai, char *dnn); bool ogs_sbi_check_smf_info_tai( diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 3e663a144a..07f5ce3098 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -189,6 +189,10 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message) OpenAPI_sec_negotiate_req_data_free(message->SecNegotiateReqData); if (message->SecNegotiateRspData) OpenAPI_sec_negotiate_rsp_data_free(message->SecNegotiateRspData); + if (message->UeContextTransferReqData) + OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData); + if (message->UeContextTransferRspData) + OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData); /* HTTP Part */ for (i = 0; i < message->num_of_part; i++) { @@ -282,6 +286,7 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) int i; ogs_sbi_request_t *request = NULL; OpenAPI_nf_type_e nf_type = OpenAPI_nf_type_NULL; + char sender_timestamp[OGS_SBI_RFC7231_DATE_LEN]; char *max_rsp_time = NULL; @@ -389,6 +394,18 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID, discovery_option->requester_nf_instance_id); } + if (discovery_option->target_guami) { + char *v = ogs_sbi_discovery_option_build_guami(discovery_option); + if (v) { + ogs_sbi_header_set(request->http.params, + OGS_SBI_PARAM_GUAMI, v); + ogs_free(v); + } else { + ogs_warn("build failed: service-names[%d:%s]", + discovery_option->num_of_service_names, + discovery_option->service_names[0]); + } + } if (ogs_sbi_self()->discovery_config.no_service_names == false && discovery_option->num_of_service_names) { @@ -817,9 +834,14 @@ int ogs_sbi_parse_request( ogs_sbi_discovery_option_parse_snssais(discovery_option, v); discovery_option_presence = true; } + } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_GUAMI)) { + char *v = ogs_hash_this_val(hi); + if (v) { + ogs_sbi_discovery_option_parse_guami(discovery_option, v); + discovery_option_presence = true; + } } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) { char *v = ogs_hash_this_val(hi); - if (v) { ogs_sbi_discovery_option_set_dnn(discovery_option, v); discovery_option_presence = true; @@ -1340,6 +1362,14 @@ static char *build_json(ogs_sbi_message_t *message) item = OpenAPI_sec_negotiate_rsp_data_convertToJSON( message->SecNegotiateRspData); ogs_assert(item); + } else if (message->UeContextTransferReqData) { + item = OpenAPI_ue_context_transfer_req_data_convertToJSON( + message->UeContextTransferReqData); + ogs_assert(item); + } else if (message->UeContextTransferRspData) { + item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON( + message->UeContextTransferRspData); + ogs_assert(item); } if (item) { @@ -2082,6 +2112,27 @@ static int parse_json(ogs_sbi_message_t *message, } break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + if (message->res_status == 0) { + message->UeContextTransferReqData = + OpenAPI_ue_context_transfer_req_data_parseFromJSON(item); + if (!message->UeContextTransferReqData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) { + message->UeContextTransferRspData = + OpenAPI_ue_context_transfer_rsp_data_parseFromJSON(item); + if (!message->UeContextTransferRspData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", + message->res_status); + } + break; + DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name [%s]", @@ -2889,6 +2940,8 @@ void ogs_sbi_discovery_option_free( ogs_free(discovery_option->requester_nf_instance_id); if (discovery_option->dnn) ogs_free(discovery_option->dnn); + if (discovery_option->target_guami) + ogs_free(discovery_option->target_guami); for (i = 0; i < discovery_option->num_of_service_names; i++) ogs_free(discovery_option->service_names[i]); @@ -3129,6 +3182,71 @@ void ogs_sbi_discovery_option_parse_snssais( ogs_free(v); } +char *ogs_sbi_discovery_option_build_guami( + ogs_sbi_discovery_option_t *discovery_option) +{ + OpenAPI_guami_t *Guami = NULL; + cJSON *guamiItem = NULL; + char *v = NULL; + + ogs_assert(discovery_option); + ogs_assert(discovery_option->target_guami); + + Guami = ogs_sbi_build_guami(discovery_option->target_guami); + ogs_assert(Guami); + guamiItem = OpenAPI_guami_convertToJSON(Guami); + ogs_assert(guamiItem); + ogs_sbi_free_guami(Guami); + + v = cJSON_PrintUnformatted(guamiItem); + ogs_expect(v); + cJSON_Delete(guamiItem); + + return v; +} + +void ogs_sbi_discovery_option_parse_guami( + ogs_sbi_discovery_option_t *discovery_option, char *guami) +{ + OpenAPI_guami_t *Guami = NULL; + cJSON *guamItem = NULL; + char *v = NULL; + + ogs_assert(discovery_option); + ogs_assert(guami); + + v = ogs_sbi_url_decode(guami); + if (!v) { + ogs_error("ogs_sbi_url_decode() failed : guami[%s]", guami); + return; + } + + guamItem = cJSON_Parse(v); + if (!guamItem) { + ogs_error("Cannot parse guami[%s]", guami); + ogs_free(v); + return; + } + + Guami = OpenAPI_guami_parseFromJSON(guamItem); + + if (Guami) { + ogs_guami_t *ogs_guami = NULL; + + discovery_option->target_guami = ogs_malloc(sizeof(*ogs_guami)); + ogs_assert(discovery_option->target_guami); + + ogs_sbi_parse_guami(discovery_option->target_guami, Guami); + OpenAPI_guami_free(Guami); + } else { + ogs_error("OpenAPI_guami_parseFromJSON() failed : guami[%s]", + guami); + } + cJSON_Delete(guamItem); + + ogs_free(v); +} + void ogs_sbi_discovery_option_set_tai( ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai) { diff --git a/lib/sbi/message.h b/lib/sbi/message.h index 5ea06e6979..b295f3195c 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -124,6 +124,7 @@ extern "C" { #define OGS_SBI_RESOURCE_NAME_UE_CONTEXTS "ue-contexts" #define OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES "n1-n2-messages" +#define OGS_SBI_RESOURCE_NAME_TRANSFER "transfer" #define OGS_SBI_RESOURCE_NAME_SM_CONTEXT_STATUS "sm-context-status" #define OGS_SBI_RESOURCE_NAME_AM_POLICY_NOTIFY "am-policy-notify" @@ -295,6 +296,8 @@ extern "C" { OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_PLMN_LIST #define OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_FEATURES \ OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_FEATURES +#define OGS_SBI_CUSTOM_DISCOVERY_GUAMI \ + OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_GUAMI #define OGS_SBI_CUSTOM_PRODUCER_ID \ OGS_SBI_CUSTOM_3GPP_COMMON "Producer-Id" #define OGS_SBI_CUSTOM_OCI \ @@ -330,6 +333,7 @@ extern "C" { #define OGS_SBI_PARAM_PLMN_ID "plmn-id" #define OGS_SBI_PARAM_SINGLE_NSSAI "single-nssai" #define OGS_SBI_PARAM_SNSSAI "snssai" +#define OGS_SBI_PARAM_GUAMI "guami" #define OGS_SBI_PARAM_SNSSAIS "snssais" #define OGS_SBI_PARAM_TAI "tai" #define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \ @@ -431,6 +435,8 @@ typedef struct ogs_sbi_discovery_option_s { bool tai_presence; ogs_5gs_tai_t tai; + ogs_guami_t *target_guami; + int num_of_target_plmn_list; ogs_plmn_id_t target_plmn_list[OGS_MAX_NUM_OF_PLMN]; int num_of_requester_plmn_list; @@ -542,6 +548,8 @@ typedef struct ogs_sbi_message_s { OpenAPI_smf_registration_t *SmfRegistration; OpenAPI_sec_negotiate_req_data_t *SecNegotiateReqData; OpenAPI_sec_negotiate_rsp_data_t *SecNegotiateRspData; + OpenAPI_ue_context_transfer_req_data_t *UeContextTransferReqData; + OpenAPI_ue_context_transfer_rsp_data_t *UeContextTransferRspData; ogs_sbi_links_t *links; @@ -641,6 +649,11 @@ char *ogs_sbi_discovery_option_build_snssais( void ogs_sbi_discovery_option_parse_snssais( ogs_sbi_discovery_option_t *discovery_option, char *snssais); +char *ogs_sbi_discovery_option_build_guami( + ogs_sbi_discovery_option_t *discovery_option); +void ogs_sbi_discovery_option_parse_guami( + ogs_sbi_discovery_option_t *discovery_option, char *guami); + void ogs_sbi_discovery_option_set_tai( ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai); char *ogs_sbi_discovery_option_build_tai( diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 36f2b69754..3279cd4af0 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -27,6 +27,8 @@ static void handle_scp_info( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_scp_info_t *ScpInfo); static void handle_sepp_info( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_sepp_info_t *SeppInfo); +static void handle_amf_info( + ogs_sbi_nf_instance_t *nf_instance, OpenAPI_amf_info_t *AmfInfo); void ogs_nnrf_nfm_handle_nf_register( ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_message_t *recvmsg) @@ -256,7 +258,14 @@ void ogs_nnrf_nfm_handle_nf_profile( if (SmfInfoMap && SmfInfoMap->value) handle_smf_info(nf_instance, SmfInfoMap->value); } + if (NFProfile->amf_info) + handle_amf_info(nf_instance, NFProfile->amf_info); + OpenAPI_list_for_each(NFProfile->amf_info_list, node) { + OpenAPI_map_t *AmfInfoMap = node->data; + if (AmfInfoMap && AmfInfoMap->value) + handle_amf_info(nf_instance, AmfInfoMap->value); + } if (NFProfile->scp_info) handle_scp_info(nf_instance, NFProfile->scp_info); if (NFProfile->sepp_info) @@ -653,6 +662,100 @@ static void handle_sepp_info( } } +static void handle_amf_info( + ogs_sbi_nf_instance_t *nf_instance, OpenAPI_amf_info_t *AmfInfo) +{ + ogs_sbi_nf_info_t *nf_info = NULL; + OpenAPI_list_t *GuamiList = NULL; + OpenAPI_guami_t *GuamiAmfInfoItem = NULL; + OpenAPI_list_t *TaiList = NULL; + OpenAPI_tai_t *TaiItem = NULL; + OpenAPI_list_t *TaiRangeList = NULL; + OpenAPI_tai_range_t *TaiRangeItem = NULL; + OpenAPI_list_t *TacRangeList = NULL; + OpenAPI_tac_range_t *TacRangeItem = NULL; + OpenAPI_lnode_t *node = NULL, *node2 = NULL; + + ogs_assert(nf_instance); + ogs_assert(AmfInfo); + + nf_info = ogs_sbi_nf_info_add( + &nf_instance->nf_info_list, OpenAPI_nf_type_AMF); + ogs_assert(nf_info); + + nf_info->amf.amf_set_id = ogs_uint64_from_string(AmfInfo->amf_set_id); + nf_info->amf.amf_region_id = ogs_uint64_from_string(AmfInfo->amf_region_id); + GuamiList = AmfInfo->guami_list; + + OpenAPI_list_for_each(GuamiList, node) { + GuamiAmfInfoItem = node->data; + if (GuamiAmfInfoItem) { + ogs_assert(nf_info->amf.num_of_guami < OGS_MAX_NUM_OF_SERVED_GUAMI); + + if (GuamiAmfInfoItem->amf_id && GuamiAmfInfoItem->plmn_id && + GuamiAmfInfoItem->plmn_id->mnc && + GuamiAmfInfoItem->plmn_id->mcc) { + + ogs_sbi_parse_guami( + &nf_info->amf.guami[nf_info->amf.num_of_guami], + GuamiAmfInfoItem); + nf_info->amf.num_of_guami++; + } + } + } + + TaiList = AmfInfo->tai_list; + OpenAPI_list_for_each(TaiList, node) { + TaiItem = node->data; + if (TaiItem && TaiItem->plmn_id && TaiItem->tac) { + ogs_5gs_tai_t *nr_tai = NULL; + ogs_assert(nf_info->amf.num_of_nr_tai < OGS_MAX_NUM_OF_TAI); + nr_tai = &nf_info->amf.nr_tai[nf_info->amf.num_of_nr_tai]; + ogs_assert(nr_tai); + ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); + nr_tai->tac = ogs_uint24_from_string(TaiItem->tac); + nf_info->amf.num_of_nr_tai++; + } + } + + TaiRangeList = AmfInfo->tai_range_list; + OpenAPI_list_for_each(TaiRangeList, node) { + TaiRangeItem = node->data; + if (TaiRangeItem && TaiRangeItem->plmn_id && + TaiRangeItem->tac_range_list) { + ogs_assert(nf_info->amf.num_of_nr_tai_range < + OGS_MAX_NUM_OF_TAI); + + ogs_sbi_parse_plmn_id( + &nf_info->amf.nr_tai_range + [nf_info->amf.num_of_nr_tai_range].plmn_id, + TaiRangeItem->plmn_id); + + TacRangeList = TaiRangeItem->tac_range_list; + OpenAPI_list_for_each(TacRangeList, node2) { + TacRangeItem = node2->data; + if (TacRangeItem && + TacRangeItem->start && TacRangeItem->end) { + int tac_index = nf_info->amf.nr_tai_range + [nf_info->amf.num_of_nr_tai_range].num_of_tac_range; + ogs_assert(tac_index < OGS_MAX_NUM_OF_TAI); + + nf_info->amf.nr_tai_range + [nf_info->amf.num_of_nr_tai_range].start[tac_index] = + ogs_uint24_from_string(TacRangeItem->start); + nf_info->amf.nr_tai_range + [nf_info->amf.num_of_nr_tai_range].end[tac_index] = + ogs_uint24_from_string(TacRangeItem->end); + + nf_info->amf.nr_tai_range + [nf_info->amf.num_of_nr_tai_range].num_of_tac_range++; + } + } + nf_info->amf.num_of_nr_tai_range++; + } + } +} + static void handle_validity_time( ogs_sbi_subscription_data_t *subscription_data, char *validity_time, const char *action) diff --git a/lib/sbi/ogs-sbi.h b/lib/sbi/ogs-sbi.h index cafa2b7283..23cc63e798 100644 --- a/lib/sbi/ogs-sbi.h +++ b/lib/sbi/ogs-sbi.h @@ -84,6 +84,8 @@ #include "model/sec_negotiate_rsp_data.h" #include "model/patch_item.h" #include "model/ue_authentication_ctx.h" +#include "model/ue_context_transfer_req_data.h" +#include "model/ue_context_transfer_rsp_data.h" #include "custom/links.h" diff --git a/lib/sbi/path.c b/lib/sbi/path.c index b4451110bd..66dd8ef811 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -422,6 +422,33 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) discovery_option->tai.tac.v); } + if (discovery_option && discovery_option->target_guami) { + bool rc = false; + char *v = ogs_sbi_discovery_option_build_guami(discovery_option); + ogs_expect(v); + + if (v) { + char *encoded = ogs_sbi_url_encode(v); + ogs_expect(encoded); + + if (encoded) { + ogs_sbi_header_set(request->http.headers, + OGS_SBI_CUSTOM_DISCOVERY_GUAMI, encoded); + ogs_free(encoded); + + rc = true; + } + ogs_free(v); + } + + if (rc == false) + ogs_error("build failed: guami[PLMN_ID:%06x,AMF_ID:%x]", + ogs_plmn_id_hexdump( + &discovery_option->target_guami->plmn_id), + ogs_amf_id_hexdump( + &discovery_option->target_guami->amf_id)); + } + if (discovery_option && discovery_option->requester_features) { char *v = ogs_uint64_to_string( diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index ebd59e6ba3..22de3f8525 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -180,6 +180,22 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + SWITCH(sbi_message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + amf_namf_comm_handle_ue_context_transfer_request( + stream, &sbi_message); + break; + DEFAULT + ogs_error("Invalid HTTP method [%s]", + sbi_message.h.method); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, + "Invalid HTTP method", sbi_message.h.method)); + END + break; + DEFAULT ogs_error("Invalid resource name [%s]", sbi_message.h.resource.component[2]); @@ -375,6 +391,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) sbi_xact = e->h.sbi.data; ogs_assert(sbi_xact); diff --git a/src/amf/context.c b/src/amf/context.c index 12db2a8fc8..b8e7713b62 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -40,6 +40,7 @@ static void stats_add_ran_ue(void); static void stats_remove_ran_ue(void); static void stats_add_amf_session(void); static void stats_remove_amf_session(void); +static bool amf_namf_comm_parse_guti(ogs_nas_5gs_guti_t *guti, char *ue_context_id); void amf_context_init(void) { @@ -1955,6 +1956,105 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message) return amf_ue; } +static bool amf_namf_comm_parse_guti(ogs_nas_5gs_guti_t *guti, char *ue_context_id) +{ +#define MIN_LENGTH_OF_MNC 2 +#define MAX_LENGTH_OF_MNC 3 +#define LENGTH_OF_MCC 3 +#define LENGTH_OF_AMF_ID 6 +#define LENGTH_OF_TMSI 8 + + char amf_id_string[LENGTH_OF_AMF_ID + 1]; + char tmsi_string[LENGTH_OF_TMSI + 1]; + char mcc_string[LENGTH_OF_MCC + 1]; + char mnc_string[MAX_LENGTH_OF_MNC + 1]; + OpenAPI_plmn_id_t Plmn_id; + ogs_plmn_id_t plmn_id; + + /* TS29.518 6.1.3.2.2 Guti pattern (27 or 28 characters): + "5g-guti-[0-9]{5,6}[0-9a-fA-F]{14}" */ + + short index = 8; /* start parsing guti after "5g-guti-" */ + + strncpy(mcc_string, &ue_context_id[index], LENGTH_OF_MCC); + mcc_string[LENGTH_OF_MCC] = '\0'; + index += LENGTH_OF_MCC; + + if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN - 1) { + /* mnc is 2 characters long */ + mnc_string[MIN_LENGTH_OF_MNC] = '\0'; + strncpy(mnc_string, &ue_context_id[index], MIN_LENGTH_OF_MNC); + index += MIN_LENGTH_OF_MNC; + } else if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN) { + /* mnc is 3 characters long */ + mnc_string[MAX_LENGTH_OF_MNC] = '\0'; + strncpy(mnc_string, &ue_context_id[index], MAX_LENGTH_OF_MNC); + index += MAX_LENGTH_OF_MNC; + } else { + ogs_error("Invalid Ue context id"); + return false; + } + + strncpy(amf_id_string, &ue_context_id[index], LENGTH_OF_AMF_ID); + amf_id_string[LENGTH_OF_AMF_ID] = '\0'; + index += LENGTH_OF_AMF_ID; + + strncpy(tmsi_string, &ue_context_id[index], LENGTH_OF_TMSI); + tmsi_string[LENGTH_OF_TMSI] = '\0'; + + memset(&Plmn_id, 0, sizeof(Plmn_id)); + Plmn_id.mcc = mcc_string; + Plmn_id.mnc = mnc_string; + + memset(&plmn_id, 0, sizeof(plmn_id)); + ogs_sbi_parse_plmn_id(&plmn_id, &Plmn_id); + ogs_nas_from_plmn_id(&guti->nas_plmn_id, &plmn_id); + ogs_amf_id_from_string(&guti->amf_id, amf_id_string); + + guti->m_tmsi = (u_int32_t)strtol(tmsi_string, NULL, 16); + return true; +} + +amf_ue_t *amf_ue_find_by_ue_context_id(char *ue_context_id) +{ + amf_ue_t *amf_ue = NULL; + + ogs_assert(ue_context_id); + + if (strncmp(ue_context_id, OGS_ID_SUPI_TYPE_IMSI, + strlen(OGS_ID_SUPI_TYPE_IMSI)) == 0) { + + amf_ue = amf_ue_find_by_supi(ue_context_id); + if (!amf_ue) { + ogs_info("[%s] Unknown UE by SUPI", ue_context_id); + return NULL; + } + + } else if (strncmp(ue_context_id, OGS_ID_5G_GUTI_TYPE, + strlen(OGS_ID_5G_GUTI_TYPE)) == 0) { + + ogs_nas_5gs_guti_t guti; + memset(&guti, 0, sizeof(guti)); + + if (amf_namf_comm_parse_guti(&guti, ue_context_id) == false) { + ogs_error("amf_namf_comm_parse_guti() failed"); + return NULL; + } + + amf_ue = amf_ue_find_by_guti(&guti); + if (!amf_ue) { + ogs_info("[%s] Unknown UE by GUTI", ue_context_id); + return NULL; + } + + } else { + ogs_error("Unsupported UE context ID type"); + return NULL; + } + + return amf_ue; +} + void amf_ue_set_suci(amf_ue_t *amf_ue, ogs_nas_5gs_mobile_identity_t *mobile_identity) { diff --git a/src/amf/context.h b/src/amf/context.h index 83ab14b4a1..33bcd5d021 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -749,6 +749,7 @@ void amf_ue_fsm_fini(amf_ue_t *amf_ue); amf_ue_t *amf_ue_find_by_guti(ogs_nas_5gs_guti_t *nas_guti); amf_ue_t *amf_ue_find_by_suci(char *suci); amf_ue_t *amf_ue_find_by_supi(char *supi); +amf_ue_t *amf_ue_find_by_ue_context_id(char *ue_context_id); amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message); void amf_ue_set_suci(amf_ue_t *amf_ue, diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 4a57a6aa84..ba2cd86be0 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1520,6 +1520,243 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( return gmm_cause; } +static ogs_nas_5gmm_capability_t + amf_namf_comm_base64_decode_5gmm_capability(char *encoded) +{ + ogs_nas_5gmm_capability_t gmm_capability; + char *gmm_capability_octets_string = NULL; + uint8_t gmm_capability_iei = 0; + + memset(&gmm_capability, 0, sizeof(gmm_capability)); + gmm_capability_octets_string = + (char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char)); + ogs_assert(gmm_capability_octets_string); + + int len = ogs_base64_decode(gmm_capability_octets_string, encoded); + + if (len == 0) + ogs_error("Gmm capability not decoded"); + + ogs_assert(sizeof(gmm_capability_octets_string) <= + sizeof(gmm_capability) + 1); + + gmm_capability_iei = // not copied anywhere for now + gmm_capability_octets_string[0]; + if (gmm_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) { + ogs_error("Type of 5GMM capability IEI is incorrect"); + } + memcpy(&gmm_capability, + gmm_capability_octets_string + 1, + sizeof(gmm_capability)); + if (gmm_capability_octets_string) { + ogs_free(gmm_capability_octets_string); + } + + return gmm_capability; +} + +static ogs_nas_ue_security_capability_t + amf_namf_comm_base64_decode_ue_security_capability(char *encoded) +{ + ogs_nas_ue_security_capability_t ue_security_capability; + char *ue_security_capability_octets_string = NULL; + uint8_t ue_security_capability_iei = 0; + + memset(&ue_security_capability, 0, sizeof(ue_security_capability)); + ue_security_capability_octets_string = + (char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char)); + ogs_assert(ue_security_capability_octets_string); + + ogs_base64_decode(ue_security_capability_octets_string, encoded); + + ogs_assert(sizeof(ue_security_capability_octets_string) <= + sizeof(ogs_nas_ue_security_capability_t) + 1); + + ue_security_capability_iei = // not copied anywhere for now + ue_security_capability_octets_string[0]; + if (ue_security_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) { + ogs_error("UE security capability IEI is incorrect"); + } + + memcpy(&ue_security_capability, ue_security_capability_octets_string + 1, + sizeof(ue_security_capability)); + + if (ue_security_capability_octets_string) { + ogs_free(ue_security_capability_octets_string); + } + + return ue_security_capability; +} + +static void amf_namf_comm_decode_ue_mm_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) { + + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_for_each(MmContextList, node) { + + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *AllowedNssaiList = NULL; + OpenAPI_lnode_t *node1 = NULL; + OpenAPI_list_t *NssaiMappingList = NULL; + int num_of_s_nssai = 0; + int num_of_nssai_mapping = 0; + + MmContext = node->data; + + AllowedNssaiList = MmContext->allowed_nssai; + NssaiMappingList = MmContext->nssai_mapping_list; + + OpenAPI_list_for_each(AllowedNssaiList, node1) { + OpenAPI_snssai_t *AllowedNssai = node1->data; + + ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE); + + amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sst = + (uint8_t)AllowedNssai->sst; + amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sd = + ogs_s_nssai_sd_from_string(AllowedNssai->sd); + + num_of_s_nssai++; + amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai; + } + + OpenAPI_list_for_each(NssaiMappingList, node1) { + OpenAPI_nssai_mapping_t *NssaiMapping = node1->data; + OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai; + + ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE); + + amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. + mapped_hplmn_sst = HSnssai->sst; + amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. + mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd); + + num_of_nssai_mapping++; + } + + if (MmContext->ue_security_capability) { + amf_ue->ue_security_capability = + amf_namf_comm_base64_decode_ue_security_capability( + MmContext->ue_security_capability); + } + } +} + +static void amf_namf_comm_decode_ue_session_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList) +{ + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_for_each(SessionContextList, node) { + OpenAPI_pdu_session_context_t *PduSessionContext; + PduSessionContext = node->data; + amf_sess_t *sess = NULL; + + sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); + ogs_assert(sess); + + sess->sm_context_ref = PduSessionContext->sm_context_ref; + + if (PduSessionContext->s_nssai) { + memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); + + sess->s_nssai.sst = PduSessionContext->s_nssai->sst; + sess->s_nssai.sd = ogs_s_nssai_sd_from_string( + PduSessionContext->s_nssai->sd); + } + + if (PduSessionContext->dnn) + sess->dnn = ogs_strdup(PduSessionContext->dnn); + if (PduSessionContext->access_type) + amf_ue->nas.access_type = (int)PduSessionContext->access_type; + } +} + +int amf_namf_comm_handle_ue_context_transfer_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) +{ + OpenAPI_ue_context_t *UeContext = NULL; + +ogs_error("V funkciji amf_namf_comm_handle_ue_context_transfer_response"); + + if (!recvmsg->UeContextTransferRspData) { + ogs_error("No UeContextTransferRspData"); + return OGS_ERROR; + } + + if (!recvmsg->UeContextTransferRspData->ue_context) { + ogs_error("No UE context"); + return OGS_ERROR; + } + + UeContext = recvmsg->UeContextTransferRspData->ue_context; + + if (UeContext->supi) { + amf_ue_set_supi(amf_ue, UeContext->supi); + if (!UeContext->supi_unauth_ind){ + amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS; + } + } + + if (UeContext->pei) { + if (amf_ue->pei) + ogs_free(amf_ue->pei); + amf_ue->pei = ogs_strdup(UeContext->pei); + } + + if (UeContext->sub_ue_ambr) { + amf_ue->ue_ambr.downlink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink); + amf_ue->ue_ambr.uplink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink); + } + + if (UeContext->seaf_data) { + if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) { + amf_ue->nas.ue.tsc = + (UeContext->seaf_data->ng_ksi->tsc == OpenAPI_sc_type_NATIVE) ? 0 : 1; + amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi; + + ogs_ascii_to_hex( + UeContext->seaf_data->key_amf->key_val, + strlen(UeContext->seaf_data->key_amf->key_val), + amf_ue->kamf, + sizeof(amf_ue->kamf)); + } + } + + if (UeContext->_5g_mm_capability) { + ogs_nas_5gmm_capability_t gmm_capability; + + gmm_capability = amf_namf_comm_base64_decode_5gmm_capability( + UeContext->_5g_mm_capability); + amf_ue->gmm_capability.lte_positioning_protocol_capability = + (bool)gmm_capability.lte_positioning_protocol_capability; + amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach; + amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode; + } + + if (UeContext->pcf_id) { + /* TODO */ + } + + /* TODO UeContext->pcfAmPolicyUri */ + /* TODO UeContext->pcfUePolicyUri */ + + if (UeContext->mm_context_list) + amf_namf_comm_decode_ue_mm_context_list(amf_ue, UeContext->mm_context_list); + + if (UeContext->session_context_list) + amf_namf_comm_decode_ue_session_context_list(amf_ue, UeContext->session_context_list); + + /* TODO ueRadioCapability */ + + return OGS_OK; +} + static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id) { int i; diff --git a/src/amf/gmm-handler.h b/src/amf/gmm-handler.h index d89dd9f833..4cedf2077d 100644 --- a/src/amf/gmm-handler.h +++ b/src/amf/gmm-handler.h @@ -21,6 +21,7 @@ #define GMM_HANDLER_H #include "context.h" +#include "namf-handler.h" #ifdef __cplusplus extern "C" { diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 8972db01f7..522cf774aa 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -27,8 +27,10 @@ #include "nsmf-handler.h" #include "nudm-handler.h" #include "npcf-handler.h" +#include "namf-handler.h" #include "sbi-path.h" #include "amf-sm.h" +#include "namf-build.h" #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __gmm_log_domain @@ -62,6 +64,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) { amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; + ran_ue_t *ran_ue = NULL; ogs_sbi_message_t *sbi_message = NULL; @@ -546,6 +549,61 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); + + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { + r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); + ogs_expect(r == OGS_OK); + } + + int xact_count = amf_sess_xact_count(amf_ue); + + if (!AMF_UE_HAVE_SUCI(amf_ue)) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } + + amf_sbi_send_release_all_sessions( + amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate, + amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + + OGS_FSM_TRAN(s, &gmm_state_authentication); + + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid service name [%s]", sbi_message->h.service.name); ogs_assert_if_reached(); @@ -1136,6 +1194,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_nas_5gs_registration_request_t *registration_request = NULL; + ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL; + ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL; ogs_assert(e); @@ -1194,6 +1255,66 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; } + registration_request = &nas_message->gmm.registration_request; + mobile_identity = &registration_request->mobile_identity; + mobile_identity_header = + (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + + /* Check if registration is done with GUTI */ + if (mobile_identity_header && mobile_identity_header->type == + OGS_NAS_5GS_MOBILE_IDENTITY_GUTI && + ogs_nas_5gs_guti_is_valid(&amf_ue->current.guti)) { + + /* + * TS 23.502 + * 4.2.2.2.2 General Registration + * (Without UDSF Deployment): If the UE's 5G-GUTI was included in the + * Registration Request and the serving AMF has changed since last + * Registration procedure, the new AMF may invoke the + * Namf_Communication_UEContextTransfer service operation on the + * old AMF including the complete Registration Request NAS message, + * which may be integrity protected, as well as the Access Type, + * to request the UE's SUPI and UE Context. See clause 5.2.2.2.2 + * for details of this service operation. + */ + + int state = e->h.sbi.state; + bool serving_guami = false; + int i; + + /* Compare all serving guamis with guami from UE's GUTI */ + for (i = 0; i < amf_self()->num_of_served_guami; i++) { + if ((memcmp(&amf_self()->served_guami[i].amf_id, + &amf_ue->current.guti.amf_id, + sizeof(ogs_amf_id_t)) == 0) && + (memcmp(&amf_self()->served_guami[i].plmn_id, + &amf_ue->current.guti.nas_plmn_id, + OGS_PLMN_ID_LEN) == 0)) { + + serving_guami = true; + break; + } + } + if (!serving_guami) { + /* Guami from UE is not this AMF's serving guami - send UEContextTransfer */ + ogs_sbi_discovery_option_t *discovery_option = NULL; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + memcpy(discovery_option->target_guami, + amf_ue->guami, sizeof(ogs_guami_t)); + + int r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_ue_context_transfer, + amf_ue, state, nas_message); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } + } + if (!AMF_UE_HAVE_SUCI(amf_ue)) { CLEAR_AMF_UE_TIMER(amf_ue->t3570); r = nas_5gs_send_identity_request(amf_ue); diff --git a/src/amf/meson.build b/src/amf/meson.build index 3ec5041e55..88ab0bc44f 100644 --- a/src/amf/meson.build +++ b/src/amf/meson.build @@ -40,6 +40,7 @@ libamf_sources = files(''' nnrf-build.c nnrf-handler.c + namf-build.c namf-handler.c sbi-path.c diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c new file mode 100644 index 0000000000..72d423de65 --- /dev/null +++ b/src/amf/namf-build.c @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "namf-build.h" + +static char* ogs_guti_to_string(amf_ue_t *amf_ue) +{ + ogs_plmn_id_t plmn_id; + char plmn_id_buff[OGS_PLMNIDSTRLEN]; + char *amf_id = NULL; + char *tmsi = NULL; + char *guti = NULL; + + memset(&plmn_id, 0, sizeof(plmn_id)); + ogs_nas_to_plmn_id(&plmn_id, &amf_ue->current.guti.nas_plmn_id); + + amf_id = ogs_amf_id_to_string(&amf_ue->current.guti.amf_id); + tmsi = ogs_uint32_to_0string(*(amf_ue->current.m_tmsi)); + + guti = ogs_msprintf("5g-guti-%s%s%s", + ogs_plmn_id_to_string(&plmn_id, plmn_id_buff), + amf_id, + tmsi); + + /* TS29.518 6.1.3.2.2 Guti pattern (27 or 28 characters): + "5g-guti-[0-9]{5,6}[0-9a-fA-F]{14}" */ + ogs_assert(strlen(guti) == (OGS_MAX_5G_GUTI_LEN - 1) || + (strlen(guti)) == OGS_MAX_5G_GUTI_LEN); + + ogs_free(amf_id); + ogs_free(tmsi); + + return guti; +} + +static char* amf_ue_to_context_id(amf_ue_t *amf_ue) +{ + char *ue_context_id = NULL; + + if (amf_ue->supi) { + ue_context_id = ogs_strdup(amf_ue->supi); + } else { + ue_context_id = ogs_guti_to_string(amf_ue); + } + + return ue_context_id; +} + +ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( + amf_ue_t *amf_ue, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + OpenAPI_ue_context_transfer_req_data_t UeContextTransferReqData; + char *ue_context_id = NULL; + + ogs_assert(amf_ue); + + ue_context_id = amf_ue_to_context_id(amf_ue); + ogs_assert(ue_context_id); + + memset(&UeContextTransferReqData, 0, sizeof(UeContextTransferReqData)); + UeContextTransferReqData.access_type = amf_ue->nas.access_type; + UeContextTransferReqData.reason = amf_ue->nas.registration.value; + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NAMF_COMM; + message.h.api.version = (char *)OGS_SBI_API_V1; + message.h.resource.component[0] = + (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; + message.h.resource.component[1] = ue_context_id; + message.h.resource.component[2] = + (char *)OGS_SBI_RESOURCE_NAME_TRANSFER; + message.UeContextTransferReqData = &UeContextTransferReqData; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + if (ue_context_id) + ogs_free(ue_context_id); + + return request; +} diff --git a/src/amf/namf-build.h b/src/amf/namf-build.h new file mode 100644 index 0000000000..92cd716dcc --- /dev/null +++ b/src/amf/namf-build.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef AMF_NAMF_BUILD_H +#define AMF_NAMF_BUILD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "context.h" + +ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( + amf_ue_t *amf_ue, void *data); + +#ifdef __cplusplus +} +#endif + +#endif /* AMF_NAMF_BUILD_H */ diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index 43410c8ddb..2cc8c46d41 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1079,3 +1079,396 @@ int amf_namf_callback_handle_sdm_data_change_notify( return OGS_OK; } + +static char *amf_namf_comm_base64_encode_ue_security_capability( + ogs_nas_ue_security_capability_t ue_security_capability) +{ + char *enc = NULL; + int enc_len = 0; + + char num_of_octets = + ue_security_capability.length + + sizeof(ue_security_capability.length) + + sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE); + /* Security guarantee */ + num_of_octets = ogs_min( + num_of_octets, sizeof(ue_security_capability) + 1); + /* + * size [sizeof(ue_security_capability) + 1] is a sum of lengths: + * ue_security_capability (9 octets) + + * type (1 octet) + */ + char security_octets_string[sizeof(ue_security_capability) + 1]; + + enc_len = ogs_base64_encode_len(num_of_octets); + + enc = ogs_malloc(enc_len); + ogs_assert(enc); + memset(enc, 0, sizeof(*enc)); + + security_octets_string[0] = + (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE; + memcpy(security_octets_string + 1, &ue_security_capability, num_of_octets); + ogs_base64_encode(enc , security_octets_string, num_of_octets); + + return enc; +} + +static char *amf_namf_comm_base64_encode_5gmm_capability(amf_ue_t *amf_ue) +{ + ogs_nas_5gmm_capability_t nas_gmm_capability; + int enc_len = 0; + char *enc = NULL; + + memset(&nas_gmm_capability, 0, sizeof(nas_gmm_capability)); + + /* 1 octet is mandatory, n.3 from TS 24.501 V16.12.0, 9.11.3.1 */ + nas_gmm_capability.length = 1; + nas_gmm_capability.lte_positioning_protocol_capability = + amf_ue->gmm_capability.lte_positioning_protocol_capability; + nas_gmm_capability.ho_attach = amf_ue->gmm_capability.ho_attach; + nas_gmm_capability.s1_mode = amf_ue->gmm_capability.s1_mode; + + uint8_t num_of_octets = + nas_gmm_capability.length + + sizeof(nas_gmm_capability.length) + + sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); + + /* Security guarantee. + 1 stands for 5GMM capability IEI */ + num_of_octets = ogs_min( + num_of_octets, sizeof(ogs_nas_5gmm_capability_t) + 1); + + char gmm_capability_octets_string[sizeof(ogs_nas_5gmm_capability_t) + 1]; + + enc_len = ogs_base64_encode_len(num_of_octets); + enc = ogs_malloc(enc_len); + ogs_assert(enc); + memset(enc, 0, sizeof(*enc)); + + /* Fill the bytes of data */ + gmm_capability_octets_string[0] = + (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE; + memcpy(gmm_capability_octets_string + 1, &nas_gmm_capability, num_of_octets); + ogs_base64_encode(enc, gmm_capability_octets_string, num_of_octets); + + return enc; +} + +static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *amf_ue) +{ + ogs_assert(amf_ue); + + amf_sess_t *sess = NULL; + OpenAPI_list_t *PduSessionList = NULL; + OpenAPI_pdu_session_context_t *PduSessionContext = NULL; + OpenAPI_snssai_t *sNSSAI = NULL; + + PduSessionList = OpenAPI_list_create(); + ogs_assert(PduSessionList); + + ogs_list_for_each(&amf_ue->sess_list, sess) { + PduSessionContext = ogs_calloc(1, sizeof(*PduSessionContext)); + ogs_assert(PduSessionContext); + + sNSSAI = ogs_calloc(1, sizeof(*sNSSAI)); + ogs_assert(sNSSAI); + + PduSessionContext->pdu_session_id = sess->psi; + PduSessionContext->sm_context_ref = sess->sm_context_ref; + + sNSSAI->sst = sess->s_nssai.sst; + sNSSAI->sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + PduSessionContext->s_nssai = sNSSAI; + + PduSessionContext->dnn = sess->dnn; + PduSessionContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type; + + OpenAPI_list_add(PduSessionList, PduSessionContext); + } + + return PduSessionList; +} + +static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) +{ + OpenAPI_list_t *MmContextList = NULL; + OpenAPI_mm_context_t *MmContext = NULL; + + int i; + + ogs_assert(amf_ue); + + + MmContextList = OpenAPI_list_create(); + ogs_assert(MmContextList); + + MmContext = ogs_malloc(sizeof(*MmContext)); + ogs_assert(MmContext); + memset(MmContext, 0, sizeof(*MmContext)); + + MmContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type; + + if ((OpenAPI_ciphering_algorithm_e)amf_ue->selected_enc_algorithm && + (OpenAPI_integrity_algorithm_e)amf_ue->selected_int_algorithm) { + + OpenAPI_nas_security_mode_t *NasSecurityMode; + + NasSecurityMode = ogs_calloc(1, sizeof(*NasSecurityMode)); + ogs_assert(NasSecurityMode); + + NasSecurityMode->ciphering_algorithm = + (OpenAPI_ciphering_algorithm_e)amf_ue->selected_enc_algorithm; + NasSecurityMode->integrity_algorithm = + (OpenAPI_integrity_algorithm_e)amf_ue->selected_int_algorithm; + + MmContext->nas_security_mode = NasSecurityMode; + } + + if (amf_ue->dl_count > 0) { + MmContext->is_nas_downlink_count = true; + MmContext->nas_downlink_count = amf_ue->dl_count; + } + + if (amf_ue->ul_count.i32 > 0) { + MmContext->is_nas_uplink_count = true; + MmContext->nas_uplink_count = amf_ue->ul_count.i32; + } + + if (amf_ue->ue_security_capability.length > 0) { + MmContext->ue_security_capability = + amf_namf_comm_base64_encode_ue_security_capability( + amf_ue->ue_security_capability); + } + + if (amf_ue->allowed_nssai.num_of_s_nssai) { + + OpenAPI_list_t *AllowedNssaiList; + OpenAPI_list_t *NssaiMappingList; + + /* This IE shall be present if the source AMF and the target AMF are + * in the same PLMN and if available. When present, this IE shall + * contain the allowed NSSAI for the access type. + */ + AllowedNssaiList = OpenAPI_list_create(); + + /* This IE shall be present if the source AMF and the target AMF are + * in the same PLMN and if available. When present, this IE shall + * contain the mapping of the allowed NSSAI for the UE. + */ + NssaiMappingList = OpenAPI_list_create(); + + ogs_assert(AllowedNssaiList); + ogs_assert(NssaiMappingList); + + for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { + OpenAPI_snssai_t *AllowedNssai; + + AllowedNssai = ogs_calloc(1, sizeof(*AllowedNssai)); + ogs_assert(AllowedNssai); + + AllowedNssai->sst = amf_ue->allowed_nssai.s_nssai[i].sst; + AllowedNssai->sd = ogs_s_nssai_sd_to_string( + amf_ue->allowed_nssai.s_nssai[i].sd); + + OpenAPI_list_add(AllowedNssaiList, AllowedNssai); + } + + for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { + OpenAPI_nssai_mapping_t *NssaiMapping; + OpenAPI_snssai_t *HSnssai; + OpenAPI_snssai_t *MappedSnssai; + + NssaiMapping = ogs_calloc(1, sizeof(*NssaiMapping)); + ogs_assert(NssaiMapping); + + /* Indicates the S-NSSAI in home PLMN */ + HSnssai = ogs_calloc(1, sizeof(*HSnssai)); + ogs_assert(HSnssai); + + HSnssai->sst = + amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sst; + HSnssai->sd = + ogs_s_nssai_sd_to_string( + amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sd); + NssaiMapping->h_snssai = HSnssai; + + /* Indicates the mapped S-NSSAI in the serving PLMN */ + MappedSnssai = ogs_calloc(1, sizeof(*MappedSnssai)); + ogs_assert(MappedSnssai); + + /* MappedSnssai must be defined, else + "nssaiMappingList" will not convert to json*/ + MappedSnssai->sst = 0; + MappedSnssai->sd = ogs_strdup(""); + NssaiMapping->mapped_snssai = MappedSnssai; + + OpenAPI_list_add(NssaiMappingList, NssaiMapping); + } + + MmContext->allowed_nssai = AllowedNssaiList; + MmContext->nssai_mapping_list = NssaiMappingList; + } + + OpenAPI_list_add(MmContextList, MmContext); + + return MmContextList; +} + +int amf_namf_comm_handle_ue_context_transfer_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + ogs_sbi_response_t *response = NULL; + ogs_sbi_message_t sendmsg; + amf_ue_t *amf_ue = NULL; + + OpenAPI_ambr_t *UeAmbr = NULL; + OpenAPI_list_t *MmContextList = NULL; + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *SessionContextList = NULL; + OpenAPI_pdu_session_context_t *PduSessionContext = NULL; + OpenAPI_lnode_t *node = NULL; + OpenAPI_ue_context_t UeContext; + OpenAPI_seaf_data_t SeafData; + OpenAPI_ng_ksi_t Ng_ksi; + OpenAPI_key_amf_t Key_amf; + OpenAPI_sc_type_e Tsc_type; + + OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + + char *ue_context_id = NULL; + char *encoded_gmm_capability = NULL; + int status = OGS_SBI_HTTP_STATUS_OK; + char hxkamf_string[OGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE)]; + char *strerror = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData)); + memset(&UeContext, 0, sizeof(UeContext)); + UeContextTransferRspData.ue_context = &UeContext; + + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.UeContextTransferRspData = &UeContextTransferRspData; + + ue_context_id = recvmsg->h.resource.component[1]; + if (!ue_context_id) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("No UE context ID"); + goto cleanup; + } + + amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + if (!amf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); + goto cleanup; + } + + if (amf_ue->supi) { + UeContext.supi = amf_ue->supi; + if (amf_ue->auth_result != + OpenAPI_auth_result_AUTHENTICATION_SUCCESS) { + UeContext.is_supi_unauth_ind = true; + UeContext.supi_unauth_ind = amf_ue->auth_result; + } + } + + /* TODO UeContext.gpsi_list */ + + if (amf_ue->pei) { + UeContext.pei = amf_ue->pei; + } + + if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) { + UeAmbr = ogs_malloc(sizeof(*UeAmbr)); + ogs_assert(UeAmbr); + memset(UeAmbr, 0, sizeof(*UeAmbr)); + + if (amf_ue->ue_ambr.uplink > 0) + UeAmbr->uplink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS); + if (amf_ue->ue_ambr.downlink > 0) + UeAmbr->downlink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS); + UeContext.sub_ue_ambr = UeAmbr; + } + + if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) { + memset(&SeafData, 0, sizeof(SeafData)); + Tsc_type = (amf_ue->nas.ue.tsc == 0) ? + OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED; + + memset(&Ng_ksi, 0, sizeof(Ng_ksi)); + SeafData.ng_ksi = &Ng_ksi; + Ng_ksi.tsc = Tsc_type; + Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi; + + memset(&Key_amf, 0, sizeof(Key_amf)); + SeafData.key_amf = &Key_amf; + OpenAPI_key_amf_type_e temp_key_type = + (OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF; + Key_amf.key_type = temp_key_type; + ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf), + hxkamf_string, sizeof(hxkamf_string)); + Key_amf.key_val = hxkamf_string; + UeContext.seaf_data = &SeafData; + } + + encoded_gmm_capability = amf_namf_comm_base64_encode_5gmm_capability(amf_ue); + UeContext._5g_mm_capability = encoded_gmm_capability; + + UeContext.pcf_id = amf_ue->sbi.service_type_array[ + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance->id; + + /* TODO UeContext.pcfAmPolicyUri */ + /* TODO UeContext.pcfUePolicyUri */ + + MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue); + UeContext.mm_context_list = MmContextList; + + if (recvmsg->UeContextTransferReqData->reason == + OpenAPI_transfer_reason_MOBI_REG) { + SessionContextList = amf_namf_comm_encode_ue_session_context_list(amf_ue); + UeContext.session_context_list = SessionContextList; + } + + /* TODO ueRadioCapability */ + + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + if (encoded_gmm_capability) + ogs_free(encoded_gmm_capability); + if (UeAmbr) + OpenAPI_ambr_free(UeAmbr); + + if (SessionContextList) { + OpenAPI_list_for_each(SessionContextList, node) { + PduSessionContext = node->data; + OpenAPI_pdu_session_context_free(PduSessionContext); + } + OpenAPI_list_free(SessionContextList); + } + + if (MmContextList) { + OpenAPI_list_for_each(MmContextList, node) { + MmContext = node->data; + OpenAPI_mm_context_free(MmContext); + } + OpenAPI_list_free(MmContextList); + } + + return OGS_OK; + +cleanup: + ogs_assert(strerror); + ogs_error("%s", strerror); + + ogs_assert(true == + ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL)); + ogs_free(strerror); + + return OGS_ERROR; +} diff --git a/src/amf/namf-handler.h b/src/amf/namf-handler.h index 9581260ec2..19bcd203ce 100644 --- a/src/amf/namf-handler.h +++ b/src/amf/namf-handler.h @@ -34,6 +34,10 @@ int amf_namf_callback_handle_dereg_notify( ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); int amf_namf_callback_handle_sdm_data_change_notify( ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +int amf_namf_comm_handle_ue_context_transfer_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +int amf_namf_comm_handle_ue_context_transfer_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue); #ifdef __cplusplus } diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 409298850c..0f5e4a3cbe 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -36,6 +36,7 @@ int amf_sbi_open(void) ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SMF); + ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); /* Build NF service information. It will be transmitted to NRF. */ if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NAMF_COMM)) { @@ -45,6 +46,7 @@ int amf_sbi_open(void) ogs_sbi_nf_service_add_version( service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL); ogs_sbi_nf_service_add_allowed_nf_type(service, OpenAPI_nf_type_SMF); + ogs_sbi_nf_service_add_allowed_nf_type(service, OpenAPI_nf_type_AMF); } /* Initialize NRF NF Instance */ diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 64649a86ac..1368e2fcb5 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -830,6 +830,13 @@ bool nrf_nnrf_handle_nf_discover( &discovery_option->tai.plmn_id), discovery_option->tai.tac.v); } + if (discovery_option->target_guami) { + ogs_debug("guami[PLMN_ID:%06x,AMF_ID:%x]", + ogs_plmn_id_hexdump( + &discovery_option->target_guami->plmn_id), + ogs_amf_id_hexdump( + &discovery_option->target_guami->amf_id)); + } if (discovery_option->num_of_target_plmn_list) { for (i = 0; i < discovery_option->num_of_target_plmn_list; i++) ogs_debug("[%d] target-plmn-list[MCC:%03d,MNC:%03d]", i, diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index cca4fb4a47..1a16953e04 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -225,6 +225,9 @@ static int request_handler(ogs_sbi_request_t *request, void *data) } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_SNSSAIS)) { if (val) ogs_sbi_discovery_option_parse_snssais(discovery_option, val); + } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_GUAMI)) { + if (val) + ogs_sbi_discovery_option_parse_guami(discovery_option, val); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_DNN)) { ogs_sbi_discovery_option_set_dnn(discovery_option, val); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TAI)) { From 12158eebb8ab0c6ea7b52291bce6cc4d3d38186c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 19 Mar 2024 17:55:15 +0100 Subject: [PATCH 050/323] [SMF] Gy: Check Multiple-Services-Credit-Control Result-Code --- lib/diameter/gy/message.h | 2 ++ src/smf/gy-handler.c | 6 ++++++ src/smf/gy-path.c | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/lib/diameter/gy/message.h b/lib/diameter/gy/message.h index 5d402e0420..2356738f3c 100644 --- a/lib/diameter/gy/message.h +++ b/lib/diameter/gy/message.h @@ -187,6 +187,8 @@ typedef struct ogs_diam_gy_message_s { uint32_t time_threshold; uint32_t volume_threshold; ogs_diam_gy_service_unit_t granted; + uint32_t result_code; + uint32_t *err; } cca; }; } ogs_diam_gy_message_t; diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 159d7f63c5..78dfa2e019 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -178,6 +178,12 @@ uint32_t smf_gy_handle_cca_update_request( return gy_message->err ? *gy_message->err : ER_DIAMETER_AUTHENTICATION_REJECTED; } + if (gy_message->cca.result_code != ER_DIAMETER_SUCCESS) { + ogs_warn("Gy CCA Update Diameter Multiple-Services-Credit-Control Result-Code=%u", + gy_message->cca.result_code); + return gy_message->cca.err ? *gy_message->cca.err : + ER_DIAMETER_AUTHENTICATION_REJECTED; + } bearer = smf_default_bearer_in_sess(sess); ogs_assert(bearer); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index db1827111d..d2ad295194 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -1003,6 +1003,9 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) /* Set Credit Control Command */ gy_message->cmd_code = OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL; + /* Initialize some values: */ + gy_message->cca.result_code = ER_DIAMETER_SUCCESS; + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -1114,6 +1117,10 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); switch (hdr->avp_code) { + case AC_RESULT_CODE: + gy_message->cca.result_code = hdr->avp_value->u32; + gy_message->cca.err = &gy_message->cca.result_code; + break; case OGS_DIAM_GY_AVP_CODE_GRANTED_SERVICE_UNIT: rv = decode_granted_service_unit( &gy_message->cca.granted, avpch1, &error); From ca5a29dbe3dcc800bbc72fba40452608991aa845 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 20 Mar 2024 16:00:55 +0100 Subject: [PATCH 051/323] [SMF] Gy: Use correct QoS AVP descriptor from Gy instead of Gx one --- src/smf/gy-path.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index d2ad295194..421961afd3 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -198,7 +198,7 @@ static void fill_qos_information(smf_sess_t *sess, struct avp *parent_avp) union avp_value val; struct avp *avpch1, *avpch2, *avpch3; - ret = fd_msg_avp_new(ogs_diam_gx_qos_information, 0, &avpch1); + ret = fd_msg_avp_new(ogs_diam_gy_qos_information, 0, &avpch1); ogs_assert(ret == 0); /* QoS-Class-Identifier */ From 6420e80fe680d884f14e5e6d78f15e21b171d3af Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 20 Mar 2024 15:54:07 +0100 Subject: [PATCH 052/323] [SMF] Gy: Split PS-Information AVP creation into its own function Makes the already long function easier to follow, since there's one level less of encapsulation inside it. --- src/smf/gy-path.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 421961afd3..15049dafc0 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -335,31 +335,27 @@ static void fill_multiple_services_credit_control_ccr(smf_sess_t *sess, ogs_assert(ret == 0); ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); ogs_assert(ret == 0); - /* Multiple Services AVP add to req: */ ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); } -/* TS 32.299 7.2.192 Service-Information AVP for CCR */ -static void fill_service_information_ccr(smf_sess_t *sess, - uint32_t cc_request_type, struct msg *req) +/* TS 32.299 7.2.158 PS-Information AVP for CCR */ +static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, + struct avp *avp) { int ret; union avp_value val; - struct avp *avp; struct avp *avpch1, *avpch2, *avpch3; struct sockaddr_in sin; struct sockaddr_in6 sin6; char buf[OGS_PLMNIDSTRLEN]; char digit; - /* Service-Information, TS 32.299 sec 7.2.192 */ - ret = fd_msg_avp_new(ogs_diam_gy_service_information, 0, &avp); - /* PS-Information, TS 32.299 sec 7.2.158 */ ret = fd_msg_avp_new(ogs_diam_gy_ps_information, 0, &avpch1); + ogs_assert(ret == 0); /* 3GPP-Charging-Id, 3GPP TS 29.061 16.4.7.2 2 */ ret = fd_msg_avp_new(ogs_diam_gy_3gpp_charging_id, 0, &avpch2); @@ -585,9 +581,25 @@ static void fill_service_information_ccr(smf_sess_t *sess, ogs_assert(ret == 0); } - /* PS-Information AVP add to req: */ + /* PS-Information AVP add to parent AVP (Service-Information): */ ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); ogs_assert(ret == 0); +} + +/* TS 32.299 7.2.192 Service-Information AVP for CCR */ +static void fill_service_information_ccr(smf_sess_t *sess, + uint32_t cc_request_type, struct msg *req) +{ + + int ret; + struct avp *avp; + + /* Service-Information, TS 32.299 sec 7.2.192 */ + ret = fd_msg_avp_new(ogs_diam_gy_service_information, 0, &avp); + ogs_assert(ret == 0); + + /* PS-Information, TS 32.299 sec 7.2.158 */ + fill_ps_information(sess, cc_request_type, avp); /* Service-Information AVP add to req: */ ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); From d0b31177cca360865ebc6ab0b89eee7ee4fc8d1a Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 20 Mar 2024 16:03:44 +0100 Subject: [PATCH 053/323] [SMF] Gy: Include 3GPP-RAT-Type AVP in PS-Information AVP The AVP is optional, but used by some OCS vendors like PortaOne OCS make use of it. --- src/smf/gy-path.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 15049dafc0..74bb87ad19 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -552,6 +552,17 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, /* 3GPP-User-Location-Info, 3GPP TS 29.061 16.4.7.2 22 */ smf_fd_msg_avp_add_3gpp_uli(sess, (struct msg *)avpch1); + /* 3GPP-RAT-Type, TS 29.061 16.4.7.2 21 */ + /* GGSN: TS 29.060 7.7.50, PGW: TS 29.274 8.17 */ + ret = fd_msg_avp_new(ogs_diam_gy_3gpp_rat_type, 0, &avpch2); + ogs_assert(ret == 0); + val.os.data = (uint8_t*)&sess->gtp_rat_type; + val.os.len = 1; + ret = fd_msg_avp_setvalue(avpch2, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2); + ogs_assert(ret == 0); + if (sess->smf_ue->imeisv_len > 0) { /* User-Equipment-Info, 3GPP TS 32.299 7.1.17 */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info, 0, &avpch2); From 3b5e851f5d1328536052031e66a7b9b03c3057f6 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 20 Mar 2024 16:05:47 +0100 Subject: [PATCH 054/323] [SMF] Gy: Remove 3GPP-RAT-Type AVP from Multiple-Services-Credit-Control AVP This AVP is optional and was added in later releases of the 3GPP TS 32.299 spec. For instance, it shows up in Release 16 (V16.2.0), but doesn't show up in Release 12 (V12.7.0). Some OCS, like PortaOne OCS, implement older versions of the release (V12.14.0), and hence fail when receiving the 3GPP-RAT-Type inside Multiple-Services-Credit-Control AVP. Since nowadays we also send the 3GPP-RAT-Type in PS-Information AVP, which has been specified for longer time (it already shows up in V12.7.0), drop it from Multiple-Services-Credit-Control to have greater compatibility with other vendors. --- src/smf/gy-path.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 74bb87ad19..882787b1bc 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -325,16 +325,6 @@ static void fill_multiple_services_credit_control_ccr(smf_sess_t *sess, /* QoS-Information */ fill_qos_information(sess, avp); - /* 3GPP-RAT-Type, TS 29.061 16.4.7.2 21 */ - /* GGSN: TS 29.060 7.7.50, PGW: TS 29.274 8.17 */ - ret = fd_msg_avp_new(ogs_diam_gy_3gpp_rat_type, 0, &avpch1); - ogs_assert(ret == 0); - val.os.data = (uint8_t*)&sess->gtp_rat_type; - val.os.len = 1; - ret = fd_msg_avp_setvalue (avpch1, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); - ogs_assert(ret == 0); /* Multiple Services AVP add to req: */ ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); From 1dc4300203189b7f730f204e24252cb2a88c8d41 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 22 Mar 2024 06:48:58 +0900 Subject: [PATCH 055/323] [AMF] ran_ue can be NULL in IMPLICIT Dereg (#2999) When we try to send an SBI message to SMF to release a session, sometimes ran_ue is NULL. This happens when the Mobile Reachable Timer expires and Implicit Deregistration is triggered. To account for this case, we added the `ran_ue` parameter to the SBI interface and made it work even if it is NULL. --- src/amf/gmm-handler.c | 58 +++++++++++++-------- src/amf/gmm-handler.h | 6 ++- src/amf/gmm-sm.c | 30 ++++++----- src/amf/ngap-handler.c | 31 ++++++------ src/amf/nnssf-handler.c | 5 +- src/amf/nsmf-handler.c | 2 +- src/amf/sbi-path.c | 109 ++++++++++++++++++++++------------------ src/amf/sbi-path.h | 17 ++++--- 8 files changed, 147 insertions(+), 111 deletions(-) diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index ba2cd86be0..16a9eb1e3a 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -29,7 +29,7 @@ #define OGS_LOG_DOMAIN __gmm_log_domain static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( - amf_ue_t *amf_ue, uint8_t message_type, + ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type, ogs_nas_message_container_t *nas_message_container); static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id); @@ -339,7 +339,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } -ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_registration_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request) { amf_sess_t *sess = NULL; @@ -352,6 +353,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, ogs_nas_5gs_update_type_t *update_type = NULL; ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(registration_request); last_visited_registered_tai = @@ -376,7 +378,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST, + ran_ue, amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST, &registration_request->nas_message_container); } @@ -472,7 +474,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, if ((psimask & (1 << sess->psi)) == 0) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_release_session( - sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT); + ran_ue, sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT); } } } @@ -491,7 +493,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, if (psimask & (1 << sess->psi)) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_activating_session( - sess, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST); } } } @@ -653,7 +656,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } -ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_service_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_service_request_t *service_request) { amf_sess_t *sess = NULL; @@ -665,6 +669,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status = NULL; ogs_assert(amf_ue); + ogs_assert(ran_ue); + ogs_assert(service_request); uplink_data_status = &service_request->uplink_data_status; ogs_assert(uplink_data_status); @@ -677,7 +683,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_SERVICE_REQUEST, + ran_ue, amf_ue, OGS_NAS_5GS_SERVICE_REQUEST, &service_request->nas_message_container); } @@ -712,7 +718,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, if ((psimask & (1 << sess->psi)) == 0) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_release_session( - sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT); + ran_ue, sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT); } } } @@ -739,7 +745,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, if (psimask & (1 << sess->psi)) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_activating_session( - sess, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST); } } } @@ -757,9 +764,12 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue, ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request) { int r, state, xact_count = 0; + ran_ue_t *ran_ue = NULL; ogs_nas_de_registration_type_t *de_registration_type = NULL; ogs_assert(amf_ue); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); ogs_assert(deregistration_request); de_registration_type = &deregistration_request->de_registration_type; @@ -790,7 +800,7 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue, xact_count = amf_sess_xact_count(amf_ue); state = AMF_UE_INITIATED_DE_REGISTERED; - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(ran_ue, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -884,6 +894,7 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, ogs_assert(amf_ue); ran_ue = ran_ue_cycle(amf_ue->ran_ue); ogs_assert(ran_ue); + ogs_assert(identity_response); mobile_identity = &identity_response->mobile_identity; @@ -940,12 +951,15 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, } ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, - ogs_nas_5gs_security_mode_complete_t *security_mode_complete) + ogs_nas_5gs_security_mode_complete_t *security_mode_complete) { + ran_ue_t *ran_ue = NULL; ogs_nas_5gs_mobile_identity_t *imeisv = NULL; ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL; ogs_assert(amf_ue); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); ogs_assert(security_mode_complete); /* @@ -1021,7 +1035,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE, + ran_ue, amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE, &security_mode_complete->nas_message_container); } @@ -1316,14 +1330,15 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NNSSF_NSSELECTION, discovery_option, - amf_nnssf_nsselection_build_get, sess, 0, NULL); + amf_nnssf_nsselection_build_get, + ran_ue, sess, 0, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1337,7 +1352,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID, + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1366,7 +1382,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -1374,7 +1391,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1440,7 +1457,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, } static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( - amf_ue_t *amf_ue, uint8_t message_type, + ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type, ogs_nas_message_container_t *nas_message_container) { int gmm_cause; @@ -1449,6 +1466,7 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( ogs_nas_5gs_message_t nas_message; ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(nas_message_container); if (!nas_message_container->buffer || !nas_message_container->length) { @@ -1505,12 +1523,12 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( case OGS_NAS_5GS_REGISTRATION_REQUEST: ogs_debug("Registration request in NAS message container"); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message.gmm.registration_request); + ran_ue, amf_ue, &nas_message.gmm.registration_request); break; case OGS_NAS_5GS_SERVICE_REQUEST: ogs_debug("Service request in NAS message container"); gmm_cause = gmm_handle_service_update( - amf_ue, &nas_message.gmm.service_request); + ran_ue, amf_ue, &nas_message.gmm.service_request); break; default: ogs_error("Unknown message [%d]", nas_message.gmm.h.message_type); diff --git a/src/amf/gmm-handler.h b/src/amf/gmm-handler.h index 4cedf2077d..3e735aa9e6 100644 --- a/src/amf/gmm-handler.h +++ b/src/amf/gmm-handler.h @@ -30,13 +30,15 @@ extern "C" { ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_registration_request_t *registration_request); -ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_registration_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request); ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_service_request_t *service_request); -ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_service_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_service_request_t *service_request); int gmm_handle_deregistration_request(amf_ue_t *amf_ue, diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 522cf774aa..6231e633cb 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -64,7 +64,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) { amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; - ran_ue_t *ran_ue = NULL; ogs_sbi_message_t *sbi_message = NULL; @@ -302,7 +301,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { int xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -555,9 +554,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) - ran_ue = ran_ue_cycle(amf_ue->ran_ue); - ogs_assert(ran_ue); - if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); ogs_expect(r == OGS_OK); @@ -574,7 +570,8 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + amf_ue->ran_ue, amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -887,7 +884,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { int xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1058,7 +1055,8 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) } else { - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions( + NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1333,7 +1331,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message->gmm.registration_request); + ran_ue, amf_ue, &nas_message->gmm.registration_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); @@ -1392,7 +1390,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, } else { amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1462,7 +1460,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_service_update( - amf_ue, &nas_message->gmm.service_request); + ran_ue, amf_ue, &nas_message->gmm.service_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_service_update() failed [%d]", amf_ue->suci, gmm_cause); @@ -1513,7 +1511,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2417,7 +2415,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2552,7 +2550,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2613,7 +2611,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message->gmm.registration_request); + ran_ue, amf_ue, &nas_message->gmm.registration_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); @@ -2664,7 +2662,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) } else { amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 8c6d852ef6..e9e2b87686 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -1018,7 +1018,7 @@ void ngap_handle_initial_context_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1248,7 +1248,7 @@ void ngap_handle_initial_context_setup_failure( amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); new_xact_count = amf_sess_xact_count(amf_ue); @@ -1552,7 +1552,7 @@ void ngap_handle_ue_context_release_request( if (!PDUSessionList) { amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); } else { for (i = 0; i < PDUSessionList->list.count; i++) { @@ -1584,7 +1584,7 @@ void ngap_handle_ue_context_release_request( PDUSessionItem->pDUSessionID); if (SESSION_CONTEXT_IN_SMF(sess)) { amf_sbi_send_deactivate_session( - sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); } } @@ -2002,7 +2002,7 @@ void ngap_handle_pdu_session_resource_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2128,7 +2128,7 @@ void ngap_handle_pdu_session_resource_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2321,7 +2321,7 @@ void ngap_handle_pdu_session_resource_modify_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2508,7 +2508,7 @@ void ngap_handle_pdu_session_resource_release_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2977,7 +2977,8 @@ void ngap_handle_path_switch_request( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3366,7 +3367,8 @@ void ngap_handle_handover_required( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param); + source_ue, sess, + AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3607,7 +3609,8 @@ void ngap_handle_handover_request_ack( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param); + target_ue, sess, + AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3879,7 +3882,7 @@ void ngap_handle_handover_cancel( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param); + source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -4188,7 +4191,7 @@ void ngap_handle_handover_notification( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param); + source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -4604,7 +4607,7 @@ void ngap_handle_ng_reset( old_xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL, + ran_ue, amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure); diff --git a/src/amf/nnssf-handler.c b/src/amf/nnssf-handler.c index 27e81650aa..f13a1b8170 100644 --- a/src/amf/nnssf-handler.c +++ b/src/amf/nnssf-handler.c @@ -121,7 +121,7 @@ int amf_nnssf_nsselection_handle_get( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, &param); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -163,7 +163,8 @@ int amf_nnssf_nsselection_handle_get( ogs_freeaddrinfo(addr6); r = amf_sess_sbi_discover_by_nsi( - sess, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option); + ran_ue, sess, + OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index f011b7e9e0..09aad02934 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -635,7 +635,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 0f5e4a3cbe..c48d3e49e1 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -158,30 +158,24 @@ int amf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), - amf_sess_t *sess, int state, void *data) + ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data) { int r; int rv; ogs_sbi_xact_t *xact = NULL; - amf_ue_t *amf_ue = NULL; - ogs_assert(service_type); ogs_assert(sess); ogs_assert(build); - amf_ue = amf_ue_cycle(sess->amf_ue); - if (!amf_ue) { - ogs_error("UE(amf_ue) Context has already been removed"); - return OGS_NOTFOUND; - } - - sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (!sess->ran_ue) { - ogs_error("[%s] RAN-NG Context has already been removed", - amf_ue->supi); - return OGS_NOTFOUND; - } + if (ran_ue) { + sess->ran_ue = ran_ue_cycle(ran_ue); + if (!sess->ran_ue) { + ogs_error("NG context has already been removed"); + return OGS_NOTFOUND; + } + } else + sess->ran_ue = NULL; xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, @@ -221,6 +215,7 @@ static int client_discover_cb( OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; xact = data; @@ -253,14 +248,30 @@ static int client_discover_cb( } ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); + return OGS_ERROR; + } + ran_ue = ran_ue_cycle(sess->ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); + ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); + return OGS_ERROR; + } if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "client_discover_cb() failed [%d]", status); ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); return OGS_ERROR; } @@ -269,7 +280,7 @@ static int client_discover_cb( rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { ogs_error("cannot parse HTTP response"); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -279,7 +290,7 @@ static int client_discover_cb( if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { ogs_error("NF-Discover failed [%d]", message.res_status); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -289,7 +300,7 @@ static int client_discover_cb( if (!message.SearchResult) { ogs_error("No SearchResult"); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -306,7 +317,7 @@ static int client_discover_cb( ogs_error("[%s:%d] (NF discover) No [%s]", amf_ue->supi, sess->psi, ogs_sbi_service_type_to_name(service_type)); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -318,7 +329,7 @@ static int client_discover_cb( r = amf_sess_sbi_discover_and_send( service_type, NULL, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -339,15 +350,13 @@ static int client_discover_cb( } int amf_sess_sbi_discover_by_nsi( - amf_sess_t *sess, + ran_ue_t *ran_ue, amf_sess_t *sess, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option) { ogs_sbi_xact_t *xact = NULL; ogs_sbi_client_t *client = NULL; - amf_ue_t *amf_ue = NULL; - ogs_assert(sess); client = sess->nssf.nrf.client; ogs_assert(client); @@ -356,18 +365,14 @@ int amf_sess_sbi_discover_by_nsi( ogs_warn("Try to discover [%s]", ogs_sbi_service_type_to_name(service_type)); - amf_ue = amf_ue_cycle(sess->amf_ue); - if (!amf_ue) { - ogs_error("UE(amf_ue) Context has already been removed"); - return OGS_NOTFOUND; - } - - sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (!sess->ran_ue) { - ogs_error("[%s] RAN-NG Context has already been removed", - amf_ue->supi); - return OGS_NOTFOUND; - } + if (ran_ue) { + sess->ran_ue = ran_ue_cycle(ran_ue); + if (!sess->ran_ue) { + ogs_error("NG context has already been removed"); + return OGS_NOTFOUND; + } + } else + sess->ran_ue = NULL; xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, NULL, NULL, NULL); @@ -388,7 +393,8 @@ int amf_sess_sbi_discover_by_nsi( client, client_discover_cb, xact->request, xact) == true ? OGS_OK : OGS_ERROR; } -void amf_sbi_send_activating_session(amf_sess_t *sess, int state) +void amf_sbi_send_activating_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state) { amf_nsmf_pdusession_sm_context_param_t param; int r; @@ -400,13 +406,14 @@ void amf_sbi_send_activating_session(amf_sess_t *sess, int state) r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_update_sm_context, sess, state, &param); + amf_nsmf_pdusession_build_update_sm_context, + ran_ue, sess, state, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } void amf_sbi_send_deactivate_session( - amf_sess_t *sess, int state, int group, int cause) + ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause) { amf_nsmf_pdusession_sm_context_param_t param; int r; @@ -422,13 +429,14 @@ void amf_sbi_send_deactivate_session( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_update_sm_context, sess, state, &param); + amf_nsmf_pdusession_build_update_sm_context, + ran_ue, sess, state, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } void amf_sbi_send_deactivate_all_sessions( - amf_ue_t *amf_ue, int state, int group, int cause) + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause) { amf_sess_t *sess = NULL; @@ -436,7 +444,7 @@ void amf_sbi_send_deactivate_all_sessions( ogs_list_for_each(&amf_ue->sess_list, sess) { if (SESSION_CONTEXT_IN_SMF(sess)) - amf_sbi_send_deactivate_session(sess, state, group, cause); + amf_sbi_send_deactivate_session(ran_ue, sess, state, group, cause); } } @@ -448,13 +456,13 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) { int old_xact_count = 0, new_xact_count = 0; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_cycle(ran_ue->amf_ue); if (amf_ue) { old_xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_deactivate_all_sessions( - amf_ue, state, NGAP_Cause_PR_radioNetwork, + ran_ue, amf_ue, state, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure); new_xact_count = amf_sess_xact_count(amf_ue); @@ -482,7 +490,8 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) } } -void amf_sbi_send_release_session(amf_sess_t *sess, int state) +void amf_sbi_send_release_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state) { int r; @@ -490,7 +499,8 @@ void amf_sbi_send_release_session(amf_sess_t *sess, int state) r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_release_sm_context, sess, state, NULL); + amf_nsmf_pdusession_build_release_sm_context, + ran_ue, sess, state, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -498,7 +508,8 @@ void amf_sbi_send_release_session(amf_sess_t *sess, int state) CLEAR_SM_CONTEXT_REF(sess); } -void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state) +void amf_sbi_send_release_all_sessions( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state) { amf_sess_t *sess = NULL; @@ -506,7 +517,7 @@ void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state) ogs_list_for_each(&amf_ue->sess_list, sess) { if (SESSION_CONTEXT_IN_SMF(sess)) - amf_sbi_send_release_session(sess, state); + amf_sbi_send_release_session(ran_ue, sess, state); } } diff --git a/src/amf/sbi-path.h b/src/amf/sbi-path.h index da6952eb76..3f666f5d68 100644 --- a/src/amf/sbi-path.h +++ b/src/amf/sbi-path.h @@ -74,23 +74,26 @@ int amf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), - amf_sess_t *sess, int state, void *data); + ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data); int amf_sess_sbi_discover_by_nsi( - amf_sess_t *sess, + ran_ue_t *ran_ue, amf_sess_t *sess, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option); -void amf_sbi_send_activating_session(amf_sess_t *sess, int state); +void amf_sbi_send_activating_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state); void amf_sbi_send_deactivate_session( - amf_sess_t *sess, int state, int group, int cause); + ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause); void amf_sbi_send_deactivate_all_sessions( - amf_ue_t *amf_ue, int state, int group, int cause); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause); void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state); -void amf_sbi_send_release_session(amf_sess_t *sess, int state); -void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state); +void amf_sbi_send_release_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state); +void amf_sbi_send_release_all_sessions( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state); bool amf_sbi_send_n1_n2_failure_notify( amf_sess_t *sess, OpenAPI_n1_n2_message_transfer_cause_e cause); From a6675250417135cad1163a75213d49dd0d194c2a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 23 Mar 2024 10:00:08 +0900 Subject: [PATCH 056/323] [GTP/PFCP]] incorrect dst TEI=0/SEID=0 (#3043) If eg. PCRF or AAA diameter link is not yet ready (eg. PCRF crashed), and a client sends a CreateSessionRequest announcing its ow F-TEID, then open5gs-smfd answers with Create Session Response Cause= "Remote peer not responding", but it is not setting the received F-TEID in the header of the response, instead it sends with TEI=0. As a result, the peer cannot match the CreateSessionResponse, and needs to rely on its own timeout timer to figure out that specific request failed. This also happens in PFCP, so to solve this problem, I added teid/seid_presence to the interface that sends the error message as shown below. void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value); void ogs_pfcp_send_error_message( ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type, uint8_t cause_value, uint16_t offending_ie_value); --- lib/gtp/path.c | 15 +---- lib/gtp/path.h | 5 +- lib/gtp/v2/message.c | 4 +- lib/gtp/v2/message.h | 7 ++- lib/gtp/v2/path.c | 11 ++-- lib/gtp/v2/path.h | 6 +- lib/gtp/v2/support/gtp-tlv.py | 7 ++- lib/gtp/xact.c | 9 +-- lib/pfcp/message.c | 4 +- lib/pfcp/message.h | 6 +- lib/pfcp/path.c | 17 +++--- lib/pfcp/path.h | 4 +- lib/pfcp/support/pfcp-tlv.py | 6 +- lib/pfcp/xact.c | 6 +- src/mme/mme-gtp-path.c | 13 +++- src/mme/mme-s11-handler.c | 22 +++++-- src/sgwc/gtp-path.c | 4 +- src/sgwc/pfcp-path.c | 7 ++- src/sgwc/s11-handler.c | 100 ++++++++++++++++++++----------- src/sgwc/s5c-handler.c | 109 ++++++++++++++++++++++------------ src/sgwc/sxa-handler.c | 75 ++++++++++++++++------- src/sgwu/pfcp-path.c | 6 +- src/sgwu/sxa-handler.c | 19 ++++-- src/smf/binding.c | 4 +- src/smf/gsm-sm.c | 17 ++++-- src/smf/gtp-path.c | 6 +- src/smf/n4-handler.c | 15 +++-- src/smf/pfcp-path.c | 8 ++- src/smf/pfcp-sm.c | 8 ++- src/smf/s5c-handler.c | 30 +++++++--- src/smf/smf-sm.c | 8 ++- src/upf/n4-handler.c | 19 ++++-- src/upf/pfcp-path.c | 6 +- tests/non3gpp/gtp-path.c | 6 +- 34 files changed, 383 insertions(+), 206 deletions(-) diff --git a/lib/gtp/path.c b/lib/gtp/path.c index b20f491c00..d550bf1bb2 100644 --- a/lib/gtp/path.c +++ b/lib/gtp/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -128,16 +128,3 @@ int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf) return OGS_OK; } - -void ogs_gtp_send_error_message( - ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value) -{ - switch (xact->gtp_version) { - case 1: - ogs_gtp1_send_error_message(xact, teid, type, cause_value); - break; - case 2: - ogs_gtp2_send_error_message(xact, teid, type, cause_value); - break; - } -} diff --git a/lib/gtp/path.h b/lib/gtp/path.h index 6cb39ac77e..e9bdef8e14 100644 --- a/lib/gtp/path.h +++ b/lib/gtp/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -72,9 +72,6 @@ int ogs_gtp_connect(ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_gtp_node_t *gnode); int ogs_gtp_send(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf); int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf); -void ogs_gtp_send_error_message( - ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value); - #ifdef __cplusplus } #endif diff --git a/lib/gtp/v2/message.c b/lib/gtp/v2/message.c index 31c79a3f88..96b7342c95 100644 --- a/lib/gtp/v2/message.c +++ b/lib/gtp/v2/message.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by gtp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-08-26 16:35:12.648272 by acetcom + * Created on: 2024-03-23 07:21:22.444548 by acetcom * from 29274-h70.docx ******************************************************************************/ diff --git a/lib/gtp/v2/message.h b/lib/gtp/v2/message.h index a6fcb161bc..d294e9645f 100644 --- a/lib/gtp/v2/message.h +++ b/lib/gtp/v2/message.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by gtp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2023-08-26 16:35:12.642445 by acetcom + * Created on: 2024-03-23 07:21:22.438775 by acetcom * from 29274-h70.docx ******************************************************************************/ @@ -44,6 +44,9 @@ typedef struct ogs_gtp2_header_s { struct { #define OGS_GTP2_VERSION_0 0 #define OGS_GTP2_VERSION_1 1 + +#define OGS_GTP2_TEID_NO_PRESENCE 0 +#define OGS_GTP2_TEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t piggybacked:1;, uint8_t teid_presence:1;, diff --git a/lib/gtp/v2/path.c b/lib/gtp/v2/path.c index 26549ab81c..757f51c621 100644 --- a/lib/gtp/v2/path.c +++ b/lib/gtp/v2/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -160,8 +160,8 @@ ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb) return pkb_resp; } -void ogs_gtp2_send_error_message( - ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value) +void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, + int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value) { int rv; ogs_gtp2_message_t errmsg; @@ -170,6 +170,7 @@ void ogs_gtp2_send_error_message( ogs_pkbuf_t *pkbuf = NULL; memset(&errmsg, 0, sizeof(ogs_gtp2_message_t)); + errmsg.h.teid_presence = teid_presence; errmsg.h.teid = teid; errmsg.h.type = type; @@ -257,7 +258,7 @@ void ogs_gtp2_send_echo_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_ECHO_REQUEST_TYPE; - h.teid = 0; + h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE; pkbuf = ogs_gtp2_build_echo_request(h.type, recovery, features); if (!pkbuf) { @@ -284,7 +285,7 @@ void ogs_gtp2_send_echo_response(ogs_gtp_xact_t *xact, memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_ECHO_RESPONSE_TYPE; - h.teid = 0; + h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE; pkbuf = ogs_gtp2_build_echo_response(h.type, recovery, features); if (!pkbuf) { diff --git a/lib/gtp/v2/path.h b/lib/gtp/v2/path.h index 7b3aa6ddaf..8a21cd6f26 100644 --- a/lib/gtp/v2/path.h +++ b/lib/gtp/v2/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -36,8 +36,8 @@ int ogs_gtp2_send_user_plane( ogs_pkbuf_t *pkbuf); ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb); -void ogs_gtp2_send_error_message( - ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value); +void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, + int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value); void ogs_gtp2_send_echo_request( ogs_gtp_node_t *gnode, uint8_t recovery, uint8_t features); diff --git a/lib/gtp/v2/support/gtp-tlv.py b/lib/gtp/v2/support/gtp-tlv.py index fafd12268f..4ff6da798d 100644 --- a/lib/gtp/v2/support/gtp-tlv.py +++ b/lib/gtp/v2/support/gtp-tlv.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -60,7 +60,7 @@ def write_file(f, string): def output_header_to_file(f): now = datetime.datetime.now() f.write("""/* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -461,6 +461,9 @@ def iter_block_items(parent): struct { #define OGS_GTP2_VERSION_0 0 #define OGS_GTP2_VERSION_1 1 + +#define OGS_GTP2_TEID_NO_PRESENCE 0 +#define OGS_GTP2_TEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t piggybacked:1;, uint8_t teid_presence:1;, diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index ffec8621a3..0da03de769 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> + * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -407,7 +408,7 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact, return OGS_ERROR; } - if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) { + if (hdesc->teid_presence) { gtp_hlen = OGS_GTPV2C_HEADER_LEN; } else { gtp_hlen = OGS_GTPV2C_HEADER_LEN - OGS_GTP2_TEID_LEN; @@ -420,12 +421,12 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact, h->version = 2; h->type = hdesc->type; - if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) { - h->teid_presence = 1; + if (hdesc->teid_presence) { + h->teid_presence = OGS_GTP2_TEID_PRESENCE; h->teid = htobe32(hdesc->teid); h->sqn = OGS_GTP2_XID_TO_SQN(xact->xid); } else { - h->teid_presence = 0; + h->teid_presence = OGS_GTP2_TEID_NO_PRESENCE; h->sqn_only = OGS_GTP2_XID_TO_SQN(xact->xid); } h->length = htobe16(pkbuf->len - 4); diff --git a/lib/pfcp/message.c b/lib/pfcp/message.c index 50941162d7..d183e53256 100644 --- a/lib/pfcp/message.c +++ b/lib/pfcp/message.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.346970 by acetcom + * Created on: 2024-03-23 07:20:44.691773 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ diff --git a/lib/pfcp/message.h b/lib/pfcp/message.h index c186cb988a..46d716d67f 100644 --- a/lib/pfcp/message.h +++ b/lib/pfcp/message.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.327925 by acetcom + * Created on: 2024-03-23 07:20:44.672650 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -41,6 +41,8 @@ extern "C" { typedef struct ogs_pfcp_header_s { union { struct { +#define OGS_PFCP_SEID_NO_PRESENCE 0 +#define OGS_PFCP_SEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t spare1:3;, uint8_t mp:1;, diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index 82e3a3467c..9638440645 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -140,7 +140,7 @@ int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_HEARTBEAT_REQUEST_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -176,7 +176,7 @@ int ogs_pfcp_send_heartbeat_response(ogs_pfcp_xact_t *xact) memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_HEARTBEAT_RESPONSE_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; pkbuf = ogs_pfcp_build_heartbeat_response(h.type); if (!pkbuf) { @@ -217,7 +217,7 @@ int ogs_pfcp_cp_send_association_setup_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -254,7 +254,7 @@ int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; pkbuf = ogs_pfcp_cp_build_association_setup_response(h.type, cause); if (!pkbuf) { @@ -286,7 +286,7 @@ int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -323,7 +323,7 @@ int ogs_pfcp_up_send_association_setup_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE; - h.seid = 0; + h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; pkbuf = ogs_pfcp_up_build_association_setup_response(h.type, cause); if (!pkbuf) { @@ -468,7 +468,7 @@ void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr) } void ogs_pfcp_send_error_message( - ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type, + ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type, uint8_t cause_value, uint16_t offending_ie_value) { int rv; @@ -480,6 +480,7 @@ void ogs_pfcp_send_error_message( ogs_assert(xact); memset(&errmsg, 0, sizeof(ogs_pfcp_message_t)); + errmsg.h.seid_presence = seid_presence; errmsg.h.seid = seid; errmsg.h.type = type; diff --git a/lib/pfcp/path.h b/lib/pfcp/path.h index 379e992ebe..eb1014d052 100644 --- a/lib/pfcp/path.h +++ b/lib/pfcp/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -86,7 +86,7 @@ int ogs_pfcp_send_end_marker(ogs_pfcp_pdr_t *pdr); void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr); void ogs_pfcp_send_error_message( - ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type, + ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type, uint8_t cause_value, uint16_t offending_ie_value); #ifdef __cplusplus diff --git a/lib/pfcp/support/pfcp-tlv.py b/lib/pfcp/support/pfcp-tlv.py index 671b81640c..2306af1a1a 100644 --- a/lib/pfcp/support/pfcp-tlv.py +++ b/lib/pfcp/support/pfcp-tlv.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -54,7 +54,7 @@ def write_file(f, string): def output_header_to_file(f): now = datetime.datetime.now() f.write("""/* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -541,6 +541,8 @@ def write_cells_to_file(name, cells): typedef struct ogs_pfcp_header_s { union { struct { +#define OGS_PFCP_SEID_NO_PRESENCE 0 +#define OGS_PFCP_SEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t spare1:3;, uint8_t mp:1;, diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index 878bec7141..f469f962b9 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -251,7 +251,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, return OGS_ERROR; } - if (hdesc->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) { + if (hdesc->seid_presence) { pfcp_hlen = OGS_PFCP_HEADER_LEN; } else { pfcp_hlen = OGS_PFCP_HEADER_LEN - OGS_PFCP_SEID_LEN; @@ -264,7 +264,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, h->version = OGS_PFCP_VERSION; h->type = hdesc->type; - if (h->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) { + if (hdesc->seid_presence) { h->seid_presence = 1; h->seid = htobe64(hdesc->seid); h->sqn = OGS_PFCP_XID_TO_SQN(xact->xid); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 7d9e8f3f35..a5bc1fb398 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -254,6 +254,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_session_request(h.type, sess, create_action); @@ -293,6 +294,7 @@ int mme_gtp_send_modify_bearer_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_modify_bearer_request(h.type, mme_ue, uli_presence); @@ -332,6 +334,7 @@ int mme_gtp_send_delete_session_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; s11buf = mme_s11_build_delete_session_request(h.type, sess, action); @@ -400,6 +403,7 @@ int mme_gtp_send_create_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value); @@ -445,6 +449,7 @@ int mme_gtp_send_update_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value); @@ -490,6 +495,7 @@ int mme_gtp_send_delete_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value); @@ -525,6 +531,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_release_access_bearers_request(h.type); @@ -622,6 +629,7 @@ int mme_gtp_send_downlink_data_notification_ack( /* Build Downlink data notification ack */ memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value); @@ -657,6 +665,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request( @@ -696,6 +705,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM); @@ -738,6 +748,7 @@ int mme_gtp_send_bearer_resource_command( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 0886541fec..103921b45f 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -820,7 +820,9 @@ void mme_s11_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, + sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -856,7 +858,9 @@ void mme_s11_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, + sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1012,7 +1016,9 @@ void mme_s11_handle_update_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, + sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1183,7 +1189,9 @@ void mme_s11_handle_delete_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, + sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); return; @@ -1440,7 +1448,9 @@ void mme_s11_handle_downlink_data_notification( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, + sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); return; diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index 6ce21e64ff..01b5c9b3a3 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -182,6 +182,7 @@ int sgwc_gtp_send_create_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgwc_ue->mme_s11_teid; pkbuf = sgwc_s11_build_create_session_response(h.type, sess); @@ -229,6 +230,7 @@ int sgwc_gtp_send_downlink_data_notification( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgwc_ue->mme_s11_teid; pkbuf = sgwc_s11_build_downlink_data_notification(cause_value, bearer); diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index fa5c9f5057..984c655168 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -222,6 +222,7 @@ int sgwc_pfcp_send_bearer_to_modify_list( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact); @@ -302,6 +303,7 @@ int sgwc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_session_establishment_request(h.type, sess); @@ -389,6 +391,7 @@ int sgwc_pfcp_send_bearer_modification_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact); @@ -437,6 +440,7 @@ int sgwc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_session_deletion_request(h.type, sess); @@ -466,6 +470,7 @@ int sgwc_pfcp_send_session_report_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index f6fe9c319c..3164af8209 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -173,8 +173,9 @@ void sgwc_s11_handle_create_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -214,8 +215,9 @@ void sgwc_s11_handle_create_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -262,8 +264,9 @@ void sgwc_s11_handle_create_session_request( /* Check if selected SGW-U is associated with SGW-C */ ogs_assert(sess->pfcp_node); if (!OGS_FSM_CHECK(&sess->pfcp_node->sm, sgwc_pfcp_state_associated)) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING); return; @@ -423,8 +426,9 @@ void sgwc_s11_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -531,8 +535,9 @@ void sgwc_s11_handle_modify_bearer_request( if (i == 0) { ogs_error("No Bearer"); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -609,8 +614,9 @@ void sgwc_s11_handle_delete_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -629,8 +635,9 @@ void sgwc_s11_handle_delete_session_request( indication->operation_indication == 1 && indication->scope_indication == 1) { ogs_error("Invalid Indication"); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); return; @@ -656,6 +663,7 @@ void sgwc_s11_handle_delete_session_request( } else { message->h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; gtpbuf = ogs_gtp2_build_msg(message); @@ -762,7 +770,9 @@ void sgwc_s11_handle_create_bearer_response( sgwc_pfcp_send_bearer_modification_request( bearer, NULL, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -781,7 +791,9 @@ void sgwc_s11_handle_create_bearer_response( sgwc_pfcp_send_bearer_modification_request( bearer, NULL, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -915,7 +927,9 @@ void sgwc_s11_handle_update_bearer_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -930,7 +944,9 @@ void sgwc_s11_handle_update_bearer_response( cause_value = cause->value; if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value); - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -940,7 +956,9 @@ void sgwc_s11_handle_update_bearer_response( cause_value = cause->value; if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause [Value:%d]", cause_value); - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -957,6 +975,7 @@ void sgwc_s11_handle_update_bearer_response( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -1128,8 +1147,9 @@ void sgwc_s11_handle_release_access_bearers_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); return; } @@ -1235,8 +1255,9 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, cause_value); return; @@ -1253,8 +1274,9 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( for (i = 0; req->bearer_contexts[i].presence; i++) { if (req->bearer_contexts[i].eps_bearer_id.presence == 0) { ogs_error("No EBI"); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1276,8 +1298,9 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp_send_error_message(s11_xact, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1311,8 +1334,9 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp_send_error_message(s11_xact, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1366,8 +1390,9 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, cause_value); return; @@ -1441,8 +1466,9 @@ void sgwc_s11_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1462,8 +1488,9 @@ void sgwc_s11_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1483,6 +1510,7 @@ void sgwc_s11_handle_bearer_resource_command( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(message); diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index 377a7d5e22..d8acb267c3 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024444 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -122,8 +122,9 @@ void sgwc_s5c_handle_create_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -160,8 +161,9 @@ void sgwc_s5c_handle_create_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -185,8 +187,10 @@ void sgwc_s5c_handle_create_session_response( bearer_cause = cause->value; if (bearer_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Bearer Cause [VALUE:%d]", bearer_cause); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, bearer_cause); return; } @@ -199,8 +203,9 @@ void sgwc_s5c_handle_create_session_response( session_cause != OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) { ogs_error("GTP Cause [VALUE:%d]", session_cause); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); return; } @@ -233,8 +238,10 @@ void sgwc_s5c_handle_create_session_response( bearer = sgwc_bearer_find_by_sess_ebi(sess, rsp->bearer_contexts_created[i].eps_bearer_id.u8); if (!bearer) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -253,8 +260,10 @@ void sgwc_s5c_handle_create_session_response( rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -354,13 +363,15 @@ void sgwc_s5c_handle_modify_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); else - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -376,13 +387,15 @@ void sgwc_s5c_handle_modify_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); else - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -394,13 +407,15 @@ void sgwc_s5c_handle_modify_bearer_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause [VALUE:%d]", session_cause); if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); else - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause); return; } @@ -420,6 +435,7 @@ void sgwc_s5c_handle_modify_bearer_response( sgwc_gtp_send_create_session_response(sess, s11_xact)); } else { message->h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -493,8 +509,9 @@ void sgwc_s5c_handle_delete_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -573,7 +590,9 @@ void sgwc_s5c_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -601,7 +620,9 @@ void sgwc_s5c_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -631,7 +652,9 @@ void sgwc_s5c_handle_create_bearer_request( rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -709,7 +732,9 @@ void sgwc_s5c_handle_update_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -729,6 +754,7 @@ void sgwc_s5c_handle_update_bearer_request( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -850,7 +876,9 @@ void sgwc_s5c_handle_delete_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -870,6 +898,7 @@ void sgwc_s5c_handle_delete_bearer_request( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; + message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -970,6 +999,8 @@ void sgwc_s5c_handle_bearer_resource_failure_indication( cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } - ogs_gtp_send_error_message(s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); } diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index 14fb667cbc..dffd2a76d3 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -245,8 +245,9 @@ void sgwc_sxa_handle_session_establishment_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (sess) sgwc_ue = sess->sgwc_ue; - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -269,10 +270,11 @@ void sgwc_sxa_handle_session_establishment_response( if (dl_tunnel->local_addr == NULL && dl_tunnel->local_addr6 == NULL) { ogs_error("No UP F-TEID"); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, - OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, + OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND); return; } @@ -347,6 +349,7 @@ void sgwc_sxa_handle_session_establishment_response( memset(&send_message, 0, sizeof(ogs_gtp2_message_t)); send_message.h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; + send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sess->pgw_s5c_teid; /* Send Control Plane(DL) : SGW-S5C */ @@ -396,6 +399,7 @@ void sgwc_sxa_handle_session_establishment_response( /* Create Session Request */ recv_message->h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; /* Send Control Plane(DL) : SGW-S5C */ @@ -581,9 +585,10 @@ void sgwc_sxa_handle_session_modification_response( s5c_xact = pfcp_xact->assoc_xact; if (s5c_xact) { - ogs_gtp_send_error_message( - s5c_xact, sess ? sess->pgw_s5c_teid : 0, - OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, + OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); } sgwc_bearer_remove(bearer); @@ -591,8 +596,9 @@ void sgwc_sxa_handle_session_modification_response( s5c_xact = pfcp_xact->assoc_xact; ogs_assert(s5c_xact); - ogs_gtp_send_error_message( - s5c_xact, sess ? sess->pgw_s5c_teid : 0, + ogs_gtp2_send_error_message(s5c_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); @@ -601,16 +607,20 @@ void sgwc_sxa_handle_session_modification_response( s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); } else if (flags & OGS_PFCP_MODIFY_DL_ONLY) { s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); } else { ogs_fatal("Invalid modify_flags[0x%llx]", (long long)flags); @@ -620,9 +630,10 @@ void sgwc_sxa_handle_session_modification_response( s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp_send_error_message( - s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); + ogs_gtp2_send_error_message(s11_xact, + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); } ogs_pfcp_xact_commit(pfcp_xact); @@ -694,6 +705,7 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE; + send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -720,6 +732,7 @@ void sgwc_sxa_handle_session_modification_response( if (s5c_xact) { ogs_assert(recv_message); recv_message->h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -769,6 +782,7 @@ void sgwc_sxa_handle_session_modification_response( gtp_req->bearer_contexts.s1_u_enodeb_f_teid.len = len; recv_message->h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -836,6 +850,7 @@ void sgwc_sxa_handle_session_modification_response( gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.len = len; recv_message->h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -962,6 +977,7 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE; + send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1046,6 +1062,7 @@ void sgwc_sxa_handle_session_modification_response( } recv_message->h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -1083,6 +1100,7 @@ void sgwc_sxa_handle_session_modification_response( if (indication && indication->handover_indication) { recv_message->h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; + recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -1168,6 +1186,7 @@ void sgwc_sxa_handle_session_modification_response( } send_message.h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; + send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1233,6 +1252,7 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE; + send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1264,6 +1284,7 @@ void sgwc_sxa_handle_session_deletion_response( { int rv; uint8_t cause_value = 0; + int teid_presence = OGS_GTP2_TEID_NO_PRESENCE; uint32_t teid = 0; sgwc_ue_t *sgwc_ue = NULL; @@ -1315,6 +1336,8 @@ void sgwc_sxa_handle_session_deletion_response( * 2. SMF sends Delete Session Response to SGW/MME. */ if (sess) sgwc_ue = sess->sgwc_ue; + teid_presence = + sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE; teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0; break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: @@ -1331,6 +1354,8 @@ void sgwc_sxa_handle_session_deletion_response( * - Bearer Resource Command * - Delete Bearer Request/Response with DEDICATED BEARER. */ + teid_presence = + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE; teid = sess ? sess->pgw_s5c_teid : 0; break; default: @@ -1340,8 +1365,8 @@ void sgwc_sxa_handle_session_deletion_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (gtp_xact) { - ogs_gtp_send_error_message( - gtp_xact, teid, gtp_message->h.type, cause_value); + ogs_gtp2_send_error_message(gtp_xact, + teid_presence, teid, gtp_message->h.type, cause_value); } return; } @@ -1358,6 +1383,7 @@ void sgwc_sxa_handle_session_deletion_response( * If gtp_message->h.type == OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE * Then gtp_xact is S5C-XACT */ + gtp_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; gtp_message->h.teid = teid; pkbuf = ogs_gtp2_build_msg(gtp_message); @@ -1419,7 +1445,8 @@ void sgwc_sxa_handle_session_report_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_pfcp_send_error_message(pfcp_xact, 0, + ogs_pfcp_send_error_message(pfcp_xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, cause_value, 0); return; @@ -1431,7 +1458,9 @@ void sgwc_sxa_handle_session_report_request( if (!sgwc_ue->gnode) { ogs_error("No SGWC-UE GTP Node"); - ogs_pfcp_send_error_message(pfcp_xact, sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(pfcp_xact, + sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, + sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index d9f423bbf7..e54423fe00 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -180,6 +180,7 @@ int sgwu_pfcp_send_session_establishment_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_establishment_response( @@ -213,6 +214,7 @@ int sgwu_pfcp_send_session_modification_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_modification_response( @@ -245,6 +247,7 @@ int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_deletion_response(h.type, sess); @@ -295,6 +298,7 @@ int sgwu_pfcp_send_session_report_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); diff --git a/src/sgwu/sxa-handler.c b/src/sgwu/sxa-handler.c index ec25214e3f..4fd54f8689 100644 --- a/src/sgwu/sxa-handler.c +++ b/src/sgwu/sxa-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -45,7 +45,8 @@ void sgwu_sxa_handle_session_establishment_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0); return; @@ -142,7 +143,9 @@ void sgwu_sxa_handle_session_establishment_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, + sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, + sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -168,7 +171,8 @@ void sgwu_sxa_handle_session_modification_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -309,7 +313,9 @@ void sgwu_sxa_handle_session_modification_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, + sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, + sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -325,7 +331,8 @@ void sgwu_sxa_handle_session_deletion_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/smf/binding.c b/src/smf/binding.c index 72ee3e5170..8fbefeeb7c 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -363,6 +363,7 @@ void smf_bearer_binding(smf_sess_t *sess) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_update_bearer_request( @@ -439,6 +440,7 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer) ogs_assert(sess); h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; memset(&tft, 0, sizeof tft); diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index d1226ca9ea..60ff146bdb 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -1,6 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> - + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -74,7 +73,9 @@ static void send_gtp_create_err_msg(const smf_sess_t *sess, ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause); else - ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess->sgw_s5c_teid, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, gtp_cause); } @@ -85,7 +86,9 @@ static void send_gtp_delete_err_msg(const smf_sess_t *sess, ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause); else - ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess->sgw_s5c_teid, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp_cause); } @@ -775,8 +778,10 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) sess, e->gtp_xact, &gtp2_message->delete_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, - OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); + ogs_gtp2_send_error_message(e->gtp_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess->sgw_s5c_teid, + OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); return; } OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); diff --git a/src/smf/gtp-path.c b/src/smf/gtp-path.c index 8d88ee20e1..c77d467423 100644 --- a/src/smf/gtp-path.c +++ b/src/smf/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -444,6 +444,7 @@ int smf_gtp2_send_create_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_create_session_response(h.type, sess); @@ -478,6 +479,7 @@ int smf_gtp2_send_modify_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_modify_bearer_response( @@ -511,6 +513,7 @@ int smf_gtp2_send_delete_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_delete_session_response(h.type, sess); @@ -548,6 +551,7 @@ int smf_gtp2_send_delete_bearer_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_delete_bearer_request( diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 355ff1477d..6727666ad8 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -971,6 +971,7 @@ void smf_epc_n4_handle_session_modification_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.teid = sess->sgw_s5c_teid; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; pkbuf = smf_s5c_build_delete_bearer_request( @@ -1182,7 +1183,8 @@ void smf_n4_handle_session_report_request( } if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) { - ogs_pfcp_send_error_message(pfcp_xact, 0, + ogs_pfcp_send_error_message(pfcp_xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, cause_value, 0); return; @@ -1222,7 +1224,8 @@ void smf_n4_handle_session_report_request( if (paging_policy_indication_value) { ogs_warn("Not implement - " "Paging Policy Indication Value"); - ogs_pfcp_send_error_message(pfcp_xact, 0, + ogs_pfcp_send_error_message(pfcp_xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED, 0); return; @@ -1232,7 +1235,8 @@ void smf_n4_handle_session_report_request( qos_flow = smf_qos_flow_find_by_qfi(sess, qfi); if (!qos_flow) { ogs_error("Cannot find the QoS Flow[%d]", qfi); - ogs_pfcp_send_error_message(pfcp_xact, 0, + ogs_pfcp_send_error_message(pfcp_xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -1257,7 +1261,8 @@ void smf_n4_handle_session_report_request( if (!pdr) { ogs_error("No Context"); - ogs_pfcp_send_error_message(pfcp_xact, 0, + ogs_pfcp_send_error_message(pfcp_xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 272e2b4845..700fceae61 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -353,6 +353,7 @@ int smf_pfcp_send_modify_list( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = (*modify_list)(h.type, sess, xact); @@ -430,6 +431,7 @@ int smf_5gc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact); @@ -532,6 +534,7 @@ int smf_5gc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_deletion_request(h.type, sess); @@ -605,6 +608,7 @@ int smf_epc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact); @@ -748,6 +752,7 @@ int smf_epc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_deletion_request(h.type, sess); @@ -846,6 +851,7 @@ int smf_pfcp_send_session_report_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 6d93ee59a3..3d6eaf022b 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -317,7 +317,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE, OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); else - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + OGS_GTP2_TEID_NO_PRESENCE, 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; @@ -352,7 +353,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); else - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + OGS_GTP2_TEID_NO_PRESENCE, 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index da65704e70..e20b23ecfb 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -504,7 +504,9 @@ void smf_s5c_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(gtp_xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(gtp_xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1186,7 +1188,9 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1211,7 +1215,9 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1240,8 +1246,10 @@ void smf_s5c_handle_bearer_resource_command( pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1); if (pf) { if (reconfigure_packet_filter(pf, &tft, i) < 0) { - ogs_gtp2_send_error_message( - xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? OGS_GTP2_TEID_PRESENCE : + OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1309,8 +1317,9 @@ void smf_s5c_handle_bearer_resource_command( ogs_assert(pf); if (reconfigure_packet_filter(pf, &tft, i) < 0) { - ogs_gtp2_send_error_message( - xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1396,7 +1405,9 @@ void smf_s5c_handle_bearer_resource_command( if (tft_update == 0 && tft_delete == 0 && qos_update == 0) { /* No modification */ - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, + sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SERVICE_NOT_SUPPORTED); return; @@ -1422,6 +1433,7 @@ void smf_s5c_handle_bearer_resource_command( } else { memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.teid = sess->sgw_s5c_teid; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; pkbuf = smf_s5c_build_update_bearer_request( diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 60fc8f0a8f..992373f7ab 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -144,7 +144,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) } if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + OGS_GTP2_TEID_NO_PRESENCE, 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; @@ -158,7 +159,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) smf_metrics_inst_gtp_node_inc(smf_gnode->metrics, SMF_METR_GTP_NODE_CTR_S5C_RX_DELETESESSIONREQ); if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + OGS_GTP2_TEID_NO_PRESENCE, 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index b9b0bf9b29..ff6443dcf0 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -69,7 +69,8 @@ void upf_n4_handle_session_establishment_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0); upf_metrics_inst_by_cause_add(OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, @@ -214,7 +215,9 @@ void upf_n4_handle_session_establishment_request( upf_metrics_inst_by_cause_add(cause_value, UPF_METR_CTR_SM_N4SESSIONESTABFAIL, 1); ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0, + ogs_pfcp_send_error_message(xact, + sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, + sess ? sess->smf_n4_f_seid.seid : 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -240,7 +243,8 @@ void upf_n4_handle_session_modification_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -413,7 +417,9 @@ void upf_n4_handle_session_modification_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0, + ogs_pfcp_send_error_message(xact, + sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, + sess ? sess->smf_n4_f_seid.seid : 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -431,7 +437,8 @@ void upf_n4_handle_session_deletion_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, 0, + ogs_pfcp_send_error_message(xact, + OGS_PFCP_SEID_NO_PRESENCE, 0, OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index 0935e99228..1bebaee4ca 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -183,6 +183,7 @@ int upf_pfcp_send_session_establishment_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_establishment_response( @@ -216,6 +217,7 @@ int upf_pfcp_send_session_modification_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_modification_response( @@ -248,6 +250,7 @@ int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_deletion_response(h.type, sess); @@ -300,6 +303,7 @@ int upf_pfcp_send_session_report_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; + h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); diff --git a/tests/non3gpp/gtp-path.c b/tests/non3gpp/gtp-path.c index 3992bd01d5..c5b2453cd0 100644 --- a/tests/non3gpp/gtp-path.c +++ b/tests/non3gpp/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -135,6 +135,7 @@ int test_s2b_send_create_session_request(test_sess_t *sess, bool handover_ind) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_create_session_request(h.type, sess, handover_ind); @@ -166,6 +167,7 @@ int test_s2b_send_delete_session_request(test_sess_t *sess) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_delete_session_request(h.type, sess); @@ -201,6 +203,7 @@ int test_s2b_send_create_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_create_bearer_response(h.type, bearer); @@ -236,6 +239,7 @@ int test_s2b_send_delete_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; + h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_delete_bearer_response(h.type, bearer); From cf4ad1f2484ce8229aa0c468af77d7474736e4ec Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 24 Mar 2024 09:46:25 +0900 Subject: [PATCH 057/323] [PFCP] Session removal while waiting PFCP reply (#3040) 'node_timeout' and some other functions can remove a smf_sess_t while that session is still waiting for a PFCP reply and has an active PFCP xact. In this case, xact->data points to the deleted session and xact's timeout function (sess_5gc_timeout for example) eventually refers to this already freed session. This fix prevents duplicate deletes from occurring by checking to see if the session context has already been deleted when the timeout occurs. Additionally, it moves session deletions out of timer callbacks into state machine by reselect_upf(). Due to the way 'ogs_timer_mgr_expire' calls timer callbacks, one must not stop or expire timers from within a timer callback. And now one must not remove sessions from within a timer callback. --- lib/core/ogs-timer.c | 2 ++ lib/pfcp/context.c | 5 +++++ lib/pfcp/context.h | 1 + lib/pfcp/xact.c | 5 ----- lib/pfcp/xact.h | 1 - src/sgwc/pfcp-sm.c | 4 ---- src/sgwu/pfcp-sm.c | 4 ---- src/smf/pfcp-path.c | 23 ++++++++++++++++++++--- src/smf/pfcp-sm.c | 38 +++++++++++++++++++++++++++++--------- src/smf/timer.c | 2 ++ src/smf/timer.h | 1 + src/upf/pfcp-sm.c | 4 ---- 12 files changed, 60 insertions(+), 30 deletions(-) diff --git a/lib/core/ogs-timer.c b/lib/core/ogs-timer.c index cc14a7675a..c9dfc47e47 100644 --- a/lib/core/ogs-timer.c +++ b/lib/core/ogs-timer.c @@ -199,6 +199,8 @@ void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager) ogs_list_add(&list, &this->lnode); } + /* You should not perform a delete on a timer using ogs_timer_delete() + * in a callback function this->cb(). */ ogs_list_for_each(&list, lnode) { this = ogs_rb_entry(lnode, ogs_timer_t, lnode); ogs_timer_stop(this); diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 352e04df27..36860553d7 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -870,6 +870,11 @@ ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list) return node; } +ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node) +{ + return ogs_pool_cycle(&ogs_pfcp_node_pool, node); +} + void ogs_pfcp_node_free(ogs_pfcp_node_t *node) { ogs_assert(node); diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 679fc20ffe..e77cd48691 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -393,6 +393,7 @@ ogs_pfcp_context_t *ogs_pfcp_self(void); int ogs_pfcp_context_parse_config(const char *local, const char *remote); ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list); +ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node); void ogs_pfcp_node_free(ogs_pfcp_node_t *node); ogs_pfcp_node_t *ogs_pfcp_node_add( diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index f469f962b9..53a947df52 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -161,11 +161,6 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( return xact; } -ogs_pfcp_xact_t *ogs_pfcp_xact_cycle(ogs_pfcp_xact_t *xact) -{ - return ogs_pool_cycle(&pool, xact); -} - void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node) { ogs_pfcp_xact_t *xact = NULL, *next_xact = NULL; diff --git a/lib/pfcp/xact.h b/lib/pfcp/xact.h index 580b80b463..0229883c31 100644 --- a/lib/pfcp/xact.h +++ b/lib/pfcp/xact.h @@ -133,7 +133,6 @@ void ogs_pfcp_xact_final(void); ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, void (*cb)(ogs_pfcp_xact_t *xact, void *data), void *data); -ogs_pfcp_xact_t *ogs_pfcp_xact_cycle(ogs_pfcp_xact_t *xact); void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node); int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, diff --git a/src/sgwc/pfcp-sm.c b/src/sgwc/pfcp-sm.c index 06d47e2cbd..946d1f9a79 100644 --- a/src/sgwc/pfcp-sm.c +++ b/src/sgwc/pfcp-sm.c @@ -356,10 +356,6 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) } break; case SGWC_EVT_SXA_NO_HEARTBEAT: - - /* 'node' context was removed in ogs_pfcp_xact_delete(xact) - * So, we should not use PFCP node here */ - ogs_warn("No Heartbeat from SGW-U [%s]:%d", OGS_ADDR(addr, buf), OGS_PORT(addr)); OGS_FSM_TRAN(s, sgwc_pfcp_state_will_associate); diff --git a/src/sgwu/pfcp-sm.c b/src/sgwu/pfcp-sm.c index b14772baf4..2cf5512fe9 100644 --- a/src/sgwu/pfcp-sm.c +++ b/src/sgwu/pfcp-sm.c @@ -318,10 +318,6 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) } break; case SGWU_EVT_SXA_NO_HEARTBEAT: - - /* 'node' context was removed in ogs_pfcp_xact_delete(xact) - * So, we should not use PFCP node here */ - ogs_warn("No Heartbeat from SGW-C [%s]:%d", OGS_ADDR(addr, buf), OGS_PORT(addr)); OGS_FSM_TRAN(s, sgwu_pfcp_state_will_associate); diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 700fceae61..37fdb69168 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -222,8 +222,11 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) ogs_assert(xact); ogs_assert(data); - sess = data; - ogs_assert(sess); + sess = smf_sess_cycle(data); + if (!sess) { + ogs_warn("Session has already been removed"); + return; + } smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -288,7 +291,21 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) ogs_free(strerror); - smf_sess_remove(sess); + /* We mustn't remove sess here. Removing a session may delete PFCP xact + timers and we must not delete any timers from within a timer + callback. Instead, we shall emit a new event to trigger session + removal from pfcp-sm state machine. */ + e = smf_event_new(SMF_EVT_N4_TIMER); + ogs_assert(e); + e->sess = sess; + e->h.timer_id = SMF_TIMER_PFCP_NO_DELETION_RESPONSE; + e->pfcp_node = sess->pfcp_node; + + rv = ogs_queue_push(ogs_app()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_event_free(e); + } break; default: ogs_error("Not implemented [type:%d]", type); diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 3d6eaf022b..084f985f68 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -117,14 +117,21 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_cp_send_association_setup_request(node, node_timeout); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = e->sess; - sess = smf_sess_cycle(sess); + sess = smf_sess_cycle(e->sess); if (!sess) { ogs_warn("Session has already been removed"); break; } ogs_fsm_dispatch(&sess->sm, e); break; + case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: + sess = smf_sess_cycle(e->sess); + if (!sess) { + ogs_warn("Session has already been removed"); + break; + } + SMF_SESS_CLEAR(sess); + break; default: ogs_error("Unknown timer[%s:%d]", smf_timer_get_name(e->h.timer_id), e->h.timer_id); @@ -386,14 +393,21 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_send_heartbeat_request(node, node_timeout)); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = e->sess; - sess = smf_sess_cycle(sess); + sess = smf_sess_cycle(e->sess); if (!sess) { ogs_warn("Session has already been removed"); break; } ogs_fsm_dispatch(&sess->sm, e); break; + case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: + sess = smf_sess_cycle(e->sess); + if (!sess) { + ogs_warn("Session has already been removed"); + break; + } + SMF_SESS_CLEAR(sess); + break; default: ogs_error("Unknown timer[%s:%d]", smf_timer_get_name(e->h.timer_id), e->h.timer_id); @@ -401,12 +415,19 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) } break; case SMF_EVT_N4_NO_HEARTBEAT: - - /* 'node' context was removed in ogs_pfcp_xact_delete(xact) - * So, we should not use PFCP node here */ - ogs_warn("No Heartbeat from UPF [%s]:%d", OGS_ADDR(addr, buf), OGS_PORT(addr)); + + /* + * reselect_upf() should not be executed on node_timeout + * because the timer cannot be deleted in the timer expiration function. + * + * Note that reselct_upf contains SMF_SESS_CLEAR. + */ + node = e->pfcp_node; + ogs_assert(node); + reselect_upf(node); + OGS_FSM_TRAN(s, smf_pfcp_state_will_associate); break; default: @@ -550,7 +571,6 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data) switch (type) { case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: ogs_assert(data); - reselect_upf(data); e = smf_event_new(SMF_EVT_N4_NO_HEARTBEAT); e->pfcp_node = data; diff --git a/src/smf/timer.c b/src/smf/timer.c index fa2882d75e..0ee2f3ff56 100644 --- a/src/smf/timer.c +++ b/src/smf/timer.c @@ -42,6 +42,8 @@ const char *smf_timer_get_name(int timer_id) return "SMF_TIMER_PFCP_NO_HEARTBEAT"; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: return "SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE"; + case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: + return "SMF_TIMER_PFCP_NO_DELETION_RESPONSE"; default: break; } diff --git a/src/smf/timer.h b/src/smf/timer.h index 9a30701c70..0a32552236 100644 --- a/src/smf/timer.h +++ b/src/smf/timer.h @@ -33,6 +33,7 @@ typedef enum { SMF_TIMER_PFCP_ASSOCIATION, SMF_TIMER_PFCP_NO_HEARTBEAT, SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE, + SMF_TIMER_PFCP_NO_DELETION_RESPONSE, MAX_NUM_OF_SMF_TIMER, diff --git a/src/upf/pfcp-sm.c b/src/upf/pfcp-sm.c index ba8d1ed7d8..f7f788e308 100644 --- a/src/upf/pfcp-sm.c +++ b/src/upf/pfcp-sm.c @@ -322,10 +322,6 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) } break; case UPF_EVT_N4_NO_HEARTBEAT: - - /* 'node' context was removed in ogs_pfcp_xact_delete(xact) - * So, we should not use PFCP node here */ - ogs_warn("No Heartbeat from SMF [%s]:%d", OGS_ADDR(addr, buf), OGS_PORT(addr)); OGS_FSM_TRAN(s, upf_pfcp_state_will_associate); From 7c14073533e6f1ce39c53d4187fab6847fac0d44 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 24 Mar 2024 14:04:44 +0900 Subject: [PATCH 058/323] [UDM] Added validation for pubkey MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a cryptographic vulnerability in the SUCI decryption routines of Open5GS 5G—specifically Profile B, which uses P-256 (secp256r1) for its elliptic curve routines. If a mobile device user passes a public key within its SUCI that does not correspond to a valid point on the P-256 elliptic curve, the Open5GS UDM will not check the point before running elliptic curve operations with it and returning a response to the mobile device user. If the public key is not checked to be a valid point, an attacker can leverage this behavior to extract the Profile B private key from the UDM, as has been done in other domains (https://owasp.org/www-pdf-archive/Practical_Invalid_Curve_Attacks_on_TLS-ECDH_-_Juraj_Somorovsky.pdf). Note that Profile A is not similarly vulnerable to this, as it is impossible to construct an invalid point on a curve25519 elliptic curve. There was some work that went into developing a practical proof of concept of this kind of attack against free5gc last year; it can be found here: https://www.gsma.com/security/wp-content/uploads/2023/10/0073-invalid_curve.pdf And here is the free5gc security advisory: https://github.com/advisories/GHSA-cqvv-r3g3-26rf To mitigate this issue in Open5GS, the public key of the UE must be validated by the UDM prior to use. Adding a validation function such as the following should work: I designed this code based on information from https://crypto.stackexchange.com/questions/90151/verify-that-a-point-belongs-to-secp256r1. --- lib/crypt/ecc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/lib/crypt/ecc.c b/lib/crypt/ecc.c index d22789d6a2..411abe9231 100644 --- a/lib/crypt/ecc.c +++ b/lib/crypt/ecc.c @@ -4,6 +4,8 @@ #include <string.h> +#include "ogs-core.h" + #define NUM_ECC_DIGITS (ECC_BYTES/8) #define MAX_TRIES 16 @@ -82,6 +84,7 @@ static int getRandomNumber(uint64_t *p_vli) HCRYPTPROV l_prov; if(!CryptAcquireContext(&l_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + ogs_error("CryptAcquireContext() failed"); return 0; } @@ -107,9 +110,11 @@ static int getRandomNumber(uint64_t *p_vli) int l_fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); if(l_fd == -1) { + ogs_error("open(/dev/urandom) failed"); l_fd = open("/dev/random", O_RDONLY | O_CLOEXEC); if(l_fd == -1) { + ogs_error("open(/dev/random) failed"); return 0; } } @@ -122,6 +127,7 @@ static int getRandomNumber(uint64_t *p_vli) if(l_read <= 0) { // read failed close(l_fd); + ogs_error("read() failed"); return 0; } l_left -= l_read; @@ -1073,6 +1079,7 @@ int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTE { if(!getRandomNumber(l_private) || (l_tries++ >= MAX_TRIES)) { + ogs_error("getRandomNumber() failed [%d]", l_tries); return 0; } if(vli_isZero(l_private)) @@ -1096,6 +1103,45 @@ int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTE return 1; } +#define CURVE_A_32 {0xFFFFFFFFFFFFFFFCull, 0x00000000FFFFFFFFull, 0x0000000000000000ull, 0xFFFFFFFF00000001ull} + +static int ecdh_validate_pubkey(EccPoint l_public, uint64_t l_private[NUM_ECC_DIGITS]) { + uint64_t left[NUM_ECC_DIGITS]; + uint64_t right[NUM_ECC_DIGITS]; + uint64_t curve_a[NUM_ECC_DIGITS] = CURVE_A_32; + /* + * To ensure l_public is a valid point on the curve, we need to check: + * y^2 % p == (x^3 + a * x + b) % p) + */ + + /* Compute y^2 % p and store in `left` */ + vli_modSquare_fast(left, l_public.y); + + /* Compute x^3 and store in `right` */ + vli_modSquare_fast(right, l_public.x); + vli_modMult_fast(right, right, l_public.x); + + /* Compute a * x and store in `curve_a` */ + vli_modMult_fast(curve_a, curve_a, l_public.x); + /* Store ((a * x) + b) % p in `curve_a */ + vli_modAdd(curve_a, curve_a, curve_b, curve_p); + + /* + * Combine x^3 and ((a * x) + b) to make (x^3 + a * x + b) % p); + * store in `right` + */ + vli_modAdd(right, right, curve_a, curve_p); + + int i; + for (i = 0; i < NUM_ECC_DIGITS; i++) { + if (left[i] != right[i]) { + return 0; // y^2 % p != (x^3 + a * x + b) % p) + } + } + + return 1; +} + int ecdh_shared_secret(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_privateKey[ECC_BYTES], uint8_t p_secret[ECC_BYTES]) { EccPoint l_public; @@ -1104,12 +1150,23 @@ int ecdh_shared_secret(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_p if(!getRandomNumber(l_random)) { + ogs_error("getRandomNumber() failed"); return 0; } ecc_point_decompress(&l_public, p_publicKey); ecc_bytes2native(l_private, p_privateKey); + /* + * Validate received public key `p_publicKey` is a valid point + * on curve P-256 + */ + if (!ecdh_validate_pubkey(l_public, l_private)) + { + ogs_error("ecdh_validate_pubkey() failed"); + return 0; + } + EccPoint l_product; EccPoint_mult(&l_product, &l_public, l_private, l_random); @@ -1202,6 +1259,7 @@ int ecdsa_sign(const uint8_t p_privateKey[ECC_BYTES], const uint8_t p_hash[ECC_B { if(!getRandomNumber(k) || (l_tries++ >= MAX_TRIES)) { + ogs_error("getRandomNumber() failed [%d]", l_tries); return 0; } if(vli_isZero(k)) @@ -1256,11 +1314,13 @@ int ecdsa_verify(const uint8_t p_publicKey[ECC_BYTES+1], const uint8_t p_hash[EC if(vli_isZero(l_r) || vli_isZero(l_s)) { /* r, s must not be 0. */ + ogs_error("r, s must not be 0"); return 0; } if(vli_cmp(curve_n, l_r) != 1 || vli_cmp(curve_n, l_s) != 1) { /* r, s must be < n. */ + ogs_error("r, s must be < n"); return 0; } From 390a9dd6375858abfa93ff511d389d2bc41c4eca Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 24 Mar 2024 20:30:04 +0900 Subject: [PATCH 059/323] [MME] incorrect behavior of the SGsAP 1. According to ETSI TS 129 118 4.1, if the Network Access Mode (NAM) is set to "Packet only," no SGs association should be established. 2. If the NAM is set to "Packet and Circuit," and the SGs association is rejected by the CS core, this rejection should only impact the SGs association itself and not result in a UE attach rejection for a UE with a valid HSS account. --- docs/_docs/tutorial/01-your-first-lte.md | 2 +- src/mme/esm-handler.c | 12 ++-- src/mme/mme-s11-handler.c | 15 +++-- src/mme/sgsap-handler.c | 4 +- tests/csfb/mo-idle-test.c | 75 +++++++++++++++++++++++- 5 files changed, 93 insertions(+), 15 deletions(-) diff --git a/docs/_docs/tutorial/01-your-first-lte.md b/docs/_docs/tutorial/01-your-first-lte.md index 2b421c2d9c..29c8584cb4 100644 --- a/docs/_docs/tutorial/01-your-first-lte.md +++ b/docs/_docs/tutorial/01-your-first-lte.md @@ -334,7 +334,7 @@ Change back to the srsRAN source directory and copy the main config example as w ```bash $ cp srsenb/enb.conf.example srsenb/enb.conf $ cp srsenb/rr.conf.example srsenb/rr.conf -$ cp srsenb/drb.conf.example srsenb/drb.conf +$ cp srsenb/rb.conf.example srsenb/rb.conf $ cp srsenb/sib.conf.example srsenb/sib.conf ``` diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index 0f5bf377f6..752f760c8b 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -236,13 +236,17 @@ int esm_handle_information_response(mme_sess_t *sess, mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai); mme_ue->csmap = csmap; - if (csmap) { - ogs_assert(OGS_OK == - sgsap_send_location_update_request(mme_ue)); - } else { + if (!csmap || + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_ONLY_PACKET || + mme_ue->nas_eps.attach.value == + OGS_NAS_ATTACH_TYPE_EPS_ATTACH) { r = nas_eps_send_attach_accept(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_assert(OGS_OK == + sgsap_send_location_update_request(mme_ue)); } } else { ogs_assert(OGS_OK == diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 103921b45f..148f0e94e3 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -427,17 +427,20 @@ void mme_s11_handle_create_session_response( mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai); mme_ue->csmap = csmap; - if (csmap) { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( - session->paa.session_type)); - ogs_assert(OGS_OK == - sgsap_send_location_update_request(mme_ue)); - } else { + if (!csmap || + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_ONLY_PACKET || + mme_ue->nas_eps.attach.value == + OGS_NAS_ATTACH_TYPE_EPS_ATTACH) { ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( session->paa.session_type)); r = nas_eps_send_attach_accept(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( + session->paa.session_type)); + ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue)); } } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index ea0384a78f..5e7b204794 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -210,11 +210,9 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); } - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, - emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); + r = nas_eps_send_attach_accept(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); return; diff --git a/tests/csfb/mo-idle-test.c b/tests/csfb/mo-idle-test.c index cf2dfac31e..762447f4c8 100644 --- a/tests/csfb/mo-idle-test.c +++ b/tests/csfb/mo-idle-test.c @@ -470,11 +470,84 @@ static void test2_func(abts_case *tc, void *data) rv = testvlr_sgsap_send(sgsap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - /* Receive Attach Reject */ + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ recvbuf = testenb_s1ap_read(s1ap); ABTS_PTR_NOTNULL(tc, recvbuf); tests1ap_recv(test_ue, recvbuf); + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Service Request */ + emmbuf = testemm_build_service_request(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Data, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Detach Request */ + emmbuf = testemm_build_detach_request(test_ue, 1, true, true); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive UE Context Release Command */ recvbuf = testenb_s1ap_read(s1ap); ABTS_PTR_NOTNULL(tc, recvbuf); From 581d255c53ebb18173455546b8fbeadf7b8c5e18 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 26 Mar 2024 08:04:26 +0900 Subject: [PATCH 060/323] Revert "[GTP/PFCP]] incorrect dst TEI=0/SEID=0 (#3043)" This reverts commit a6675250417135cad1163a75213d49dd0d194c2a. --- lib/gtp/path.c | 15 ++++- lib/gtp/path.h | 5 +- lib/gtp/v2/message.c | 4 +- lib/gtp/v2/message.h | 7 +-- lib/gtp/v2/path.c | 11 ++-- lib/gtp/v2/path.h | 6 +- lib/gtp/v2/support/gtp-tlv.py | 7 +-- lib/gtp/xact.c | 9 ++- lib/pfcp/message.c | 4 +- lib/pfcp/message.h | 6 +- lib/pfcp/path.c | 17 +++--- lib/pfcp/path.h | 4 +- lib/pfcp/support/pfcp-tlv.py | 6 +- lib/pfcp/xact.c | 6 +- src/mme/mme-gtp-path.c | 13 +--- src/mme/mme-s11-handler.c | 22 ++----- src/sgwc/gtp-path.c | 4 +- src/sgwc/pfcp-path.c | 7 +-- src/sgwc/s11-handler.c | 100 +++++++++++-------------------- src/sgwc/s5c-handler.c | 109 ++++++++++++---------------------- src/sgwc/sxa-handler.c | 75 +++++++---------------- src/sgwu/pfcp-path.c | 6 +- src/sgwu/sxa-handler.c | 19 ++---- src/smf/binding.c | 4 +- src/smf/gsm-sm.c | 17 ++---- src/smf/gtp-path.c | 6 +- src/smf/n4-handler.c | 15 ++--- src/smf/pfcp-path.c | 8 +-- src/smf/pfcp-sm.c | 8 +-- src/smf/s5c-handler.c | 30 +++------- src/smf/smf-sm.c | 8 +-- src/upf/n4-handler.c | 19 ++---- src/upf/pfcp-path.c | 6 +- tests/non3gpp/gtp-path.c | 6 +- 34 files changed, 206 insertions(+), 383 deletions(-) diff --git a/lib/gtp/path.c b/lib/gtp/path.c index d550bf1bb2..b20f491c00 100644 --- a/lib/gtp/path.c +++ b/lib/gtp/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -128,3 +128,16 @@ int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf) return OGS_OK; } + +void ogs_gtp_send_error_message( + ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value) +{ + switch (xact->gtp_version) { + case 1: + ogs_gtp1_send_error_message(xact, teid, type, cause_value); + break; + case 2: + ogs_gtp2_send_error_message(xact, teid, type, cause_value); + break; + } +} diff --git a/lib/gtp/path.h b/lib/gtp/path.h index e9bdef8e14..6cb39ac77e 100644 --- a/lib/gtp/path.h +++ b/lib/gtp/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -72,6 +72,9 @@ int ogs_gtp_connect(ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_gtp_node_t *gnode); int ogs_gtp_send(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf); int ogs_gtp_sendto(ogs_gtp_node_t *gnode, ogs_pkbuf_t *pkbuf); +void ogs_gtp_send_error_message( + ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value); + #ifdef __cplusplus } #endif diff --git a/lib/gtp/v2/message.c b/lib/gtp/v2/message.c index 96b7342c95..31c79a3f88 100644 --- a/lib/gtp/v2/message.c +++ b/lib/gtp/v2/message.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by gtp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-03-23 07:21:22.444548 by acetcom + * Created on: 2023-08-26 16:35:12.648272 by acetcom * from 29274-h70.docx ******************************************************************************/ diff --git a/lib/gtp/v2/message.h b/lib/gtp/v2/message.h index d294e9645f..a6fcb161bc 100644 --- a/lib/gtp/v2/message.h +++ b/lib/gtp/v2/message.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by gtp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-03-23 07:21:22.438775 by acetcom + * Created on: 2023-08-26 16:35:12.642445 by acetcom * from 29274-h70.docx ******************************************************************************/ @@ -44,9 +44,6 @@ typedef struct ogs_gtp2_header_s { struct { #define OGS_GTP2_VERSION_0 0 #define OGS_GTP2_VERSION_1 1 - -#define OGS_GTP2_TEID_NO_PRESENCE 0 -#define OGS_GTP2_TEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t piggybacked:1;, uint8_t teid_presence:1;, diff --git a/lib/gtp/v2/path.c b/lib/gtp/v2/path.c index 757f51c621..26549ab81c 100644 --- a/lib/gtp/v2/path.c +++ b/lib/gtp/v2/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -160,8 +160,8 @@ ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb) return pkb_resp; } -void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, - int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value) +void ogs_gtp2_send_error_message( + ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value) { int rv; ogs_gtp2_message_t errmsg; @@ -170,7 +170,6 @@ void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, ogs_pkbuf_t *pkbuf = NULL; memset(&errmsg, 0, sizeof(ogs_gtp2_message_t)); - errmsg.h.teid_presence = teid_presence; errmsg.h.teid = teid; errmsg.h.type = type; @@ -258,7 +257,7 @@ void ogs_gtp2_send_echo_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_ECHO_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE; + h.teid = 0; pkbuf = ogs_gtp2_build_echo_request(h.type, recovery, features); if (!pkbuf) { @@ -285,7 +284,7 @@ void ogs_gtp2_send_echo_response(ogs_gtp_xact_t *xact, memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_ECHO_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_NO_PRESENCE; + h.teid = 0; pkbuf = ogs_gtp2_build_echo_response(h.type, recovery, features); if (!pkbuf) { diff --git a/lib/gtp/v2/path.h b/lib/gtp/v2/path.h index 8a21cd6f26..7b3aa6ddaf 100644 --- a/lib/gtp/v2/path.h +++ b/lib/gtp/v2/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -36,8 +36,8 @@ int ogs_gtp2_send_user_plane( ogs_pkbuf_t *pkbuf); ogs_pkbuf_t *ogs_gtp2_handle_echo_req(ogs_pkbuf_t *pkb); -void ogs_gtp2_send_error_message(ogs_gtp_xact_t *xact, - int teid_presence, uint32_t teid, uint8_t type, uint8_t cause_value); +void ogs_gtp2_send_error_message( + ogs_gtp_xact_t *xact, uint32_t teid, uint8_t type, uint8_t cause_value); void ogs_gtp2_send_echo_request( ogs_gtp_node_t *gnode, uint8_t recovery, uint8_t features); diff --git a/lib/gtp/v2/support/gtp-tlv.py b/lib/gtp/v2/support/gtp-tlv.py index 4ff6da798d..fafd12268f 100644 --- a/lib/gtp/v2/support/gtp-tlv.py +++ b/lib/gtp/v2/support/gtp-tlv.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -60,7 +60,7 @@ def write_file(f, string): def output_header_to_file(f): now = datetime.datetime.now() f.write("""/* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -461,9 +461,6 @@ def iter_block_items(parent): struct { #define OGS_GTP2_VERSION_0 0 #define OGS_GTP2_VERSION_1 1 - -#define OGS_GTP2_TEID_NO_PRESENCE 0 -#define OGS_GTP2_TEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t piggybacked:1;, uint8_t teid_presence:1;, diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index 0da03de769..ffec8621a3 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -1,7 +1,6 @@ /* * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> - * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -408,7 +407,7 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact, return OGS_ERROR; } - if (hdesc->teid_presence) { + if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) { gtp_hlen = OGS_GTPV2C_HEADER_LEN; } else { gtp_hlen = OGS_GTPV2C_HEADER_LEN - OGS_GTP2_TEID_LEN; @@ -421,12 +420,12 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact, h->version = 2; h->type = hdesc->type; - if (hdesc->teid_presence) { - h->teid_presence = OGS_GTP2_TEID_PRESENCE; + if (hdesc->type > OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE) { + h->teid_presence = 1; h->teid = htobe32(hdesc->teid); h->sqn = OGS_GTP2_XID_TO_SQN(xact->xid); } else { - h->teid_presence = OGS_GTP2_TEID_NO_PRESENCE; + h->teid_presence = 0; h->sqn_only = OGS_GTP2_XID_TO_SQN(xact->xid); } h->length = htobe16(pkbuf->len - 4); diff --git a/lib/pfcp/message.c b/lib/pfcp/message.c index d183e53256..50941162d7 100644 --- a/lib/pfcp/message.c +++ b/lib/pfcp/message.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-03-23 07:20:44.691773 by acetcom + * Created on: 2024-01-19 23:36:01.346970 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ diff --git a/lib/pfcp/message.h b/lib/pfcp/message.h index 46d716d67f..c186cb988a 100644 --- a/lib/pfcp/message.h +++ b/lib/pfcp/message.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-03-23 07:20:44.672650 by acetcom + * Created on: 2024-01-19 23:36:01.327925 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -41,8 +41,6 @@ extern "C" { typedef struct ogs_pfcp_header_s { union { struct { -#define OGS_PFCP_SEID_NO_PRESENCE 0 -#define OGS_PFCP_SEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t spare1:3;, uint8_t mp:1;, diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index 9638440645..82e3a3467c 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -140,7 +140,7 @@ int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_HEARTBEAT_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -176,7 +176,7 @@ int ogs_pfcp_send_heartbeat_response(ogs_pfcp_xact_t *xact) memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_HEARTBEAT_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; pkbuf = ogs_pfcp_build_heartbeat_response(h.type); if (!pkbuf) { @@ -217,7 +217,7 @@ int ogs_pfcp_cp_send_association_setup_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -254,7 +254,7 @@ int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; pkbuf = ogs_pfcp_cp_build_association_setup_response(h.type, cause); if (!pkbuf) { @@ -286,7 +286,7 @@ int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; xact = ogs_pfcp_xact_local_create(node, cb, node); if (!xact) { @@ -323,7 +323,7 @@ int ogs_pfcp_up_send_association_setup_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_NO_PRESENCE; + h.seid = 0; pkbuf = ogs_pfcp_up_build_association_setup_response(h.type, cause); if (!pkbuf) { @@ -468,7 +468,7 @@ void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr) } void ogs_pfcp_send_error_message( - ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type, + ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type, uint8_t cause_value, uint16_t offending_ie_value) { int rv; @@ -480,7 +480,6 @@ void ogs_pfcp_send_error_message( ogs_assert(xact); memset(&errmsg, 0, sizeof(ogs_pfcp_message_t)); - errmsg.h.seid_presence = seid_presence; errmsg.h.seid = seid; errmsg.h.type = type; diff --git a/lib/pfcp/path.h b/lib/pfcp/path.h index eb1014d052..379e992ebe 100644 --- a/lib/pfcp/path.h +++ b/lib/pfcp/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -86,7 +86,7 @@ int ogs_pfcp_send_end_marker(ogs_pfcp_pdr_t *pdr); void ogs_pfcp_send_buffered_packet(ogs_pfcp_pdr_t *pdr); void ogs_pfcp_send_error_message( - ogs_pfcp_xact_t *xact, int seid_presence, uint64_t seid, uint8_t type, + ogs_pfcp_xact_t *xact, uint64_t seid, uint8_t type, uint8_t cause_value, uint16_t offending_ie_value); #ifdef __cplusplus diff --git a/lib/pfcp/support/pfcp-tlv.py b/lib/pfcp/support/pfcp-tlv.py index 2306af1a1a..671b81640c 100644 --- a/lib/pfcp/support/pfcp-tlv.py +++ b/lib/pfcp/support/pfcp-tlv.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> +# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> # This file is part of Open5GS. @@ -54,7 +54,7 @@ def write_file(f, string): def output_header_to_file(f): now = datetime.datetime.now() f.write("""/* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -541,8 +541,6 @@ def write_cells_to_file(name, cells): typedef struct ogs_pfcp_header_s { union { struct { -#define OGS_PFCP_SEID_NO_PRESENCE 0 -#define OGS_PFCP_SEID_PRESENCE 1 ED4(uint8_t version:3;, uint8_t spare1:3;, uint8_t mp:1;, diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index 53a947df52..dc0c1ef2cc 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -246,7 +246,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, return OGS_ERROR; } - if (hdesc->seid_presence) { + if (hdesc->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) { pfcp_hlen = OGS_PFCP_HEADER_LEN; } else { pfcp_hlen = OGS_PFCP_HEADER_LEN - OGS_PFCP_SEID_LEN; @@ -259,7 +259,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, h->version = OGS_PFCP_VERSION; h->type = hdesc->type; - if (hdesc->seid_presence) { + if (h->type >= OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE) { h->seid_presence = 1; h->seid = htobe64(hdesc->seid); h->sqn = OGS_PFCP_XID_TO_SQN(xact->xid); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index a5bc1fb398..7d9e8f3f35 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -254,7 +254,6 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_session_request(h.type, sess, create_action); @@ -294,7 +293,6 @@ int mme_gtp_send_modify_bearer_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_modify_bearer_request(h.type, mme_ue, uli_presence); @@ -334,7 +332,6 @@ int mme_gtp_send_delete_session_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; s11buf = mme_s11_build_delete_session_request(h.type, sess, action); @@ -403,7 +400,6 @@ int mme_gtp_send_create_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value); @@ -449,7 +445,6 @@ int mme_gtp_send_update_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value); @@ -495,7 +490,6 @@ int mme_gtp_send_delete_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value); @@ -531,7 +525,6 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_release_access_bearers_request(h.type); @@ -629,7 +622,6 @@ int mme_gtp_send_downlink_data_notification_ack( /* Build Downlink data notification ack */ memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value); @@ -665,7 +657,6 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request( @@ -705,7 +696,6 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM); @@ -748,7 +738,6 @@ int mme_gtp_send_bearer_resource_command( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgw_ue->sgw_s11_teid; pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 148f0e94e3..339bde7ef7 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -823,9 +823,7 @@ void mme_s11_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -861,9 +859,7 @@ void mme_s11_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1019,9 +1015,7 @@ void mme_s11_handle_update_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1192,9 +1186,7 @@ void mme_s11_handle_delete_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); return; @@ -1451,9 +1443,7 @@ void mme_s11_handle_downlink_data_notification( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sgw_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgw_ue ? sgw_ue->sgw_s11_teid : 0, + ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0, OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); return; diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index 01b5c9b3a3..6ce21e64ff 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -182,7 +182,6 @@ int sgwc_gtp_send_create_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgwc_ue->mme_s11_teid; pkbuf = sgwc_s11_build_create_session_response(h.type, sess); @@ -230,7 +229,6 @@ int sgwc_gtp_send_downlink_data_notification( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sgwc_ue->mme_s11_teid; pkbuf = sgwc_s11_build_downlink_data_notification(cause_value, bearer); diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index 984c655168..fa5c9f5057 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -222,7 +222,6 @@ int sgwc_pfcp_send_bearer_to_modify_list( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact); @@ -303,7 +302,6 @@ int sgwc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_session_establishment_request(h.type, sess); @@ -391,7 +389,6 @@ int sgwc_pfcp_send_bearer_modification_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_bearer_to_modify_list(h.type, sess, xact); @@ -440,7 +437,6 @@ int sgwc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = sgwc_sxa_build_session_deletion_request(h.type, sess); @@ -470,7 +466,6 @@ int sgwc_pfcp_send_session_report_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwu_sxa_seid; sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 3164af8209..f6fe9c319c 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -173,9 +173,8 @@ void sgwc_s11_handle_create_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -215,9 +214,8 @@ void sgwc_s11_handle_create_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -264,9 +262,8 @@ void sgwc_s11_handle_create_session_request( /* Check if selected SGW-U is associated with SGW-C */ ogs_assert(sess->pfcp_node); if (!OGS_FSM_CHECK(&sess->pfcp_node->sm, sgwc_pfcp_state_associated)) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING); return; @@ -426,9 +423,8 @@ void sgwc_s11_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -535,9 +531,8 @@ void sgwc_s11_handle_modify_bearer_request( if (i == 0) { ogs_error("No Bearer"); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -614,9 +609,8 @@ void sgwc_s11_handle_delete_session_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -635,9 +629,8 @@ void sgwc_s11_handle_delete_session_request( indication->operation_indication == 1 && indication->scope_indication == 1) { ogs_error("Invalid Indication"); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); return; @@ -663,7 +656,6 @@ void sgwc_s11_handle_delete_session_request( } else { message->h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; gtpbuf = ogs_gtp2_build_msg(message); @@ -770,9 +762,7 @@ void sgwc_s11_handle_create_bearer_response( sgwc_pfcp_send_bearer_modification_request( bearer, NULL, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -791,9 +781,7 @@ void sgwc_s11_handle_create_bearer_response( sgwc_pfcp_send_bearer_modification_request( bearer, NULL, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -927,9 +915,7 @@ void sgwc_s11_handle_update_bearer_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -944,9 +930,7 @@ void sgwc_s11_handle_update_bearer_response( cause_value = cause->value; if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value); - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -956,9 +940,7 @@ void sgwc_s11_handle_update_bearer_response( cause_value = cause->value; if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause [Value:%d]", cause_value); - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -975,7 +957,6 @@ void sgwc_s11_handle_update_bearer_response( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -1147,9 +1128,8 @@ void sgwc_s11_handle_release_access_bearers_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); return; } @@ -1255,9 +1235,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, cause_value); return; @@ -1274,9 +1253,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( for (i = 0; req->bearer_contexts[i].presence; i++) { if (req->bearer_contexts[i].eps_bearer_id.presence == 0) { ogs_error("No EBI"); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1298,9 +1276,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message(s11_xact, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1334,9 +1311,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message(s11_xact, + sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -1390,9 +1366,8 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE, cause_value); return; @@ -1466,9 +1441,8 @@ void sgwc_s11_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1488,9 +1462,8 @@ void sgwc_s11_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1510,7 +1483,6 @@ void sgwc_s11_handle_bearer_resource_command( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(message); diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index d8acb267c3..377a7d5e22 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024444 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -122,9 +122,8 @@ void sgwc_s5c_handle_create_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -161,9 +160,8 @@ void sgwc_s5c_handle_create_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -187,10 +185,8 @@ void sgwc_s5c_handle_create_session_response( bearer_cause = cause->value; if (bearer_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Bearer Cause [VALUE:%d]", bearer_cause); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, bearer_cause); return; } @@ -203,9 +199,8 @@ void sgwc_s5c_handle_create_session_response( session_cause != OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) { ogs_error("GTP Cause [VALUE:%d]", session_cause); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); return; } @@ -238,10 +233,8 @@ void sgwc_s5c_handle_create_session_response( bearer = sgwc_bearer_find_by_sess_ebi(sess, rsp->bearer_contexts_created[i].eps_bearer_id.u8); if (!bearer) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -260,10 +253,8 @@ void sgwc_s5c_handle_create_session_response( rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -363,15 +354,13 @@ void sgwc_s5c_handle_modify_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); else - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -387,15 +376,13 @@ void sgwc_s5c_handle_modify_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); else - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -407,15 +394,13 @@ void sgwc_s5c_handle_modify_bearer_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause [VALUE:%d]", session_cause); if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST) - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause); else - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause); return; } @@ -435,7 +420,6 @@ void sgwc_s5c_handle_modify_bearer_response( sgwc_gtp_send_create_session_response(sess, s11_xact)); } else { message->h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -509,9 +493,8 @@ void sgwc_s5c_handle_delete_session_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -590,9 +573,7 @@ void sgwc_s5c_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -620,9 +601,7 @@ void sgwc_s5c_handle_create_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -652,9 +631,7 @@ void sgwc_s5c_handle_create_bearer_request( rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip); if (rv != OGS_OK) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, OGS_GTP2_CAUSE_MANDATORY_IE_MISSING); return; @@ -732,9 +709,7 @@ void sgwc_s5c_handle_update_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -754,7 +729,6 @@ void sgwc_s5c_handle_update_bearer_request( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -876,9 +850,7 @@ void sgwc_s5c_handle_delete_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -898,7 +870,6 @@ void sgwc_s5c_handle_delete_bearer_request( sess->sgw_s5c_teid, sess->pgw_s5c_teid); message->h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; - message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(message); @@ -999,8 +970,6 @@ void sgwc_s5c_handle_bearer_resource_failure_indication( cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message(s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); } diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index dffd2a76d3..14fb667cbc 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -245,9 +245,8 @@ void sgwc_sxa_handle_session_establishment_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (sess) sgwc_ue = sess->sgwc_ue; - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); return; } @@ -270,11 +269,10 @@ void sgwc_sxa_handle_session_establishment_response( if (dl_tunnel->local_addr == NULL && dl_tunnel->local_addr6 == NULL) { ogs_error("No UP F-TEID"); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, - OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, + OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND); return; } @@ -349,7 +347,6 @@ void sgwc_sxa_handle_session_establishment_response( memset(&send_message, 0, sizeof(ogs_gtp2_message_t)); send_message.h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; - send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sess->pgw_s5c_teid; /* Send Control Plane(DL) : SGW-S5C */ @@ -399,7 +396,6 @@ void sgwc_sxa_handle_session_establishment_response( /* Create Session Request */ recv_message->h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; /* Send Control Plane(DL) : SGW-S5C */ @@ -585,10 +581,9 @@ void sgwc_sxa_handle_session_modification_response( s5c_xact = pfcp_xact->assoc_xact; if (s5c_xact) { - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, - OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s5c_xact, sess ? sess->pgw_s5c_teid : 0, + OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); } sgwc_bearer_remove(bearer); @@ -596,9 +591,8 @@ void sgwc_sxa_handle_session_modification_response( s5c_xact = pfcp_xact->assoc_xact; ogs_assert(s5c_xact); - ogs_gtp2_send_error_message(s5c_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->pgw_s5c_teid : 0, + ogs_gtp_send_error_message( + s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); @@ -607,20 +601,16 @@ void sgwc_sxa_handle_session_modification_response( s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); } else if (flags & OGS_PFCP_MODIFY_DL_ONLY) { s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); } else { ogs_fatal("Invalid modify_flags[0x%llx]", (long long)flags); @@ -630,10 +620,9 @@ void sgwc_sxa_handle_session_modification_response( s11_xact = pfcp_xact->assoc_xact; ogs_assert(s11_xact); - ogs_gtp2_send_error_message(s11_xact, - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sgwc_ue ? sgwc_ue->mme_s11_teid : 0, - OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); + ogs_gtp_send_error_message( + s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, + OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value); } ogs_pfcp_xact_commit(pfcp_xact); @@ -705,7 +694,6 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE; - send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -732,7 +720,6 @@ void sgwc_sxa_handle_session_modification_response( if (s5c_xact) { ogs_assert(recv_message); recv_message->h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -782,7 +769,6 @@ void sgwc_sxa_handle_session_modification_response( gtp_req->bearer_contexts.s1_u_enodeb_f_teid.len = len; recv_message->h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -850,7 +836,6 @@ void sgwc_sxa_handle_session_modification_response( gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.len = len; recv_message->h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -977,7 +962,6 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE; - send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1062,7 +1046,6 @@ void sgwc_sxa_handle_session_modification_response( } recv_message->h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -1100,7 +1083,6 @@ void sgwc_sxa_handle_session_modification_response( if (indication && indication->handover_indication) { recv_message->h.type = OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE; - recv_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; recv_message->h.teid = sess->pgw_s5c_teid; pkbuf = ogs_gtp2_build_msg(recv_message); @@ -1186,7 +1168,6 @@ void sgwc_sxa_handle_session_modification_response( } send_message.h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; - send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1252,7 +1233,6 @@ void sgwc_sxa_handle_session_modification_response( send_message.h.type = OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE; - send_message.h.teid_presence = OGS_GTP2_TEID_PRESENCE; send_message.h.teid = sgwc_ue->mme_s11_teid; pkbuf = ogs_gtp2_build_msg(&send_message); @@ -1284,7 +1264,6 @@ void sgwc_sxa_handle_session_deletion_response( { int rv; uint8_t cause_value = 0; - int teid_presence = OGS_GTP2_TEID_NO_PRESENCE; uint32_t teid = 0; sgwc_ue_t *sgwc_ue = NULL; @@ -1336,8 +1315,6 @@ void sgwc_sxa_handle_session_deletion_response( * 2. SMF sends Delete Session Response to SGW/MME. */ if (sess) sgwc_ue = sess->sgwc_ue; - teid_presence = - sgwc_ue ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE; teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0; break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: @@ -1354,8 +1331,6 @@ void sgwc_sxa_handle_session_deletion_response( * - Bearer Resource Command * - Delete Bearer Request/Response with DEDICATED BEARER. */ - teid_presence = - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE; teid = sess ? sess->pgw_s5c_teid : 0; break; default: @@ -1365,8 +1340,8 @@ void sgwc_sxa_handle_session_deletion_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { if (gtp_xact) { - ogs_gtp2_send_error_message(gtp_xact, - teid_presence, teid, gtp_message->h.type, cause_value); + ogs_gtp_send_error_message( + gtp_xact, teid, gtp_message->h.type, cause_value); } return; } @@ -1383,7 +1358,6 @@ void sgwc_sxa_handle_session_deletion_response( * If gtp_message->h.type == OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE * Then gtp_xact is S5C-XACT */ - gtp_message->h.teid_presence = OGS_GTP2_TEID_PRESENCE; gtp_message->h.teid = teid; pkbuf = ogs_gtp2_build_msg(gtp_message); @@ -1445,8 +1419,7 @@ void sgwc_sxa_handle_session_report_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_pfcp_send_error_message(pfcp_xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, cause_value, 0); return; @@ -1458,9 +1431,7 @@ void sgwc_sxa_handle_session_report_request( if (!sgwc_ue->gnode) { ogs_error("No SGWC-UE GTP Node"); - ogs_pfcp_send_error_message(pfcp_xact, - sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, - sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(pfcp_xact, sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index e54423fe00..d9f423bbf7 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -180,7 +180,6 @@ int sgwu_pfcp_send_session_establishment_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_establishment_response( @@ -214,7 +213,6 @@ int sgwu_pfcp_send_session_modification_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_modification_response( @@ -247,7 +245,6 @@ int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; sxabuf = sgwu_sxa_build_session_deletion_response(h.type, sess); @@ -298,7 +295,6 @@ int sgwu_pfcp_send_session_report_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->sgwc_sxa_f_seid.seid; xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); diff --git a/src/sgwu/sxa-handler.c b/src/sgwu/sxa-handler.c index 4fd54f8689..ec25214e3f 100644 --- a/src/sgwu/sxa-handler.c +++ b/src/sgwu/sxa-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -45,8 +45,7 @@ void sgwu_sxa_handle_session_establishment_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0); return; @@ -143,9 +142,7 @@ void sgwu_sxa_handle_session_establishment_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, - sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, - sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -171,8 +168,7 @@ void sgwu_sxa_handle_session_modification_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -313,9 +309,7 @@ void sgwu_sxa_handle_session_modification_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, - sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, - sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -331,8 +325,7 @@ void sgwu_sxa_handle_session_deletion_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/smf/binding.c b/src/smf/binding.c index 8fbefeeb7c..72ee3e5170 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -363,7 +363,6 @@ void smf_bearer_binding(smf_sess_t *sess) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_update_bearer_request( @@ -440,7 +439,6 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer) ogs_assert(sess); h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; memset(&tft, 0, sizeof tft); diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 60ff146bdb..d1226ca9ea 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -1,5 +1,6 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * * This file is part of Open5GS. * @@ -73,9 +74,7 @@ static void send_gtp_create_err_msg(const smf_sess_t *sess, ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause); else - ogs_gtp2_send_error_message(gtp_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, gtp_cause); } @@ -86,9 +85,7 @@ static void send_gtp_delete_err_msg(const smf_sess_t *sess, ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, gtp_cause); else - ogs_gtp2_send_error_message(gtp_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp_cause); } @@ -778,10 +775,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) sess, e->gtp_xact, &gtp2_message->delete_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(e->gtp_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess->sgw_s5c_teid, - OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); + ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, + OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); return; } OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); diff --git a/src/smf/gtp-path.c b/src/smf/gtp-path.c index c77d467423..8d88ee20e1 100644 --- a/src/smf/gtp-path.c +++ b/src/smf/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -444,7 +444,6 @@ int smf_gtp2_send_create_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_create_session_response(h.type, sess); @@ -479,7 +478,6 @@ int smf_gtp2_send_modify_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_modify_bearer_response( @@ -513,7 +511,6 @@ int smf_gtp2_send_delete_session_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_delete_session_response(h.type, sess); @@ -551,7 +548,6 @@ int smf_gtp2_send_delete_bearer_request( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->sgw_s5c_teid; pkbuf = smf_s5c_build_delete_bearer_request( diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 6727666ad8..355ff1477d 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -971,7 +971,6 @@ void smf_epc_n4_handle_session_modification_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.teid = sess->sgw_s5c_teid; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.type = OGS_GTP2_DELETE_BEARER_REQUEST_TYPE; pkbuf = smf_s5c_build_delete_bearer_request( @@ -1183,8 +1182,7 @@ void smf_n4_handle_session_report_request( } if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) { - ogs_pfcp_send_error_message(pfcp_xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, cause_value, 0); return; @@ -1224,8 +1222,7 @@ void smf_n4_handle_session_report_request( if (paging_policy_indication_value) { ogs_warn("Not implement - " "Paging Policy Indication Value"); - ogs_pfcp_send_error_message(pfcp_xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED, 0); return; @@ -1235,8 +1232,7 @@ void smf_n4_handle_session_report_request( qos_flow = smf_qos_flow_find_by_qfi(sess, qfi); if (!qos_flow) { ogs_error("Cannot find the QoS Flow[%d]", qfi); - ogs_pfcp_send_error_message(pfcp_xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -1261,8 +1257,7 @@ void smf_n4_handle_session_report_request( if (!pdr) { ogs_error("No Context"); - ogs_pfcp_send_error_message(pfcp_xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 37fdb69168..fc02ae6ae8 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -370,7 +370,6 @@ int smf_pfcp_send_modify_list( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = (*modify_list)(h.type, sess, xact); @@ -448,7 +447,6 @@ int smf_5gc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact); @@ -551,7 +549,6 @@ int smf_5gc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_deletion_request(h.type, sess); @@ -625,7 +622,6 @@ int smf_epc_pfcp_send_session_establishment_request( * over N4 towards another SMF or another PFCP entity in the SMF * as specified in clause 5.22.2 and clause 5.22.3. */ - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_establishment_request(h.type, sess, xact); @@ -769,7 +765,6 @@ int smf_epc_pfcp_send_session_deletion_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; n4buf = smf_n4_build_session_deletion_request(h.type, sess); @@ -868,7 +863,6 @@ int smf_pfcp_send_session_report_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->upf_n4_seid; sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 084f985f68..bf02358424 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -324,8 +324,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_CREATE_PDP_CONTEXT_RESPONSE_TYPE, OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); else - ogs_gtp2_send_error_message(gtp_xact, - OGS_GTP2_TEID_NO_PRESENCE, 0, + ogs_gtp2_send_error_message(gtp_xact, 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; @@ -360,8 +359,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); else - ogs_gtp2_send_error_message(gtp_xact, - OGS_GTP2_TEID_NO_PRESENCE, 0, + ogs_gtp2_send_error_message(gtp_xact, 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index e20b23ecfb..da65704e70 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -504,9 +504,7 @@ void smf_s5c_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(gtp_xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(gtp_xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1188,9 +1186,7 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1215,9 +1211,7 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1246,10 +1240,8 @@ void smf_s5c_handle_bearer_resource_command( pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1); if (pf) { if (reconfigure_packet_filter(pf, &tft, i) < 0) { - ogs_gtp2_send_error_message(xact, - sess ? OGS_GTP2_TEID_PRESENCE : - OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message( + xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1317,9 +1309,8 @@ void smf_s5c_handle_bearer_resource_command( ogs_assert(pf); if (reconfigure_packet_filter(pf, &tft, i) < 0) { - ogs_gtp2_send_error_message(xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message( + xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1405,9 +1396,7 @@ void smf_s5c_handle_bearer_resource_command( if (tft_update == 0 && tft_delete == 0 && qos_update == 0) { /* No modification */ - ogs_gtp2_send_error_message(xact, - sess ? OGS_GTP2_TEID_PRESENCE : OGS_GTP2_TEID_NO_PRESENCE, - sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SERVICE_NOT_SUPPORTED); return; @@ -1433,7 +1422,6 @@ void smf_s5c_handle_bearer_resource_command( } else { memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.teid = sess->sgw_s5c_teid; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; pkbuf = smf_s5c_build_update_bearer_request( diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 992373f7ab..60fc8f0a8f 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -144,8 +144,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) } if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, - OGS_GTP2_TEID_NO_PRESENCE, 0, + ogs_gtp2_send_error_message(gtp_xact, 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; @@ -159,8 +158,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) smf_metrics_inst_gtp_node_inc(smf_gnode->metrics, SMF_METR_GTP_NODE_CTR_S5C_RX_DELETESESSIONREQ); if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, - OGS_GTP2_TEID_NO_PRESENCE, 0, + ogs_gtp2_send_error_message(gtp_xact, 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index ff6443dcf0..b9b0bf9b29 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -69,8 +69,7 @@ void upf_n4_handle_session_establishment_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0); upf_metrics_inst_by_cause_add(OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, @@ -215,9 +214,7 @@ void upf_n4_handle_session_establishment_request( upf_metrics_inst_by_cause_add(cause_value, UPF_METR_CTR_SM_N4SESSIONESTABFAIL, 1); ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, - sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, - sess ? sess->smf_n4_f_seid.seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -243,8 +240,7 @@ void upf_n4_handle_session_modification_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; @@ -417,9 +413,7 @@ void upf_n4_handle_session_modification_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, - sess ? OGS_PFCP_SEID_PRESENCE : OGS_PFCP_SEID_NO_PRESENCE, - sess ? sess->smf_n4_f_seid.seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -437,8 +431,7 @@ void upf_n4_handle_session_deletion_request( if (!sess) { ogs_error("No Context"); - ogs_pfcp_send_error_message(xact, - OGS_PFCP_SEID_NO_PRESENCE, 0, + ogs_pfcp_send_error_message(xact, 0, OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); return; diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index 1bebaee4ca..0935e99228 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -183,7 +183,6 @@ int upf_pfcp_send_session_establishment_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_establishment_response( @@ -217,7 +216,6 @@ int upf_pfcp_send_session_modification_response( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_modification_response( @@ -250,7 +248,6 @@ int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; n4buf = upf_n4_build_session_deletion_response(h.type, sess); @@ -303,7 +300,6 @@ int upf_pfcp_send_session_report_request( memset(&h, 0, sizeof(ogs_pfcp_header_t)); h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; - h.seid_presence = OGS_PFCP_SEID_PRESENCE; h.seid = sess->smf_n4_f_seid.seid; xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); diff --git a/tests/non3gpp/gtp-path.c b/tests/non3gpp/gtp-path.c index c5b2453cd0..3992bd01d5 100644 --- a/tests/non3gpp/gtp-path.c +++ b/tests/non3gpp/gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -135,7 +135,6 @@ int test_s2b_send_create_session_request(test_sess_t *sess, bool handover_ind) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_SESSION_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_create_session_request(h.type, sess, handover_ind); @@ -167,7 +166,6 @@ int test_s2b_send_delete_session_request(test_sess_t *sess) memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_delete_session_request(h.type, sess); @@ -203,7 +201,6 @@ int test_s2b_send_create_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_create_bearer_response(h.type, bearer); @@ -239,7 +236,6 @@ int test_s2b_send_delete_bearer_response( memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; - h.teid_presence = OGS_GTP2_TEID_PRESENCE; h.teid = sess->smf_s2b_c_teid; pkbuf = test_s2b_build_delete_bearer_response(h.type, bearer); From be7d08bffc4919475e5c87355eda22e051ccc5b2 Mon Sep 17 00:00:00 2001 From: Oliver Smith <osmith@sysmocom.de> Date: Mon, 25 Mar 2024 14:47:56 +0100 Subject: [PATCH 061/323] logrotate: fix reload failures Do not attempt to run "systemctl reload" on the open5gs services, unless they are running. This fixes the logrotate service failing on this postrotate script, if units are not running or not installed. --- configs/logrotate/open5gs.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configs/logrotate/open5gs.in b/configs/logrotate/open5gs.in index 113b12a2cd..73cf7abce1 100644 --- a/configs/logrotate/open5gs.in +++ b/configs/logrotate/open5gs.in @@ -8,7 +8,9 @@ postrotate for i in nrfd scpd seppd pcrfd hssd ausfd udmd udrd upfd sgwcd sgwud smfd mmed amfd; do - systemctl reload open5gs-$i + if systemctl --quiet is-active open5gs-$i; then + systemctl reload open5gs-$i + fi done endscript } From e8a3b76af395a9986234b7d339a7a96dc5bb537f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 31 Mar 2024 20:23:12 +0900 Subject: [PATCH 062/323] [SMF] Crash SMF when no GTP-C config (#3094) When GTP-C secition of smf.yaml is deleted as follows to run smf as 5G, it crashed. ```diff --- smf.yaml.orig 2024-03-26 14:13:12.000000000 +0900 +++ smf.yaml 2024-03-26 14:29:40.701508424 +0900 @@ -23,9 +23,6 @@ client: upf: - address: 127.0.0.7 - gtpc: - server: - - address: 127.0.0.4 gtpu: server: - address: 127.0.0.4 @@ -47,7 +44,7 @@ # - ::1 # ctf: # enabled: auto # auto(default)|yes|no - freeDiameter: /root/open5gs/install/etc/freeDiameter/smf.conf +# freeDiameter: /root/open5gs/install/etc/freeDiameter/smf.conf ################################################################################ # SMF Info Open5GS daemon v2.7.0-119-g581d255 03/26 14:39:42.844: [app] INFO: Configuration: 'install/etc/open5gs/smf.yaml' (../lib/app/ogs-init.c:130) 03/26 14:39:42.845: [app] INFO: File Logging: '/root/open5gs/install/var/log/open5gs/smf.log' (../lib/app/ogs-init.c:133) 03/26 14:39:42.913: [metrics] INFO: metrics_server() [http://127.0.0.4]:9090 (../lib/metrics/prometheus/context.c:299) 03/26 14:39:42.913: [smf] WARNING: No diameter configuration (../src/smf/fd-path.c:30) 03/26 14:39:42.913: [smf] FATAL: smf_gtp_open: Assertion `ogs_gtp_self()->gtpc_sock || ogs_gtp_self()->gtpc_sock6' failed. (../src/smf/gtp-path.c:253) 03/26 14:39:42.913: [core] FATAL: backtrace() returned 8 addresses (../lib/core/ogs-abort.c:37) ./install/bin/open5gs-smfd(+0x391ab) [0x55d28319b1ab] ./install/bin/open5gs-smfd(+0x10046) [0x55d283172046] ./install/bin/open5gs-smfd(+0xf3de) [0x55d2831713de] ./install/bin/open5gs-smfd(+0xfcf9) [0x55d283171cf9] /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f0a145f9d90] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f0a145f9e40] ./install/bin/open5gs-smfd(+0xf305) [0x55d283171305] Aborted (core dumped) ``` So, Fixed to run SMF with GTP-C disabled for 5G. --- lib/gtp/path.h | 4 ---- src/mme/mme-gtp-path.c | 2 ++ src/sgwc/gtp-path.c | 2 ++ src/smf/gtp-path.c | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/gtp/path.h b/lib/gtp/path.h index 6cb39ac77e..7aecf6f7f7 100644 --- a/lib/gtp/path.h +++ b/lib/gtp/path.h @@ -35,8 +35,6 @@ extern "C" { ogs_gtp_self()->gtpc_sock6 = \ ogs_socknode_sock_first(&ogs_gtp_self()->gtpc_list6); \ \ - ogs_assert(ogs_gtp_self()->gtpc_sock || ogs_gtp_self()->gtpc_sock6); \ - \ if (ogs_gtp_self()->gtpc_sock) \ ogs_gtp_self()->gtpc_addr = \ &ogs_gtp_self()->gtpc_sock->local_addr; \ @@ -44,8 +42,6 @@ extern "C" { ogs_gtp_self()->gtpc_addr6 = \ &ogs_gtp_self()->gtpc_sock6->local_addr; \ \ - ogs_assert(ogs_gtp_self()->gtpc_addr || ogs_gtp_self()->gtpc_addr6); \ - \ } while(0) #define OGS_SETUP_GTPU_SERVER \ diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 7d9e8f3f35..0ef1da82d7 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -203,6 +203,8 @@ int mme_gtp_open(void) } OGS_SETUP_GTPC_SERVER; + ogs_assert(ogs_gtp_self()->gtpc_sock || ogs_gtp_self()->gtpc_sock6); + ogs_assert(ogs_gtp_self()->gtpc_addr || ogs_gtp_self()->gtpc_addr6); mme_self()->pgw_addr = mme_pgw_addr_find_by_apn_enb( &mme_self()->pgw_list, AF_INET, NULL); diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index 6ce21e64ff..8e850e7c93 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -129,6 +129,8 @@ int sgwc_gtp_open(void) } OGS_SETUP_GTPC_SERVER; + ogs_assert(ogs_gtp_self()->gtpc_sock || ogs_gtp_self()->gtpc_sock6); + ogs_assert(ogs_gtp_self()->gtpc_addr || ogs_gtp_self()->gtpc_addr6); return OGS_OK; } diff --git a/src/smf/gtp-path.c b/src/smf/gtp-path.c index 8d88ee20e1..f4738658da 100644 --- a/src/smf/gtp-path.c +++ b/src/smf/gtp-path.c @@ -251,6 +251,9 @@ int smf_gtp_open(void) } OGS_SETUP_GTPC_SERVER; + /* If we only use 5G, we don't need GTP-C, so there is no check routine. */ + if (!ogs_gtp_self()->gtpc_sock && !ogs_gtp_self()->gtpc_sock6) + ogs_warn("No GTP-C configuration"); ogs_list_for_each(&ogs_gtp_self()->gtpu_list, node) { sock = ogs_gtp_server(node); From d32cc14a710ec885c3b17599d05f9cd24401072e Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 31 Mar 2024 20:40:37 +0900 Subject: [PATCH 063/323] [DBI] mongoc version not checked correctly #3086 checks mongoc version with which can unexpectedly return false in case of mongoc versions such as 2.3.4. So, I've fixed it as below. --- lib/dbi/ims.c | 4 ++-- lib/dbi/ogs-mongoc.c | 6 +++--- lib/dbi/ogs-mongoc.h | 2 +- lib/dbi/session.c | 2 +- lib/dbi/subscription.c | 4 ++-- src/hss/hss-context.c | 4 ++-- src/hss/hss-sm.c | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/dbi/ims.c b/lib/dbi/ims.c index 927f2ce917..ce4dea3d78 100644 --- a/lib/dbi/ims.c +++ b/lib/dbi/ims.c @@ -42,7 +42,7 @@ int ogs_dbi_msisdn_data( "{", "imsi", BCON_UTF8(imsi_or_msisdn_bcd), "}", "{", "msisdn", BCON_UTF8(imsi_or_msisdn_bcd), "}", "]"); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 5 +#if MONGOC_CHECK_VERSION(1, 5, 0) cursor = mongoc_collection_find_with_opts( ogs_mongoc()->collection.subscriber, query, NULL, NULL); #else @@ -138,7 +138,7 @@ int ogs_dbi_ims_data(char *supi, ogs_ims_data_t *ims_data) ogs_assert(supi_id); query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 5 +#if MONGOC_CHECK_VERSION(1, 5, 0) cursor = mongoc_collection_find_with_opts( ogs_mongoc()->collection.subscriber, query, NULL, NULL); #else diff --git a/lib/dbi/ogs-mongoc.c b/lib/dbi/ogs-mongoc.c index 69fbdf61bb..9c7599ddc3 100644 --- a/lib/dbi/ogs-mongoc.c +++ b/lib/dbi/ogs-mongoc.c @@ -104,7 +104,7 @@ int ogs_mongoc_init(const char *db_uri) return OGS_ERROR; } -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 4 +#if MONGOC_CHECK_VERSION(1, 4, 0) mongoc_client_set_error_api(self.client, 2); #endif @@ -182,7 +182,7 @@ void ogs_dbi_final(void) mongoc_collection_destroy(self.collection.subscriber); } -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) if (self.stream) { mongoc_change_stream_destroy(self.stream); } @@ -193,7 +193,7 @@ void ogs_dbi_final(void) int ogs_dbi_collection_watch_init(void) { -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) bson_t empty = BSON_INITIALIZER; const bson_t *err_doc; bson_error_t error; diff --git a/lib/dbi/ogs-mongoc.h b/lib/dbi/ogs-mongoc.h index 3722890384..c02877fae2 100644 --- a/lib/dbi/ogs-mongoc.h +++ b/lib/dbi/ogs-mongoc.h @@ -37,7 +37,7 @@ typedef struct ogs_mongoc_s { void *client; void *database; -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) mongoc_change_stream_t *stream; #endif diff --git a/lib/dbi/session.c b/lib/dbi/session.c index b1e695b21f..4748e37958 100644 --- a/lib/dbi/session.c +++ b/lib/dbi/session.c @@ -50,7 +50,7 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn, ogs_assert(supi_id); query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 5 +#if MONGOC_CHECK_VERSION(1, 5, 0) cursor = mongoc_collection_find_with_opts( ogs_mongoc()->collection.subscriber, query, NULL, NULL); #else diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index e37bf66759..ac8a44c908 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -44,7 +44,7 @@ int ogs_dbi_auth_info(char *supi, ogs_dbi_auth_info_t *auth_info) ogs_assert(supi_id); query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 5 +#if MONGOC_CHECK_VERSION(1, 5, 0) cursor = mongoc_collection_find_with_opts( ogs_mongoc()->collection.subscriber, query, NULL, NULL); #else @@ -326,7 +326,7 @@ int ogs_dbi_subscription_data(char *supi, ogs_assert(supi_id); query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 5 +#if MONGOC_CHECK_VERSION(1, 5, 0) cursor = mongoc_collection_find_with_opts( ogs_mongoc()->collection.subscriber, query, NULL, NULL); #else diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index b88725627c..fede577037 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -331,7 +331,7 @@ int hss_context_parse_config(void) self.sms_over_ims = ogs_yaml_iter_value(&hss_iter); } else if (!strcmp(hss_key, "use_mongodb_change_stream")) { -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) self.use_mongodb_change_stream = ogs_yaml_iter_bool(&hss_iter); #else @@ -1201,7 +1201,7 @@ int hss_db_poll_change_stream(void) static int poll_change_stream(void) { -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) int rv; const bson_t *document; diff --git a/src/hss/hss-sm.c b/src/hss/hss-sm.c index 9d3ed63fff..a2a11eedae 100644 --- a/src/hss/hss-sm.c +++ b/src/hss/hss-sm.c @@ -32,7 +32,7 @@ void hss_state_initial(ogs_fsm_t *s, hss_event_t *e) ogs_assert(s); -#if MONGOC_MAJOR_VERSION >= 1 && MONGOC_MINOR_VERSION >= 9 +#if MONGOC_CHECK_VERSION(1, 9, 0) if (hss_self()->use_mongodb_change_stream) { ogs_dbi_collection_watch_init(); From da5d424ed92405f3adb2a1fd73c65414b5803ee7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 1 Apr 2024 22:07:19 +0900 Subject: [PATCH 064/323] [MME] Incorrect behavior of SGsAP+Dedicated-Bearer (#3072) First of all, it crashes when creating a Dedicated Bearer on the default Session that is created for the first time. This behavior should be possible, so the related ASSERT is removed. Next, the InitialContextRequest is modified during the Attach Request to include the first Bearer. Finally, there was an issue where trying to create a Dedicated Bearer with SGsAP enabled resulted in an InitialContextSetupRequest message with a PTI of zero. This is because MME initializes the PTI to 0 upon receiving the Create Bearer Request while processing SGsAP. All of these issues has been fixed. --- src/mme/esm-build.c | 20 ++- src/mme/mme-context.c | 6 +- src/mme/mme-s11-handler.c | 15 ++- src/mme/nas-path.c | 9 +- src/mme/s1ap-build.c | 240 +++++++++++++++++++-------------- tests/attach/auth-test.c | 4 + tests/attach/guti-test.c | 9 ++ tests/common/context.c | 12 ++ tests/common/context.h | 1 + tests/common/esm-build.c | 37 ++++- tests/common/esm-handler.c | 93 +++++++++++++ tests/common/esm-handler.h | 10 ++ tests/common/nas-path.c | 5 + tests/csfb/mo-idle-test.c | 268 +++++++++++++++++++++++++++++++++++++ 14 files changed, 622 insertions(+), 107 deletions(-) diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index 5ab89be36c..7813c1a6de 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -124,7 +124,6 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( ogs_assert(session->name); bearer = mme_default_bearer_in_sess(sess); ogs_assert(bearer); - ogs_assert(mme_bearer_next(bearer) == NULL); ogs_debug("Activate default bearer context request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", @@ -254,6 +253,7 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( mme_bearer_t *bearer) { mme_ue_t *mme_ue = NULL; + mme_sess_t *sess = NULL; mme_bearer_t *linked_bearer = NULL; ogs_nas_eps_message_t message; @@ -269,6 +269,8 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( &activate_dedicated_eps_bearer_context_request->tft; ogs_assert(bearer); + sess = bearer->sess; + ogs_assert(sess); mme_ue = bearer->mme_ue; ogs_assert(mme_ue); linked_bearer = mme_linked_bearer(bearer); @@ -284,7 +286,21 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; - message.esm.h.procedure_transaction_identity = 0; + + /* + * Issue #3072 + * + * PTI 0 is set here to prevent a InitialContextSetupRequest message + * with a PTI of 0 from being created when the Create Bearer Request occurs + * and InitialContextSetupRequest occurs. + * + * If you implement the creation of a dedicated bearer + * in the ESM procedure reqeusted by the UE, + * you will need to refactor the part that sets the PTI. + */ + message.esm.h.procedure_transaction_identity = + sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; + message.esm.h.message_type = OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 0308c27dd0..b08b9b5062 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -4287,7 +4287,8 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( } if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { - ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi); + ogs_error("ESM message type: %d, Both PTI[%d] and EBI[%d] are 0", + message->esm.h.message_type, pti, ebi); r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); @@ -4373,6 +4374,9 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( sess = mme_sess_find_by_apn(mme_ue, pdn_connectivity_request->access_point_name.apn); if (sess && create_action != OGS_GTP_CREATE_IN_ATTACH_REQUEST) { + + sess->pti = pti; + r = nas_eps_send_pdn_connectivity_reject( sess, OGS_NAS_ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED, diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 339bde7ef7..795305a4ab 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -793,7 +793,7 @@ void mme_s11_handle_create_bearer_request( ogs_assert(xact); ogs_assert(req); - ogs_debug("Create Bearer Response"); + ogs_debug("Create Bearer Request"); /*********************** * Check MME-UE Context @@ -877,12 +877,25 @@ void mme_s11_handle_create_bearer_request( ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", mme_ue->mme_s11_teid, sgw_ue->sgw_s11_teid); + /* + * DEPRECATED : Issues #3072 + * + * PTI 0 is set here to prevent a InitialContextSetupRequest message + * with a PTI of 0 from being created when the Create Bearer Request occurs + * and InitialContextSetupRequest occurs. + * + * If you implement the creation of a dedicated bearer + * in the ESM procedure reqeusted by the UE, + * you will need to refactor the part that sets the PTI. + */ +#if 0 /* Set PTI */ sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; if (req->procedure_transaction_id.presence) { sess->pti = req->procedure_transaction_id.u8; ogs_debug(" PTI[%d]", sess->pti); } +#endif /* Data Plane(UL) : SGW-S1U */ sgw_s1u_teid = req->bearer_contexts.s1_u_enodeb_f_teid.data; diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index bf8cd8095b..ed01be0952 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -106,7 +106,6 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue) { int rv; mme_sess_t *sess = NULL; - mme_bearer_t *bearer = NULL; ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL; @@ -122,10 +121,10 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue) sess = mme_sess_first(mme_ue); ogs_assert(sess); - ogs_assert(mme_sess_next(sess) == NULL); - bearer = mme_default_bearer_in_sess(sess); - ogs_assert(bearer); - ogs_assert(mme_bearer_next(bearer) == NULL); + if (mme_sess_next(sess)) { + ogs_error("There should only be one SESSION"); + return OGS_ERROR; + } ogs_debug("[%s] Attach accept", mme_ue->imsi_bcd); diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 245d70a08c..4f21ab8dd6 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -343,11 +343,72 @@ ogs_pkbuf_t *s1ap_build_downlink_nas_transport( return ogs_s1ap_encode(&pdu); } -ogs_pkbuf_t *s1ap_build_initial_context_setup_request( - mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf) +static void fill_e_rab_to_be_setup( + S1AP_E_RABToBeSetupItemCtxtSUReq_t *e_rab, mme_bearer_t *bearer) { int rv; + S1AP_GBR_QosInformation_t *gbrQosInformation = NULL; + + ogs_assert(e_rab); + ogs_assert(bearer); + + e_rab->e_RAB_ID = bearer->ebi; + e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.index; + + ogs_debug(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]", + bearer->ebi, bearer->qos.index, bearer->sgw_s1u_teid); + ogs_debug(" ARP[%d:%d:%d]", + bearer->qos.arp.priority_level, + bearer->qos.arp.pre_emption_capability, + bearer->qos.arp.pre_emption_vulnerability); + + e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. + priorityLevel = bearer->qos.arp.priority_level; + e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. + pre_emptionCapability = + !(bearer->qos.arp.pre_emption_capability); + e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. + pre_emptionVulnerability = + !(bearer->qos.arp.pre_emption_vulnerability); + + if (bearer->qos.mbr.downlink || bearer->qos.mbr.uplink || + bearer->qos.gbr.downlink || bearer->qos.gbr.uplink) { + ogs_assert(bearer->qos.mbr.downlink); + ogs_assert(bearer->qos.mbr.uplink); + ogs_assert(bearer->qos.gbr.downlink); + ogs_assert(bearer->qos.gbr.uplink); + ogs_debug(" MBR[DL:%lld,UL:%lld]", + (long long)bearer->qos.mbr.downlink, + (long long)bearer->qos.mbr.uplink); + ogs_debug(" GBR[DL:%lld,UL:%lld]", + (long long)bearer->qos.gbr.downlink, + (long long)bearer->qos.gbr.uplink); + + gbrQosInformation = + CALLOC(1, sizeof(struct S1AP_GBR_QosInformation)); + asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL, + bearer->qos.mbr.downlink); + asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL, + bearer->qos.mbr.uplink); + asn_uint642INTEGER(&gbrQosInformation-> + e_RAB_GuaranteedBitrateDL, bearer->qos.gbr.downlink); + asn_uint642INTEGER(&gbrQosInformation-> + e_RAB_GuaranteedBitrateUL, bearer->qos.gbr.uplink); + e_rab->e_RABlevelQoSParameters.gbrQosInformation = + gbrQosInformation; + } + + rv = ogs_asn_ip_to_BIT_STRING( + &bearer->sgw_s1u_ip, &e_rab->transportLayerAddress); + ogs_assert(rv == OGS_OK); + ogs_asn_uint32_to_OCTET_STRING( + bearer->sgw_s1u_teid, &e_rab->gTP_TEID); +} + +ogs_pkbuf_t *s1ap_build_initial_context_setup_request( + mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf) +{ S1AP_S1AP_PDU_t pdu; S1AP_InitiatingMessage_t *initiatingMessage = NULL; S1AP_InitialContextSetupRequest_t *InitialContextSetupRequest = NULL; @@ -443,50 +504,26 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( &UEAggregateMaximumBitrate->uEaggregateMaximumBitRateDL, mme_ue->ambr.downlink); - ogs_list_for_each(&mme_ue->sess_list, sess) { - ogs_list_for_each(&sess->bearer_list, bearer) { - - S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t *item = NULL; - S1AP_E_RABToBeSetupItemCtxtSUReq_t *e_rab = NULL; - S1AP_GBR_QosInformation_t *gbrQosInformation = NULL; - S1AP_NAS_PDU_t *nasPdu = NULL; - - if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { - /* - * For Attach Request, - * Delete Session Request/Response removes ALL session/bearers. - * - * Since all bearers are INACTIVE, - * we should not check the bearer activation. - */ - } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_inactive)) { - /* - * For Service Request/TAU Request/Extended Service Request, - * Only the active EPS bearer can be included. - * - * If MME received Create Bearer Request and - * if MME does not receive Activate EPS Bearer Context Accept, - * We should not include the INACTIVE bearer. - * - * For example, - * 1. SGW->MME : Create Bearer Request - * 2. MME->UE : S1 Paging - * 3. UE->MME : Service Request - * 4. MME->UE : Initial Context Setup Request - * (We should not include INACTIVE BEARER) - * 5. UE->MME : Initial Context Setup Response - * 6. MME->UE : Activate dedicated EPS Bearer Context Request - * 7. UE->MME : Activate dedicated EPS Bearer Context Accept - * 8. MME->SGW : Create Bearer Response - */ - ogs_warn("No active EPS bearer [%d]", bearer->ebi); - ogs_warn(" IMSI[%s] NAS-EPS Type[%d] " - "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", - mme_ue->imsi_bcd, mme_ue->nas_eps.type, - enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - continue; - } + S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t *item = NULL; + S1AP_E_RABToBeSetupItemCtxtSUReq_t *e_rab = NULL; + S1AP_NAS_PDU_t *nasPdu = NULL; + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + /* + * For Attach Request, + * Delete Session Request/Response removes ALL session/bearers. + * + * Since all bearers are INACTIVE, + * we should not check the bearer activation. + */ + sess = ogs_list_first(&mme_ue->sess_list); + /* + * Issue #3072 : Only first Bearer should be included. + */ + if (sess) + bearer = ogs_list_first(&sess->bearer_list); + + if (sess && bearer) { item = CALLOC(1, sizeof(S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t)); ASN_SEQUENCE_ADD(&E_RABToBeSetupListCtxtSUReq->list, item); @@ -496,58 +533,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( e_rab = &item->value.choice.E_RABToBeSetupItemCtxtSUReq; - e_rab->e_RAB_ID = bearer->ebi; - e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.index; - - ogs_debug(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]", - bearer->ebi, bearer->qos.index, bearer->sgw_s1u_teid); - ogs_debug(" ARP[%d:%d:%d]", - bearer->qos.arp.priority_level, - bearer->qos.arp.pre_emption_capability, - bearer->qos.arp.pre_emption_vulnerability); - - e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. - priorityLevel = bearer->qos.arp.priority_level; - e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. - pre_emptionCapability = - !(bearer->qos.arp.pre_emption_capability); - e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. - pre_emptionVulnerability = - !(bearer->qos.arp.pre_emption_vulnerability); - - if (bearer->qos.mbr.downlink || bearer->qos.mbr.uplink || - bearer->qos.gbr.downlink || bearer->qos.gbr.uplink) { - ogs_assert(bearer->qos.mbr.downlink); - ogs_assert(bearer->qos.mbr.uplink); - ogs_assert(bearer->qos.gbr.downlink); - ogs_assert(bearer->qos.gbr.uplink); - - ogs_debug(" MBR[DL:%lld,UL:%lld]", - (long long)bearer->qos.mbr.downlink, - (long long)bearer->qos.mbr.uplink); - ogs_debug(" GBR[DL:%lld,UL:%lld]", - (long long)bearer->qos.gbr.downlink, - (long long)bearer->qos.gbr.uplink); - - gbrQosInformation = - CALLOC(1, sizeof(struct S1AP_GBR_QosInformation)); - asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL, - bearer->qos.mbr.downlink); - asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL, - bearer->qos.mbr.uplink); - asn_uint642INTEGER(&gbrQosInformation-> - e_RAB_GuaranteedBitrateDL, bearer->qos.gbr.downlink); - asn_uint642INTEGER(&gbrQosInformation-> - e_RAB_GuaranteedBitrateUL, bearer->qos.gbr.uplink); - e_rab->e_RABlevelQoSParameters.gbrQosInformation = - gbrQosInformation; - } - - rv = ogs_asn_ip_to_BIT_STRING( - &bearer->sgw_s1u_ip, &e_rab->transportLayerAddress); - ogs_assert(rv == OGS_OK); - ogs_asn_uint32_to_OCTET_STRING( - bearer->sgw_s1u_teid, &e_rab->gTP_TEID); + fill_e_rab_to_be_setup(e_rab, bearer); if (emmbuf && emmbuf->len) { ogs_debug(" NASPdu[%p:%d]", emmbuf, emmbuf->len); @@ -566,6 +552,66 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( emmbuf = NULL; } } + } else { + /* + * For Service Request/TAU Request/Extended Service Request, + * Only the active EPS bearer can be included. + * + * If MME received Create Bearer Request and + * if MME does not receive Activate EPS Bearer Context Accept, + * We should not include the INACTIVE bearer. + * + * For example, + * 1. SGW->MME : Create Bearer Request + * 2. MME->UE : S1 Paging + * 3. UE->MME : Service Request + * 4. MME->UE : Initial Context Setup Request + * (We should not include INACTIVE BEARER) + * 5. UE->MME : Initial Context Setup Response + * 6. MME->UE : Activate dedicated EPS Bearer Context Request + * 7. UE->MME : Activate dedicated EPS Bearer Context Accept + * 8. MME->SGW : Create Bearer Response + */ + ogs_list_for_each(&mme_ue->sess_list, sess) { + ogs_list_for_each(&sess->bearer_list, bearer) { + if (OGS_FSM_CHECK(&bearer->sm, esm_state_inactive)) { + ogs_warn("No active EPS bearer [%d]", bearer->ebi); + ogs_warn(" IMSI[%s] NAS-EPS Type[%d] " + "ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + mme_ue->imsi_bcd, mme_ue->nas_eps.type, + enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + continue; + } + + item = CALLOC(1, sizeof(S1AP_E_RABToBeSetupItemCtxtSUReqIEs_t)); + ASN_SEQUENCE_ADD(&E_RABToBeSetupListCtxtSUReq->list, item); + + item->id = S1AP_ProtocolIE_ID_id_E_RABToBeSetupItemCtxtSUReq; + item->criticality = S1AP_Criticality_reject; + item->value.present = S1AP_E_RABToBeSetupItemCtxtSUReqIEs__value_PR_E_RABToBeSetupItemCtxtSUReq; + + e_rab = &item->value.choice.E_RABToBeSetupItemCtxtSUReq; + + fill_e_rab_to_be_setup(e_rab, bearer); + + if (emmbuf && emmbuf->len) { + ogs_debug(" NASPdu[%p:%d]", emmbuf, emmbuf->len); + + nasPdu = (S1AP_NAS_PDU_t *)CALLOC(1, sizeof(S1AP_NAS_PDU_t)); + nasPdu->size = emmbuf->len; + nasPdu->buf = CALLOC(nasPdu->size, sizeof(uint8_t)); + memcpy(nasPdu->buf, emmbuf->data, nasPdu->size); + e_rab->nAS_PDU = nasPdu; + ogs_pkbuf_free(emmbuf); + + ogs_log_hexdump(OGS_LOG_DEBUG, nasPdu->buf, nasPdu->size); + + /* Since Tracking area update accept is used only once, + * set emmbuf to NULL as shown below */ + emmbuf = NULL; + } + } + } } if (emmbuf && emmbuf->len) { diff --git a/tests/attach/auth-test.c b/tests/attach/auth-test.c index 9ba162d5dd..abbc9ca31d 100644 --- a/tests/attach/auth-test.c +++ b/tests/attach/auth-test.c @@ -196,6 +196,8 @@ static void test1_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Attach Request */ + sess->pti = 1; + sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = @@ -269,6 +271,8 @@ static void test1_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Attach Request - No Integrity */ + sess->pti = 1; + sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = diff --git a/tests/attach/guti-test.c b/tests/attach/guti-test.c index b8662b1b6a..00cd87561b 100644 --- a/tests/attach/guti-test.c +++ b/tests/attach/guti-test.c @@ -225,6 +225,8 @@ static void test1_func(abts_case *tc, void *data) #endif /* Send Attach Request */ + sess->pti = 1; + memset(&sess->pdn_connectivity_param, 0, sizeof(sess->pdn_connectivity_param)); sess->pdn_connectivity_param.eit = 1; @@ -364,6 +366,7 @@ static void test1_func(abts_case *tc, void *data) /* Send Attach Request - INVALID GUTI */ test_ue->nas_eps_guti.m_tmsi = 0x1234; + sess->pti = 1; memset(&sess->pdn_connectivity_param, 0, sizeof(sess->pdn_connectivity_param)); @@ -618,6 +621,8 @@ static void test2_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Attach Request - No Integrity */ + sess->pti = 1; + sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = @@ -751,6 +756,8 @@ static void test2_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Attach Request */ + sess->pti = 1; + memset(&sess->pdn_connectivity_param, 0, sizeof(sess->pdn_connectivity_param)); sess->pdn_connectivity_param.eit = 1; @@ -1507,6 +1514,8 @@ static void test4_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Attach Request */ + sess->pti = 1; + memset(&sess->pdn_connectivity_param, 0, sizeof(sess->pdn_connectivity_param)); sess->pdn_connectivity_param.eit = 1; diff --git a/tests/common/context.c b/tests/common/context.c index 8d797dfd4d..afe0838992 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -1295,6 +1295,18 @@ test_sess_t *test_sess_find_by_apn( return NULL; } +test_sess_t *test_sess_find_by_pti(test_ue_t *test_ue, uint8_t pti) +{ + test_sess_t *sess = NULL; + + ogs_assert(test_ue); + + ogs_list_for_each(&test_ue->sess_list, sess) + if (sess->pti == pti) return sess; + + return NULL; +} + test_sess_t *test_sess_find_by_psi(test_ue_t *test_ue, uint8_t psi) { test_sess_t *sess = NULL; diff --git a/tests/common/context.h b/tests/common/context.h index 07d7e68225..8befe4e129 100644 --- a/tests/common/context.h +++ b/tests/common/context.h @@ -513,6 +513,7 @@ void test_sess_remove_all(test_ue_t *test_ue); test_sess_t *test_sess_find_by_apn( test_ue_t *test_ue, char *apn, uint8_t rat_type); +test_sess_t *test_sess_find_by_pti(test_ue_t *test_ue, uint8_t pti); test_sess_t *test_sess_find_by_psi(test_ue_t *test_ue, uint8_t psi); test_bearer_t *test_bearer_add(test_sess_t *sess, uint8_t ebi); diff --git a/tests/common/esm-build.c b/tests/common/esm-build.c index 93e6034baf..e8ec4f760c 100644 --- a/tests/common/esm-build.c +++ b/tests/common/esm-build.c @@ -63,7 +63,13 @@ ogs_pkbuf_t *testesm_build_pdn_connectivity_request( } message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + + if (!sess->pti) { + ogs_error("PTI should be not NULL in PDU Connectivity Request"); + return NULL; + } message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.message_type = OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST; request_type->type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; @@ -136,7 +142,13 @@ ogs_pkbuf_t *testesm_build_pdn_disconnect_request(test_sess_t *sess) message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + + if (!sess->pti) { + ogs_error("PTI should be not NULL in PDU Disonnectivity Request"); + return NULL; + } message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.message_type = OGS_NAS_EPS_PDN_DISCONNECT_REQUEST; linked_eps_bearer_identity->eps_bearer_identity = bearer->ebi; @@ -194,7 +206,13 @@ ogs_pkbuf_t *testesm_build_esm_information_response(test_sess_t *sess) message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + + if (!sess->pti) { + ogs_error("PTI should be not 0 in ESM Information Response"); + return NULL; + } message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.message_type = OGS_NAS_EPS_ESM_INFORMATION_RESPONSE; esm_information_response->presencemask |= OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT; @@ -254,6 +272,7 @@ ogs_pkbuf_t *testesm_build_activate_default_eps_bearer_context_accept( message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + message.esm.h.procedure_transaction_identity = sess->pti = 0; message.esm.h.message_type = OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT; @@ -289,6 +308,7 @@ ogs_pkbuf_t *testesm_build_activate_dedicated_eps_bearer_context_accept( message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + message.esm.h.procedure_transaction_identity = sess->pti = 0; message.esm.h.message_type = OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT; @@ -321,6 +341,7 @@ ogs_pkbuf_t *testesm_build_activate_dedicated_eps_bearer_context_reject( message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + message.esm.h.procedure_transaction_identity = sess->pti = 0; message.esm.h.message_type = OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT; @@ -352,7 +373,7 @@ ogs_pkbuf_t *testesm_build_modify_eps_bearer_context_accept( message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; - message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.procedure_transaction_identity = sess->pti = 0; message.esm.h.message_type = OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT; return test_nas_eps_security_encode(test_ue, &message); @@ -381,6 +402,7 @@ ogs_pkbuf_t *testesm_build_deactivate_eps_bearer_context_accept( message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + message.esm.h.procedure_transaction_identity = sess->pti = 0; message.esm.h.message_type = OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT; @@ -422,7 +444,13 @@ ogs_pkbuf_t *testesm_build_bearer_resource_allocation_request( message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + + if (!sess->pti) { + ogs_error("PTI should be not 0 in Bearer Resource Allocation Request"); + return NULL; + } message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.message_type = OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST; linked_eps_bearer_identity->eps_bearer_identity = bearer->ebi; @@ -473,7 +501,14 @@ ogs_pkbuf_t *testesm_build_bearer_resource_modification_request( message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; + + if (!sess->pti) { + ogs_error("PTI should be not 0 " + "in Bearer Resource Modification Request"); + return NULL; + } message.esm.h.procedure_transaction_identity = sess->pti; + message.esm.h.message_type = OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST; diff --git a/tests/common/esm-handler.c b/tests/common/esm-handler.c index 921f3e71c9..ed5af22e0f 100644 --- a/tests/common/esm-handler.c +++ b/tests/common/esm-handler.c @@ -19,6 +19,38 @@ #include "test-common.h" +void testesm_handle_esm_information_request( + test_ue_t *test_ue, ogs_nas_eps_message_t *message) +{ + test_sess_t *sess = NULL; + + ogs_assert(test_ue); + ogs_assert(message); + + ogs_assert(message->esm.h.procedure_transaction_identity != + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); + + sess = test_sess_find_by_pti( + test_ue, message->esm.h.procedure_transaction_identity); + ogs_assert(sess); +} + +void testesm_handle_pdn_connectivity_reject( + test_ue_t *test_ue, ogs_nas_eps_message_t *message) +{ + test_sess_t *sess = NULL; + + ogs_assert(test_ue); + ogs_assert(message); + + ogs_assert(message->esm.h.procedure_transaction_identity != + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); + + sess = test_sess_find_by_pti( + test_ue, message->esm.h.procedure_transaction_identity); + ogs_assert(sess); +} + void testesm_handle_activate_default_eps_bearer_context_request( test_ue_t *test_ue, ogs_nas_eps_message_t *message) { @@ -43,6 +75,9 @@ void testesm_handle_activate_default_eps_bearer_context_request( sess = test_sess_find_by_apn( test_ue, access_point_name->apn, OGS_GTP2_RAT_TYPE_EUTRAN); ogs_assert(sess); + + ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity); + bearer = test_bearer_find_by_sess_ebi( sess, message->esm.h.eps_bearer_identity); if (!bearer) @@ -96,6 +131,8 @@ void testesm_handle_activate_dedicated_eps_bearer_context_request( sess = bearer->sess; ogs_assert(sess); + ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity); + bearer = test_bearer_find_by_sess_ebi( sess, message->esm.h.eps_bearer_identity); if (!bearer) @@ -103,6 +140,26 @@ void testesm_handle_activate_dedicated_eps_bearer_context_request( ogs_assert(bearer); } +void testesm_handle_modify_eps_bearer_context_request( + test_ue_t *test_ue, ogs_nas_eps_message_t *message) +{ + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + uint8_t ebi; + + ogs_assert(message); + + ebi = message->esm.h.eps_bearer_identity; + ogs_assert(ebi); + + bearer = test_bearer_find_by_ue_ebi(test_ue, ebi); + ogs_assert(bearer); + sess = bearer->sess; + ogs_assert(sess); + + ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity); +} + void testesm_handle_deactivate_eps_bearer_context_request( test_ue_t *test_ue, ogs_nas_eps_message_t *message) { @@ -117,4 +174,40 @@ void testesm_handle_deactivate_eps_bearer_context_request( bearer = test_bearer_find_by_ue_ebi(test_ue, ebi); ogs_assert(bearer); + sess = bearer->sess; + ogs_assert(sess); + + ogs_assert(sess->pti == message->esm.h.procedure_transaction_identity); +} + +void testesm_handle_bearer_resource_allocation( + test_ue_t *test_ue, ogs_nas_eps_message_t *message) +{ + test_sess_t *sess = NULL; + + ogs_assert(test_ue); + ogs_assert(message); + + ogs_assert(message->esm.h.procedure_transaction_identity != + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); + + sess = test_sess_find_by_pti( + test_ue, message->esm.h.procedure_transaction_identity); + ogs_assert(sess); +} + +void testesm_handle_bearer_resource_modification( + test_ue_t *test_ue, ogs_nas_eps_message_t *message) +{ + test_sess_t *sess = NULL; + + ogs_assert(test_ue); + ogs_assert(message); + + ogs_assert(message->esm.h.procedure_transaction_identity != + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); + + sess = test_sess_find_by_pti( + test_ue, message->esm.h.procedure_transaction_identity); + ogs_assert(sess); } diff --git a/tests/common/esm-handler.h b/tests/common/esm-handler.h index 884a854e9d..cf3feaab91 100644 --- a/tests/common/esm-handler.h +++ b/tests/common/esm-handler.h @@ -24,12 +24,22 @@ extern "C" { #endif +void testesm_handle_esm_information_request( + test_ue_t *test_ue, ogs_nas_eps_message_t *message); +void testesm_handle_pdn_connectivity_reject( + test_ue_t *test_ue, ogs_nas_eps_message_t *message); void testesm_handle_activate_default_eps_bearer_context_request( test_ue_t *test_ue, ogs_nas_eps_message_t *message); void testesm_handle_activate_dedicated_eps_bearer_context_request( test_ue_t *test_ue, ogs_nas_eps_message_t *message); +void testesm_handle_modify_eps_bearer_context_request( + test_ue_t *test_ue, ogs_nas_eps_message_t *message); void testesm_handle_deactivate_eps_bearer_context_request( test_ue_t *test_ue, ogs_nas_eps_message_t *message); +void testesm_handle_bearer_resource_allocation( + test_ue_t *test_ue, ogs_nas_eps_message_t *message); +void testesm_handle_bearer_resource_modification( + test_ue_t *test_ue, ogs_nas_eps_message_t *message); #ifdef __cplusplus } diff --git a/tests/common/nas-path.c b/tests/common/nas-path.c index f46bb50912..372cf0b1ee 100644 --- a/tests/common/nas-path.c +++ b/tests/common/nas-path.c @@ -196,8 +196,10 @@ void testesm_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf) test_ue->esm_message_type = message.esm.h.message_type; switch (message.esm.h.message_type) { case OGS_NAS_EPS_ESM_INFORMATION_REQUEST: + testesm_handle_esm_information_request(test_ue, &message); break; case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT: + testesm_handle_pdn_connectivity_reject(test_ue, &message); break; case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: testesm_handle_activate_default_eps_bearer_context_request( @@ -208,13 +210,16 @@ void testesm_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf) test_ue, &message); break; case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST: + testesm_handle_modify_eps_bearer_context_request(test_ue, &message); break; case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: testesm_handle_deactivate_eps_bearer_context_request(test_ue, &message); break; case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT: + testesm_handle_bearer_resource_allocation(test_ue, &message); break; case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT: + testesm_handle_bearer_resource_modification(test_ue, &message); break; default: ogs_error("Unknown message[%d]", message.esm.h.message_type); diff --git a/tests/csfb/mo-idle-test.c b/tests/csfb/mo-idle-test.c index 762447f4c8..dadc7d9eb1 100644 --- a/tests/csfb/mo-idle-test.c +++ b/tests/csfb/mo-idle-test.c @@ -305,6 +305,273 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test_issues3072_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x19b010; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x19b0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_qos_flow(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.guti = 1; + test_ue->attach_request_param.last_visited_registered_tai = 1; + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.mobile_station_classmark_3 = 1; + test_ue->attach_request_param.supported_codecs = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + test_ue->attach_request_param.old_guti_type = 1; + test_ue->attach_request_param.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Identity response */ + emmbuf = testemm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* + * To raise the RACE CONDITION + * for the Create Bearer Request and InitialContextSetupRequest + */ + ogs_msleep(100); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive E-RABSetupRequest + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(100); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(100); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + static void test2_func(abts_case *tc, void *data) { int rv; @@ -1043,6 +1310,7 @@ abts_suite *test_mo_idle(abts_suite *suite) suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, test_issues3072_func, NULL); abts_run_test(suite, test2_func, NULL); abts_run_test(suite, test3_func, NULL); abts_run_test(suite, test4_func, NULL); From 74fcd9b9c6089dc0fad0f18819c52e661b7f3289 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Thu, 4 Apr 2024 15:46:00 +0200 Subject: [PATCH 065/323] cosmetic: upf: Add missing lines between functions --- src/upf/context.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/upf/context.c b/src/upf/context.c index 3ae2ed72a1..bd0737c098 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -816,6 +816,7 @@ static void upf_sess_urr_acc_validity_time_setup(upf_sess_t *sess, ogs_pfcp_urr_ ogs_timer_start(urr_acc->t_validity_time, ogs_time_from_sec(urr->quota_validity_time)); } + static void upf_sess_urr_acc_time_quota_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; @@ -827,6 +828,7 @@ static void upf_sess_urr_acc_time_quota_setup(upf_sess_t *sess, ogs_pfcp_urr_t * upf_sess_urr_acc_timers_cb, urr); ogs_timer_start(urr_acc->t_time_quota, ogs_time_from_sec(urr->time_quota)); } + static void upf_sess_urr_acc_time_threshold_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; From 3ee4bb7d3c8954670e137c7e5ffd60fcbb5b35ce Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Thu, 4 Apr 2024 15:47:15 +0200 Subject: [PATCH 066/323] pfcp: Fix missing fields in ogs_pfcp_build_update_urr() Flag bitmask check elements are reordered to follow same order as IEs in 3GPP TS 29.244 7.5.4.4 "Update URR". --- lib/pfcp/build.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/pfcp/build.c b/lib/pfcp/build.c index 663baa3d9c..b2830abc28 100644 --- a/lib/pfcp/build.c +++ b/lib/pfcp/build.c @@ -773,21 +773,23 @@ void ogs_pfcp_build_update_urr( /* No change requested, skip. */ if (!(modify_flags & (OGS_PFCP_MODIFY_URR_MEAS_METHOD| OGS_PFCP_MODIFY_URR_REPORT_TRIGGER| - OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME| - OGS_PFCP_MODIFY_URR_VOLUME_QUOTA| OGS_PFCP_MODIFY_URR_VOLUME_THRESH| + OGS_PFCP_MODIFY_URR_VOLUME_QUOTA| + OGS_PFCP_MODIFY_URR_TIME_THRESH| OGS_PFCP_MODIFY_URR_TIME_QUOTA| - OGS_PFCP_MODIFY_URR_TIME_THRESH))) + OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME))) return; /* Change request: Send only changed IEs */ message->presence = 1; message->urr_id.presence = 1; message->urr_id.u32 = urr->id; + if (modify_flags & OGS_PFCP_MODIFY_URR_MEAS_METHOD) { message->measurement_method.presence = 1; message->measurement_method.u8 = urr->meas_method; } + if (modify_flags & OGS_PFCP_MODIFY_URR_REPORT_TRIGGER) { message->reporting_triggers.presence = 1; message->reporting_triggers.u24 = (urr->rep_triggers.reptri_5 << 16) @@ -804,12 +806,35 @@ void ogs_pfcp_build_update_urr( } } + if (modify_flags & OGS_PFCP_MODIFY_URR_VOLUME_QUOTA) { + if (urr->vol_quota.flags) { + message->volume_quota.presence = 1; + ogs_pfcp_build_volume( + &message->volume_quota, &urr->vol_quota, + &urrbuf[i].vol_quota, sizeof(urrbuf[i].vol_quota)); + } + } + if (modify_flags & OGS_PFCP_MODIFY_URR_TIME_THRESH) { if (urr->time_threshold) { message->time_threshold.presence = 1; message->time_threshold.u32 = urr->time_threshold; } } + + if (modify_flags & OGS_PFCP_MODIFY_URR_TIME_QUOTA) { + if (urr->time_quota) { + message->time_quota.presence = 1; + message->time_quota.u32 = urr->time_quota; + } + } + + if (modify_flags & OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME) { + if (urr->quota_validity_time) { + message->quota_validity_time.presence = 1; + message->quota_validity_time.u32 = urr->quota_validity_time; + } + } } static struct { From eb2b19b39ca5e64fb3875207f2e6f0c5a81753b9 Mon Sep 17 00:00:00 2001 From: gstaa <93838663+gstaa@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:29:20 +0200 Subject: [PATCH 067/323] Include cause in HTTP response ProblemDetails (#3051) Cause is set according to particular NF standard. Additionally: - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED typo fixed. - [PCF] Fixed SM Policy establishment error handling --- lib/sbi/message.h | 2 +- lib/sbi/mhd-server.c | 2 +- lib/sbi/nghttp2-server.c | 2 +- lib/sbi/nnrf-handler.c | 23 ++++----- lib/sbi/server.c | 3 +- lib/sbi/server.h | 3 +- src/amf/amf-sm.c | 25 +++++----- src/amf/namf-handler.c | 2 +- src/ausf/ausf-sm.c | 16 +++--- src/ausf/nausf-handler.c | 8 +-- src/ausf/nudm-handler.c | 44 ++++++++++++----- src/ausf/sbi-path.c | 4 +- src/ausf/ue-sm.c | 10 ++-- src/bsf/bsf-sm.c | 16 +++--- src/bsf/nbsf-handler.c | 3 +- src/bsf/sbi-path.c | 4 +- src/nrf/nf-sm.c | 32 ++++++------ src/nrf/nnrf-handler.c | 55 ++++++++++++--------- src/nrf/nrf-sm.c | 22 +++++---- src/nssf/nnssf-handler.c | 3 +- src/nssf/nssf-sm.c | 12 +++-- src/pcf/am-sm.c | 10 ++-- src/pcf/nbsf-handler.c | 3 +- src/pcf/npcf-handler.c | 35 ++++++++++---- src/pcf/nudr-handler.c | 19 ++++++-- src/pcf/pcf-sm.c | 30 +++++++----- src/pcf/sbi-path.c | 4 +- src/pcf/sm-sm.c | 52 +++++++++++++++----- src/scp/sbi-path.c | 12 +++-- src/scp/scp-sm.c | 14 +++--- src/sepp/handshake-sm.c | 6 +-- src/sepp/n32c-handler.c | 10 ++-- src/sepp/sbi-path.c | 2 +- src/sepp/sepp-sm.c | 16 +++--- src/smf/gsm-sm.c | 47 +++++++++++------- src/smf/n4-handler.c | 2 +- src/smf/namf-handler.c | 8 +-- src/smf/npcf-handler.c | 2 +- src/smf/nudm-handler.c | 2 +- src/smf/pfcp-path.c | 3 +- src/smf/sbi-path.c | 4 +- src/smf/smf-sm.c | 28 ++++++----- src/udm/nudm-handler.c | 102 +++++++++++++++++++++++---------------- src/udm/nudr-handler.c | 96 +++++++++++++++++++----------------- src/udm/sbi-path.c | 4 +- src/udm/sess-sm.c | 7 +-- src/udm/udm-sm.c | 22 +++++---- src/udm/ue-sm.c | 26 +++++----- src/udr/nudr-handler.c | 70 +++++++++++++++------------ src/udr/udr-sm.c | 18 ++++--- tests/af/af-sm.c | 20 ++++---- 51 files changed, 573 insertions(+), 392 deletions(-) diff --git a/lib/sbi/message.h b/lib/sbi/message.h index b295f3195c..7f5cd91091 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -48,7 +48,7 @@ extern "C" { #define OGS_SBI_HTTP_STATUS_UNAUTHORIZED 401 /* ALL */ #define OGS_SBI_HTTP_STATUS_FORBIDDEN 403 /* ALL */ #define OGS_SBI_HTTP_STATUS_NOT_FOUND 404 /* ALL */ -#define OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED 405 /* ALL */ +#define OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED 405 /* ALL */ #define OGS_SBI_HTTP_STATUS_NOT_ACCEPTABLE 406 /* GET OPTIONS */ #define OGS_SBI_HTTP_STATUS_REQUEST_TIMEOUT 408 /* ALL */ #define OGS_SBI_HTTP_STATUS_CONFLICT 409 /* PATCH POST PUT */ diff --git a/lib/sbi/mhd-server.c b/lib/sbi/mhd-server.c index 913d0f931a..a5d3eef7fc 100644 --- a/lib/sbi/mhd-server.c +++ b/lib/sbi/mhd-server.c @@ -576,7 +576,7 @@ static _MHD_Result access_handler( ogs_assert(true == ogs_sbi_server_send_error((ogs_sbi_stream_t *)sbi_sess, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "server callback error", NULL)); + "server callback error", NULL, NULL)); return MHD_YES; } diff --git a/lib/sbi/nghttp2-server.c b/lib/sbi/nghttp2-server.c index 43074beb99..4352d46e10 100644 --- a/lib/sbi/nghttp2-server.c +++ b/lib/sbi/nghttp2-server.c @@ -1174,7 +1174,7 @@ static int on_frame_recv(nghttp2_session *session, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "server callback error", NULL)); + "server callback error", NULL, NULL)); return 0; } diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 3279cd4af0..b36c7c375e 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -927,7 +927,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_error("No NotificationData"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NotificationData", NULL)); + recvmsg, "No NotificationData", NULL, NULL)); return false; } @@ -935,7 +935,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_error("No nfInstanceUri"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No nfInstanceUri", NULL)); + recvmsg, "No nfInstanceUri", NULL, NULL)); return false; } @@ -947,7 +947,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_error("Cannot parse nfInstanceUri [%s]", header.uri); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "Cannot parse nfInstanceUri", header.uri)); + recvmsg, "Cannot parse nfInstanceUri", header.uri, NULL)); return false; } @@ -955,7 +955,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_error("No nfInstanceId [%s]", header.uri); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "Cannot parse nfInstanceUri", header.uri)); + recvmsg, "Cannot parse nfInstanceUri", header.uri, NULL)); ogs_sbi_header_free(&header); return false; } @@ -966,7 +966,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, recvmsg, "The notification is not allowed", - message.h.resource.component[1])); + message.h.resource.component[1], NULL)); ogs_sbi_header_free(&header); return false; } @@ -982,7 +982,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile", NULL)); + recvmsg, "No NFProfile", NULL, NULL)); ogs_sbi_header_free(&header); return false; } @@ -992,7 +992,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFInstanceId", NULL)); + recvmsg, "No NFProfile.NFInstanceId", NULL, NULL)); ogs_sbi_header_free(&header); return false; } @@ -1002,7 +1002,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFType", NULL)); + recvmsg, "No NFProfile.NFType", NULL, NULL)); ogs_sbi_header_free(&header); return false; } @@ -1012,7 +1012,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFStatus", NULL)); + recvmsg, "No NFProfile.NFStatus", NULL, NULL)); ogs_sbi_header_free(&header); return false; } @@ -1086,7 +1086,8 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Not found", message.h.resource.component[1])); + recvmsg, "Not found", message.h.resource.component[1], + NULL)); ogs_sbi_header_free(&header); return false; } @@ -1098,7 +1099,7 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "Not supported event", - eventstr ? eventstr : "Unknown")); + eventstr ? eventstr : "Unknown", NULL)); ogs_sbi_header_free(&header); return false; } diff --git a/lib/sbi/server.c b/lib/sbi/server.c index 151bcf0336..49cf3015ef 100644 --- a/lib/sbi/server.c +++ b/lib/sbi/server.c @@ -197,7 +197,7 @@ bool ogs_sbi_server_send_problem( bool ogs_sbi_server_send_error(ogs_sbi_stream_t *stream, int status, ogs_sbi_message_t *message, - const char *title, const char *detail) + const char *title, const char *detail, const char *cause) { OpenAPI_problem_details_t problem; @@ -224,6 +224,7 @@ bool ogs_sbi_server_send_error(ogs_sbi_stream_t *stream, } problem.title = (char*)title; problem.detail = (char*)detail; + problem.cause = (char*)cause; ogs_sbi_server_send_problem(stream, &problem); diff --git a/lib/sbi/server.h b/lib/sbi/server.h index 50480713f6..ddd5e96c6e 100644 --- a/lib/sbi/server.h +++ b/lib/sbi/server.h @@ -90,7 +90,8 @@ bool ogs_sbi_server_send_response( ogs_sbi_stream_t *stream, ogs_sbi_response_t *response); bool ogs_sbi_server_send_error(ogs_sbi_stream_t *stream, int status, ogs_sbi_message_t *message, - const char *title, const char *detail); + const char *title, const char *detail, const char *cause); + bool ogs_sbi_server_send_problem( ogs_sbi_stream_t *stream, OpenAPI_problem_details_t *problem); diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 22de3f8525..e2df53c4d1 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -99,7 +99,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, NULL)); break; } @@ -117,7 +117,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &sbi_message, "Not supported version", NULL)); + &sbi_message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&sbi_message); break; } @@ -137,7 +137,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, - "Invalid HTTP method", sbi_message.h.method)); + "Invalid HTTP method", sbi_message.h.method, NULL)); END break; @@ -148,7 +148,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; @@ -166,7 +166,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, - "No N1N2MessageTransferReqData", NULL)); + "No N1N2MessageTransferReqData", NULL, NULL)); } break; @@ -176,7 +176,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, - "Invalid HTTP method", sbi_message.h.method)); + "Invalid HTTP method", sbi_message.h.method, + NULL)); END break; @@ -192,7 +193,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, - "Invalid HTTP method", sbi_message.h.method)); + "Invalid HTTP method", sbi_message.h.method, + NULL)); END break; @@ -203,7 +205,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[2])); + sbi_message.h.resource.component[2], NULL)); END break; @@ -214,7 +216,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; @@ -245,7 +247,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[1])); + sbi_message.h.resource.component[1], NULL)); END break; @@ -254,7 +256,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, - "Invalid API name", sbi_message.h.resource.component[0])); + "Invalid API name", sbi_message.h.resource.component[0], + NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index 2cc8c46d41..d1b97cffe8 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1467,7 +1467,7 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); ogs_free(strerror); return OGS_ERROR; diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index a7eb5ae609..f17bb4348e 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -73,7 +73,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -82,7 +82,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -104,7 +104,8 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -115,7 +116,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -147,7 +148,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.method)); + &message, "Not found", message.h.method, NULL)); break; } @@ -167,7 +168,8 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.resource.component[0])); + "Invalid API name", message.h.resource.component[0], + NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -428,7 +430,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); break; default: ogs_error("Unknown timer[%s:%d]", diff --git a/src/ausf/nausf-handler.c b/src/ausf/nausf-handler.c index a255a75088..2c4fd45e69 100644 --- a/src/ausf/nausf-handler.c +++ b/src/ausf/nausf-handler.c @@ -37,7 +37,7 @@ bool ausf_nausf_auth_handle_authenticate(ausf_ue_t *ausf_ue, ogs_error("[%s] No AuthenticationInfo", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationInfo", ausf_ue->suci)); + recvmsg, "No AuthenticationInfo", ausf_ue->suci, NULL)); return false; } @@ -46,7 +46,7 @@ bool ausf_nausf_auth_handle_authenticate(ausf_ue_t *ausf_ue, ogs_error("[%s] No servingNetworkName", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No servingNetworkName", ausf_ue->suci)); + recvmsg, "No servingNetworkName", ausf_ue->suci, NULL)); return false; } @@ -82,7 +82,7 @@ bool ausf_nausf_auth_handle_authenticate_confirmation(ausf_ue_t *ausf_ue, ogs_error("[%s] No ConfirmationData", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No ConfirmationData", ausf_ue->suci)); + recvmsg, "No ConfirmationData", ausf_ue->suci, NULL)); return false; } @@ -91,7 +91,7 @@ bool ausf_nausf_auth_handle_authenticate_confirmation(ausf_ue_t *ausf_ue, ogs_error("[%s] No ConfirmationData.resStar", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No ConfirmationData.resStar", ausf_ue->suci)); + recvmsg, "No ConfirmationData.resStar", ausf_ue->suci, NULL)); return false; } diff --git a/src/ausf/nudm-handler.c b/src/ausf/nudm-handler.c index 8872b6026f..91d835170e 100644 --- a/src/ausf/nudm-handler.c +++ b/src/ausf/nudm-handler.c @@ -63,7 +63,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationInfoResult", ausf_ue->suci)); + recvmsg, "No AuthenticationInfoResult", ausf_ue->suci, + NULL)); return false; } @@ -75,7 +76,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_IMPLEMENTED, - recvmsg, "Not supported Auth Method", ausf_ue->suci)); + recvmsg, "Not supported Auth Method", ausf_ue->suci, + NULL)); return false; } @@ -86,17 +88,32 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector", ausf_ue->suci)); + recvmsg, "No AuthenticationVector", ausf_ue->suci, NULL)); return false; } if (AuthenticationVector->av_type != OpenAPI_av_type_5G_HE_AKA) { ogs_error("[%s] Not supported Auth Method [%d]", ausf_ue->suci, AuthenticationVector->av_type); + /* + * TS29.509 + * 5.2.2.2.2 5G AKA + * + * On failure or redirection, one of the HTTP status code + * listed in table 6.1.7.3-1 shall be returned with the message + * body containing a ProblemDetails structure with the "cause" + * attribute set to one of the application error listed in + * Table 6.1.7.3-1. + * Application Error: AUTHENTICATION_REJECTED + * HTTP status code: 403 Forbidden + * Description: The user cannot be authenticated with this + * authentication method e.g. only SIM data available + */ ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - recvmsg, "Not supported Auth Method", ausf_ue->suci)); + recvmsg, "Not supported Auth Method", ausf_ue->suci, + "AUTHENTICATION_REJECTED")); return false; } @@ -105,7 +122,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector.rand", ausf_ue->suci)); + recvmsg, "No AuthenticationVector.rand", ausf_ue->suci, + NULL)); return false; } @@ -115,7 +133,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector.xresStar", ausf_ue->suci)); + recvmsg, "No AuthenticationVector.xresStar", ausf_ue->suci, + NULL)); return false; } @@ -124,7 +143,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector.autn", ausf_ue->suci)); + recvmsg, "No AuthenticationVector.autn", ausf_ue->suci, + NULL)); return false; } @@ -133,7 +153,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector.kausf", ausf_ue->suci)); + recvmsg, "No AuthenticationVector.kausf", ausf_ue->suci, + NULL)); return false; } @@ -142,7 +163,8 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationVector.supi", ausf_ue->suci)); + recvmsg, "No AuthenticationVector.supi", ausf_ue->suci, + NULL)); return false; } @@ -274,7 +296,7 @@ bool ausf_nudm_ueau_handle_result_confirmation_inform(ausf_ue_t *ausf_ue, ogs_error("[%s] No AuthEvent", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthEvent", ausf_ue->suci)); + recvmsg, "No AuthEvent", ausf_ue->suci, NULL)); return false; } @@ -282,7 +304,7 @@ bool ausf_nudm_ueau_handle_result_confirmation_inform(ausf_ue_t *ausf_ue, ogs_error("[%s] No Location", ausf_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Location", ausf_ue->suci)); + recvmsg, "No Location", ausf_ue->suci, NULL)); return false; } diff --git a/src/ausf/sbi-path.c b/src/ausf/sbi-path.c index d80c81aa46..34d252b384 100644 --- a/src/ausf/sbi-path.c +++ b/src/ausf/sbi-path.c @@ -96,7 +96,7 @@ int ausf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", ausf_ue->suci)); + "Cannot discover", ausf_ue->suci, NULL)); return OGS_ERROR; } @@ -109,7 +109,7 @@ int ausf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", ausf_ue->suci)); + "Cannot discover", ausf_ue->suci, NULL)); return r; } diff --git a/src/ausf/ue-sm.c b/src/ausf/ue-sm.c index f2f8f47164..a701aac964 100644 --- a/src/ausf/ue-sm.c +++ b/src/ausf/ue-sm.c @@ -95,7 +95,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "[%s] No SUPI", ausf_ue->suci)); + message, "[%s] No SUPI", ausf_ue->suci, NULL)); OGS_FSM_TRAN(s, ausf_ue_state_exception); break; } @@ -114,7 +114,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "[%s] No SUPI", ausf_ue->suci)); + message, "[%s] No SUPI", ausf_ue->suci, NULL)); OGS_FSM_TRAN(s, ausf_ue_state_exception); break; } @@ -133,7 +133,8 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, + NULL)); END break; @@ -162,7 +163,8 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, message->res_status, - NULL, "HTTP response error", ausf_ue->suci)); + NULL, "HTTP response error", ausf_ue->suci, + message->ProblemDetails->cause)); break; } diff --git a/src/bsf/bsf-sm.c b/src/bsf/bsf-sm.c index e67ad24d4f..730038e077 100644 --- a/src/bsf/bsf-sm.c +++ b/src/bsf/bsf-sm.c @@ -76,7 +76,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, NULL)); break; } @@ -85,7 +85,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -105,7 +105,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -116,7 +116,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -166,7 +166,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.uri)); + &message, "Not found", message.h.uri, NULL)); break; } @@ -180,7 +180,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -189,7 +189,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -412,7 +412,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); } break; diff --git a/src/bsf/nbsf-handler.c b/src/bsf/nbsf-handler.c index dbf3152942..c391500a63 100644 --- a/src/bsf/nbsf-handler.c +++ b/src/bsf/nbsf-handler.c @@ -303,7 +303,8 @@ bool bsf_nbsf_management_handle_pcf_binding( ogs_assert(status); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, + NULL)); ogs_free(strerror); return false; diff --git a/src/bsf/sbi-path.c b/src/bsf/sbi-path.c index d9d9739059..5d5383ad41 100644 --- a/src/bsf/sbi-path.c +++ b/src/bsf/sbi-path.c @@ -96,7 +96,7 @@ int bsf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", sess->dnn)); + "Cannot discover", sess->dnn, NULL)); return OGS_ERROR; } @@ -109,7 +109,7 @@ int bsf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", sess->dnn)); + "Cannot discover", sess->dnn, NULL)); return r; } diff --git a/src/nrf/nf-sm.c b/src/nrf/nf-sm.c index 8e20472979..545d68bd04 100644 --- a/src/nrf/nf-sm.c +++ b/src/nrf/nf-sm.c @@ -128,8 +128,8 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, - "Invalid HTTP method", message->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -138,9 +138,9 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.resource.component[0]); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, "Invalid resource name", - message->h.resource.component[0])); + message->h.resource.component[0], NULL)); END break; @@ -149,8 +149,9 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.service.name); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, - "Invalid resource name", message->h.service.name)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid resource name", message->h.service.name, + NULL)); END OGS_FSM_TRAN(s, nrf_nf_state_registered); @@ -162,7 +163,8 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - message, "Unknown event", nrf_event_get_name(e))); + message, "Unknown event", nrf_event_get_name(e), + NULL)); OGS_FSM_TRAN(s, nrf_nf_state_exception); break; } @@ -256,8 +258,8 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, - "Invalid HTTP method", message->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -266,9 +268,9 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.resource.component[0]); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, "Invalid resource name", - message->h.resource.component[0])); + message->h.resource.component[0], NULL)); END break; @@ -277,8 +279,9 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) nf_instance->id, message->h.service.name); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, message, - "Invalid resource name", message->h.service.name)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid resource name", message->h.service.name, + NULL)); END break; @@ -288,7 +291,8 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - message, "Unknown event", nrf_event_get_name(e))); + message, "Unknown event", nrf_event_get_name(e), + NULL)); OGS_FSM_TRAN(s, nrf_nf_state_exception); break; } diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 1368e2fcb5..69bccb90d2 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -42,7 +42,7 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_error("No NFProfile"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile", NULL)); + recvmsg, "No NFProfile", NULL, NULL)); return false; } @@ -51,7 +51,7 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFInstanceId", NULL)); + recvmsg, "No NFProfile.NFInstanceId", NULL, NULL)); return false; } @@ -60,7 +60,7 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFType", NULL)); + recvmsg, "No NFProfile.NFType", NULL, NULL)); return false; } @@ -69,7 +69,7 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No NFProfile.NFStatus", NULL)); + recvmsg, "No NFProfile.NFStatus", NULL, NULL)); return false; } @@ -220,7 +220,7 @@ bool nrf_nnrf_handle_nf_update(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItemList", NULL)); + recvmsg, "No PatchItemList", NULL, NULL)); return false; } @@ -231,7 +231,7 @@ bool nrf_nnrf_handle_nf_update(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItem", NULL)); + recvmsg, "No PatchItem", NULL, NULL)); return false; } @@ -296,16 +296,15 @@ bool nrf_nnrf_handle_nf_status_subscribe( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "Invalid POST Format", - recvmsg->h.resource.component[1])); + recvmsg->h.resource.component[1], NULL)); return false; } SubscriptionData = recvmsg->SubscriptionData; if (!SubscriptionData) { - ogs_error("No SubscriptionData"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SubscriptionData", NULL)); + recvmsg, "No SubscriptionData", NULL, NULL)); return false; } @@ -314,7 +313,8 @@ bool nrf_nnrf_handle_nf_status_subscribe( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SubscriptionData", "NFStatusNotificationURL")); + recvmsg, "No SubscriptionData", "NFStatusNotificationURL", + NULL)); return false; } @@ -403,7 +403,8 @@ bool nrf_nnrf_handle_nf_status_subscribe( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "Invalid URI", subscription_data->notification_uri)); + recvmsg, "Invalid URI", subscription_data->notification_uri, + NULL)); ogs_sbi_subscription_data_remove(subscription_data); return false; } @@ -496,7 +497,7 @@ bool nrf_nnrf_handle_nf_status_update( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SubscriptionId", NULL)); + recvmsg, "No SubscriptionId", NULL, NULL)); return false; } @@ -507,7 +508,8 @@ bool nrf_nnrf_handle_nf_status_update( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Not found", recvmsg->h.resource.component[1])); + recvmsg, "Not found", recvmsg->h.resource.component[1], + NULL)); return false; } ogs_assert(subscription_data->id); @@ -518,7 +520,8 @@ bool nrf_nnrf_handle_nf_status_update( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItemList", subscription_data->id)); + recvmsg, "No PatchItemList", subscription_data->id, + NULL)); return false; } @@ -529,7 +532,7 @@ bool nrf_nnrf_handle_nf_status_update( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItem", NULL)); + recvmsg, "No PatchItem", NULL, NULL)); return false; } @@ -634,7 +637,7 @@ bool nrf_nnrf_handle_nf_status_unsubscribe( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SubscriptionId", NULL)); + recvmsg, "No SubscriptionId", NULL, NULL)); return false; } @@ -645,7 +648,8 @@ bool nrf_nnrf_handle_nf_status_unsubscribe( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Not found", recvmsg->h.resource.component[1])); + recvmsg, "Not found", recvmsg->h.resource.component[1], + NULL)); return false; } @@ -741,7 +745,8 @@ bool nrf_nnrf_handle_nf_profile_retrieval( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Not found", recvmsg->h.resource.component[1])); + recvmsg, "Not found", recvmsg->h.resource.component[1], + NULL)); return false; } @@ -783,14 +788,14 @@ bool nrf_nnrf_handle_nf_discover( ogs_error("No target-nf-type [%s]", recvmsg->h.uri); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No target-nf-type", NULL)); + recvmsg, "No target-nf-type", NULL, NULL)); return false; } if (!recvmsg->param.requester_nf_type) { ogs_error("No requester-nf-type [%s]", recvmsg->h.uri); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No requester-nf-type", NULL)); + recvmsg, "No requester-nf-type", NULL, NULL)); return false; } @@ -1004,7 +1009,7 @@ bool nrf_nnrf_handle_nf_discover( ogs_error("nrf_assoc_add() failed"); ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "nrf_assoc_add() failed", NULL)); + recvmsg, "nrf_assoc_add() failed", NULL, NULL)); goto cleanup; } @@ -1016,7 +1021,8 @@ bool nrf_nnrf_handle_nf_discover( ogs_error("ogs_nnrf_disc_build_discover() failed"); ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "ogs_nnrf_disc_build_discover() failed", NULL)); + recvmsg, "ogs_nnrf_disc_build_discover() failed", NULL, + NULL)); nrf_assoc_remove(assoc); goto cleanup; } @@ -1027,7 +1033,8 @@ bool nrf_nnrf_handle_nf_discover( ogs_error("ogs_sbi_send_request_to_client"); ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "ogs_sbi_send_request_to_client() failed", NULL)); + recvmsg, "ogs_sbi_send_request_to_client() failed", NULL, + NULL)); ogs_sbi_request_free(request); nrf_assoc_remove(assoc); goto cleanup; @@ -1085,7 +1092,7 @@ static int discover_handler( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "response_handler() failed", NULL)); + "response_handler() failed", NULL, NULL)); nrf_assoc_remove(assoc); diff --git a/src/nrf/nrf-sm.c b/src/nrf/nrf-sm.c index d9038e3337..5a16a9e2fd 100644 --- a/src/nrf/nrf-sm.c +++ b/src/nrf/nrf-sm.c @@ -73,7 +73,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -82,7 +82,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -108,7 +108,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) stream, OGS_SBI_HTTP_STATUS_NOT_IMPLEMENTED, &message, "OPTIONS method is not implemented yet", - NULL)); + NULL, NULL)); break; DEFAULT @@ -131,7 +131,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) stream, OGS_SBI_HTTP_STATUS_PAYLOAD_TOO_LARGE, &message, "Insufficient space", - message.h.resource.component[1])); + message.h.resource.component[1], NULL)); break; } nf_instance = ogs_sbi_nf_instance_add(); @@ -153,7 +153,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, &message, "Not found", - message.h.resource.component[1])); + message.h.resource.component[1], NULL)); END } @@ -202,7 +202,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -213,7 +213,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -233,7 +233,8 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -245,7 +246,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -254,7 +255,8 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.resource.component[0])); + "Invalid API name", message.h.resource.component[0], + NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ diff --git a/src/nssf/nnssf-handler.c b/src/nssf/nnssf-handler.c index 8d4371fc66..c4a1fc3b6c 100644 --- a/src/nssf/nnssf-handler.c +++ b/src/nssf/nnssf-handler.c @@ -84,7 +84,8 @@ bool nssf_nnrf_nsselection_handle_get( ogs_assert(strerror); ogs_error("%s", strerror); - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, + NULL); ogs_free(strerror); return false; diff --git a/src/nssf/nssf-sm.c b/src/nssf/nssf-sm.c index 71561e7138..a62c42a36f 100644 --- a/src/nssf/nssf-sm.c +++ b/src/nssf/nssf-sm.c @@ -74,7 +74,7 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -91,7 +91,7 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -111,7 +111,8 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - &message, "Invalid HTTP method", message.h.method)); + &message, "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -122,7 +123,7 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -131,7 +132,8 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.resource.component[0])); + "Invalid API name", message.h.resource.component[0], + NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ diff --git a/src/pcf/am-sm.c b/src/pcf/am-sm.c index b8ba51e5a4..74c1dacd91 100644 --- a/src/pcf/am-sm.c +++ b/src/pcf/am-sm.c @@ -83,8 +83,8 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue->supi, message->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -113,7 +113,8 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, message->res_status, - NULL, "HTTP response error", pcf_ue->supi)); + NULL, "HTTP response error", pcf_ue->supi, + NULL)); break; } @@ -140,7 +141,8 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid API name", message->h.resource.component[0])); + "Invalid API name", message->h.resource.component[0], + NULL)); END break; diff --git a/src/pcf/nbsf-handler.c b/src/pcf/nbsf-handler.c index 56f6345ebb..84c3ddbb48 100644 --- a/src/pcf/nbsf-handler.c +++ b/src/pcf/nbsf-handler.c @@ -399,7 +399,8 @@ bool pcf_nbsf_management_handle_register( ogs_assert(status); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, + NULL)); ogs_free(strerror); OGS_SESSION_DATA_FREE(&session_data); diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index abd56150c2..1754a1186c 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -51,7 +51,8 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, ogs_error("[%s] No PolicyAssociationRequest", pcf_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "[%s] No PolicyAssociationRequest", pcf_ue->supi)); + message, "[%s] No PolicyAssociationRequest", pcf_ue->supi, + NULL)); return false; } @@ -59,7 +60,7 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, ogs_error("[%s] No notificationUri", pcf_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No notificationUri", pcf_ue->supi)); + message, "No notificationUri", pcf_ue->supi, NULL)); return false; } @@ -67,7 +68,7 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, ogs_error("[%s] No supi", pcf_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No supi", pcf_ue->supi)); + message, "No supi", pcf_ue->supi, NULL)); return false; } @@ -75,7 +76,7 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, ogs_error("[%s] No suppFeat", pcf_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No suppFeat", pcf_ue->supi)); + message, "No suppFeat", pcf_ue->supi, NULL)); return false; } @@ -86,7 +87,7 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, pcf_ue->supi, PolicyAssociationRequest->notification_uri); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "[%s] Invalid URI", pcf_ue->supi)); + message, "[%s] Invalid URI", pcf_ue->supi, NULL)); return false; } @@ -546,8 +547,21 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, ogs_assert(status); ogs_assert(strerror); ogs_error("%s", strerror); + /* + * TS29.512 + * 4.2.2.2 SM Policy Association establishment + * + * If the PCF is, due to incomplete, erroneous or missing + * information (e.g. QoS, RAT type, subscriber information) + * not able to provision a policy decision as response to + * the request for PCC rules by the SMF, the PCF may reject + * the request and include in an HTTP "400 Bad Request" + * response message the "cause" attribute of the ProblemDetails + * data structure set to "ERROR_INITIAL_PARAMETERS". + */ ogs_assert(true == - ogs_sbi_server_send_error(stream, status, message, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, message, + strerror, NULL, "ERROR_INITIAL_PARAMETERS")); ogs_free(strerror); return false; @@ -605,7 +619,8 @@ bool pcf_npcf_smpolicycontrol_handle_delete(pcf_sess_t *sess, ogs_assert(strerror); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, message, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, message, strerror, NULL, + NULL)); ogs_free(strerror); return false; @@ -1071,7 +1086,8 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, ogs_assert(strerror); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, + NULL)); ogs_free(strerror); OpenAPI_list_for_each(PccRuleList, node) { @@ -1483,7 +1499,8 @@ bool pcf_npcf_policyauthorization_handle_update( ogs_assert(strerror); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, + NULL, NULL)); ogs_free(strerror); OpenAPI_list_for_each(PccRuleList, node) { diff --git a/src/pcf/nudr-handler.c b/src/pcf/nudr-handler.c index eb0ebfb0b4..f39407d27e 100644 --- a/src/pcf/nudr-handler.c +++ b/src/pcf/nudr-handler.c @@ -174,7 +174,8 @@ bool pcf_nudr_dr_handle_query_am_data( ogs_assert(status); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, + NULL, NULL)); ogs_free(strerror); ogs_subscription_data_free(&subscription_data); @@ -249,10 +250,22 @@ bool pcf_nudr_dr_handle_query_sm_data( cleanup: ogs_assert(strerror); - ogs_assert(status); + status = OGS_SBI_HTTP_STATUS_FORBIDDEN; ogs_error("%s", strerror); + /* + * TS29.512 + * 4.2.2.2 SM Policy Association establishment + * + * If the PCF, based on local configuration and/or operator + * policies, denies the creation of the Individual SM Policy + * resource, the PCF may reject the request and include in + * an HTTP "403 Forbidden" response message the "cause" + * attribute of the ProblemDetails data structure set to + * "POLICY_CONTEXT_DENIED". + */ ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, + NULL, "POLICY_CONTEXT_DENIED")); ogs_free(strerror); return false; diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 2e1973860d..10381a1a4f 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -79,7 +79,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -88,7 +88,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -108,7 +108,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -119,7 +119,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -153,7 +153,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.method)); + &message, "Not found", message.h.method, NULL)); break; } @@ -204,13 +204,21 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) DEFAULT END - if (!sess) { ogs_error("Not found [%s]", message.h.uri); + /* + * TS29.512 + * 4.2.2.2 SM Policy Association establishment + * + * If the user information received within the "supi" attribute is + * unknown, the PCF shall reject the request with an HTTP "400 Bad + * Request" response message including the "cause" attribute + * of the ProblemDetails data structure set to "USER_UNKNOWN". + */ ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.uri)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + &message, "Not found", message.h.uri, "USER_UNKNOWN")); break; } @@ -260,7 +268,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.uri)); + &message, "Not found", message.h.uri, NULL)); break; } @@ -282,7 +290,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -694,7 +702,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); break; default: diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index 46d75d1389..2dff9a07f7 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -174,7 +174,7 @@ int pcf_ue_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", pcf_ue->supi)); + "Cannot discover", pcf_ue->supi, NULL)); return r; } @@ -217,7 +217,7 @@ int pcf_sess_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", NULL)); + "Cannot discover", NULL, NULL)); return r; } diff --git a/src/pcf/sm-sm.c b/src/pcf/sm-sm.c index 92de11b44e..527f40930b 100644 --- a/src/pcf/sm-sm.c +++ b/src/pcf/sm-sm.c @@ -96,8 +96,8 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue->supi, sess->psi, message->h.uri); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.uri)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.uri, NULL)); END } break; @@ -116,8 +116,8 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) message->h.resource.component[2]); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid resource name", message->h.uri)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, + "Invalid resource name", message->h.uri, NULL)); END } else { SWITCH(message->h.method) @@ -130,8 +130,8 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue->supi, sess->psi, message->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.uri)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.uri, NULL)); END } } else { @@ -145,8 +145,8 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue->supi, sess->psi, message->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.uri)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, message, + "Invalid HTTP method", message->h.uri, NULL)); END } break; @@ -176,14 +176,42 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) OGS_SBI_HTTP_STATUS_NOT_FOUND) { ogs_warn("[%s:%d] Cannot find SUPI [%d]", pcf_ue->supi, sess->psi, message->res_status); + /* + * TS29.512 + * 4.2.2.2 SM Policy Association establishment + * + * If the user information received within the "supi" + * attribute is unknown, the PCF shall reject the + * request with an HTTP "400 Bad Request" response + * message including the "cause" attribute of the + * ProblemDetails data structure set to "USER_UNKNOWN". + */ + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + NULL, "End user is unknown to the PCF", + pcf_ue->supi, "USER_UNKNOWN")); } else { ogs_error("[%s:%d] HTTP response error [%d]", pcf_ue->supi, sess->psi, message->res_status); + /* + * TS29.512 + * 4.2.2.2 SM Policy Association establishment + * + * If the PCF, based on local configuration and/or + * operator policies, denies the creation of the + * Individual SM Policy resource, the PCF may reject + * the request and include in an HTTP "403 Forbidden" + * response message the "cause" attribute of the + * ProblemDetails data structure set to + * "POLICY_CONTEXT_DENIED". + */ + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, + NULL, "HTTP response error", + pcf_ue->supi, "POLICY_CONTEXT_DENIED")); } - ogs_assert(true == - ogs_sbi_server_send_error( - stream, message->res_status, - NULL, "HTTP response error", pcf_ue->supi)); break; } diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 1a16953e04..50ad923d39 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -631,7 +631,7 @@ static int response_handler( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "response_handler() failed", NULL)); + "response_handler() failed", NULL, NULL)); scp_assoc_remove(assoc); @@ -700,7 +700,7 @@ static int nf_discover_handler( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "nf_discover_handler() failed", NULL)); + "nf_discover_handler() failed", NULL, NULL)); scp_assoc_remove(assoc); return OGS_ERROR; @@ -787,7 +787,8 @@ static int nf_discover_handler( ogs_assert(true == ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, + NULL)); ogs_free(strerror); @@ -829,7 +830,7 @@ static int sepp_discover_handler( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "sepp_discover_handler() failed", NULL)); + "sepp_discover_handler() failed", NULL, NULL)); scp_assoc_remove(assoc); return OGS_ERROR; @@ -881,7 +882,8 @@ static int sepp_discover_handler( ogs_assert(true == ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, + NULL)); ogs_free(strerror); diff --git a/src/scp/scp-sm.c b/src/scp/scp-sm.c index 8613dc1cc6..587ab1ac46 100644 --- a/src/scp/scp-sm.c +++ b/src/scp/scp-sm.c @@ -72,7 +72,8 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, + NULL)); break; } @@ -81,7 +82,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -101,7 +102,8 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -112,7 +114,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -121,7 +123,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -314,7 +316,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); } break; diff --git a/src/sepp/handshake-sm.c b/src/sepp/handshake-sm.c index 4d7d255700..0ff9d7a0e2 100644 --- a/src/sepp/handshake-sm.c +++ b/src/sepp/handshake-sm.c @@ -154,7 +154,7 @@ void sepp_handshake_state_will_establish(ogs_fsm_t *s, sepp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, "PRINS is not supported", - sepp_node->receiver)); + sepp_node->receiver, NULL)); } else if (sepp_node->negotiated_security_scheme == OpenAPI_security_capability_NONE) { @@ -341,7 +341,7 @@ void sepp_handshake_state_established(ogs_fsm_t *s, sepp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, "PRINS is not supported", - sepp_node->receiver)); + sepp_node->receiver, NULL)); } else if (sepp_node->negotiated_security_scheme == OpenAPI_security_capability_NONE) { @@ -483,7 +483,7 @@ void sepp_handshake_state_terminated(ogs_fsm_t *s, sepp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, "PRINS is not supported", - sepp_node->receiver)); + sepp_node->receiver, NULL)); } else if (sepp_node->negotiated_security_scheme == OpenAPI_security_capability_NONE) { diff --git a/src/sepp/n32c-handler.c b/src/sepp/n32c-handler.c index 75af2e0f1d..7c4a9a8a58 100644 --- a/src/sepp/n32c-handler.c +++ b/src/sepp/n32c-handler.c @@ -40,7 +40,8 @@ bool sepp_n32c_handshake_handle_security_capability_request( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SecNegotiateReqData", sepp_node->receiver)); + recvmsg, "No SecNegotiateReqData", sepp_node->receiver, + NULL)); return false; } @@ -49,7 +50,8 @@ bool sepp_n32c_handshake_handle_security_capability_request( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SecNegotiateReqData.sender", sepp_node->receiver)); + recvmsg, "No SecNegotiateReqData.sender", sepp_node->receiver, + NULL)); return false; } @@ -66,7 +68,7 @@ bool sepp_n32c_handshake_handle_security_capability_request( ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "No supported_sec_capability_list", - sepp_node->receiver)); + sepp_node->receiver, NULL)); return false; } @@ -104,7 +106,7 @@ bool sepp_n32c_handshake_handle_security_capability_request( ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "Unknown SupportedSecCapability", - sepp_node->receiver)); + sepp_node->receiver, NULL)); return false; } diff --git a/src/sepp/sbi-path.c b/src/sepp/sbi-path.c index 187e42a44a..78b68ec682 100644 --- a/src/sepp/sbi-path.c +++ b/src/sepp/sbi-path.c @@ -422,7 +422,7 @@ static int response_handler( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "response_handler() failed", NULL)); + "response_handler() failed", NULL, NULL)); sepp_assoc_remove(assoc); diff --git a/src/sepp/sepp-sm.c b/src/sepp/sepp-sm.c index 835d972ec6..58b484d80f 100644 --- a/src/sepp/sepp-sm.c +++ b/src/sepp/sepp-sm.c @@ -76,7 +76,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, NULL)); break; } @@ -85,7 +85,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -111,7 +111,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -122,7 +122,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -157,7 +157,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -168,7 +168,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END if (!sepp_node) { @@ -176,7 +176,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.method)); + &message, "Not found", message.h.method, NULL)); break; } @@ -194,7 +194,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index d1226ca9ea..32da155f27 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -263,7 +263,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, "Invalid resource name [%s]", - sbi_message->h.resource.component[2])); + sbi_message->h.resource.component[2], NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); break; DEFAULT @@ -280,7 +280,8 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, - "Invalid API name", sbi_message->h.service.name)); + "Invalid API name", sbi_message->h.service.name, + NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -315,7 +316,8 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, + NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -477,7 +479,8 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, sbi_message->res_status, - sbi_message, strerror, NULL)); + sbi_message, strerror, NULL, + sbi_message->ProblemDetails->cause)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -501,7 +504,7 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - sbi_message, strerror, NULL)); + sbi_message, strerror, NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -872,7 +875,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, "Invalid resource name [%s]", - sbi_message->h.resource.component[2])); + sbi_message->h.resource.component[2], NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -882,7 +885,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, - "Invalid API name", sbi_message->h.service.name)); + "Invalid API name", sbi_message->h.service.name, + NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -913,7 +917,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, sbi_message->res_status, - sbi_message, strerror, NULL)); + sbi_message, strerror, NULL, + sbi_message->ProblemDetails->cause)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -993,7 +998,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - sbi_message, strerror, NULL)); + sbi_message, strerror, NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); END @@ -1010,7 +1015,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - sbi_message, strerror, NULL)); + sbi_message, strerror, NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); END @@ -1100,7 +1105,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, + NULL, NULL)); ogs_free(strerror); } break; @@ -1157,7 +1163,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, + NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -1601,7 +1608,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, "Invalid resource name [%s]", - sbi_message->h.resource.component[2])); + sbi_message->h.resource.component[2], NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -1611,7 +1618,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, - "Invalid API name", sbi_message->h.service.name)); + "Invalid API name", sbi_message->h.service.name, + NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -1704,7 +1712,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, + NULL, NULL)); ogs_free(strerror); OGS_FSM_TRAN(s, smf_gsm_state_exception); @@ -1771,7 +1780,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, + NULL, NULL)); ogs_free(strerror); } break; @@ -1938,7 +1948,7 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, "Invalid resource name [%s]", - sbi_message->h.resource.component[2])); + sbi_message->h.resource.component[2], NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; @@ -1948,7 +1958,8 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, sbi_message, - "Invalid API name", sbi_message->h.service.name)); + "Invalid API name", sbi_message->h.service.name, + NULL)); OGS_FSM_TRAN(s, smf_gsm_state_exception); END break; diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 355ff1477d..db1f91c2f1 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -705,7 +705,7 @@ int smf_5gc_n4_handle_session_deletion_response( ogs_assert(stream); ogs_assert(true == ogs_sbi_server_send_error( - stream, status, NULL, strerror, NULL)); + stream, status, NULL, strerror, NULL, NULL)); } else if (trigger == OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED) { /* No stream - Nothing */ } else { diff --git a/src/smf/namf-handler.c b/src/smf/namf-handler.c index d04b38ccb3..5bfa823da9 100644 --- a/src/smf/namf-handler.c +++ b/src/smf/namf-handler.c @@ -198,7 +198,7 @@ bool smf_namf_comm_handle_n1_n2_message_transfer_failure_notify( ogs_error("No N1N2MsgTxfrFailureNotification"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No N1N2MsgTxfrFailureNotification", NULL)); + recvmsg, "No N1N2MsgTxfrFailureNotification", NULL, NULL)); return false; } @@ -206,7 +206,7 @@ bool smf_namf_comm_handle_n1_n2_message_transfer_failure_notify( ogs_error("No Cause"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Cause", NULL)); + recvmsg, "No Cause", NULL, NULL)); return false; } @@ -214,7 +214,7 @@ bool smf_namf_comm_handle_n1_n2_message_transfer_failure_notify( ogs_error("No n1n2MsgDataUri"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No n1n2MsgDataUri", NULL)); + recvmsg, "No n1n2MsgDataUri", NULL, NULL)); return false; } @@ -225,7 +225,7 @@ bool smf_namf_comm_handle_n1_n2_message_transfer_failure_notify( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, recvmsg, N1N2MsgTxfrFailureNotification->n1n2_msg_data_uri, - NULL)); + NULL, NULL)); return false; } diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 22441af2e1..631363fdab 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -697,7 +697,7 @@ bool smf_npcf_smpolicycontrol_handle_update_notify( ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index 62b47ac408..fff72ffd4f 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -373,7 +373,7 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index fc02ae6ae8..168eeb963d 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -283,7 +283,8 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) ogs_assert(stream); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, strerror, NULL)); + OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, strerror, + NULL, NULL)); } else { ogs_fatal("Unknown trigger [%d]", trigger); ogs_assert_if_reached(); diff --git a/src/smf/sbi-path.c b/src/smf/sbi-path.c index fb0e89f4ca..7edcef793e 100644 --- a/src/smf/sbi-path.c +++ b/src/smf/sbi-path.c @@ -206,7 +206,7 @@ int smf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", smf_ue->supi)); + "Cannot discover", smf_ue->supi, NULL)); return OGS_ERROR; } @@ -222,7 +222,7 @@ int smf_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", smf_ue->supi)); + "Cannot discover", smf_ue->supi, NULL)); return r; } diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 60fc8f0a8f..1ba9e4319c 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -429,7 +429,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, + NULL)); break; } @@ -447,7 +448,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &sbi_message, "Not supported version", NULL)); + &sbi_message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&sbi_message); break; } @@ -467,7 +468,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, - "Invalid HTTP method", sbi_message.h.method)); + "Invalid HTTP method", sbi_message.h.method, NULL)); END break; @@ -478,7 +479,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; @@ -533,7 +534,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, - "Invalid HTTP method", sbi_message.h.method)); + "Invalid HTTP method", sbi_message.h.method, + NULL)); break; END @@ -555,7 +557,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; @@ -573,7 +575,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "No smContextRef", - sbi_message.h.resource.component[1])); + sbi_message.h.resource.component[1], NULL)); break; } @@ -586,7 +588,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, &sbi_message, "Not found", - sbi_message.h.resource.component[1])); + sbi_message.h.resource.component[1], NULL)); break; } @@ -606,7 +608,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; DEFAULT @@ -616,7 +618,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, "Invalid resource name", - sbi_message.h.resource.component[0])); + sbi_message.h.resource.component[0], NULL)); END break; @@ -625,7 +627,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &sbi_message, - "Invalid API name", sbi_message.h.service.name)); + "Invalid API name", sbi_message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -852,7 +854,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, strerror, NULL)); + NULL, strerror, NULL, NULL)); ogs_free(strerror); break; } @@ -976,7 +978,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); } break; diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 63b180db8c..2aa6d638b1 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -37,7 +37,8 @@ bool udm_nudm_ueau_handle_get( ogs_error("[%s] No AuthenticationInfoRequest", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthenticationInfoRequest", udm_ue->suci)); + recvmsg, "No AuthenticationInfoRequest", udm_ue->suci, + NULL)); return false; } @@ -45,7 +46,7 @@ bool udm_nudm_ueau_handle_get( ogs_error("[%s] No servingNetworkName", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No servingNetworkName", udm_ue->suci)); + recvmsg, "No servingNetworkName", udm_ue->suci, NULL)); return false; } @@ -53,7 +54,7 @@ bool udm_nudm_ueau_handle_get( ogs_error("[%s] No ausfInstanceId", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No ausfInstanceId", udm_ue->suci)); + recvmsg, "No ausfInstanceId", udm_ue->suci, NULL)); return false; } @@ -90,7 +91,7 @@ bool udm_nudm_ueau_handle_get( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No RAND", udm_ue->suci)); + recvmsg, "No RAND", udm_ue->suci, NULL)); return false; } @@ -99,7 +100,7 @@ bool udm_nudm_ueau_handle_get( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AUTS", udm_ue->suci)); + recvmsg, "No AUTS", udm_ue->suci, NULL)); return false; } @@ -118,7 +119,7 @@ bool udm_nudm_ueau_handle_get( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "Invalid RAND", udm_ue->suci)); + recvmsg, "Invalid RAND", udm_ue->suci, NULL)); return false; } @@ -133,7 +134,7 @@ bool udm_nudm_ueau_handle_get( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_UNAUTHORIZED, - recvmsg, "Re-sync MAC failed", udm_ue->suci)); + recvmsg, "Re-sync MAC failed", udm_ue->suci, NULL)); return false; } @@ -187,7 +188,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No AuthEvent", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No AuthEvent", udm_ue->suci)); + message, "No AuthEvent", udm_ue->suci, NULL)); return false; } @@ -195,7 +196,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No nfInstanceId", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No nfInstanceId", udm_ue->suci)); + message, "No nfInstanceId", udm_ue->suci, NULL)); return false; } @@ -203,7 +204,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No success", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No success", udm_ue->suci)); + message, "No success", udm_ue->suci, NULL)); return false; } @@ -211,7 +212,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No timeStamp", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No timeStamp", udm_ue->suci)); + message, "No timeStamp", udm_ue->suci, NULL)); return false; } @@ -219,7 +220,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No authType", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No authType", udm_ue->suci)); + message, "No authType", udm_ue->suci, NULL)); return false; } @@ -227,7 +228,7 @@ bool udm_nudm_ueau_handle_result_confirmation_inform( ogs_error("[%s] No servingNetworkName", udm_ue->suci); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No servingNetworkName", udm_ue->suci)); + message, "No servingNetworkName", udm_ue->suci, NULL)); return false; } @@ -259,7 +260,8 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No Amf3GppAccessRegistration", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Amf3GppAccessRegistration", udm_ue->supi)); + message, "No Amf3GppAccessRegistration", udm_ue->supi, + NULL)); return false; } @@ -267,7 +269,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No amfInstanceId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No amfInstanceId", udm_ue->supi)); + message, "No amfInstanceId", udm_ue->supi, NULL)); return false; } @@ -275,7 +277,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No dregCallbackUri", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No dregCallbackUri", udm_ue->supi)); + message, "No dregCallbackUri", udm_ue->supi, NULL)); return false; } @@ -284,7 +286,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No Guami", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Guami", udm_ue->supi)); + message, "No Guami", udm_ue->supi, NULL)); return false; } @@ -292,7 +294,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No Guami.AmfId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Guami.AmfId", udm_ue->supi)); + message, "No Guami.AmfId", udm_ue->supi, NULL)); return false; } @@ -300,7 +302,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No PlmnId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId", udm_ue->supi)); + message, "No PlmnId", udm_ue->supi, NULL)); return false; } @@ -308,7 +310,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No PlmnId.Mnc", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId.Mnc", udm_ue->supi)); + message, "No PlmnId.Mnc", udm_ue->supi, NULL)); return false; } @@ -316,7 +318,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No PlmnId.Mcc", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId.Mcc", udm_ue->supi)); + message, "No PlmnId.Mcc", udm_ue->supi, NULL)); return false; } @@ -324,7 +326,7 @@ bool udm_nudm_uecm_handle_amf_registration( ogs_error("[%s] No RatType", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No RatType", udm_ue->supi)); + message, "No RatType", udm_ue->supi, NULL)); return false; } @@ -371,7 +373,8 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No Amf3GppAccessRegistrationModification", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Amf3GppAccessRegistrationModification", udm_ue->supi)); + message, "No Amf3GppAccessRegistrationModification", udm_ue->supi, + NULL)); return false; } @@ -380,7 +383,7 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No Guami", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Guami", udm_ue->supi)); + message, "No Guami", udm_ue->supi, NULL)); return false; } @@ -388,7 +391,7 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No Guami.AmfId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No Guami.AmfId", udm_ue->supi)); + message, "No Guami.AmfId", udm_ue->supi, NULL)); return false; } @@ -396,7 +399,7 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No PlmnId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId", udm_ue->supi)); + message, "No PlmnId", udm_ue->supi, NULL)); return false; } @@ -404,7 +407,7 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No PlmnId.Mnc", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId.Mnc", udm_ue->supi)); + message, "No PlmnId.Mnc", udm_ue->supi, NULL)); return false; } @@ -412,7 +415,7 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_error("[%s] No PlmnId.Mcc", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No PlmnId.Mcc", udm_ue->supi)); + message, "No PlmnId.Mcc", udm_ue->supi, NULL)); return false; } @@ -424,9 +427,25 @@ bool udm_nudm_uecm_handle_amf_registration_update( ogs_sbi_parse_guami(&recv_guami, Guami); if (memcmp(&recv_guami, &udm_ue->guami, sizeof(recv_guami)) != 0) { ogs_error("[%s] Guami mismatch", udm_ue->supi); + /* + * TS29.503 + * 6.2.7.3 Application Errors + * + * Protocol and application errors common to several 5GC SBI API + * specifications for which the NF shall include in the HTTP + * response a payload body ("ProblemDetails" data structure or + * application specific error data structure) with the "cause" + * attribute indicating corresponding error are listed in table + * 5.2.7.2-1. + * Application Error: INVALID_GUAMI + * HTTP status code: 403 Forbidden + * Description: The AMF is not allowed to modify the registration + * information stored in the UDM, as it is not the registered AMF. + */ ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - message, "Guami mismatch", udm_ue->supi)); + message, "Guami mismatch", udm_ue->supi, + "INVALID_GUAMI")); return false; } @@ -480,7 +499,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No SmfRegistration", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No SmfRegistration", udm_ue->supi)); + message, "No SmfRegistration", udm_ue->supi, NULL)); return false; } @@ -488,7 +507,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No smfInstanceId", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No smfInstanceId", udm_ue->supi)); + message, "No smfInstanceId", udm_ue->supi, NULL)); return false; } @@ -496,7 +515,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No pduSessionId", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No pduSessionId", udm_ue->supi)); + message, "No pduSessionId", udm_ue->supi, NULL)); return false; } @@ -504,7 +523,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No singleNssai", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No singleNssai", udm_ue->supi)); + message, "No singleNssai", udm_ue->supi, NULL)); return false; } @@ -512,7 +531,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No dnn", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No dnn", udm_ue->supi)); + message, "No dnn", udm_ue->supi, NULL)); return false; } @@ -521,7 +540,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_error("[%s:%d] No plmnId", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - message, "No plmnId", udm_ue->supi)); + message, "No plmnId", udm_ue->supi, NULL)); return false; } @@ -612,7 +631,7 @@ bool udm_nudm_sdm_handle_subscription_create( ogs_error("[%s] No SDMSubscription", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SDMSubscription", udm_ue->supi)); + recvmsg, "No SDMSubscription", udm_ue->supi, NULL)); return false; } @@ -620,7 +639,7 @@ bool udm_nudm_sdm_handle_subscription_create( ogs_error("[%s] No nfInstanceId", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No nfInstanceId", udm_ue->supi)); + recvmsg, "No nfInstanceId", udm_ue->supi, NULL)); return false; } @@ -628,7 +647,7 @@ bool udm_nudm_sdm_handle_subscription_create( ogs_error("[%s] No callbackReference", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No callbackReference", udm_ue->supi)); + recvmsg, "No callbackReference", udm_ue->supi, NULL)); return false; } @@ -637,7 +656,7 @@ bool udm_nudm_sdm_handle_subscription_create( ogs_error("[%s] No monitoredResourceUris", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No monitoredResourceUris", udm_ue->supi)); + recvmsg, "No monitoredResourceUris", udm_ue->supi, NULL)); return false; } @@ -689,7 +708,7 @@ bool udm_nudm_sdm_handle_subscription_delete( ogs_error("[%s] No subscriptionID", udm_ue->supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No subscriptionID", udm_ue->supi)); + recvmsg, "No subscriptionID", udm_ue->supi, NULL)); return false; } sdm_subscription = udm_sdm_subscription_find_by_id( @@ -703,7 +722,8 @@ bool udm_nudm_sdm_handle_subscription_delete( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Subscription Not found", recvmsg->h.method)); + recvmsg, "Subscription Not found", recvmsg->h.method, + NULL)); return false; } diff --git a/src/udm/nudr-handler.c b/src/udm/nudr-handler.c index e11b9326eb..0bd5a874c8 100644 --- a/src/udm/nudr-handler.c +++ b/src/udm/nudr-handler.c @@ -88,7 +88,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error( - stream, recvmsg->res_status, recvmsg, strerror, NULL)); + stream, recvmsg->res_status, recvmsg, strerror, NULL, + recvmsg->ProblemDetails->cause)); ogs_free(strerror); return false; } @@ -100,7 +101,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, recvmsg, "No AuthenticationSubscription", - udm_ue->suci)); + udm_ue->suci, NULL)); return false; } @@ -112,7 +113,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - recvmsg, "Not supported Auth Method", udm_ue->suci)); + recvmsg, "Not supported Auth Method", udm_ue->suci, + NULL)); return false; } @@ -122,7 +124,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "No encPermanentKey", udm_ue->suci)); + recvmsg, "No encPermanentKey", udm_ue->suci, + NULL)); return false; } if (!AuthenticationSubscription->enc_opc_key) { @@ -130,7 +133,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "No encPermanentKey", udm_ue->suci)); + recvmsg, "No encPermanentKey", udm_ue->suci, NULL)); return false; } if (!AuthenticationSubscription->authentication_management_field) { @@ -139,7 +142,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "No authenticationManagementField", udm_ue->suci)); + recvmsg, "No authenticationManagementField", udm_ue->suci, + NULL)); return false; } if (!AuthenticationSubscription->sequence_number) { @@ -147,7 +151,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "No SequenceNumber", udm_ue->suci)); + recvmsg, "No SequenceNumber", udm_ue->suci, NULL)); return false; } if (!AuthenticationSubscription->sequence_number->sqn) { @@ -155,7 +159,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "No SequenceNumber.sqn", udm_ue->suci)); + recvmsg, "No SequenceNumber.sqn", udm_ue->suci, NULL)); return false; } @@ -189,7 +193,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error( - stream, recvmsg->res_status, recvmsg, strerror, NULL)); + stream, recvmsg->res_status, recvmsg, strerror, NULL, + recvmsg->ProblemDetails->cause)); ogs_free(strerror); return false; } @@ -261,7 +266,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, recvmsg, - "Invalid HTTP method", recvmsg->h.method)); + "Invalid HTTP method", recvmsg->h.method, NULL)); return false; END break; @@ -277,7 +282,8 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_error("%s", strerror); ogs_assert(true == ogs_sbi_server_send_error( - stream, recvmsg->res_status, recvmsg, strerror, NULL)); + stream, recvmsg->res_status, recvmsg, strerror, NULL, + recvmsg->ProblemDetails->cause)); ogs_free(strerror); return false; } @@ -288,7 +294,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthEvent", udm_ue->suci)); + recvmsg, "No AuthEvent", udm_ue->suci, NULL)); return false; } @@ -297,7 +303,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No nfInstanceId", udm_ue->suci)); + recvmsg, "No nfInstanceId", udm_ue->suci, NULL)); return false; } @@ -306,7 +312,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No success", udm_ue->suci)); + recvmsg, "No success", udm_ue->suci, NULL)); return false; } @@ -315,7 +321,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No timeStamp", udm_ue->suci)); + recvmsg, "No timeStamp", udm_ue->suci, NULL)); return false; } @@ -324,7 +330,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No authType", udm_ue->suci)); + recvmsg, "No authType", udm_ue->suci, NULL)); return false; } @@ -333,7 +339,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No servingNetworkName", udm_ue->suci)); + recvmsg, "No servingNetworkName", udm_ue->suci, NULL)); return false; } @@ -376,7 +382,7 @@ bool udm_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; END @@ -408,7 +414,8 @@ bool udm_nudr_dr_handle_subscription_context( udm_ue->supi, recvmsg->res_status); ogs_assert(true == ogs_sbi_server_send_error(stream, recvmsg->res_status, - NULL, "HTTP response error", udm_ue->supi)); + NULL, "HTTP response error", udm_ue->supi, + recvmsg->ProblemDetails->cause)); return false; } @@ -433,7 +440,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; END @@ -452,7 +459,8 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Amf3GppAccessRegistration", udm_ue->supi)); + recvmsg, "No Amf3GppAccessRegistration", udm_ue->supi, + NULL)); return false; } @@ -461,7 +469,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No amfInstanceId", udm_ue->supi)); + recvmsg, "No amfInstanceId", udm_ue->supi, NULL)); return false; } @@ -470,7 +478,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No dregCallbackUri", udm_ue->supi)); + recvmsg, "No dregCallbackUri", udm_ue->supi, NULL)); return false; } @@ -480,7 +488,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Guami", udm_ue->supi)); + recvmsg, "No Guami", udm_ue->supi, NULL)); return false; } @@ -489,7 +497,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Guami.AmfId", udm_ue->supi)); + recvmsg, "No Guami.AmfId", udm_ue->supi, NULL)); return false; } @@ -498,7 +506,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PlmnId", udm_ue->supi)); + recvmsg, "No PlmnId", udm_ue->supi, NULL)); return false; } @@ -507,7 +515,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PlmnId.Mnc", udm_ue->supi)); + recvmsg, "No PlmnId.Mnc", udm_ue->supi, NULL)); return false; } @@ -516,7 +524,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PlmnId.Mcc", udm_ue->supi)); + recvmsg, "No PlmnId.Mcc", udm_ue->supi, NULL)); return false; } @@ -525,7 +533,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No RatType", udm_ue->supi)); + recvmsg, "No RatType", udm_ue->supi, NULL)); return false; } @@ -584,7 +592,7 @@ bool udm_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; END @@ -622,7 +630,7 @@ bool udm_nudr_dr_handle_subscription_provisioned( ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "No AccessAndMobilitySubscriptionData", - udm_ue->supi)); + udm_ue->supi, NULL)); return false; } @@ -651,7 +659,7 @@ bool udm_nudr_dr_handle_subscription_provisioned( ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "No SmfSelectionSubscriptionData", - udm_ue->supi)); + udm_ue->supi, NULL)); return false; } @@ -684,7 +692,7 @@ bool udm_nudr_dr_handle_subscription_provisioned( ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, "No SessionManagementSubscriptionData", - udm_ue->supi)); + udm_ue->supi, NULL)); return false; } @@ -723,7 +731,7 @@ bool udm_nudr_dr_handle_subscription_provisioned( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; END @@ -759,7 +767,8 @@ bool udm_nudr_dr_handle_smf_registration( udm_ue->supi, sess->psi, recvmsg->res_status); ogs_assert(true == ogs_sbi_server_send_error(stream, recvmsg->res_status, - NULL, "HTTP response error", udm_ue->supi)); + NULL, "HTTP response error", udm_ue->supi, + recvmsg->ProblemDetails->cause)); return false; } @@ -776,7 +785,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SmfRegistration", udm_ue->supi)); + recvmsg, "No SmfRegistration", udm_ue->supi, NULL)); return false; } @@ -785,7 +794,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No smfInstanceId", udm_ue->supi)); + recvmsg, "No smfInstanceId", udm_ue->supi, NULL)); return false; } @@ -794,7 +803,8 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No pduSessionId", udm_ue->supi)); + recvmsg, "No pduSessionId", udm_ue->supi, + NULL)); return false; } @@ -804,7 +814,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No singleNssai", udm_ue->supi)); + recvmsg, "No singleNssai", udm_ue->supi, NULL)); return false; } @@ -813,7 +823,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No dnn", udm_ue->supi)); + recvmsg, "No dnn", udm_ue->supi, NULL)); return false; } @@ -824,7 +834,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No plmnId", udm_ue->supi)); + recvmsg, "No plmnId", udm_ue->supi, NULL)); return false; } @@ -882,7 +892,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, recvmsg, - "Invalid HTTP method", recvmsg->h.method)); + "Invalid HTTP method", recvmsg->h.method, NULL)); END break; @@ -895,7 +905,7 @@ bool udm_nudr_dr_handle_smf_registration( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, strerror, NULL)); + recvmsg, strerror, NULL, NULL)); ogs_free(strerror); return false; END diff --git a/src/udm/sbi-path.c b/src/udm/sbi-path.c index 770c2b8e64..022b4064a1 100644 --- a/src/udm/sbi-path.c +++ b/src/udm/sbi-path.c @@ -147,7 +147,7 @@ int udm_ue_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", udm_ue->suci)); + "Cannot discover", udm_ue->suci, NULL)); return r; } @@ -170,7 +170,7 @@ int udm_sess_sbi_discover_and_send( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot discover", NULL)); + "Cannot discover", NULL, NULL)); return r; } diff --git a/src/udm/sess-sm.c b/src/udm/sess-sm.c index a6a4a3e908..a6ddc33ec4 100644 --- a/src/udm/sess-sm.c +++ b/src/udm/sess-sm.c @@ -85,7 +85,8 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, + NULL)); END break; DEFAULT @@ -95,7 +96,7 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -104,7 +105,7 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid API name", message->h.service.name)); + "Invalid API name", message->h.service.name, NULL)); END break; diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index ebf0214c0e..ec0f7f1e43 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -75,7 +75,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -92,7 +92,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -113,7 +113,8 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -124,7 +125,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -136,7 +137,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.method)); + &message, "Not found", message.h.method, NULL)); break; } @@ -145,7 +146,8 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Invalid resource name", message.h.method)); + &message, "Invalid resource name", message.h.method, + NULL)); break; } @@ -169,7 +171,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, NULL, NULL)); + &message, NULL, NULL, NULL)); break; } } @@ -180,7 +182,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - &message, "Not found", message.h.method)); + &message, "Not found", message.h.method, NULL)); break; } @@ -229,7 +231,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -549,7 +551,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); break; default: diff --git a/src/udm/ue-sm.c b/src/udm/ue-sm.c index 2c50f2c473..a312341831 100644 --- a/src/udm/ue-sm.c +++ b/src/udm/ue-sm.c @@ -80,7 +80,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid resource name", message->h.method)); + "Invalid resource name", message->h.method, NULL)); END break; @@ -96,7 +96,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid resource name", message->h.method)); + "Invalid resource name", message->h.method, NULL)); END break; @@ -106,7 +106,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -125,7 +125,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, NULL)); END break; CASE(OGS_SBI_HTTP_METHOD_PATCH) @@ -141,7 +141,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, NULL)); END break; DEFAULT @@ -150,7 +150,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, NULL)); END break; @@ -180,7 +180,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid resource name", message->h.method)); + "Invalid resource name", message->h.method, NULL)); END break; @@ -197,7 +197,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid resource name", message->h.method)); + "Invalid resource name", message->h.method, NULL)); END break; @@ -214,7 +214,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid resource name", message->h.method)); + "Invalid resource name", message->h.method, NULL)); END break; DEFAULT @@ -223,7 +223,8 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, message, - "Invalid HTTP method", message->h.method)); + "Invalid HTTP method", message->h.method, + NULL)); END break; @@ -232,7 +233,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid API name", message->h.service.name)); + "Invalid API name", message->h.service.name, NULL)); END break; @@ -286,7 +287,8 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, - "Invalid API name", message->h.resource.component[0])); + "Invalid API name", message->h.resource.component[0], + NULL)); END break; diff --git a/src/udr/nudr-handler.c b/src/udr/nudr-handler.c index 290ab27fa3..07c78ea4ac 100644 --- a/src/udr/nudr-handler.c +++ b/src/udr/nudr-handler.c @@ -50,7 +50,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_error("No SUPI"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SUPI", NULL)); + recvmsg, "No SUPI", NULL, NULL)); return false; } @@ -59,7 +59,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_error("[%s] Unknown SUPI Type", supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - recvmsg, "Unknwon SUPI Type", supi)); + recvmsg, "Unknwon SUPI Type", supi, NULL)); return false; } @@ -68,7 +68,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_warn("[%s] Cannot find SUPI in DB", supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, - recvmsg, "Cannot find SUPI Type", supi)); + recvmsg, "Cannot find SUPI Type", supi, NULL)); return false; } @@ -128,7 +128,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItemList Array", NULL)); + recvmsg, "No PatchItemList Array", NULL, NULL)); return false; } @@ -146,7 +146,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItemList", NULL)); + recvmsg, "No PatchItemList", NULL, NULL)); return false; } @@ -160,7 +160,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "Cannot update SQN", supi)); + recvmsg, "Cannot update SQN", supi, NULL)); return false; } @@ -170,7 +170,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "Cannot increment SQN", supi)); + recvmsg, "Cannot increment SQN", supi, NULL)); return false; } @@ -187,8 +187,9 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_error("Invalid HTTP method [%s]", recvmsg->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, - recvmsg, "Invalid HTTP method", recvmsg->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, + recvmsg, "Invalid HTTP method", recvmsg->h.method, + NULL)); END break; @@ -205,7 +206,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No AuthEvent", supi)); + recvmsg, "No AuthEvent", supi, NULL)); return false; } @@ -216,7 +217,7 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, - recvmsg, "Cannot increment SQN", supi)); + recvmsg, "Cannot increment SQN", supi, NULL)); return false; } @@ -231,8 +232,9 @@ bool udr_nudr_dr_handle_subscription_authentication( ogs_error("Invalid HTTP method [%s]", recvmsg->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, - recvmsg, "Invalid HTTP method", recvmsg->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, + recvmsg, "Invalid HTTP method", recvmsg->h.method, + NULL)); END break; @@ -241,9 +243,9 @@ bool udr_nudr_dr_handle_subscription_authentication( recvmsg->h.resource.component[3]); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, recvmsg, "Unknown resource name", - recvmsg->h.resource.component[3])); + recvmsg->h.resource.component[3], NULL)); END return false; @@ -265,7 +267,7 @@ bool udr_nudr_dr_handle_subscription_context( ogs_error("No SUPI"); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SUPI", NULL)); + recvmsg, "No SUPI", NULL, NULL)); return false; } @@ -274,7 +276,7 @@ bool udr_nudr_dr_handle_subscription_context( ogs_error("[%s] Unknown SUPI Type", supi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - recvmsg, "Unknwon SUPI Type", supi)); + recvmsg, "Unknwon SUPI Type", supi, NULL)); return false; } @@ -290,7 +292,7 @@ bool udr_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No Amf3GppAccessRegistration", supi)); + recvmsg, "No Amf3GppAccessRegistration", supi, NULL)); return false; } @@ -336,7 +338,7 @@ bool udr_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItemList", supi)); + recvmsg, "No PatchItemList", supi, NULL)); return false; } @@ -355,8 +357,9 @@ bool udr_nudr_dr_handle_subscription_context( ogs_error("Invalid HTTP method [%s]", recvmsg->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, - recvmsg, "Invalid HTTP method", recvmsg->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, + recvmsg, "Invalid HTTP method", recvmsg->h.method, + NULL)); END break; CASE(OGS_SBI_RESOURCE_NAME_SMF_REGISTRATIONS) @@ -370,7 +373,7 @@ bool udr_nudr_dr_handle_subscription_context( ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No SmfRegistration", supi)); + recvmsg, "No SmfRegistration", supi, NULL)); return false; } @@ -397,8 +400,9 @@ bool udr_nudr_dr_handle_subscription_context( ogs_error("Invalid HTTP method [%s]", recvmsg->h.method); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, - recvmsg, "Invalid HTTP method", recvmsg->h.method)); + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, + recvmsg, "Invalid HTTP method", recvmsg->h.method, + NULL)); END break; @@ -407,9 +411,9 @@ bool udr_nudr_dr_handle_subscription_context( recvmsg->h.resource.component[3]); ogs_assert(true == ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED, + OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED, recvmsg, "Unknown resource name", - recvmsg->h.resource.component[3])); + recvmsg->h.resource.component[3], NULL)); END return false; @@ -1029,7 +1033,7 @@ bool udr_nudr_dr_handle_subscription_provisioned( DEFAULT strerror = ogs_msprintf("Invalid resource name [%s]", recvmsg->h.resource.component[3]); - status = OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED; + status = OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED; goto cleanup; END @@ -1042,7 +1046,8 @@ bool udr_nudr_dr_handle_subscription_provisioned( ogs_assert(status); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, + NULL)); ogs_free(strerror); ogs_subscription_data_free(&subscription_data); @@ -1263,7 +1268,7 @@ bool udr_nudr_dr_handle_policy_data( DEFAULT strerror = ogs_msprintf("Invalid resource name [%s]", recvmsg->h.resource.component[3]); - status = OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED; + status = OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED; goto cleanup; END @@ -1272,7 +1277,7 @@ bool udr_nudr_dr_handle_policy_data( DEFAULT strerror = ogs_msprintf("Invalid HTTP method [%s]", recvmsg->h.method); - status = OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED; + status = OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED; goto cleanup; END @@ -1281,7 +1286,7 @@ bool udr_nudr_dr_handle_policy_data( DEFAULT strerror = ogs_msprintf("Invalid resource name [%s]", recvmsg->h.resource.component[1]); - status = OGS_SBI_HTTP_STATUS_MEHTOD_NOT_ALLOWED; + status = OGS_SBI_HTTP_STATUS_METHOD_NOT_ALLOWED; goto cleanup; END @@ -1294,7 +1299,8 @@ bool udr_nudr_dr_handle_policy_data( ogs_assert(status); ogs_error("%s", strerror); ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL)); + ogs_sbi_server_send_error(stream, status, recvmsg, strerror, + NULL, NULL)); ogs_free(strerror); ogs_subscription_data_free(&subscription_data); diff --git a/src/udr/udr-sm.c b/src/udr/udr-sm.c index a41c5600c3..3d8c888d67 100644 --- a/src/udr/udr-sm.c +++ b/src/udr/udr-sm.c @@ -72,7 +72,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP message", NULL)); + NULL, "cannot parse HTTP message", NULL, NULL)); break; } @@ -81,7 +81,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -102,7 +102,8 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, - &message, "Invalid HTTP method", message.h.method)); + &message, "Invalid HTTP method", message.h.method, + NULL)); END break; @@ -113,7 +114,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -145,7 +146,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, "Invalid HTTP method", - message.h.method)); + message.h.method, NULL)); END break; DEFAULT @@ -155,7 +156,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[2])); + message.h.resource.component[2], NULL)); END END break; @@ -171,7 +172,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Unknown resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -180,7 +181,8 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.resource.component[0])); + "Invalid API name", message.h.resource.component[0], + NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ diff --git a/tests/af/af-sm.c b/tests/af/af-sm.c index 0c9bfadbaa..ba19eb63ee 100644 --- a/tests/af/af-sm.c +++ b/tests/af/af-sm.c @@ -77,7 +77,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - NULL, "cannot parse HTTP sbi_message", NULL)); + NULL, "cannot parse HTTP sbi_message", NULL, NULL)); break; } @@ -86,7 +86,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, "Not supported version", NULL)); + &message, "Not supported version", NULL, NULL)); ogs_sbi_message_free(&message); break; } @@ -106,7 +106,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, - "Invalid HTTP method", message.h.method)); + "Invalid HTTP method", message.h.method, NULL)); END break; @@ -117,7 +117,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -133,7 +133,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, &message, "Not found", - message.h.resource.component[1])); + message.h.resource.component[1], NULL)); break; } @@ -146,7 +146,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, &message, "Not found", - message.h.resource.component[1])); + message.h.resource.component[1], NULL)); break; } @@ -163,7 +163,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[2])); + message.h.resource.component[2], NULL)); END break; DEFAULT @@ -173,7 +173,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, "Invalid resource name", - message.h.resource.component[0])); + message.h.resource.component[0], NULL)); END break; @@ -182,7 +182,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, - "Invalid API name", message.h.service.name)); + "Invalid API name", message.h.service.name, NULL)); END /* In lib/sbi/server.c, notify_completed() releases 'request' buffer. */ @@ -497,7 +497,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, - "Cannot receive SBI message", NULL)); + "Cannot receive SBI message", NULL, NULL)); } break; From 990bfe96a863691fe1ca049699e29f2775bd91e7 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Thu, 4 Apr 2024 17:38:26 +0200 Subject: [PATCH 068/323] [SMF] Gy: Check Multiple-Services-Credit-Control Result-Code in CCA-I This is the continuation of commit 12158eebb8ab0c6ea7b52291bce6cc4d3d38186c, which only checked the code in CCA[Update], but not in CCA[Initial]. The handling in CCA[Initial] is a bit more complex since depending on the outcome, we may end up with a Result-Code != SUCCESS in MSCC but the session may still be created at the OCS because the message Result-Code = SUCCESS. In that scenario, we want to abort setting up the PDN session but we still need to make sure we terminate the Gy session that was just created. --- src/smf/gsm-sm.c | 15 ++++++++++++--- src/smf/gy-handler.c | 27 ++++++++++++++++++++++----- src/smf/gy-handler.h | 3 ++- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 32da155f27..7ec051e6f4 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -337,6 +337,7 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) ogs_diam_gy_message_t *gy_message = NULL; ogs_diam_gx_message_t *gx_message = NULL; uint32_t diam_err; + bool need_gy_terminate = false; ogs_assert(s); ogs_assert(e); @@ -392,7 +393,7 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST: ogs_assert(e->gtp_xact); diam_err = smf_gy_handle_cca_initial_request(sess, - gy_message, e->gtp_xact); + gy_message, e->gtp_xact, &need_gy_terminate); sess->sm_data.gy_ccr_init_in_flight = false; sess->sm_data.gy_cca_init_err = diam_err; goto test_can_proceed; @@ -422,8 +423,16 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) smf_epc_pfcp_send_session_establishment_request( sess, e->gtp_xact, 0)); } else { - /* FIXME: tear down Gx/Gy session - * if its sm_data.*init_err == ER_DIAMETER_SUCCESS */ + /* Tear down Gx/Gy session if its sm_data.*init_err == ER_DIAMETER_SUCCESS */ + if (sess->sm_data.gx_cca_init_err == ER_DIAMETER_SUCCESS) { + sess->sm_data.gx_ccr_term_in_flight = true; + smf_gx_send_ccr(sess, e->gtp_xact, OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); + } + if (smf_use_gy_iface() == 1 && + (sess->sm_data.gy_cca_init_err == ER_DIAMETER_SUCCESS || need_gy_terminate)) { + sess->sm_data.gy_ccr_term_in_flight = true; + smf_gy_send_ccr(sess, e->gtp_xact, OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); + } uint8_t gtp_cause = gtp_cause_from_diameter( e->gtp_xact->gtp_version, diam_err, NULL); send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 78dfa2e019..63b780a500 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -113,24 +113,41 @@ static void urr_update_time(smf_sess_t *sess, ogs_pfcp_urr_t *urr, ogs_diam_gy_m } } -/* Returns ER_DIAMETER_SUCCESS on success, Diameter error code on failue. */ +/* Returns ER_DIAMETER_SUCCESS on success, Diameter error code on failue. + * Upon failure, CCR-Terminate is needed based on "need_termination" value (this + * may happen eg. if messaged RC is successful but MSCC RC is rejected). */ uint32_t smf_gy_handle_cca_initial_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, - ogs_gtp_xact_t *gtp_xact) + ogs_gtp_xact_t *gtp_xact, + bool *need_termination) { smf_bearer_t *bearer; ogs_assert(sess); ogs_assert(gy_message); ogs_assert(gtp_xact); + ogs_assert(need_termination); ogs_debug("[Gy CCA Initial]"); ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]", sess->sgw_s5c_teid, sess->smf_n4_teid); - if (gy_message->result_code != ER_DIAMETER_SUCCESS) + *need_termination = false; + if (gy_message->result_code != ER_DIAMETER_SUCCESS) { + ogs_warn("Gy CCA Initial Diameter failure: res=%u", + gy_message->result_code); return gy_message->err ? *gy_message->err : ER_DIAMETER_AUTHENTICATION_REJECTED; + } + if (gy_message->cca.result_code != ER_DIAMETER_SUCCESS) { + ogs_warn("Gy CCA Initial Diameter Multiple-Services-Credit-Control Result-Code=%u", + gy_message->cca.result_code); + /* Message RC was successful but MSCC was rejected. The session needs to + * be tear down through CCR-T: */ + *need_termination = true; + return gy_message->cca.err ? *gy_message->cca.err : + ER_DIAMETER_AUTHENTICATION_REJECTED; + } bearer = smf_default_bearer_in_sess(sess); ogs_assert(bearer); @@ -173,8 +190,8 @@ uint32_t smf_gy_handle_cca_update_request( sess->sgw_s5c_teid, sess->smf_n4_teid); if (gy_message->result_code != ER_DIAMETER_SUCCESS) { - ogs_warn("Gy CCA Update Diameter failure: res=%u err=%u", - gy_message->result_code, *gy_message->err); + ogs_warn("Gy CCA Update Diameter failure: Result-Code=%u", + gy_message->result_code); return gy_message->err ? *gy_message->err : ER_DIAMETER_AUTHENTICATION_REJECTED; } diff --git a/src/smf/gy-handler.h b/src/smf/gy-handler.h index 019d9b29d9..ad8a089c0a 100644 --- a/src/smf/gy-handler.h +++ b/src/smf/gy-handler.h @@ -29,7 +29,8 @@ extern "C" { uint32_t smf_gy_handle_cca_initial_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, - ogs_gtp_xact_t *gtp_xact); + ogs_gtp_xact_t *gtp_xact, + bool *need_termination); uint32_t smf_gy_handle_cca_update_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_pfcp_xact_t *pfcp_xact); From 8484a5af6033f46cfee73de580e8ef3828130158 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 6 Apr 2024 16:34:03 +0900 Subject: [PATCH 069/323] [GTP] Incorrect destination TEID=0 (#3043) If eg. PCRF or AAA diameter link is not yet ready (eg. PCRF crashed), and a client sends a CreateSessionRequest announcing its ow F-TEID, then open5gs-smfd answers with Create Session Response Cause= "Remote peer not responding", but it is not setting the received F-TEID in the header of the response, instead it sends with TEI=0. As a result, the peer cannot match the CreateSessionResponse, and needs to rely on its own timeout timer to figure out that specific request failed. To address this issue, I modified the GTP Response message to check the Sender F-TEID and send it accordingly, setting the destination TEID to the value of the Sender F-TEID. I've made this modification only for SMF, but MME and SGW-C have not done so; if you need to, you can work from the examples in SMF. Similarly, the same situation can happen with PFCP. If anyone needs to do this in the future, I think you can work on it this way. --- docs/_docs/guide/01-quickstart.md | 2 +- lib/gtp/util.c | 65 +++++++++++++++++++++++++++++++ lib/gtp/util.h | 8 ++++ src/smf/s5c-handler.c | 21 +++++++--- src/smf/s5c-handler.h | 6 ++- src/smf/smf-sm.c | 37 ++++++++++++++++-- 6 files changed, 127 insertions(+), 12 deletions(-) diff --git a/docs/_docs/guide/01-quickstart.md b/docs/_docs/guide/01-quickstart.md index e745dab398..fa11e1eb96 100644 --- a/docs/_docs/guide/01-quickstart.md +++ b/docs/_docs/guide/01-quickstart.md @@ -233,7 +233,7 @@ MME-frDi = 127.0.0.2 :3868 for S6a SGWC-gtpc = 127.0.0.3 :2123 for S11 SGWC-pfcp = 127.0.0.3 :8805 for Sxa -SMF-gtpc = 127.0.0.4 :2123 for S5c, N11 +SMF-gtpc = 127.0.0.4 :2123 for S5c SMF-gtpu = 127.0.0.4 :2152 for N4u (Sxu) SMF-pfcp = 127.0.0.4 :8805 for N4 (Sxb) SMF-frDi = 127.0.0.4 :3868 for Gx auth diff --git a/lib/gtp/util.c b/lib/gtp/util.c index 1e59239d2a..f0defe73c1 100644 --- a/lib/gtp/util.c +++ b/lib/gtp/util.c @@ -180,3 +180,68 @@ uint16_t ogs_in_cksum(uint16_t *addr, int len) return answer; } + +void ogs_gtp2_sender_f_teid( + ogs_gtp2_sender_f_teid_t *sender_f_teid, ogs_gtp2_message_t *message) +{ + ogs_gtp2_tlv_f_teid_t *tlv_f_teid = NULL; + ogs_gtp2_f_teid_t *f_teid = NULL; + + ogs_assert(sender_f_teid); + ogs_assert(message); + + memset(sender_f_teid, 0, sizeof(*sender_f_teid)); + + switch (message->h.type) { + case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: + tlv_f_teid = &message->create_session_request. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE: + tlv_f_teid = &message->create_session_response. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE: + tlv_f_teid = &message->modify_bearer_request. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: + tlv_f_teid = &message->delete_session_request. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_MODIFY_BEARER_COMMAND_TYPE: + tlv_f_teid = &message->modify_bearer_command. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_DELETE_BEARER_COMMAND_TYPE: + tlv_f_teid = &message->delete_bearer_command. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: + tlv_f_teid = &message->bearer_resource_command. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: + tlv_f_teid = &message->create_indirect_data_forwarding_tunnel_request. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE: + tlv_f_teid = &message->create_indirect_data_forwarding_tunnel_response. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE: + tlv_f_teid = &message->downlink_data_notification. + sender_f_teid_for_control_plane; + break; + case OGS_GTP2_MODIFY_ACCESS_BEARERS_REQUEST_TYPE: + tlv_f_teid = &message->modify_access_bearers_request. + sender_f_teid_for_control_plane; + default: + break; + } + + if (tlv_f_teid && tlv_f_teid->presence && (f_teid = tlv_f_teid->data)) { + sender_f_teid->teid_presence = true; + sender_f_teid->teid = be32toh(f_teid->teid); + } +} diff --git a/lib/gtp/util.h b/lib/gtp/util.h index 7fabdd7c68..69339f0e88 100644 --- a/lib/gtp/util.h +++ b/lib/gtp/util.h @@ -32,6 +32,14 @@ int ogs_gtpu_parse_header( ogs_gtp2_header_desc_t *header_desc, ogs_pkbuf_t *pkbuf); uint16_t ogs_in_cksum(uint16_t *addr, int len); +typedef struct ogs_gtp2_sender_f_teid_s { + bool teid_presence; + uint32_t teid; +} ogs_gtp2_sender_f_teid_t; + +void ogs_gtp2_sender_f_teid( + ogs_gtp2_sender_f_teid_t *sender_f_teid, ogs_gtp2_message_t *message); + #ifdef __cplusplus } #endif diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index da65704e70..46c4fb0ba7 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -281,7 +281,8 @@ uint8_t smf_s5c_handle_create_session_request( /* Control Plane(DL) : SGW-S5C */ sgw_s5c_teid = req->sender_f_teid_for_control_plane.data; ogs_assert(sgw_s5c_teid); - sess->sgw_s5c_teid = be32toh(sgw_s5c_teid->teid); + /* sess->sgw_s5c_teid has already been updated in SMF-SM */ + ogs_assert(sess->sgw_s5c_teid == be32toh(sgw_s5c_teid->teid)); rv = ogs_gtp2_f_teid_to_ip(sgw_s5c_teid, &sess->sgw_s5c_ip); ogs_assert(rv == OGS_OK); @@ -479,7 +480,8 @@ uint8_t smf_s5c_handle_delete_session_request( void smf_s5c_handle_modify_bearer_request( smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact, - ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req) + ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req, + ogs_gtp2_sender_f_teid_t *sender_f_teid) { int rv, i; uint8_t cause_value = 0; @@ -492,6 +494,7 @@ void smf_s5c_handle_modify_bearer_request( ogs_assert(gtp_xact); ogs_assert(req); + ogs_assert(sender_f_teid); /************************ * Check Session Context @@ -504,7 +507,10 @@ void smf_s5c_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(gtp_xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(gtp_xact, + sess ? sess->sgw_s5c_teid : + sender_f_teid->teid_presence == true ? + sender_f_teid->teid : 0, OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1132,7 +1138,8 @@ static int reconfigure_packet_filter(smf_pf_t *pf, ogs_gtp2_tft_t *tft, int i) void smf_s5c_handle_bearer_resource_command( smf_sess_t *sess, ogs_gtp_xact_t *xact, - ogs_gtp2_bearer_resource_command_t *cmd) + ogs_gtp2_bearer_resource_command_t *cmd, + ogs_gtp2_sender_f_teid_t *sender_f_teid) { int rv; uint8_t cause_value = 0; @@ -1153,6 +1160,7 @@ void smf_s5c_handle_bearer_resource_command( ogs_assert(xact); ogs_assert(cmd); + ogs_assert(sender_f_teid); ogs_debug("Bearer Resource Command"); @@ -1186,7 +1194,10 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message(xact, + sess ? sess->sgw_s5c_teid : + sender_f_teid->teid_presence == true ? + sender_f_teid->teid : 0, OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } diff --git a/src/smf/s5c-handler.h b/src/smf/s5c-handler.h index 0312c5077f..a8addb5766 100644 --- a/src/smf/s5c-handler.h +++ b/src/smf/s5c-handler.h @@ -39,7 +39,8 @@ uint8_t smf_s5c_handle_delete_session_request( ogs_gtp2_delete_session_request_t *req); void smf_s5c_handle_modify_bearer_request( smf_sess_t *sess, ogs_gtp_xact_t *xact, - ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req); + ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req, + ogs_gtp2_sender_f_teid_t *sender_f_teid); void smf_s5c_handle_create_bearer_response( smf_sess_t *sess, ogs_gtp_xact_t *xact, ogs_gtp2_create_bearer_response_t *rsp); @@ -51,7 +52,8 @@ bool smf_s5c_handle_delete_bearer_response( ogs_gtp2_delete_bearer_response_t *rsp); void smf_s5c_handle_bearer_resource_command( smf_sess_t *sess, ogs_gtp_xact_t *xact, - ogs_gtp2_bearer_resource_command_t *cmd); + ogs_gtp2_bearer_resource_command_t *cmd, + ogs_gtp2_sender_f_teid_t *sender_f_teid); #ifdef __cplusplus } diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 1ba9e4319c..40715ea970 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -58,6 +58,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_gtp_xact_t *gtp_xact = NULL; ogs_gtp2_message_t gtp2_message; + ogs_gtp2_sender_f_teid_t gtp2_sender_f_teid; ogs_gtp1_message_t gtp1_message; ogs_diam_gx_message_t *gx_message = NULL; @@ -108,6 +109,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) } e->gtp2_message = &gtp2_message; + ogs_gtp2_sender_f_teid(&gtp2_sender_f_teid, &gtp2_message); + rv = ogs_gtp_xact_receive(smf_gnode->gnode, &gtp2_message.h, &gtp_xact); if (rv != OGS_OK) { ogs_pkbuf_free(recvbuf); @@ -144,11 +147,21 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) } if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + gtp2_sender_f_teid.teid_presence == true ? + gtp2_sender_f_teid.teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; } + + if (gtp2_sender_f_teid.teid_presence == true) + sess->sgw_s5c_teid = gtp2_sender_f_teid.teid; + + ogs_debug(" SGW_S5C_TEID[0x%x], Sender F-TEID(%d)[0x%x]", + sess->sgw_s5c_teid, + gtp2_sender_f_teid.teid_presence, gtp2_sender_f_teid.teid); + e->sess = sess; ogs_fsm_dispatch(&sess->sm, e); break; @@ -158,18 +171,33 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) smf_metrics_inst_gtp_node_inc(smf_gnode->metrics, SMF_METR_GTP_NODE_CTR_S5C_RX_DELETESESSIONREQ); if (!sess) { ogs_error("No Session"); - ogs_gtp2_send_error_message(gtp_xact, 0, + ogs_gtp2_send_error_message(gtp_xact, + gtp2_sender_f_teid.teid_presence == true ? + gtp2_sender_f_teid.teid : 0, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); break; } + if (gtp2_sender_f_teid.teid_presence == true) { + if (sess->sgw_s5c_teid != gtp2_sender_f_teid.teid) { + ogs_error("Invalid Sender F-TEID [0x%x != 0x%x]", + sess->sgw_s5c_teid, gtp2_sender_f_teid.teid); + ogs_gtp2_send_error_message(gtp_xact, + gtp2_sender_f_teid.teid_presence == true ? + gtp2_sender_f_teid.teid : 0, + OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, + OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); + break; + } + } e->sess = sess; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); smf_s5c_handle_modify_bearer_request( - sess, gtp_xact, recvbuf, &gtp2_message.modify_bearer_request); + sess, gtp_xact, recvbuf, + &gtp2_message.modify_bearer_request, &gtp2_sender_f_teid); break; case OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); @@ -194,7 +222,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); smf_s5c_handle_bearer_resource_command( - sess, gtp_xact, &gtp2_message.bearer_resource_command); + sess, gtp_xact, + &gtp2_message.bearer_resource_command, &gtp2_sender_f_teid); break; default: ogs_warn("Not implemented(type:%d)", gtp2_message.h.type); From e078b33f0c4d6f34d8991f8ad211dd2d9ea977a0 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 5 Apr 2024 14:07:21 +0200 Subject: [PATCH 070/323] [SMF] Fix Volume/Time Threshold conversion Gy->PFCP AS shown in 3GPP TS 29.244 C.2.1.1 diagram, the meaning of Threshold value is different in Diameter Gy and in PFCP interfaces. In Diameter Gy the value sets the trigger for the "remaining credit", while in PFCP the value sets the trigger for the "used credit". ThresholdPFCP = Quota - ThresholdGy --- src/smf/gy-handler.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 63b780a500..14ef79d867 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -47,12 +47,14 @@ static void urr_update_volume(smf_sess_t *sess, ogs_pfcp_urr_t *urr, ogs_diam_gy urr->vol_quota.total_volume = 0; } - /* Volume Threshold */ - if (gy_message->cca.volume_threshold) { + /* Volume Threshold, requires Volume Quota for calculations */ + if (gy_message->cca.volume_threshold && + gy_message->cca.granted.cc_total_octets >= gy_message->cca.volume_threshold) { ogs_debug("Adding Volume Threshold total_octets=%" PRIu32, gy_message->cca.volume_threshold); urr->rep_triggers.volume_threshold = 1; urr->vol_threshold.tovol = 1; - urr->vol_threshold.total_volume = gy_message->cca.volume_threshold; + urr->vol_threshold.total_volume = (gy_message->cca.granted.cc_total_octets - + gy_message->cca.volume_threshold); } else { urr->rep_triggers.volume_threshold = 0; urr->vol_threshold.tovol = 0; @@ -94,6 +96,7 @@ static void urr_update_time(smf_sess_t *sess, ogs_pfcp_urr_t *urr, ogs_diam_gy_m urr->meas_method &= ~OGS_PFCP_MEASUREMENT_METHOD_DURATION; } + /* Time Quota */ if (time_quota) { ogs_debug("Adding Time Quota secs=%" PRIu32, time_quota); urr->rep_triggers.time_quota = 1; @@ -103,10 +106,12 @@ static void urr_update_time(smf_sess_t *sess, ogs_pfcp_urr_t *urr, ogs_diam_gy_m urr->time_quota = 0; } - if (gy_message->cca.time_threshold) { + /* Time Threshold, requires Time Quota for calculations */ + if (gy_message->cca.time_threshold && + time_quota >= gy_message->cca.time_threshold) { ogs_debug("Adding Time Threshold secs=%" PRIu32, gy_message->cca.time_threshold); urr->rep_triggers.time_threshold = 1; - urr->time_threshold = gy_message->cca.time_threshold; + urr->time_threshold = (time_quota - gy_message->cca.time_threshold); } else { urr->rep_triggers.time_threshold = 0; urr->time_threshold = 0; From bbdfca29bf90660579cfac873a69374d76da00e0 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 7 Apr 2024 22:47:36 +0900 Subject: [PATCH 071/323] [SGWC] Fixed crashing when Create Bearer Response occurs after Delete Bearer Response (#3109) If a Create Bearer Response occurs after a Delete Bearer Response, SGW-C crashes. The execution is stopped by the following ASSERT because it tries to access the UL Tunnel deleted by the Delete Bearer Response. ``` 03/28 17:28:41.229: [gtp] DEBUG: [7] LOCAL Find GTPv2 peer [172.22.0.9]:2123 (../lib/gtp/xact.c:949) 03/28 17:28:41.229: [gtp] DEBUG: [7] LOCAL Receive peer [172.22.0.9]:2123 (../lib/gtp/xact.c:966) 03/28 17:28:41.229: [gtp] DEBUG: [7] LOCAL UPD RX-96 peer [172.22.0.9]:2123 (../lib/gtp/xact.c:448) 03/28 17:28:41.229: [sgwc] DEBUG: Create Bearer Response (../src/sgwc/s11-handler.c:707) 03/28 17:28:41.229: [gtp] DEBUG: [7] LOCAL Commit peer [172.22.0.9]:2123 (../lib/gtp/xact.c:629) 03/28 17:28:41.230: [gtp] DEBUG: [7] LOCAL Delete peer [172.22.0.9]:2123 (../lib/gtp/xact.c:1149) 03/28 17:28:41.230: [sgwc] FATAL: sgwc_s11_handle_create_bearer_response: Assertion `ul_tunnel' failed. (../src/sgwc/s11-handler.c:802) 03/28 17:28:41.231: [core] FATAL: backtrace() returned 8 addresses (../lib/core/ogs-abort.c:37) ./open5gs-sgwcd(+0x189b7) [0x5b3c92cf09b7] ./open5gs-sgwcd(+0x13c6d) [0x5b3c92cebc6d] /open5gs/install/lib/x86_64-linux-gnu/libogscore.so.2(ogs_fsm_dispatch+0x113) [0x70600ed63402] ./open5gs-sgwcd(+0x629d) [0x5b3c92cde29d] /open5gs/install/lib/x86_64-linux-gnu/libogscore.so.2(+0x11754) [0x70600ed54754] /lib/x86_64-linux-gnu/libpthread.so.0(+0x8609) [0x70600ecfc609] /lib/x86_64-linux-gnu/libc.so.6(clone+0x43) [0x70600ec21353] ``` To solve this problem, I have modified to handle the exception appropriately, display the error situation in the Cause of the Create Bearer Response, and proceed with the execution. --- src/sgwc/s11-handler.c | 18 ++- src/sgwu/sxa-handler.c | 4 +- src/smf/s5c-handler.c | 30 ++-- tests/volte/rx-test.c | 326 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 362 insertions(+), 16 deletions(-) diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index f6fe9c319c..8edec28400 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -799,9 +799,23 @@ void sgwc_s11_handle_create_bearer_response( /* Find the Tunnel by SGW-S1U-TEID */ ul_tunnel = sgwc_tunnel_find_by_teid(sgwc_ue, be32toh(sgw_s1u_teid->teid)); - ogs_assert(ul_tunnel); + if (!ul_tunnel) { + ogs_error("No UL-tunnel [EBI:%d, TEID:0x%x]", + bearer->ebi, be32toh(sgw_s1u_teid->teid)); + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, + OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND); + return; + } dl_tunnel = sgwc_dl_tunnel_in_bearer(bearer); - ogs_assert(dl_tunnel); + if (!dl_tunnel) { + ogs_error("No DL-tunnel [EBI:%d, TEID:0x%x]", + bearer->ebi, be32toh(sgw_s1u_teid->teid)); + ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, + OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, + OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND); + return; + } /* Set EBI */ bearer->ebi = rsp->bearer_contexts.eps_bearer_id.u8; diff --git a/src/sgwu/sxa-handler.c b/src/sgwu/sxa-handler.c index ec25214e3f..cf33e305c9 100644 --- a/src/sgwu/sxa-handler.c +++ b/src/sgwu/sxa-handler.c @@ -142,7 +142,7 @@ void sgwu_sxa_handle_session_establishment_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->sgwc_sxa_f_seid.seid : 0, OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE, cause_value, offending_ie_value); } @@ -309,7 +309,7 @@ void sgwu_sxa_handle_session_modification_request( cleanup: ogs_pfcp_sess_clear(&sess->pfcp); - ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0, + ogs_pfcp_send_error_message(xact, sess ? sess->sgwc_sxa_f_seid.seid : 0, OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE, cause_value, offending_ie_value); } diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 46c4fb0ba7..65db0c587c 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -50,6 +50,14 @@ static void pfcp_sess_timeout(ogs_pfcp_xact_t *xact, void *data) } } +static ogs_inline uint32_t get_sender_f_teid( + smf_sess_t *sess, ogs_gtp2_sender_f_teid_t *sender_f_teid) +{ + return sess ? sess->sgw_s5c_teid : + sender_f_teid && sender_f_teid->teid_presence == true ? + sender_f_teid->teid : 0; +} + void smf_s5c_handle_echo_request( ogs_gtp_xact_t *xact, ogs_gtp2_echo_request_t *req) { @@ -507,10 +515,8 @@ void smf_s5c_handle_modify_bearer_request( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(gtp_xact, - sess ? sess->sgw_s5c_teid : - sender_f_teid->teid_presence == true ? - sender_f_teid->teid : 0, + ogs_gtp2_send_error_message( + gtp_xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value); return; } @@ -1194,10 +1200,8 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, - sess ? sess->sgw_s5c_teid : - sender_f_teid->teid_presence == true ? - sender_f_teid->teid : 0, + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1222,7 +1226,8 @@ void smf_s5c_handle_bearer_resource_command( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value); return; } @@ -1252,7 +1257,7 @@ void smf_s5c_handle_bearer_resource_command( if (pf) { if (reconfigure_packet_filter(pf, &tft, i) < 0) { ogs_gtp2_send_error_message( - xact, sess ? sess->sgw_s5c_teid : 0, + xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1321,7 +1326,7 @@ void smf_s5c_handle_bearer_resource_command( if (reconfigure_packet_filter(pf, &tft, i) < 0) { ogs_gtp2_send_error_message( - xact, sess ? sess->sgw_s5c_teid : 0, + xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER); return; @@ -1407,7 +1412,8 @@ void smf_s5c_handle_bearer_resource_command( if (tft_update == 0 && tft_delete == 0 && qos_update == 0) { /* No modification */ - ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0, + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, OGS_GTP2_CAUSE_SERVICE_NOT_SUPPORTED); return; diff --git a/tests/volte/rx-test.c b/tests/volte/rx-test.c index 2bfe1a1386..62df3558aa 100644 --- a/tests/volte/rx-test.c +++ b/tests/volte/rx-test.c @@ -3068,6 +3068,329 @@ static void test7_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +#if 0 +static void test_issues3109_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + uint8_t *rx_sid = NULL; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "1032548691"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_ims(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.pco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send PDN Connectivity Request */ + sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + sess->pti = 5; + + sess->pdn_connectivity_param.apn = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, true); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive E-RABSetupRequest + + * Activate default EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate default EPS bearer context accept */ + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, true); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send AA-Request */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 1, 1); + + /* Receive E-RABSetupRequest + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 7); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Session-Termination-Request */ + test_rx_send_str(rx_sid); + + ogs_msleep(100); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Detach Request */ + emmbuf = testemm_build_detach_request(test_ue, 1, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UEContextReleaseCommand */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} +#endif + abts_suite *test_rx(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -3079,6 +3402,9 @@ abts_suite *test_rx(abts_suite *suite) abts_run_test(suite, test5_func, NULL); abts_run_test(suite, test6_func, NULL); abts_run_test(suite, test7_func, NULL); +#if 0 /* disable this issues3109 test because of a lot of ERROR messages. */ + abts_run_test(suite, test_issues3109_func, NULL); +#endif return suite; } From b30604b28982f6cca766a9be3c4ca30e301e0739 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Thu, 4 Apr 2024 16:05:40 +0200 Subject: [PATCH 072/323] [SMF] Initial implementation of Final-Unit-Indication Only "Terminate" action is implemented so far, and it will be used regardless of the action provided by the OCS. --- lib/diameter/gy/message.h | 11 ++++++++++ src/smf/context.h | 3 +++ src/smf/gsm-sm.c | 9 ++++++++ src/smf/gy-handler.c | 2 ++ src/smf/gy-path.c | 46 +++++++++++++++++++++++++++++++++++++++ src/smf/n4-handler.c | 28 ++++++++++++++++-------- src/smf/n4-handler.h | 2 +- src/smf/pfcp-sm.c | 10 +++++++-- 8 files changed, 99 insertions(+), 12 deletions(-) diff --git a/lib/diameter/gy/message.h b/lib/diameter/gy/message.h index 2356738f3c..5880ca59c6 100644 --- a/lib/diameter/gy/message.h +++ b/lib/diameter/gy/message.h @@ -40,8 +40,10 @@ extern "C" { #define OGS_DIAM_GY_AVP_CODE_CC_REQUEST_TYPE (416) #define OGS_DIAM_GY_AVP_CODE_CC_TIME (420) #define OGS_DIAM_GY_AVP_CODE_CC_TOTAL_OCTETS (421) +#define OGS_DIAM_GY_AVP_CODE_FINAL_UNIT_INDICATION (430) #define OGS_DIAM_GY_AVP_CODE_GRANTED_SERVICE_UNIT (431) #define OGS_DIAM_GY_AVP_CODE_VALIDITY_TIME (448) +#define OGS_DIAM_GY_AVP_CODE_FINAL_UNIT_ACTION (449) #define OGS_DIAM_GY_AVP_CODE_MULTIPLE_SERVICES_CREDIT_CONTROL (456) #define OGS_DIAM_GY_AVP_CODE_SUPPORTED_FEATURES (628) #define OGS_DIAM_GY_AVP_CODE_TIME_QUOTA_THRESHOLD (868) @@ -155,6 +157,14 @@ typedef struct ogs_diam_gy_service_unit_s { uint64_t cc_output_octets; } ogs_diam_gy_service_unit_t; +typedef struct gs_diam_gy_final_unit_s { + bool cc_final_action_present; +#define OGS_DIAM_GY_FINAL_UNIT_ACTION_TERMINATE 0 +#define OGS_DIAM_GY_FINAL_UNIT_ACTION_REDIRECT 1 +#define OGS_DIAM_GY_FINAL_UNIT_ACTION_REDIRECT_ACCESS 2 + int32_t cc_final_action; +} ogs_diam_gy_final_unit_t; + typedef struct ogs_diam_gy_message_s { #define OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL 272 #define OGS_DIAM_GY_CMD_RE_AUTH 258 @@ -187,6 +197,7 @@ typedef struct ogs_diam_gy_message_s { uint32_t time_threshold; uint32_t volume_threshold; ogs_diam_gy_service_unit_t granted; + ogs_diam_gy_final_unit_t final; uint32_t result_code; uint32_t *err; } cca; diff --git a/src/smf/context.h b/src/smf/context.h index 06b9535fd0..62d0ee559f 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -357,6 +357,9 @@ typedef struct smf_sess_s { uint64_t dl_octets; ogs_time_t duration; uint32_t reporting_reason; /* OGS_DIAM_GY_REPORTING_REASON_* */ + /* Whether Gy Final-Unit-Indication was received. + * Triggers session release upon Rx of next PFCP Report Req */ + bool final_unit; /* Snapshot of measurement when last report was sent: */ struct { uint64_t ul_octets; diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 7ec051e6f4..b42ddbd9c7 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -727,6 +727,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_xact_t *pfcp_xact = NULL; ogs_pfcp_message_t *pfcp_message = NULL; + uint8_t pfcp_cause; ogs_diam_gy_message_t *gy_message = NULL; uint32_t diam_err; @@ -838,6 +839,14 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) OGS_FSM_TRAN(s, smf_gsm_state_epc_session_will_release); break; + case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: + pfcp_cause = smf_n4_handle_session_report_request(sess, pfcp_xact, + &pfcp_message->pfcp_session_report_request); + if (pfcp_cause != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) { + OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); + } + break; + default: ogs_error("cannot handle PFCP message type[%d]", pfcp_message->h.type); diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 14ef79d867..51c40ab513 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -164,6 +164,7 @@ uint32_t smf_gy_handle_cca_initial_request( /* Configure based on what we received from OCS: */ urr_update_time(sess, bearer->urr, gy_message); urr_update_volume(sess, bearer->urr, gy_message); + sess->gy.final_unit = gy_message->cca.final.cc_final_action_present; /* Associate acconting URR each direction PDR: */ ogs_pfcp_pdr_associate_urr(bearer->ul_pdr, bearer->urr); @@ -221,6 +222,7 @@ uint32_t smf_gy_handle_cca_update_request( urr_update_time(sess, urr, gy_message); urr_update_volume(sess, urr, gy_message); + sess->gy.final_unit = gy_message->cca.final.cc_final_action_present; /* Associate accounting URR each direction PDR: */ ogs_pfcp_pdr_associate_urr(bearer->ul_pdr, urr); ogs_pfcp_pdr_associate_urr(bearer->dl_pdr, urr); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 882787b1bc..52a2a02250 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -48,6 +48,8 @@ static ogs_thread_mutex_t sess_state_mutex; static int decode_granted_service_unit( ogs_diam_gy_service_unit_t *su, struct avp *avpch1, int *perror); +static int decode_final_unit_indication( + ogs_diam_gy_final_unit_t *fu, struct avp *avpch1, int *perror); static void smf_gy_cca_cb(void *data, struct msg **msg); static __inline__ struct sess_state *new_state(os0_t sid) @@ -1149,6 +1151,11 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) case OGS_DIAM_GY_AVP_CODE_VOLUME_QUOTA_THRESHOLD: gy_message->cca.volume_threshold = hdr->avp_value->u32; break; + case OGS_DIAM_GY_AVP_CODE_FINAL_UNIT_INDICATION: + rv = decode_final_unit_indication( + &gy_message->cca.final, avpch1, &error); + ogs_assert(rv == OGS_OK); + break; default: ogs_warn("Not supported(%d)", hdr->avp_code); break; @@ -1464,3 +1471,42 @@ static int decode_granted_service_unit( return OGS_OK; } + +static int decode_final_unit_indication( + ogs_diam_gy_final_unit_t *fu, struct avp *avpch1, int *perror) +{ + int ret = 0, error = 0; + struct avp *avpch2; + struct avp_hdr *hdr; + + ogs_assert(fu); + ogs_assert(avpch1); + memset(fu, 0, sizeof(*fu)); + + ret = fd_msg_browse(avpch1, MSG_BRW_FIRST_CHILD, &avpch2, NULL); + ogs_assert(ret == 0); + while (avpch2) { + ret = fd_msg_avp_hdr(avpch2, &hdr); + ogs_assert(ret == 0); + switch (hdr->avp_code) { + case OGS_DIAM_GY_AVP_CODE_FINAL_UNIT_ACTION: + fu->cc_final_action_present = true; + fu->cc_final_action = hdr->avp_value->i32; + break; + /* TODO: + case OGS_DIAM_GY_AVP_CODE_REDIRECT_SERVER: + case OGS_DIAM_GY_AVP_CODE_FILTER_ID: + case OGS_DIAM_GY_AVP_CODE_RESTRICTION_FILTER_RULE: + */ + default: + ogs_error("Not implemented(%d)", hdr->avp_code); + break; + } + fd_msg_browse(avpch2, MSG_BRW_NEXT, &avpch2, NULL); + } + + if (perror) + *perror = error; + + return OGS_OK; +} diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index db1f91c2f1..ec1a63f9b2 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -1147,7 +1147,9 @@ uint8_t smf_epc_n4_handle_session_deletion_response( return OGS_PFCP_CAUSE_REQUEST_ACCEPTED; } -void smf_n4_handle_session_report_request( +/* Returns OGS_PFCP_CAUSE_REQUEST_ACCEPTED on success, + * other cause value on failure */ +uint8_t smf_n4_handle_session_report_request( smf_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact, ogs_pfcp_session_report_request_t *pfcp_req) { @@ -1185,7 +1187,7 @@ void smf_n4_handle_session_report_request( ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, cause_value, 0); - return; + return cause_value; } ogs_assert(sess); @@ -1225,7 +1227,7 @@ void smf_n4_handle_session_report_request( ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED, 0); - return; + return OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED; } if (qfi) { @@ -1235,7 +1237,7 @@ void smf_n4_handle_session_report_request( ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); - return; + return OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND; } } } else { @@ -1260,7 +1262,7 @@ void smf_n4_handle_session_report_request( ogs_pfcp_send_error_message(pfcp_xact, 0, OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); - return; + return OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND; } switch (sess->up_cnx_state) { @@ -1332,14 +1334,21 @@ void smf_n4_handle_session_report_request( sess->gy.reporting_reason = smf_pfcp_urr_usage_report_trigger2diam_gy_reporting_reason(&rep_trig); } - switch(smf_use_gy_iface()) { + switch (smf_use_gy_iface()) { case 1: - smf_gy_send_ccr(sess, pfcp_xact, - OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST); + if (!sess->gy.final_unit) { + smf_gy_send_ccr(sess, pfcp_xact, + OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST); + } else { + ogs_debug("[%s:%s] Rx PFCP report after Gy Final Unit Indication", + smf_ue->imsi_bcd, sess->session.name); + /* This effectively triggers session release: */ + cause_value = OGS_PFCP_CAUSE_NO_RESOURCES_AVAILABLE; + } break; case -1: ogs_error("No Gy Diameter Peer"); - /* TODO: terminate connection */ + cause_value = OGS_PFCP_CAUSE_NO_RESOURCES_AVAILABLE; break; /* default: continue below */ } @@ -1379,4 +1388,5 @@ void smf_n4_handle_session_report_request( 0)); } } + return cause_value; } diff --git a/src/smf/n4-handler.h b/src/smf/n4-handler.h index 76a257d129..b5e89886e4 100644 --- a/src/smf/n4-handler.h +++ b/src/smf/n4-handler.h @@ -47,7 +47,7 @@ uint8_t smf_epc_n4_handle_session_deletion_response( smf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_session_deletion_response_t *rsp); -void smf_n4_handle_session_report_request( +uint8_t smf_n4_handle_session_report_request( smf_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact, ogs_pfcp_session_report_request_t *pfcp_req); diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index bf02358424..2fe69d1f39 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -370,8 +370,14 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: if (!message->h.seid_presence) ogs_error("No SEID"); - smf_n4_handle_session_report_request( - sess, xact, &message->pfcp_session_report_request); + if (!sess) { + ogs_error("No Session"); + ogs_pfcp_send_error_message(xact, 0, + OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE, + OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0); + break; + } + ogs_fsm_dispatch(&sess->sm, e); break; default: From cfd4f28f8aafddac6dd7d01674b43d5e888cc9a0 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 8 Apr 2024 14:08:55 +0200 Subject: [PATCH 073/323] cosmetic: Fix trailing whitespace --- lib/diameter/common/logger.c | 22 +++++++++++----------- lib/diameter/common/logger.h | 4 ++-- src/hss/hss-cx-path.c | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/diameter/common/logger.c b/lib/diameter/common/logger.c index 48deb3735d..a3309da955 100644 --- a/lib/diameter/common/logger.c +++ b/lib/diameter/common/logger.c @@ -27,8 +27,8 @@ static pthread_t fd_stats_th = (pthread_t)NULL; static ogs_diam_logger_user_handler user_handler = NULL; -static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, - struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, +static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, + struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata); static void * diam_stats_worker(void * arg); @@ -41,7 +41,7 @@ int ogs_diam_logger_init(int mode) self.mode = mode; self.duration = 60; /* 60 seconds */ - CHECK_FCT( fd_hook_register( + CHECK_FCT( fd_hook_register( mask_peers, ogs_diam_logger_cb, NULL, NULL, &logger_hdl) ); CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); @@ -81,8 +81,8 @@ void ogs_diam_logger_unregister(void) } /* The callback called when messages are received and sent */ -static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, - struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, +static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, + struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata) { const char * peer_name = peer ? peer->info.pi_diamid : "<unknown peer>"; @@ -117,7 +117,7 @@ static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, } /* Function to display statistics periodically */ -static void * diam_stats_worker(void * arg) +static void * diam_stats_worker(void * arg) { struct timespec start, now; struct fd_stats copy; @@ -146,7 +146,7 @@ static void * diam_stats_worker(void * arg) (int)(now.tv_sec - start.tv_sec), (long)(now.tv_nsec - start.tv_nsec) / 1000); } - else + else { ogs_trace(" Executing for: %d.%06ld sec", (int)(now.tv_sec - 1 - start.tv_sec), @@ -154,7 +154,7 @@ static void * diam_stats_worker(void * arg) } if (self.mode & FD_MODE_SERVER) { - ogs_trace(" Server: %llu message(s) echoed", + ogs_trace(" Server: %llu message(s) echoed", copy.nb_echoed); } if (self.mode & FD_MODE_CLIENT) { @@ -162,11 +162,11 @@ static void * diam_stats_worker(void * arg) ogs_trace(" %llu message(s) sent", copy.nb_sent); ogs_trace(" %llu error(s) received", copy.nb_errs); ogs_trace(" %llu answer(s) received", copy.nb_recv); - ogs_trace(" fastest: %ld.%06ld sec.", + ogs_trace(" fastest: %ld.%06ld sec.", copy.shortest / 1000000, copy.shortest % 1000000); - ogs_trace(" slowest: %ld.%06ld sec.", + ogs_trace(" slowest: %ld.%06ld sec.", copy.longest / 1000000, copy.longest % 1000000); - ogs_trace(" Average: %ld.%06ld sec.", + ogs_trace(" Average: %ld.%06ld sec.", copy.avg / 1000000, copy.avg % 1000000); } ogs_trace("-------------------------------------"); diff --git a/lib/diameter/common/logger.h b/lib/diameter/common/logger.h index e6d3d28e5d..5764bff755 100644 --- a/lib/diameter/common/logger.h +++ b/lib/diameter/common/logger.h @@ -33,7 +33,7 @@ struct ogs_diam_logger_t { #define FD_MODE_SERVER 0x1 #define FD_MODE_CLIENT 0x2 int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ - + int duration; /* default 10 */ struct fd_stats { unsigned long long nb_echoed; /* server */ @@ -56,7 +56,7 @@ struct ogs_diam_logger_t* ogs_diam_logger_self(void); int ogs_diam_logger_stats_start(void); typedef void (*ogs_diam_logger_user_handler)( - enum fd_hook_type type, struct msg *msg, struct peer_hdr *peer, + enum fd_hook_type type, struct msg *msg, struct peer_hdr *peer, void *other, struct fd_hook_permsgdata *pmd, void *regdata); void ogs_diam_logger_register(ogs_diam_logger_user_handler instance); diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index 7bfc6ed3c0..ad9ac4d562 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -34,7 +34,7 @@ static struct disp_hdl *hdl_cx_sar = NULL; static struct disp_hdl *hdl_cx_lir = NULL; /* Default callback for the application. */ -static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, +static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, struct session *session, void *opaque, enum disp_action *act) { /* This CB should never be called */ @@ -44,7 +44,7 @@ static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, } /* Callback for incoming User-Authorization-Request messages */ -static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, +static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, struct session *session, void *opaque, enum disp_action *act) { int rv, ret; From 253b09f589b118d7c317148baa8330c02853abec Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 8 Apr 2024 17:04:15 +0200 Subject: [PATCH 074/323] RFC: [HSS] Initial global metrics --- src/hss/hss-context.c | 9 +++++ src/hss/hss-context.h | 1 + src/hss/hss-init.c | 10 +++++ src/hss/meson.build | 9 ++++- src/hss/metrics.c | 93 +++++++++++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 38 ++++++++++++++++++ 6 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/hss/metrics.c create mode 100644 src/hss/metrics.h diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index fede577037..f80cded8db 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -337,6 +337,8 @@ int hss_context_parse_config(void) #else self.use_mongodb_change_stream = false; #endif + } else if (!strcmp(hss_key, "metrics")) { + /* handle config in metrics library */ } else ogs_warn("unknown key `%s`", hss_key); } @@ -519,6 +521,7 @@ static hss_imsi_t *imsi_add(char *id) ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), imsi); ogs_list_add(&self.imsi_list, imsi); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMSI); return imsi; } @@ -528,6 +531,7 @@ static void imsi_remove(hss_imsi_t *imsi) ogs_assert(imsi); ogs_list_remove(&self.imsi_list, imsi); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMSI); ogs_assert(imsi->id); ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), NULL); @@ -569,6 +573,7 @@ static hss_impi_t *impi_add(char *id) ogs_hash_set(self.impi_hash, impi->id, strlen(impi->id), impi); ogs_list_add(&self.impi_list, impi); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPI); return impi; } @@ -578,6 +583,7 @@ static void impi_remove(hss_impi_t *impi) ogs_assert(impi); ogs_list_remove(&self.impi_list, impi); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPI); impu_remove_all(impi); @@ -633,7 +639,9 @@ static hss_impu_t *impu_add(hss_impi_t *impi, char *id) ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), impu); impu->impi = impi; + ogs_list_add(&impi->impu_list, impu); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPU); return impu; } @@ -647,6 +655,7 @@ static void impu_remove(hss_impu_t *impu) ogs_assert(impi); ogs_list_remove(&impi->impu_list, impu); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPU); ogs_assert(impu->id); ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), NULL); diff --git a/src/hss/hss-context.h b/src/hss/hss-context.h index b5afd46b4a..1fe0ddc701 100644 --- a/src/hss/hss-context.h +++ b/src/hss/hss-context.h @@ -25,6 +25,7 @@ #include "ogs-diameter-swx.h" #include "ogs-dbi.h" #include "ogs-app.h" +#include "metrics.h" #ifdef __cplusplus extern "C" { diff --git a/src/hss/hss-init.c b/src/hss/hss-init.c index 305d9ef22d..7d8139e83c 100644 --- a/src/hss/hss-init.c +++ b/src/hss/hss-init.c @@ -20,6 +20,7 @@ #include "hss-context.h" #include "hss-fd-path.h" #include "hss-sm.h" +#include "metrics.h" static ogs_thread_t *thread; @@ -35,9 +36,14 @@ int hss_initialize(void) rv = ogs_app_parse_local_conf(APP_NAME); if (rv != OGS_OK) return rv; + hss_metrics_init(); + hss_context_init(); hss_event_init(); + rv = ogs_metrics_context_parse_config(APP_NAME); + if (rv != OGS_OK) return rv; + rv = hss_context_parse_config(); if (rv != OGS_OK) return rv; @@ -45,6 +51,8 @@ int hss_initialize(void) ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + ogs_metrics_context_open(ogs_metrics_self()); + rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; @@ -65,12 +73,14 @@ void hss_terminate(void) hss_event_term(); ogs_thread_destroy(thread); + ogs_metrics_context_close(ogs_metrics_self()); hss_fd_final(); ogs_dbi_final(); hss_context_final(); hss_event_final(); + hss_metrics_final(); return; } diff --git a/src/hss/meson.build b/src/hss/meson.build index 83130a4444..378139eea5 100644 --- a/src/hss/meson.build +++ b/src/hss/meson.build @@ -22,6 +22,7 @@ libhss_sources = files(''' hss-event.h hss-timer.h hss-sm.h + metrics.h hss-init.c hss-context.c @@ -34,11 +35,14 @@ libhss_sources = files(''' hss-swx-path.c hss-fd-path.c + + metrics.c '''.split()) libhss = static_library('hss', sources : libhss_sources, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, @@ -48,7 +52,8 @@ libhss = static_library('hss', libhss_dep = declare_dependency( link_with : libhss, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, diff --git a/src/hss/metrics.c b/src/hss/metrics.c new file mode 100644 index 0000000000..b14426095f --- /dev/null +++ b/src/hss/metrics.c @@ -0,0 +1,93 @@ +#include "ogs-app.h" +#include "hss-context.h" + +#include "metrics.h" + +typedef struct hss_metrics_spec_def_s { + unsigned int type; + const char *name; + const char *description; + int initial_val; + unsigned int num_labels; + const char **labels; +} hss_metrics_spec_def_t; + +/* Helper generic functions: */ +static int hss_metrics_init_inst(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, + unsigned int len, unsigned int num_labels, const char **labels) +{ + unsigned int i; + for (i = 0; i < len; i++) + inst[i] = ogs_metrics_inst_new(specs[i], num_labels, labels); + return OGS_OK; +} + +static int hss_metrics_free_inst(ogs_metrics_inst_t **inst, + unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) + ogs_metrics_inst_free(inst[i]); + memset(inst, 0, sizeof(inst[0]) * len); + return OGS_OK; +} + +static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, + ogs_metrics_spec_t **dst, hss_metrics_spec_def_t *src, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) { + dst[i] = ogs_metrics_spec_new(ctx, src[i].type, + src[i].name, src[i].description, + src[i].initial_val, src[i].num_labels, src[i].labels, + NULL); + } + return OGS_OK; +} + +/* GLOBAL */ +ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; +ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; +hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { +/* Global Gauges: */ +[HSS_METR_GLOB_GAUGE_IMSI] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_imsi", + .description = "Number of IMSIs attached to HSS", +}, +[HSS_METR_GLOB_GAUGE_IMPI] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_impi", + .description = "Number of IMPIs attached to HSS", +}, +[HSS_METR_GLOB_GAUGE_IMPU] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_impu", + .description = "Number of IMPUs attached to HSS", +}, +}; +int hss_metrics_init_inst_global(void) +{ + return hss_metrics_init_inst(hss_metrics_inst_global, hss_metrics_spec_global, + _HSS_METR_GLOB_MAX, 0, NULL); +} +int hss_metrics_free_inst_global(void) +{ + return hss_metrics_free_inst(hss_metrics_inst_global, _HSS_METR_GLOB_MAX); +} + +void hss_metrics_init(void) +{ + ogs_metrics_context_t *ctx = ogs_metrics_self(); + ogs_metrics_context_init(); + + hss_metrics_init_spec(ctx, hss_metrics_spec_global, hss_metrics_spec_def_global, + _HSS_METR_GLOB_MAX); + + hss_metrics_init_inst_global(); +} + +void hss_metrics_final(void) +{ + ogs_metrics_context_final(); +} diff --git a/src/hss/metrics.h b/src/hss/metrics.h new file mode 100644 index 0000000000..c0b36a33f9 --- /dev/null +++ b/src/hss/metrics.h @@ -0,0 +1,38 @@ +#ifndef HSS_METRICS_H +#define HSS_METRICS_H + +#include "ogs-metrics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* GLOBAL */ +typedef enum hss_metric_type_global_s { + HSS_METR_GLOB_GAUGE_IMSI, + HSS_METR_GLOB_GAUGE_IMPI, + HSS_METR_GLOB_GAUGE_IMPU, + _HSS_METR_GLOB_MAX, +} hss_metric_type_global_t; +extern ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; + +int hss_metrics_init_inst_global(void); +int hss_metrics_free_inst_global(void); + +static inline void hss_metrics_inst_global_set(hss_metric_type_global_t t, int val) +{ ogs_metrics_inst_set(hss_metrics_inst_global[t], val); } +static inline void hss_metrics_inst_global_add(hss_metric_type_global_t t, int val) +{ ogs_metrics_inst_add(hss_metrics_inst_global[t], val); } +static inline void hss_metrics_inst_global_inc(hss_metric_type_global_t t) +{ ogs_metrics_inst_inc(hss_metrics_inst_global[t]); } +static inline void hss_metrics_inst_global_dec(hss_metric_type_global_t t) +{ ogs_metrics_inst_dec(hss_metrics_inst_global[t]); } + +void hss_metrics_init(void); +void hss_metrics_final(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HSS_METRICS_H */ From d3a779e7153b1962788e42f916e0148b0225dcda Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 8 Apr 2024 17:08:10 +0200 Subject: [PATCH 075/323] [HSS] Initial Diameter S6a and Cx metrics --- src/hss/hss-cx-path.c | 13 ++++++--- src/hss/hss-s6a-path.c | 24 ++++++++++----- src/hss/metrics.c | 66 ++++++++++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 13 +++++++++ 4 files changed, 105 insertions(+), 11 deletions(-) diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index ad9ac4d562..5621b98690 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -39,6 +39,7 @@ static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN); return ENOTSUP; } @@ -66,7 +67,8 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("User-Authorization-Request"); + ogs_debug("Rx User-Authorization-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_UAR); /* Create answer header */ qry = *msg; @@ -250,7 +252,8 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Multimedia-Auth-Request"); + ogs_debug("Rx Multimedia-Auth-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_MAR); /* Create answer header */ qry = *msg; @@ -627,7 +630,8 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Server-Assignment-Request"); + ogs_debug("Rx Server-Assignment-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_SAR); /* Create answer header */ qry = *msg; @@ -875,7 +879,8 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Location-Info-Request"); + ogs_debug("Rx Location-Info-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_LIR); /* Create answer header */ qry = *msg; diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 3dc1ca3a03..876677b2a9 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -58,6 +58,7 @@ static int hss_ogs_diam_s6a_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN); return ENOTSUP; } @@ -96,7 +97,8 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Authentication-Information-Request"); + ogs_debug("Rx Authentication-Information-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_AIR); /* Create answer header */ qry = *msg; @@ -765,7 +767,8 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Update-Location-Request"); + ogs_debug("Rx Update-Location-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_ULR); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1032,7 +1035,8 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Purge-UE-Request"); + ogs_debug("Rx Purge-UE-Request"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_PUR); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1167,7 +1171,7 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - ogs_debug("[HSS] Cancel-Location-Request"); + ogs_debug("[HSS] Tx Cancel-Location-Request"); /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); @@ -1276,6 +1280,8 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, ret = fd_msg_send(&req, hss_s6a_cla_cb, svg); ogs_assert(ret == 0); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_TX_CLR); + /* Increment the counter */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); ogs_diam_logger_self()->stats.nb_sent++; @@ -1292,7 +1298,8 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Cancel-Location-Answer"); + ogs_debug("[HSS] Rx Cancel-Location-Answer"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_CLA); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); @@ -1341,7 +1348,7 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ogs_subscription_data_t subscription_data; - ogs_debug("[HSS] Insert-Subscriber-Data-Request"); + ogs_debug("[HSS] Tx Insert-Subscriber-Data-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1477,6 +1484,8 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ret = fd_msg_send(&req, hss_s6a_ida_cb, svg); ogs_assert(ret == 0); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_TX_IDR); + /* Increment the counter */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); ogs_diam_logger_self()->stats.nb_sent++; @@ -1496,7 +1505,8 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Insert-Subscriber-Data-Answer"); + ogs_debug("[HSS] Rx Insert-Subscriber-Data-Answer"); + hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_IDA); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); diff --git a/src/hss/metrics.c b/src/hss/metrics.c index b14426095f..521a89c532 100644 --- a/src/hss/metrics.c +++ b/src/hss/metrics.c @@ -49,6 +49,72 @@ static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { +/* Global Counters: */ +[HSS_METR_GLOB_CTR_CX_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_unknown", + .description = "Received Cx unknown messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_MAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_mar", + .description = "Received Cx MAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_SAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_sar", + .description = "Received Cx SAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_UAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_uar", + .description = "Received Cx UAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_LIR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_lir", + .description = "Received Cx LIR messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_unknown", + .description = "Received s6a unknown messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_AIR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_air", + .description = "Received s6a AIR messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_CLA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_cla", + .description = "Received s6a CLA messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_IDA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ida", + .description = "Received s6a IDA messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_PUR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_pur", + .description = "Received s6a PUR messages", +}, +[HSS_METR_GLOB_CTR_S6A_RX_ULR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ulr", + .description = "Received s6a ULR messages", +}, +[HSS_METR_GLOB_CTR_S6A_TX_CLR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_clr", + .description = "Transmitted s6a CLR messages", +}, +[HSS_METR_GLOB_CTR_S6A_TX_IDR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_idr", + .description = "Transmitted s6a IDR messages", +}, /* Global Gauges: */ [HSS_METR_GLOB_GAUGE_IMSI] = { .type = OGS_METRICS_METRIC_TYPE_GAUGE, diff --git a/src/hss/metrics.h b/src/hss/metrics.h index c0b36a33f9..be6cbc9379 100644 --- a/src/hss/metrics.h +++ b/src/hss/metrics.h @@ -9,6 +9,19 @@ extern "C" { /* GLOBAL */ typedef enum hss_metric_type_global_s { + HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, + HSS_METR_GLOB_CTR_CX_RX_MAR, + HSS_METR_GLOB_CTR_CX_RX_SAR, + HSS_METR_GLOB_CTR_CX_RX_UAR, + HSS_METR_GLOB_CTR_CX_RX_LIR, + HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN, + HSS_METR_GLOB_CTR_S6A_RX_AIR, + HSS_METR_GLOB_CTR_S6A_RX_CLA, + HSS_METR_GLOB_CTR_S6A_RX_IDA, + HSS_METR_GLOB_CTR_S6A_RX_PUR, + HSS_METR_GLOB_CTR_S6A_RX_ULR, + HSS_METR_GLOB_CTR_S6A_TX_CLR, + HSS_METR_GLOB_CTR_S6A_TX_IDR, HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU, From 01ef8ea6f205aa01ce47f5844a41798704dea8cd Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Apr 2024 08:35:09 +0900 Subject: [PATCH 076/323] Revert "[HSS] Initial Diameter S6a and Cx metrics" This reverts commit d3a779e7153b1962788e42f916e0148b0225dcda. --- src/hss/hss-cx-path.c | 13 +++------ src/hss/hss-s6a-path.c | 24 +++++---------- src/hss/metrics.c | 66 ------------------------------------------ src/hss/metrics.h | 13 --------- 4 files changed, 11 insertions(+), 105 deletions(-) diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index 5621b98690..ad9ac4d562 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -39,7 +39,6 @@ static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN); return ENOTSUP; } @@ -67,8 +66,7 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx User-Authorization-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_UAR); + ogs_debug("User-Authorization-Request"); /* Create answer header */ qry = *msg; @@ -252,8 +250,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Multimedia-Auth-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_MAR); + ogs_debug("Multimedia-Auth-Request"); /* Create answer header */ qry = *msg; @@ -630,8 +627,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Server-Assignment-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_SAR); + ogs_debug("Server-Assignment-Request"); /* Create answer header */ qry = *msg; @@ -879,8 +875,7 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Location-Info-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_CX_RX_LIR); + ogs_debug("Location-Info-Request"); /* Create answer header */ qry = *msg; diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 876677b2a9..3dc1ca3a03 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -58,7 +58,6 @@ static int hss_ogs_diam_s6a_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN); return ENOTSUP; } @@ -97,8 +96,7 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Authentication-Information-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_AIR); + ogs_debug("Authentication-Information-Request"); /* Create answer header */ qry = *msg; @@ -767,8 +765,7 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Update-Location-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_ULR); + ogs_debug("Update-Location-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1035,8 +1032,7 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Rx Purge-UE-Request"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_PUR); + ogs_debug("Purge-UE-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1171,7 +1167,7 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - ogs_debug("[HSS] Tx Cancel-Location-Request"); + ogs_debug("[HSS] Cancel-Location-Request"); /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); @@ -1280,8 +1276,6 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, ret = fd_msg_send(&req, hss_s6a_cla_cb, svg); ogs_assert(ret == 0); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_TX_CLR); - /* Increment the counter */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); ogs_diam_logger_self()->stats.nb_sent++; @@ -1298,8 +1292,7 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Rx Cancel-Location-Answer"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_CLA); + ogs_debug("[HSS] Cancel-Location-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); @@ -1348,7 +1341,7 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ogs_subscription_data_t subscription_data; - ogs_debug("[HSS] Tx Insert-Subscriber-Data-Request"); + ogs_debug("[HSS] Insert-Subscriber-Data-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1484,8 +1477,6 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ret = fd_msg_send(&req, hss_s6a_ida_cb, svg); ogs_assert(ret == 0); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_TX_IDR); - /* Increment the counter */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); ogs_diam_logger_self()->stats.nb_sent++; @@ -1505,8 +1496,7 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Rx Insert-Subscriber-Data-Answer"); - hss_metrics_inst_global_inc(HSS_METR_GLOB_CTR_S6A_RX_IDA); + ogs_debug("[HSS] Insert-Subscriber-Data-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); diff --git a/src/hss/metrics.c b/src/hss/metrics.c index 521a89c532..b14426095f 100644 --- a/src/hss/metrics.c +++ b/src/hss/metrics.c @@ -49,72 +49,6 @@ static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { -/* Global Counters: */ -[HSS_METR_GLOB_CTR_CX_RX_UNKNOWN] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "cx_rx_unknown", - .description = "Received Cx unknown messages", -}, -[HSS_METR_GLOB_CTR_CX_RX_MAR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "cx_rx_mar", - .description = "Received Cx MAR messages", -}, -[HSS_METR_GLOB_CTR_CX_RX_SAR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "cx_rx_sar", - .description = "Received Cx SAR messages", -}, -[HSS_METR_GLOB_CTR_CX_RX_UAR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "cx_rx_uar", - .description = "Received Cx UAR messages", -}, -[HSS_METR_GLOB_CTR_CX_RX_LIR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "cx_rx_lir", - .description = "Received Cx LIR messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_unknown", - .description = "Received s6a unknown messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_AIR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_air", - .description = "Received s6a AIR messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_CLA] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_cla", - .description = "Received s6a CLA messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_IDA] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_ida", - .description = "Received s6a IDA messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_PUR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_pur", - .description = "Received s6a PUR messages", -}, -[HSS_METR_GLOB_CTR_S6A_RX_ULR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_rx_ulr", - .description = "Received s6a ULR messages", -}, -[HSS_METR_GLOB_CTR_S6A_TX_CLR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_tx_clr", - .description = "Transmitted s6a CLR messages", -}, -[HSS_METR_GLOB_CTR_S6A_TX_IDR] = { - .type = OGS_METRICS_METRIC_TYPE_COUNTER, - .name = "s6a_tx_idr", - .description = "Transmitted s6a IDR messages", -}, /* Global Gauges: */ [HSS_METR_GLOB_GAUGE_IMSI] = { .type = OGS_METRICS_METRIC_TYPE_GAUGE, diff --git a/src/hss/metrics.h b/src/hss/metrics.h index be6cbc9379..c0b36a33f9 100644 --- a/src/hss/metrics.h +++ b/src/hss/metrics.h @@ -9,19 +9,6 @@ extern "C" { /* GLOBAL */ typedef enum hss_metric_type_global_s { - HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, - HSS_METR_GLOB_CTR_CX_RX_MAR, - HSS_METR_GLOB_CTR_CX_RX_SAR, - HSS_METR_GLOB_CTR_CX_RX_UAR, - HSS_METR_GLOB_CTR_CX_RX_LIR, - HSS_METR_GLOB_CTR_S6A_RX_UNKNOWN, - HSS_METR_GLOB_CTR_S6A_RX_AIR, - HSS_METR_GLOB_CTR_S6A_RX_CLA, - HSS_METR_GLOB_CTR_S6A_RX_IDA, - HSS_METR_GLOB_CTR_S6A_RX_PUR, - HSS_METR_GLOB_CTR_S6A_RX_ULR, - HSS_METR_GLOB_CTR_S6A_TX_CLR, - HSS_METR_GLOB_CTR_S6A_TX_IDR, HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU, From 3b820b1dbe6634b2278c7e13a33197707a3910c2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Apr 2024 08:35:15 +0900 Subject: [PATCH 077/323] Revert "RFC: [HSS] Initial global metrics" This reverts commit 253b09f589b118d7c317148baa8330c02853abec. --- src/hss/hss-context.c | 9 ----- src/hss/hss-context.h | 1 - src/hss/hss-init.c | 10 ----- src/hss/meson.build | 9 +---- src/hss/metrics.c | 93 ------------------------------------------- src/hss/metrics.h | 38 ------------------ 6 files changed, 2 insertions(+), 158 deletions(-) delete mode 100644 src/hss/metrics.c delete mode 100644 src/hss/metrics.h diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index f80cded8db..fede577037 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -337,8 +337,6 @@ int hss_context_parse_config(void) #else self.use_mongodb_change_stream = false; #endif - } else if (!strcmp(hss_key, "metrics")) { - /* handle config in metrics library */ } else ogs_warn("unknown key `%s`", hss_key); } @@ -521,7 +519,6 @@ static hss_imsi_t *imsi_add(char *id) ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), imsi); ogs_list_add(&self.imsi_list, imsi); - hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMSI); return imsi; } @@ -531,7 +528,6 @@ static void imsi_remove(hss_imsi_t *imsi) ogs_assert(imsi); ogs_list_remove(&self.imsi_list, imsi); - hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMSI); ogs_assert(imsi->id); ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), NULL); @@ -573,7 +569,6 @@ static hss_impi_t *impi_add(char *id) ogs_hash_set(self.impi_hash, impi->id, strlen(impi->id), impi); ogs_list_add(&self.impi_list, impi); - hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPI); return impi; } @@ -583,7 +578,6 @@ static void impi_remove(hss_impi_t *impi) ogs_assert(impi); ogs_list_remove(&self.impi_list, impi); - hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPI); impu_remove_all(impi); @@ -639,9 +633,7 @@ static hss_impu_t *impu_add(hss_impi_t *impi, char *id) ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), impu); impu->impi = impi; - ogs_list_add(&impi->impu_list, impu); - hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPU); return impu; } @@ -655,7 +647,6 @@ static void impu_remove(hss_impu_t *impu) ogs_assert(impi); ogs_list_remove(&impi->impu_list, impu); - hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPU); ogs_assert(impu->id); ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), NULL); diff --git a/src/hss/hss-context.h b/src/hss/hss-context.h index 1fe0ddc701..b5afd46b4a 100644 --- a/src/hss/hss-context.h +++ b/src/hss/hss-context.h @@ -25,7 +25,6 @@ #include "ogs-diameter-swx.h" #include "ogs-dbi.h" #include "ogs-app.h" -#include "metrics.h" #ifdef __cplusplus extern "C" { diff --git a/src/hss/hss-init.c b/src/hss/hss-init.c index 7d8139e83c..305d9ef22d 100644 --- a/src/hss/hss-init.c +++ b/src/hss/hss-init.c @@ -20,7 +20,6 @@ #include "hss-context.h" #include "hss-fd-path.h" #include "hss-sm.h" -#include "metrics.h" static ogs_thread_t *thread; @@ -36,14 +35,9 @@ int hss_initialize(void) rv = ogs_app_parse_local_conf(APP_NAME); if (rv != OGS_OK) return rv; - hss_metrics_init(); - hss_context_init(); hss_event_init(); - rv = ogs_metrics_context_parse_config(APP_NAME); - if (rv != OGS_OK) return rv; - rv = hss_context_parse_config(); if (rv != OGS_OK) return rv; @@ -51,8 +45,6 @@ int hss_initialize(void) ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); - rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; @@ -73,14 +65,12 @@ void hss_terminate(void) hss_event_term(); ogs_thread_destroy(thread); - ogs_metrics_context_close(ogs_metrics_self()); hss_fd_final(); ogs_dbi_final(); hss_context_final(); hss_event_final(); - hss_metrics_final(); return; } diff --git a/src/hss/meson.build b/src/hss/meson.build index 378139eea5..83130a4444 100644 --- a/src/hss/meson.build +++ b/src/hss/meson.build @@ -22,7 +22,6 @@ libhss_sources = files(''' hss-event.h hss-timer.h hss-sm.h - metrics.h hss-init.c hss-context.c @@ -35,14 +34,11 @@ libhss_sources = files(''' hss-swx-path.c hss-fd-path.c - - metrics.c '''.split()) libhss = static_library('hss', sources : libhss_sources, - dependencies : [libmetrics_dep, - libapp_dep, + dependencies : [libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, @@ -52,8 +48,7 @@ libhss = static_library('hss', libhss_dep = declare_dependency( link_with : libhss, - dependencies : [libmetrics_dep, - libapp_dep, + dependencies : [libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, diff --git a/src/hss/metrics.c b/src/hss/metrics.c deleted file mode 100644 index b14426095f..0000000000 --- a/src/hss/metrics.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "ogs-app.h" -#include "hss-context.h" - -#include "metrics.h" - -typedef struct hss_metrics_spec_def_s { - unsigned int type; - const char *name; - const char *description; - int initial_val; - unsigned int num_labels; - const char **labels; -} hss_metrics_spec_def_t; - -/* Helper generic functions: */ -static int hss_metrics_init_inst(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, - unsigned int len, unsigned int num_labels, const char **labels) -{ - unsigned int i; - for (i = 0; i < len; i++) - inst[i] = ogs_metrics_inst_new(specs[i], num_labels, labels); - return OGS_OK; -} - -static int hss_metrics_free_inst(ogs_metrics_inst_t **inst, - unsigned int len) -{ - unsigned int i; - for (i = 0; i < len; i++) - ogs_metrics_inst_free(inst[i]); - memset(inst, 0, sizeof(inst[0]) * len); - return OGS_OK; -} - -static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, - ogs_metrics_spec_t **dst, hss_metrics_spec_def_t *src, unsigned int len) -{ - unsigned int i; - for (i = 0; i < len; i++) { - dst[i] = ogs_metrics_spec_new(ctx, src[i].type, - src[i].name, src[i].description, - src[i].initial_val, src[i].num_labels, src[i].labels, - NULL); - } - return OGS_OK; -} - -/* GLOBAL */ -ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; -ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; -hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { -/* Global Gauges: */ -[HSS_METR_GLOB_GAUGE_IMSI] = { - .type = OGS_METRICS_METRIC_TYPE_GAUGE, - .name = "hss_imsi", - .description = "Number of IMSIs attached to HSS", -}, -[HSS_METR_GLOB_GAUGE_IMPI] = { - .type = OGS_METRICS_METRIC_TYPE_GAUGE, - .name = "hss_impi", - .description = "Number of IMPIs attached to HSS", -}, -[HSS_METR_GLOB_GAUGE_IMPU] = { - .type = OGS_METRICS_METRIC_TYPE_GAUGE, - .name = "hss_impu", - .description = "Number of IMPUs attached to HSS", -}, -}; -int hss_metrics_init_inst_global(void) -{ - return hss_metrics_init_inst(hss_metrics_inst_global, hss_metrics_spec_global, - _HSS_METR_GLOB_MAX, 0, NULL); -} -int hss_metrics_free_inst_global(void) -{ - return hss_metrics_free_inst(hss_metrics_inst_global, _HSS_METR_GLOB_MAX); -} - -void hss_metrics_init(void) -{ - ogs_metrics_context_t *ctx = ogs_metrics_self(); - ogs_metrics_context_init(); - - hss_metrics_init_spec(ctx, hss_metrics_spec_global, hss_metrics_spec_def_global, - _HSS_METR_GLOB_MAX); - - hss_metrics_init_inst_global(); -} - -void hss_metrics_final(void) -{ - ogs_metrics_context_final(); -} diff --git a/src/hss/metrics.h b/src/hss/metrics.h deleted file mode 100644 index c0b36a33f9..0000000000 --- a/src/hss/metrics.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef HSS_METRICS_H -#define HSS_METRICS_H - -#include "ogs-metrics.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* GLOBAL */ -typedef enum hss_metric_type_global_s { - HSS_METR_GLOB_GAUGE_IMSI, - HSS_METR_GLOB_GAUGE_IMPI, - HSS_METR_GLOB_GAUGE_IMPU, - _HSS_METR_GLOB_MAX, -} hss_metric_type_global_t; -extern ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; - -int hss_metrics_init_inst_global(void); -int hss_metrics_free_inst_global(void); - -static inline void hss_metrics_inst_global_set(hss_metric_type_global_t t, int val) -{ ogs_metrics_inst_set(hss_metrics_inst_global[t], val); } -static inline void hss_metrics_inst_global_add(hss_metric_type_global_t t, int val) -{ ogs_metrics_inst_add(hss_metrics_inst_global[t], val); } -static inline void hss_metrics_inst_global_inc(hss_metric_type_global_t t) -{ ogs_metrics_inst_inc(hss_metrics_inst_global[t]); } -static inline void hss_metrics_inst_global_dec(hss_metric_type_global_t t) -{ ogs_metrics_inst_dec(hss_metrics_inst_global[t]); } - -void hss_metrics_init(void); -void hss_metrics_final(void); - -#ifdef __cplusplus -} -#endif - -#endif /* HSS_METRICS_H */ From 34b930b4e54a7e0ec809ab43a82acb763a072c26 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 8 Apr 2024 17:04:15 +0200 Subject: [PATCH 078/323] RFC: [HSS] Initial global metrics --- src/hss/hss-context.c | 9 +++++ src/hss/hss-context.h | 1 + src/hss/hss-init.c | 10 +++++ src/hss/meson.build | 9 ++++- src/hss/metrics.c | 93 +++++++++++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 38 ++++++++++++++++++ 6 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/hss/metrics.c create mode 100644 src/hss/metrics.h diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index fede577037..f80cded8db 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -337,6 +337,8 @@ int hss_context_parse_config(void) #else self.use_mongodb_change_stream = false; #endif + } else if (!strcmp(hss_key, "metrics")) { + /* handle config in metrics library */ } else ogs_warn("unknown key `%s`", hss_key); } @@ -519,6 +521,7 @@ static hss_imsi_t *imsi_add(char *id) ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), imsi); ogs_list_add(&self.imsi_list, imsi); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMSI); return imsi; } @@ -528,6 +531,7 @@ static void imsi_remove(hss_imsi_t *imsi) ogs_assert(imsi); ogs_list_remove(&self.imsi_list, imsi); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMSI); ogs_assert(imsi->id); ogs_hash_set(self.imsi_hash, imsi->id, strlen(imsi->id), NULL); @@ -569,6 +573,7 @@ static hss_impi_t *impi_add(char *id) ogs_hash_set(self.impi_hash, impi->id, strlen(impi->id), impi); ogs_list_add(&self.impi_list, impi); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPI); return impi; } @@ -578,6 +583,7 @@ static void impi_remove(hss_impi_t *impi) ogs_assert(impi); ogs_list_remove(&self.impi_list, impi); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPI); impu_remove_all(impi); @@ -633,7 +639,9 @@ static hss_impu_t *impu_add(hss_impi_t *impi, char *id) ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), impu); impu->impi = impi; + ogs_list_add(&impi->impu_list, impu); + hss_metrics_inst_global_inc(HSS_METR_GLOB_GAUGE_IMPU); return impu; } @@ -647,6 +655,7 @@ static void impu_remove(hss_impu_t *impu) ogs_assert(impi); ogs_list_remove(&impi->impu_list, impu); + hss_metrics_inst_global_dec(HSS_METR_GLOB_GAUGE_IMPU); ogs_assert(impu->id); ogs_hash_set(self.impu_hash, impu->id, strlen(impu->id), NULL); diff --git a/src/hss/hss-context.h b/src/hss/hss-context.h index b5afd46b4a..1fe0ddc701 100644 --- a/src/hss/hss-context.h +++ b/src/hss/hss-context.h @@ -25,6 +25,7 @@ #include "ogs-diameter-swx.h" #include "ogs-dbi.h" #include "ogs-app.h" +#include "metrics.h" #ifdef __cplusplus extern "C" { diff --git a/src/hss/hss-init.c b/src/hss/hss-init.c index 305d9ef22d..7d8139e83c 100644 --- a/src/hss/hss-init.c +++ b/src/hss/hss-init.c @@ -20,6 +20,7 @@ #include "hss-context.h" #include "hss-fd-path.h" #include "hss-sm.h" +#include "metrics.h" static ogs_thread_t *thread; @@ -35,9 +36,14 @@ int hss_initialize(void) rv = ogs_app_parse_local_conf(APP_NAME); if (rv != OGS_OK) return rv; + hss_metrics_init(); + hss_context_init(); hss_event_init(); + rv = ogs_metrics_context_parse_config(APP_NAME); + if (rv != OGS_OK) return rv; + rv = hss_context_parse_config(); if (rv != OGS_OK) return rv; @@ -45,6 +51,8 @@ int hss_initialize(void) ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + ogs_metrics_context_open(ogs_metrics_self()); + rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; @@ -65,12 +73,14 @@ void hss_terminate(void) hss_event_term(); ogs_thread_destroy(thread); + ogs_metrics_context_close(ogs_metrics_self()); hss_fd_final(); ogs_dbi_final(); hss_context_final(); hss_event_final(); + hss_metrics_final(); return; } diff --git a/src/hss/meson.build b/src/hss/meson.build index 83130a4444..378139eea5 100644 --- a/src/hss/meson.build +++ b/src/hss/meson.build @@ -22,6 +22,7 @@ libhss_sources = files(''' hss-event.h hss-timer.h hss-sm.h + metrics.h hss-init.c hss-context.c @@ -34,11 +35,14 @@ libhss_sources = files(''' hss-swx-path.c hss-fd-path.c + + metrics.c '''.split()) libhss = static_library('hss', sources : libhss_sources, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, @@ -48,7 +52,8 @@ libhss = static_library('hss', libhss_dep = declare_dependency( link_with : libhss, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libcrypt_dep, libdbi_dep, libdiameter_s6a_dep, diff --git a/src/hss/metrics.c b/src/hss/metrics.c new file mode 100644 index 0000000000..b14426095f --- /dev/null +++ b/src/hss/metrics.c @@ -0,0 +1,93 @@ +#include "ogs-app.h" +#include "hss-context.h" + +#include "metrics.h" + +typedef struct hss_metrics_spec_def_s { + unsigned int type; + const char *name; + const char *description; + int initial_val; + unsigned int num_labels; + const char **labels; +} hss_metrics_spec_def_t; + +/* Helper generic functions: */ +static int hss_metrics_init_inst(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, + unsigned int len, unsigned int num_labels, const char **labels) +{ + unsigned int i; + for (i = 0; i < len; i++) + inst[i] = ogs_metrics_inst_new(specs[i], num_labels, labels); + return OGS_OK; +} + +static int hss_metrics_free_inst(ogs_metrics_inst_t **inst, + unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) + ogs_metrics_inst_free(inst[i]); + memset(inst, 0, sizeof(inst[0]) * len); + return OGS_OK; +} + +static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, + ogs_metrics_spec_t **dst, hss_metrics_spec_def_t *src, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) { + dst[i] = ogs_metrics_spec_new(ctx, src[i].type, + src[i].name, src[i].description, + src[i].initial_val, src[i].num_labels, src[i].labels, + NULL); + } + return OGS_OK; +} + +/* GLOBAL */ +ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; +ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; +hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { +/* Global Gauges: */ +[HSS_METR_GLOB_GAUGE_IMSI] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_imsi", + .description = "Number of IMSIs attached to HSS", +}, +[HSS_METR_GLOB_GAUGE_IMPI] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_impi", + .description = "Number of IMPIs attached to HSS", +}, +[HSS_METR_GLOB_GAUGE_IMPU] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "hss_impu", + .description = "Number of IMPUs attached to HSS", +}, +}; +int hss_metrics_init_inst_global(void) +{ + return hss_metrics_init_inst(hss_metrics_inst_global, hss_metrics_spec_global, + _HSS_METR_GLOB_MAX, 0, NULL); +} +int hss_metrics_free_inst_global(void) +{ + return hss_metrics_free_inst(hss_metrics_inst_global, _HSS_METR_GLOB_MAX); +} + +void hss_metrics_init(void) +{ + ogs_metrics_context_t *ctx = ogs_metrics_self(); + ogs_metrics_context_init(); + + hss_metrics_init_spec(ctx, hss_metrics_spec_global, hss_metrics_spec_def_global, + _HSS_METR_GLOB_MAX); + + hss_metrics_init_inst_global(); +} + +void hss_metrics_final(void) +{ + ogs_metrics_context_final(); +} diff --git a/src/hss/metrics.h b/src/hss/metrics.h new file mode 100644 index 0000000000..c0b36a33f9 --- /dev/null +++ b/src/hss/metrics.h @@ -0,0 +1,38 @@ +#ifndef HSS_METRICS_H +#define HSS_METRICS_H + +#include "ogs-metrics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* GLOBAL */ +typedef enum hss_metric_type_global_s { + HSS_METR_GLOB_GAUGE_IMSI, + HSS_METR_GLOB_GAUGE_IMPI, + HSS_METR_GLOB_GAUGE_IMPU, + _HSS_METR_GLOB_MAX, +} hss_metric_type_global_t; +extern ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; + +int hss_metrics_init_inst_global(void); +int hss_metrics_free_inst_global(void); + +static inline void hss_metrics_inst_global_set(hss_metric_type_global_t t, int val) +{ ogs_metrics_inst_set(hss_metrics_inst_global[t], val); } +static inline void hss_metrics_inst_global_add(hss_metric_type_global_t t, int val) +{ ogs_metrics_inst_add(hss_metrics_inst_global[t], val); } +static inline void hss_metrics_inst_global_inc(hss_metric_type_global_t t) +{ ogs_metrics_inst_inc(hss_metrics_inst_global[t]); } +static inline void hss_metrics_inst_global_dec(hss_metric_type_global_t t) +{ ogs_metrics_inst_dec(hss_metrics_inst_global[t]); } + +void hss_metrics_init(void); +void hss_metrics_final(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HSS_METRICS_H */ From 6814de5c5788838f9a101bebe7d7a2c75ff83860 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@Sukchanui-MacBookPro.local> Date: Tue, 9 Apr 2024 11:18:57 +0900 Subject: [PATCH 079/323] udpate it --- src/amf/gmm-sm.c | 26 ++++--- tests/common/ngap-build.c | 9 ++- tests/registration/identity-test.c | 117 +++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 14 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 6231e633cb..9b4b42f397 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1475,6 +1475,20 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_IDENTITY_RESPONSE: + if (amf_ue->nas.message_type != OGS_NAS_5GS_REGISTRATION_REQUEST && + amf_ue->nas.message_type != OGS_NAS_5GS_SERVICE_REQUEST) { + ogs_error( + "No Received Registration Request or Service Request"); + r = ngap_send_error_indication2( + ran_ue, + NGAP_Cause_PR_protocol, + NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + OGS_FSM_TRAN(s, gmm_state_exception); + break; + } + CLEAR_AMF_UE_TIMER(amf_ue->t3570); ogs_info("Identity response"); @@ -1484,17 +1498,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_error("gmm_handle_identity_response() " "failed [%d] in type [%d]", gmm_cause, amf_ue->nas.message_type); - if (amf_ue->nas.message_type == - OGS_NAS_5GS_REGISTRATION_REQUEST || - amf_ue->nas.message_type == - OGS_NAS_5GS_SERVICE_REQUEST) - r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); - else - r = ngap_send_error_indication2( - ran_ue, - NGAP_Cause_PR_protocol, - NGAP_CauseProtocol_semantic_error); - + r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index 82e837b466..03a3111730 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -2669,14 +2669,17 @@ ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i) "000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209" "00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078" "954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10" - "de5f5f765f000000 0000000000000000 00000000000000" - "", + "de5f5f765f000000 0000000000000000 00000000000000", + "000f" + "4049000005005500 0200030026001b1a 7e049a2167e5027e 005c000d0199f907" + "00000000c0000000 0010007900135099 f907000000010099 f907000001e9b19f" + "fa005a4001180070 400100", "", }; uint16_t len[TEST_NGAP_MAX_MESSAGE] = { 119, - 0, + 77, 0, }; char hexbuf[OGS_HUGE_LEN]; diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 6b8de05859..46d132cdcc 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -354,11 +354,128 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test2_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 29); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Identity response */ + test_ue->ran_ue_ngap_id = 1; + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ErrorIndication */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_ErrorIndication, + test_ue->ngap_procedure_code); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + abts_suite *test_identity(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, test2_func, NULL); return suite; } From 09410eba088378d8fa850d0408cab3d1d9b773a2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@Sukchanui-MacBookPro.local> Date: Tue, 9 Apr 2024 11:20:16 +0900 Subject: [PATCH 080/323] Revert "udpate it" This reverts commit 6814de5c5788838f9a101bebe7d7a2c75ff83860. --- src/amf/gmm-sm.c | 26 +++---- tests/common/ngap-build.c | 9 +-- tests/registration/identity-test.c | 117 ----------------------------- 3 files changed, 14 insertions(+), 138 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 9b4b42f397..6231e633cb 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1475,20 +1475,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_IDENTITY_RESPONSE: - if (amf_ue->nas.message_type != OGS_NAS_5GS_REGISTRATION_REQUEST && - amf_ue->nas.message_type != OGS_NAS_5GS_SERVICE_REQUEST) { - ogs_error( - "No Received Registration Request or Service Request"); - r = ngap_send_error_indication2( - ran_ue, - NGAP_Cause_PR_protocol, - NGAP_CauseProtocol_semantic_error); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - OGS_FSM_TRAN(s, gmm_state_exception); - break; - } - CLEAR_AMF_UE_TIMER(amf_ue->t3570); ogs_info("Identity response"); @@ -1498,7 +1484,17 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_error("gmm_handle_identity_response() " "failed [%d] in type [%d]", gmm_cause, amf_ue->nas.message_type); - r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); + if (amf_ue->nas.message_type == + OGS_NAS_5GS_REGISTRATION_REQUEST || + amf_ue->nas.message_type == + OGS_NAS_5GS_SERVICE_REQUEST) + r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); + else + r = ngap_send_error_indication2( + ran_ue, + NGAP_Cause_PR_protocol, + NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index 03a3111730..82e837b466 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -2669,17 +2669,14 @@ ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i) "000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209" "00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078" "954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10" - "de5f5f765f000000 0000000000000000 00000000000000", - "000f" - "4049000005005500 0200030026001b1a 7e049a2167e5027e 005c000d0199f907" - "00000000c0000000 0010007900135099 f907000000010099 f907000001e9b19f" - "fa005a4001180070 400100", + "de5f5f765f000000 0000000000000000 00000000000000" + "", "", }; uint16_t len[TEST_NGAP_MAX_MESSAGE] = { 119, - 77, + 0, 0, }; char hexbuf[OGS_HUGE_LEN]; diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 46d132cdcc..6b8de05859 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -354,128 +354,11 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } -static void test2_func(abts_case *tc, void *data) -{ - int rv; - ogs_socknode_t *ngap; - ogs_socknode_t *gtpu; - ogs_pkbuf_t *gmmbuf; - ogs_pkbuf_t *gsmbuf; - ogs_pkbuf_t *nasbuf; - ogs_pkbuf_t *sendbuf; - ogs_pkbuf_t *recvbuf; - ogs_ngap_message_t message; - int i; - - ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; - test_ue_t *test_ue = NULL; - test_sess_t *sess = NULL; - test_bearer_t *qos_flow = NULL; - - bson_t *doc = NULL; - - /* Setup Test UE & Session Context */ - memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); - - mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; - mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; - mobile_identity_suci.routing_indicator1 = 0; - mobile_identity_suci.routing_indicator2 = 0xf; - mobile_identity_suci.routing_indicator3 = 0xf; - mobile_identity_suci.routing_indicator4 = 0xf; - mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; - mobile_identity_suci.home_network_pki_value = 0; - - test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); - ogs_assert(test_ue); - - test_ue->nr_cgi.cell_id = 0x40001; - - test_ue->nas.registration.tsc = 0; - test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; - test_ue->nas.registration.follow_on_request = 1; - test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; - - test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; - test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; - - /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); - ABTS_PTR_NOTNULL(tc, ngap); - - /* gNB connects to UPF */ - gtpu = test_gtpu_server(1, AF_INET); - ABTS_PTR_NOTNULL(tc, gtpu); - - /* Send NG-Setup Reqeust */ - sendbuf = testngap_build_ng_setup_request(0x4000, 29); - ABTS_PTR_NOTNULL(tc, sendbuf); - rv = testgnb_ngap_send(ngap, sendbuf); - ABTS_INT_EQUAL(tc, OGS_OK, rv); - - /* Receive NG-Setup Response */ - recvbuf = testgnb_ngap_read(ngap); - ABTS_PTR_NOTNULL(tc, recvbuf); - testngap_recv(test_ue, recvbuf); - - /********** Insert Subscriber in Database */ - doc = test_db_new_simple(test_ue); - ABTS_PTR_NOTNULL(tc, doc); - ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); - - /* Send Identity response */ - test_ue->ran_ue_ngap_id = 1; - gmmbuf = testgmm_build_identity_response(test_ue); - ABTS_PTR_NOTNULL(tc, gmmbuf); - sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, - NGAP_RRCEstablishmentCause_mo_Signalling, false, true); - ABTS_PTR_NOTNULL(tc, sendbuf); - rv = testgnb_ngap_send(ngap, sendbuf); - ABTS_INT_EQUAL(tc, OGS_OK, rv); - - /* Receive ErrorIndication */ - recvbuf = testgnb_ngap_read(ngap); - ABTS_PTR_NOTNULL(tc, recvbuf); - testngap_recv(test_ue, recvbuf); - ABTS_INT_EQUAL(tc, - NGAP_ProcedureCode_id_ErrorIndication, - test_ue->ngap_procedure_code); - - /* Receive UEContextReleaseCommand */ - recvbuf = testgnb_ngap_read(ngap); - ABTS_PTR_NOTNULL(tc, recvbuf); - testngap_recv(test_ue, recvbuf); - ABTS_INT_EQUAL(tc, - NGAP_ProcedureCode_id_UEContextRelease, - test_ue->ngap_procedure_code); - - /* Send UEContextReleaseComplete */ - sendbuf = testngap_build_ue_context_release_complete(test_ue); - ABTS_PTR_NOTNULL(tc, sendbuf); - rv = testgnb_ngap_send(ngap, sendbuf); - ABTS_INT_EQUAL(tc, OGS_OK, rv); - - ogs_msleep(300); - - /********** Remove Subscriber in Database */ - ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); - - /* gNB disonncect from UPF */ - testgnb_gtpu_close(gtpu); - - /* gNB disonncect from AMF */ - testgnb_ngap_close(ngap); - - /* Clear Test UE Context */ - test_ue_remove(test_ue); -} - abts_suite *test_identity(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); - abts_run_test(suite, test2_func, NULL); return suite; } From cd76dc641d977b9677f7eca66cfd916fca0a8e54 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Apr 2024 16:20:18 +0900 Subject: [PATCH 081/323] [SEC] Crash and Protocol Violations The AMF will crash on the following locations when it receives a sequence of NAS messages from a UE. - ogs_nas_encrypt: Assertion `pkbuf->len' failed. (../lib/nas/common/security.c:86) - gmm_state_authentication: Assertion `r != OGS_ERROR' failed. (../src/amf/gmm-sm.c:1561) Besides the crashes found above, an incorrect protocol transition is identified in Open5GS. Without any Registration/Attach Request message, when the Identity Response message sent, the Core Network responds with an Authentication Request message. According to the standard, only the Registration/Attach Request message can start a state transition from the 5GMM/EMM-DEREGISTERED state to the 5GMM/EMM-COMMON-PROCEDURE-INITIATED. So I've modified the relevant code to address these issues. --- src/amf/context.c | 2 +- src/amf/gmm-sm.c | 24 +++--- src/amf/nas-security.c | 4 + src/amf/nudm-handler.c | 1 + src/mme/emm-sm.c | 10 +++ src/mme/nas-security.c | 4 + src/udr/nudr-handler.c | 2 + tests/attach/issues-test.c | 113 ++++++++++++++++++++++++++++ tests/common/ngap-build.c | 2 +- tests/registration/identity-test.c | 117 +++++++++++++++++++++++++++++ 10 files changed, 266 insertions(+), 13 deletions(-) diff --git a/src/amf/context.c b/src/amf/context.c index b8e7713b62..7fa8e183b6 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2852,7 +2852,7 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue) s_nssai[amf_ue->rejected_nssai.num_of_s_nssai]; bool ta_supported = false; - + ogs_assert(amf_ue->num_of_slice); slice = ogs_slice_find_by_s_nssai( amf_ue->slice, amf_ue->num_of_slice, (ogs_s_nssai_t *)requested); diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 6231e633cb..64a20e785a 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1475,6 +1475,18 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_IDENTITY_RESPONSE: + if (amf_ue->nas.message_type == 0) { + ogs_warn("No Received NAS message"); + r = ngap_send_error_indication2( + ran_ue, + NGAP_Cause_PR_protocol, + NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + OGS_FSM_TRAN(s, gmm_state_exception); + break; + } + CLEAR_AMF_UE_TIMER(amf_ue->t3570); ogs_info("Identity response"); @@ -1484,17 +1496,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_error("gmm_handle_identity_response() " "failed [%d] in type [%d]", gmm_cause, amf_ue->nas.message_type); - if (amf_ue->nas.message_type == - OGS_NAS_5GS_REGISTRATION_REQUEST || - amf_ue->nas.message_type == - OGS_NAS_5GS_SERVICE_REQUEST) - r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); - else - r = ngap_send_error_indication2( - ran_ue, - NGAP_Cause_PR_protocol, - NGAP_CauseProtocol_semantic_error); - + r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); diff --git a/src/amf/nas-security.c b/src/amf/nas-security.c index 8879ae5894..aaf38b1d25 100644 --- a/src/amf/nas-security.c +++ b/src/amf/nas-security.c @@ -178,6 +178,10 @@ int nas_5gs_security_decode(amf_ue_t *amf_ue, if (security_header_type.ciphered) { /* decrypt NAS message */ + if (pkbuf->len == 0) { + ogs_error("Cannot decrypt Malformed NAS Message"); + return OGS_ERROR; + } ogs_nas_encrypt(amf_ue->selected_enc_algorithm, amf_ue->knas_enc, amf_ue->ul_count.i32, amf_ue->nas.access_type, diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index 1eee28157a..fdea91eecc 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -199,6 +199,7 @@ int amf_nudm_sdm_handle_provisioned( continue; } + ogs_assert(amf_ue->num_of_slice); slice = ogs_slice_find_by_s_nssai( amf_ue->slice, amf_ue->num_of_slice, &s_nssai); diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index c35b142f06..340fda7df0 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -390,6 +390,16 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, switch (message->emm.h.message_type) { case OGS_NAS_EPS_IDENTITY_RESPONSE: + if (mme_ue->nas_eps.type == 0) { + ogs_warn("No Received NAS message"); + r = s1ap_send_error_indication2(mme_ue, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + OGS_FSM_TRAN(s, emm_state_exception); + break; + } + ogs_info("Identity response"); CLEAR_MME_UE_TIMER(mme_ue->t3470); diff --git a/src/mme/nas-security.c b/src/mme/nas-security.c index 498dd8d6b0..c60eda2f8f 100644 --- a/src/mme/nas-security.c +++ b/src/mme/nas-security.c @@ -223,6 +223,10 @@ int nas_eps_security_decode(mme_ue_t *mme_ue, if (security_header_type.ciphered) { /* decrypt NAS message */ + if (pkbuf->len == 0) { + ogs_error("Cannot decrypt Malformed NAS Message"); + return OGS_ERROR; + } ogs_nas_encrypt(mme_ue->selected_enc_algorithm, mme_ue->knas_enc, mme_ue->ul_count.i32, NAS_SECURITY_BEARER, OGS_NAS_SECURITY_UPLINK_DIRECTION, pkbuf); diff --git a/src/udr/nudr-handler.c b/src/udr/nudr-handler.c index 07c78ea4ac..5421f6c7e8 100644 --- a/src/udr/nudr-handler.c +++ b/src/udr/nudr-handler.c @@ -727,6 +727,7 @@ bool udr_nudr_dr_handle_subscription_provisioned( goto cleanup; }; + ogs_assert(subscription_data.num_of_slice); slice_data = ogs_slice_find_by_s_nssai( subscription_data.slice, subscription_data.num_of_slice, &recvmsg->param.s_nssai); @@ -1136,6 +1137,7 @@ bool udr_nudr_dr_handle_policy_data( goto cleanup; } + ogs_assert(subscription_data.num_of_slice); slice_data = ogs_slice_find_by_s_nssai( subscription_data.slice, subscription_data.num_of_slice, &recvmsg->param.s_nssai); diff --git a/tests/attach/issues-test.c b/tests/attach/issues-test.c index bef4c6de27..b1fd2fd420 100644 --- a/tests/attach/issues-test.c +++ b/tests/attach/issues-test.c @@ -1862,6 +1862,118 @@ static void issues_2287_v264_func(abts_case *tc, void *data) test_ue_remove_all(); } +static void pull_3122_v270_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf0; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + emmbuf = testemm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ErrorIndication */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + abts_suite *test_issues(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -1869,6 +1981,7 @@ abts_suite *test_issues(abts_suite *suite) abts_run_test(suite, issues_1431_func, NULL); abts_run_test(suite, issues_2287_v263_func, NULL); abts_run_test(suite, issues_2287_v264_func, NULL); + abts_run_test(suite, pull_3122_v270_func, NULL); return suite; } diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index 82e837b466..1a75350ee4 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -2669,7 +2669,7 @@ ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i) "000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209" "00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078" "954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10" - "de5f5f765f000000 0000000000000000 00000000000000" + "de5f5f765f000000 0000000000000000 00000000000000", "", "", diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 6b8de05859..17fd9ac53b 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -354,11 +354,128 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void pull_3122_v270_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 29); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Identity response */ + test_ue->ran_ue_ngap_id = 1; + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ErrorIndication */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_ErrorIndication, + test_ue->ngap_procedure_code); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + abts_suite *test_identity(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, pull_3122_v270_func, NULL); return suite; } From 3cfa8ba30115c6d5aec7a5b3194519a3d1fdd7a2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 13 Apr 2024 13:22:19 +0900 Subject: [PATCH 082/323] [AMF/MME] NAS message in an invaild state (#3131) In InitialUEMessage, send a NAS message with a message type other than Registration Request, Deregistration Request, or Service Request, the following messages from UE will not be accepted. We found this issue in not only the initial state but multiple states. We believe if an attacker has the ability to inject a NAS message to the core, it can perform a DoS attack on the victim UE. So, I've fixed that The MME/AMF deletes MME_UE_S1AP_ID/AMF_UE_NGAP_ID, and will not accept any following messages from the UE. --- src/amf/ngap-path.c | 31 +++++++++++++++++++++++++++ src/mme/s1ap-handler.c | 12 ++++------- src/mme/s1ap-path.c | 34 ++++++++++++++++++++++++++++++ tests/attach/issues-test.c | 4 ++++ tests/registration/identity-test.c | 4 ++++ 5 files changed, 77 insertions(+), 8 deletions(-) diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index b7094a0536..0c3488d247 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -200,6 +200,7 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, default: ogs_error("Not implemented(security header type:0x%x)", sh->security_header_type); + ran_ue_remove(ran_ue); return OGS_ERROR; } @@ -207,12 +208,39 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, if (nas_5gs_security_decode(ran_ue->amf_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); + ran_ue_remove(ran_ue); return OGS_ERROR; } } h = (ogs_nas_5gmm_header_t *)nasbuf->data; ogs_assert(h); + if (procedureCode == NGAP_ProcedureCode_id_InitialUEMessage) { + if (h->extended_protocol_discriminator != + OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM) { + + ogs_error("Invalid extended_protocol_discriminator [%d]", + h->extended_protocol_discriminator); + + ogs_pkbuf_free(nasbuf); + ran_ue_remove(ran_ue); + + return OGS_ERROR; + } + + if (h->message_type != OGS_NAS_5GS_REGISTRATION_REQUEST && + h->message_type != OGS_NAS_5GS_SERVICE_REQUEST && + h->message_type != OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE) { + + ogs_error("Invalid 5GMM message type [%d]", h->message_type); + + ogs_pkbuf_free(nasbuf); + ran_ue_remove(ran_ue); + + return OGS_ERROR; + } + } + if (h->extended_protocol_discriminator == OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM) { e = amf_event_new(AMF_EVENT_5GMM_MESSAGE); @@ -247,7 +275,10 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, } else { ogs_error("Unknown NAS Protocol discriminator 0x%02x", h->extended_protocol_discriminator); + ogs_pkbuf_free(nasbuf); + ran_ue_remove(ran_ue); + return OGS_ERROR; } } diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 8f21475638..dff401dedf 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -586,10 +586,8 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id, enb_ue->saved.tai.tac, enb_ue->saved.e_cgi.cell_id); - r = s1ap_send_to_nas(enb_ue, - S1AP_ProcedureCode_id_initialUEMessage, NAS_PDU); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + ogs_expect(OGS_OK == s1ap_send_to_nas( + enb_ue, S1AP_ProcedureCode_id_initialUEMessage, NAS_PDU)); } void s1ap_handle_uplink_nas_transport( @@ -777,10 +775,8 @@ void s1ap_handle_uplink_nas_transport( ogs_error("No UE Context in UplinkNASTransport"); } - r = s1ap_send_to_nas(enb_ue, - S1AP_ProcedureCode_id_uplinkNASTransport, NAS_PDU); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + ogs_expect(OGS_OK == s1ap_send_to_nas( + enb_ue, S1AP_ProcedureCode_id_uplinkNASTransport, NAS_PDU)); } void s1ap_handle_ue_capability_info_indication( diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index 2123aad177..c47bb5e37e 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -207,6 +207,7 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, default: ogs_error("Not implemented(security header type:0x%x)", sh->security_header_type); + enb_ue_remove(enb_ue); return OGS_ERROR; } @@ -214,12 +215,42 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, if (nas_eps_security_decode(enb_ue->mme_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); + enb_ue_remove(enb_ue); return OGS_ERROR; } } h = (ogs_nas_emm_header_t *)nasbuf->data; ogs_assert(h); + + if (procedureCode == S1AP_ProcedureCode_id_initialUEMessage) { + if (h->protocol_discriminator != OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM) { + + ogs_error("Invalid protocol_discriminator [%d]", + h->protocol_discriminator); + + ogs_pkbuf_free(nasbuf); + enb_ue_remove(enb_ue); + + return OGS_ERROR; + } + + if (h->security_header_type != + OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE && + h->message_type != OGS_NAS_EPS_ATTACH_REQUEST && + h->message_type != OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST && + h->message_type != OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST && + h->message_type != OGS_NAS_EPS_DETACH_REQUEST) { + + ogs_error("Invalid EMM message type [%d]", h->message_type); + + ogs_pkbuf_free(nasbuf); + enb_ue_remove(enb_ue); + + return OGS_ERROR; + } + } + if (h->protocol_discriminator == OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM) { int rv; e = mme_event_new(MME_EVENT_EMM_MESSAGE); @@ -255,7 +286,10 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, } else { ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x", h->protocol_discriminator); + ogs_pkbuf_free(nasbuf); + enb_ue_remove(enb_ue); + return OGS_ERROR; } } diff --git a/tests/attach/issues-test.c b/tests/attach/issues-test.c index b1fd2fd420..316737a17c 100644 --- a/tests/attach/issues-test.c +++ b/tests/attach/issues-test.c @@ -1862,6 +1862,7 @@ static void issues_2287_v264_func(abts_case *tc, void *data) test_ue_remove_all(); } +#if 0 /* Deprecated to resolve issue #3131 */ static void pull_3122_v270_func(abts_case *tc, void *data) { int rv; @@ -1973,6 +1974,7 @@ static void pull_3122_v270_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +#endif abts_suite *test_issues(abts_suite *suite) { @@ -1981,7 +1983,9 @@ abts_suite *test_issues(abts_suite *suite) abts_run_test(suite, issues_1431_func, NULL); abts_run_test(suite, issues_2287_v263_func, NULL); abts_run_test(suite, issues_2287_v264_func, NULL); +#if 0 /* Deprecated to resolve issue #3131 */ abts_run_test(suite, pull_3122_v270_func, NULL); +#endif return suite; } diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 17fd9ac53b..e80bb5836e 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -354,6 +354,7 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +#if 0 /* Deprecated to resolve issue #3131 */ static void pull_3122_v270_func(abts_case *tc, void *data) { int rv; @@ -469,13 +470,16 @@ static void pull_3122_v270_func(abts_case *tc, void *data) /* Clear Test UE Context */ test_ue_remove(test_ue); } +#endif abts_suite *test_identity(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); +#if 0 /* Deprecated to resolve issue #3131 */ abts_run_test(suite, pull_3122_v270_func, NULL); +#endif return suite; } From 2b6369e9d997eb8eb158e3803e3ae4f4d207cd4d Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 13 Apr 2024 15:01:32 +0900 Subject: [PATCH 083/323] [SMF] crash when malformed NAS message (#3132) A malformed PDU Session Modification Request is sent from UE after Registration Complete. ``` Crash 1: 04/12 15:00:44.031: [amf] INFO: [imsi-999700000000001:1:11][0:0:NULL] /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify (../src/amf/nsmf-handler.c:837) 04/12 15:00:46.569: [nas] FATAL: ogs_nas_parse_qos_flow_descriptions: Assertion `descriptions->length' failed. (../lib/nas/5gs/types.c:486) 04/12 15:00:46.569: [core] FATAL: backtrace() returned 11 addresses (../lib/core/ogs-abort.c:37) ../src/smf/../../lib/nas/5gs/libogsnas-5gs.so.2(ogs_nas_parse_qos_flow_descriptions+0x162) [0x7e6e7a5a4e5d] ../src/smf/open5gs-smfd(+0x8c6ec) [0x5dd6c333d6ec] ../src/smf/open5gs-smfd(+0x2d69b) [0x5dd6c32de69b] ../src/smf/../../lib/core/libogscore.so.2(ogs_fsm_dispatch+0x119) [0x7e6e7b216c0c] ../src/smf/open5gs-smfd(+0x288b3) [0x5dd6c32d98b3] ../src/smf/../../lib/core/libogscore.so.2(ogs_fsm_dispatch+0x119) [0x7e6e7b216c0c] ../src/smf/open5gs-smfd(+0xf2d8) [0x5dd6c32c02d8] ../src/smf/../../lib/core/libogscore.so.2(+0x1197a) [0x7e6e7b20797a] /lib/x86_64-linux-gnu/libc.so.6(+0x94ac3) [0x7e6e7a094ac3] /lib/x86_64-linux-gnu/libc.so.6(+0x126850) [0x7e6e7a126850] 04/12 15:00:46.613: [app] ERROR: Signal-NUM[17] received (Child status change) (../src/main.c:81) 04/12 15:00:46.613: [sbi] WARNING: [92] HTTP/2 stream 19 was not closed cleanly before end of the underlying stream (../lib/sbi/client.c:626) 04/12 15:00:46.613: [scp] WARNING: response_handler() failed [-1] (../src/scp/sbi-path.c:539) 04/12 15:00:46.613: [amf] ERROR: [1:0] No SmContextUpdateError [500] (../src/amf/nsmf-handler.c:866) 04/12 15:00:46.613: [amf] ERROR: AMF_SESS_CLEAR (../src/amf/amf-sm.c:484) 04/12 15:00:46.613: [amf] INFO: [Removed] Number of AMF-Sessions is now 0 (../src/amf/context.c:2551) 04/12 15:00:50.596: [nrf] WARNING: [c466ec64-f8fe-41ee-a888-194dc4363612] No heartbeat (../src/nrf/nrf-sm.c:260) 04/12 15:00:50.596: [nrf] INFO: [c466ec64-f8fe-41ee-a888-194dc4363612] NF de-registered (../src/nrf/nf-sm.c:205) 04/12 15:00:50.596: [sbi] INFO: [c466ec64-f8fe-41ee-a888-194dc4363612:1] NF removed (../lib/sbi/nnrf-handler.c:750) 04/12 15:00:50.596: [sbi] INFO: [c466ec64-f8fe-41ee-a888-194dc4363612:1] NF removed (../lib/sbi/nnrf-handler.c:750) 04/12 15:00:55.094: [pfcp] WARNING: [10] LOCAL No Reponse. Give up! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:599) 04/12 15:00:55.094: [upf] WARNING: No Heartbeat from SMF [127.0.0.4]:8805 (../src/upf/pfcp-sm.c:329) 04/12 15:00:55.094: [upf] INFO: PFCP de-associated [127.0.0.4]:8805 (../src/upf/pfcp-sm.c:199) 04/12 15:01:02.599: [pfcp] WARNING: [11] LOCAL No Reponse. Give up! for step 1 type 5 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:599) 04/12 15:01:06.098: [upf] WARNING: Retry to association with peer [127.0.0.4]:8805 failed (../src/upf/pfcp-sm.c:107) Crash 2: 04/12 15:16:39.748: [amf] INFO: [imsi-999700000000001:1:11][0:0:NULL] /nsmf-pdusession/v1/sm-contexts/{smContextRef}/modify (../src/amf/nsmf-handler.c:837) 04/12 15:16:42.155: [nas] FATAL: ogs_nas_parse_qos_rules: Assertion `size+sizeof(rule->flow.flags) <= length' failed. (../lib/nas/5gs/types.c:961) 04/12 15:16:42.155: [core] FATAL: backtrace() returned 11 addresses (../lib/core/ogs-abort.c:37) ../src/smf/../../lib/nas/5gs/libogsnas-5gs.so.2(ogs_nas_parse_qos_rules+0x12d1) [0x7d1affbd2d72] ../src/smf/open5gs-smfd(+0x8b446) [0x629a57861446] ../src/smf/open5gs-smfd(+0x2d69b) [0x629a5780369b] ../src/smf/../../lib/core/libogscore.so.2(ogs_fsm_dispatch+0x119) [0x7d1affd05c0c] ../src/smf/open5gs-smfd(+0x288b3) [0x629a577fe8b3] ../src/smf/../../lib/core/libogscore.so.2(ogs_fsm_dispatch+0x119) [0x7d1affd05c0c] ../src/smf/open5gs-smfd(+0xf2d8) [0x629a577e52d8] ../src/smf/../../lib/core/libogscore.so.2(+0x1197a) [0x7d1affcf697a] /lib/x86_64-linux-gnu/libc.so.6(+0x94ac3) [0x7d1afea94ac3] /lib/x86_64-linux-gnu/libc.so.6(+0x126850) [0x7d1afeb26850] 04/12 15:16:42.199: [sbi] WARNING: [92] HTTP/2 stream 13 was not closed cleanly before end of the underlying stream (../lib/sbi/client.c:626) 04/12 15:16:42.199: [scp] WARNING: response_handler() failed [-1] (../src/scp/sbi-path.c:539) 04/12 15:16:42.199: [app] ERROR: Signal-NUM[17] received (Child status change) (../src/main.c:81) 04/12 15:16:42.200: [amf] ERROR: [1:0] No SmContextUpdateError [500] (../src/amf/nsmf-handler.c:866) 04/12 15:16:42.200: [amf] ERROR: AMF_SESS_CLEAR (../src/amf/amf-sm.c:484) 04/12 15:16:42.200: [amf] INFO: [Removed] Number of AMF-Sessions is now 0 (../src/amf/context.c:2551) 04/12 15:16:49.858: [nrf] WARNING: [23f1aee2-f901-41ee-a488-85a58e1e3420] No heartbeat (../src/nrf/nrf-sm.c:260) 04/12 15:16:49.858: [nrf] INFO: [23f1aee2-f901-41ee-a488-85a58e1e3420] NF de-registered (../src/nrf/nf-sm.c:205) 04/12 15:16:49.859: [sbi] INFO: [23f1aee2-f901-41ee-a488-85a58e1e3420:1] NF removed (../lib/sbi/nnrf-handler.c:750) 04/12 15:16:49.859: [sbi] INFO: [23f1aee2-f901-41ee-a488-85a58e1e3420:1] NF removed (../lib/sbi/nnrf-handler.c:750) 04/12 15:16:59.364: [pfcp] WARNING: [5] LOCAL No Reponse. Give up! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:599) 04/12 15:16:59.364: [upf] WARNING: No Heartbeat from SMF [127.0.0.4]:8805 (../src/upf/pfcp-sm.c:329) 04/12 15:16:59.364: [upf] INFO: PFCP de-associated [127.0.0.4]:8805 (../src/upf/pfcp-sm.c:199) ``` So, I've fixed it. --- lib/nas/5gs/types.c | 220 ++++++++++++++++++++++++++++++++---------- src/smf/gsm-handler.c | 34 ++++--- 2 files changed, 189 insertions(+), 65 deletions(-) diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index ce0d65f512..cf576a64c9 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -483,35 +483,59 @@ int ogs_nas_parse_qos_flow_descriptions( ogs_assert(description); ogs_assert(descriptions); - ogs_assert(descriptions->length); + + if (descriptions->length == 0) { + ogs_error("Length is 0"); + goto cleanup; + } + if (descriptions->buffer == NULL) { + ogs_error("Buffer is NULL"); + goto cleanup; + } + length = descriptions->length; - ogs_assert(descriptions->buffer); buffer = descriptions->buffer; size = 0; while (size < length) { memset(description, 0, sizeof(*description)); - ogs_assert(size+3 <= length); + if (size+3 > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(description, buffer+size, 3); size += 3; for (i = 0; i < description->num_of_parameter && i < OGS_NAS_MAX_NUM_OF_QOS_FLOW_PARAMETER; i++) { - ogs_assert(size+sizeof(description->param[i].identifier) <= length); + if (size+sizeof(description->param[i].identifier) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&description->param[i].identifier, buffer+size, sizeof(description->param[i].identifier)); size += sizeof(description->param[i].identifier); - ogs_assert(size+sizeof(description->param[i].len) <= length); + if (size+sizeof(description->param[i].len) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&description->param[i].len, buffer+size, sizeof(description->param[i].len)); size += sizeof(description->param[i].len); switch(description->param[i].identifier) { case OGS_NAX_QOS_FLOW_PARAMETER_ID_5QI: - ogs_assert(description->param[i].len == 1); - ogs_assert(size+description->param[i].len <= length); + if (description->param[i].len != 1) { + ogs_error("Invalid len[%d]", description->param[i].len); + goto cleanup; + } + if (size+description->param[i].len > length) { + ogs_error("Overflow: len[%d] length[%d]", + description->param[i].len, length); + goto cleanup; + } memcpy(&description->param[i].qos_index, buffer+size, description->param[i].len); size += description->param[i].len; @@ -521,8 +545,15 @@ int ogs_nas_parse_qos_flow_descriptions( case OGS_NAX_QOS_FLOW_PARAMETER_ID_GFBR_DOWNLINK: case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_UPLINK: case OGS_NAX_QOS_FLOW_PARAMETER_ID_MFBR_DOWNLINK: - ogs_assert(description->param[i].len == 3); - ogs_assert(size+description->param[i].len <= length); + if (description->param[i].len != 3) { + ogs_error("Invalid len[%d]", description->param[i].len); + goto cleanup; + } + if (size+description->param[i].len > length) { + ogs_error("Overflow: len[%d] length[%d]", + description->param[i].len, length); + goto cleanup; + } memcpy(&description->param[i].br, buffer+size, description->param[i].len); description->param[i].br.value = @@ -530,15 +561,17 @@ int ogs_nas_parse_qos_flow_descriptions( size += description->param[i].len; break; default: - ogs_fatal("Unknown qos_flow parameter identifier [%d]", + ogs_error("Unknown qos_flow parameter identifier [%d]", description->param[i].identifier); - ogs_assert_if_reached(); + goto cleanup; } } description++; } +cleanup: + return (int)(description-first); } @@ -777,28 +810,50 @@ int ogs_nas_parse_qos_rules( ogs_assert(rule); ogs_assert(rules); - ogs_assert(rules->length); + + if (rules->length == 0) { + ogs_error("Length is 0"); + goto cleanup; + } + if (rules->buffer == NULL) { + ogs_error("Buffer is NULL"); + goto cleanup; + } + length = rules->length; - ogs_assert(rules->buffer); buffer = rules->buffer; size = 0; while (size < length) { memset(rule, 0, sizeof(*rule)); - ogs_assert(size+sizeof(rule->identifier) <= length); + if (size+sizeof(rule->identifier) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->identifier, buffer+size, sizeof(rule->identifier)); size += sizeof(rule->identifier); - ogs_assert(size+sizeof(rule->length) <= length); + if (size+sizeof(rule->length) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->length, buffer+size, sizeof(rule->length)); rule->length = be16toh(rule->length); size += sizeof(rule->length); - ogs_assert(size+sizeof(rule->flags) <= length); + if (size+sizeof(rule->flags) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->flags, buffer+size, sizeof(rule->flags)); size += sizeof(rule->flags); + if (rule->code == 0 || rule->code == 7) { /* Reserved */ + ogs_error("Reserved Rule Code [%d]", rule->code); + goto cleanup; + } + if (rule->code == OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE || rule->code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) { if (rule->num_of_packet_filter != 0) { @@ -806,12 +861,16 @@ int ogs_nas_parse_qos_rules( "and number of packet filter[%d]", rule->code, rule->num_of_packet_filter); rule->num_of_packet_filter = 0; + goto cleanup; } } for (i = 0; i < rule->num_of_packet_filter && i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - ogs_assert(size+sizeof(rule->pf[i].flags) <= length); + if (size+sizeof(rule->pf[i].flags) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->pf[i].flags, buffer+size, sizeof(rule->pf[i].flags)); size += sizeof(rule->pf[i].flags); @@ -819,24 +878,35 @@ int ogs_nas_parse_qos_rules( OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS) continue; - ogs_assert(size+sizeof(rule->pf[i].content.length) <= length); + if (size+sizeof(rule->pf[i].content.length) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->pf[i].content.length, buffer+size, sizeof(rule->pf[i].content.length)); size += sizeof(rule->pf[i].content.length); j = 0; len = 0; while(len < rule->pf[i].content.length) { - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].type) <= length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].type) > length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].type, buffer+size+len, sizeof(rule->pf[i].content.component[j].type)); len += sizeof(rule->pf[i].content.component[j].type); switch(rule->pf[i].content.component[j].type) { case OGS_PACKET_FILTER_PROTOCOL_IDENTIFIER_NEXT_HEADER_TYPE: - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].proto) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].proto) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].proto, buffer+size+len, sizeof(rule->pf[i].content.component[j].proto)); @@ -844,17 +914,25 @@ int ogs_nas_parse_qos_rules( break; case OGS_PACKET_FILTER_IPV4_REMOTE_ADDRESS_TYPE: case OGS_PACKET_FILTER_IPV4_LOCAL_ADDRESS_TYPE: - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].ipv4.addr) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].ipv4.addr) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv4.addr, buffer+size+len, sizeof(rule->pf[i].content.component[j].ipv4.addr)); len += sizeof(rule->pf[i].content.component[j].ipv4.addr); - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].ipv4.mask) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].ipv4.mask) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv4.mask, buffer+size+len, sizeof(rule->pf[i].content.component[j].ipv4.mask)); @@ -862,18 +940,26 @@ int ogs_nas_parse_qos_rules( break; case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_PREFIX_LENGTH_TYPE: case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_PREFIX_LENGTH_TYPE: - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].ipv6.addr) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].ipv6.addr) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv6.addr, buffer+size+len, sizeof(rule->pf[i].content.component[j].ipv6.addr)); len += sizeof(rule->pf[i].content.component[j].ipv6.addr); - ogs_assert(size+len+ + if (size+len+ sizeof( - rule->pf[i].content.component[j].ipv6.prefixlen) <= - length); + rule->pf[i].content.component[j].ipv6.prefixlen) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv6.prefixlen, buffer+size+len, sizeof( @@ -883,10 +969,14 @@ int ogs_nas_parse_qos_rules( break; case OGS_PACKET_FILTER_IPV6_LOCAL_ADDRESS_TYPE: case OGS_PACKET_FILTER_IPV6_REMOTE_ADDRESS_TYPE: - ogs_assert(size+len+ + if (size+len+ sizeof( - rule->pf[i].content.component[j].ipv6_mask.addr) <= - length); + rule->pf[i].content.component[j].ipv6_mask.addr) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv6_mask.addr, buffer+size+len, sizeof( @@ -894,10 +984,14 @@ int ogs_nas_parse_qos_rules( len += sizeof( rule->pf[i].content.component[j].ipv6_mask.addr); - ogs_assert(size+len+ + if (size+len+ sizeof( - rule->pf[i].content.component[j].ipv6_mask.mask) <= - length); + rule->pf[i].content.component[j].ipv6_mask.mask) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].ipv6_mask.mask, buffer+size+len, sizeof( @@ -907,9 +1001,13 @@ int ogs_nas_parse_qos_rules( break; case OGS_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE: case OGS_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE: - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].port.low) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].port.low) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].port.low, buffer+size+len, sizeof(rule->pf[i].content.component[j].port.low)); @@ -919,9 +1017,13 @@ int ogs_nas_parse_qos_rules( break; case OGS_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE: case OGS_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE: - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].port.low) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].port.low) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].port.low, buffer+size+len, sizeof(rule->pf[i].content.component[j].port.low)); @@ -929,9 +1031,13 @@ int ogs_nas_parse_qos_rules( be16toh(rule->pf[i].content.component[j].port.low); len += sizeof(rule->pf[i].content.component[j].port.low); - ogs_assert(size+len+ - sizeof(rule->pf[i].content.component[j].port.high) <= - length); + if (size+len+ + sizeof(rule->pf[i].content.component[j].port.high) > + length) { + ogs_error("Overflow : size[%d] len[%d] length[%d]", + size, len, length); + goto cleanup; + } memcpy(&rule->pf[i].content.component[j].port.high, buffer+size+len, sizeof(rule->pf[i].content.component[j].port.high)); @@ -942,7 +1048,7 @@ int ogs_nas_parse_qos_rules( default: ogs_error("Unknown Packet Filter Type(%d)", rule->pf[i].content.component[j].type); - return -1; + goto cleanup; } j++; } @@ -954,11 +1060,17 @@ int ogs_nas_parse_qos_rules( rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS && rule->code != OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS) { - ogs_assert(size+sizeof(rule->precedence) <= length); + if (size+sizeof(rule->precedence) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->precedence, buffer+size, sizeof(rule->precedence)); size += sizeof(rule->precedence); - ogs_assert(size+sizeof(rule->flow.flags) <= length); + if (size+sizeof(rule->flow.flags) > length) { + ogs_error("Overflow : size[%d] length[%d]", size, length); + goto cleanup; + } memcpy(&rule->flow.flags, buffer+size, sizeof(rule->flow.flags)); size += sizeof(rule->flow.flags); } @@ -966,6 +1078,8 @@ int ogs_nas_parse_qos_rules( rule++; } +cleanup: + return (int)(rule-first); } diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index d01252611e..48bd5ce834 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -229,7 +229,11 @@ int gsm_handle_pdu_session_modification_request( int num_of_rule = 0; num_of_rule = ogs_nas_parse_qos_rules(qos_rule, requested_qos_rules); - ogs_assert(num_of_rule > 0); + if (!num_of_rule) { + ogs_error("[%s:%d] Invalid modification request", + smf_ue->supi, sess->psi); + goto cleanup; + } for (i = 0; i < num_of_rule; i++) { qos_flow = smf_qos_flow_find_by_qfi( @@ -430,7 +434,11 @@ int gsm_handle_pdu_session_modification_request( num_of_description = ogs_nas_parse_qos_flow_descriptions( qos_flow_description, requested_qos_flow_descriptions); - ogs_assert(num_of_description > 0); + if (!num_of_description) { + ogs_error("[%s:%d] Invalid modification request", + smf_ue->supi, sess->psi); + goto cleanup; + } for (i = 0; i < num_of_description; i++) { qos_flow = smf_qos_flow_find_by_qfi( @@ -478,16 +486,7 @@ int gsm_handle_pdu_session_modification_request( ogs_error("[%s:%d] Invalid modification request [modify:%d]", smf_ue->supi, sess->psi, ogs_list_count(&sess->qos_flow_to_modify_list)); - - n1smbuf = gsm_build_pdu_session_modification_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); - ogs_assert(n1smbuf); - - smf_sbi_send_sm_context_update_error_n1_n2_message( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - n1smbuf, OpenAPI_n2_sm_info_type_NULL, NULL); - - return OGS_ERROR; + goto cleanup; } if (pfcp_flags & OGS_PFCP_MODIFY_REMOVE) { @@ -522,4 +521,15 @@ int gsm_handle_pdu_session_modification_request( OGS_PFCP_MODIFY_UE_REQUESTED|pfcp_flags, 0)); return OGS_OK; + +cleanup: + n1smbuf = gsm_build_pdu_session_modification_reject(sess, + OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); + ogs_assert(n1smbuf); + + smf_sbi_send_sm_context_update_error_n1_n2_message( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + n1smbuf, OpenAPI_n2_sm_info_type_NULL, NULL); + + return OGS_ERROR; } From a6830b30a0093ed2fa9d563445bf67026588a8f2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 13 Apr 2024 19:28:36 +0900 Subject: [PATCH 084/323] [SMF/UPF] Changes subnet configuration (#2975) The way subnet is set up has changed as shown below. ``` <OLD Format> smf: session: - subnet: 10.45.0.1/16 <NEW Format> smf: session: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 ``` For more information, please refer to Pull Request #2975. --- configs/310014.yaml.in | 10 +++-- configs/csfb.yaml.in | 10 +++-- configs/examples/5gc-sepp1-999-70.yaml.in | 10 +++-- configs/examples/5gc-sepp2-001-01.yaml.in | 10 +++-- configs/examples/5gc-sepp3-315-010.yaml.in | 10 +++-- configs/examples/5gc-tls-sepp1-999-70.yaml.in | 10 +++-- configs/examples/5gc-tls-sepp2-001-01.yaml.in | 10 +++-- .../examples/5gc-tls-sepp3-315-010.yaml.in | 10 +++-- configs/examples/gnb-001-01-ue-001-01.yaml.in | 10 +++-- .../examples/gnb-001-01-ue-315-010.yaml.in | 10 +++-- configs/examples/gnb-001-01-ue-999-70.yaml.in | 10 +++-- .../examples/gnb-315-010-ue-001-01.yaml.in | 10 +++-- .../examples/gnb-315-010-ue-315-010.yaml.in | 10 +++-- .../examples/gnb-315-010-ue-999-70.yaml.in | 10 +++-- configs/examples/gnb-999-70-ue-001-01.yaml.in | 10 +++-- .../examples/gnb-999-70-ue-315-010.yaml.in | 10 +++-- configs/examples/gnb-999-70-ue-999-70.yaml.in | 10 +++-- configs/non3gpp.yaml.in | 10 +++-- configs/open5gs/smf.yaml.in | 20 +++++---- configs/open5gs/upf.yaml.in | 15 ++++--- configs/sample.yaml.in | 10 +++-- configs/slice.yaml.in | 10 +++-- configs/srsenb.yaml.in | 10 +++-- configs/volte.yaml.in | 10 +++-- configs/vonr.yaml.in | 10 +++-- lib/pfcp/context.c | 44 ++++++++++++++++++- lib/pfcp/context.h | 2 +- 27 files changed, 202 insertions(+), 109 deletions(-) diff --git a/configs/310014.yaml.in b/configs/310014.yaml.in index 4dfdf030b6..6c4cefcc53 100644 --- a/configs/310014.yaml.in +++ b/configs/310014.yaml.in @@ -109,8 +109,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -189,8 +190,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/csfb.yaml.in b/configs/csfb.yaml.in index d32047148c..0688c928e6 100644 --- a/configs/csfb.yaml.in +++ b/configs/csfb.yaml.in @@ -142,8 +142,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -219,8 +220,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/5gc-sepp1-999-70.yaml.in b/configs/examples/5gc-sepp1-999-70.yaml.in index c0e1312af3..0a84d670f9 100644 --- a/configs/examples/5gc-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-sepp1-999-70.yaml.in @@ -112,8 +112,9 @@ smf: - address: 127.0.1.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,8 +208,9 @@ upf: server: - address: 127.0.1.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.1.7 diff --git a/configs/examples/5gc-sepp2-001-01.yaml.in b/configs/examples/5gc-sepp2-001-01.yaml.in index 46e26d8a57..e8df582352 100644 --- a/configs/examples/5gc-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-sepp2-001-01.yaml.in @@ -112,8 +112,9 @@ smf: - address: 127.0.2.4 port: 9090 session: - - subnet: 10.46.0.1/16 - - subnet: 2001:db8:babe::1/48 + - subnet: 10.46.0.0/16 + gateway: 10.46.0.1 + - subnet: 2001:db8:babe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,9 +208,10 @@ upf: server: - address: 127.0.2.7 session: - - subnet: 10.46.0.1/16 + - subnet: 10.46.0.0/16 + gateway: 10.46.0.1 dev: ogstun2 - - subnet: 2001:db8:babe::1/48 + - subnet: 2001:db8:babe::/48 dev: ogstun2 metrics: server: diff --git a/configs/examples/5gc-sepp3-315-010.yaml.in b/configs/examples/5gc-sepp3-315-010.yaml.in index 8915574e31..cfbb9b7ea4 100644 --- a/configs/examples/5gc-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-sepp3-315-010.yaml.in @@ -112,8 +112,9 @@ smf: - address: 127.0.3.4 port: 9090 session: - - subnet: 10.47.0.1/16 - - subnet: 2001:db8:face::1/48 + - subnet: 10.47.0.0/16 + gateway: 10.47.0.1 + - subnet: 2001:db8:face::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,9 +208,10 @@ upf: server: - address: 127.0.3.7 session: - - subnet: 10.47.0.1/16 + - subnet: 10.47.0.0/16 + gateway: 10.47.0.1 dev: ogstun3 - - subnet: 2001:db8:face::1/48 + - subnet: 2001:db8:face::/48 dev: ogstun3 metrics: server: diff --git a/configs/examples/5gc-tls-sepp1-999-70.yaml.in b/configs/examples/5gc-tls-sepp1-999-70.yaml.in index 1edd26b7c9..523df19c8b 100644 --- a/configs/examples/5gc-tls-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-tls-sepp1-999-70.yaml.in @@ -113,8 +113,9 @@ smf: - address: 127.0.1.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -208,8 +209,9 @@ upf: server: - address: 127.0.1.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.1.7 diff --git a/configs/examples/5gc-tls-sepp2-001-01.yaml.in b/configs/examples/5gc-tls-sepp2-001-01.yaml.in index 9170cd726f..6a2d189af0 100644 --- a/configs/examples/5gc-tls-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-tls-sepp2-001-01.yaml.in @@ -113,8 +113,9 @@ smf: - address: 127.0.2.4 port: 9090 session: - - subnet: 10.46.0.1/16 - - subnet: 2001:db8:babe::1/48 + - subnet: 10.46.0.0/16 + gateway: 10.46.0.1 + - subnet: 2001:db8:babe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -208,9 +209,10 @@ upf: server: - address: 127.0.2.7 session: - - subnet: 10.46.0.1/16 + - subnet: 10.46.0.0/16 + gateway: 10.46.0.1 dev: ogstun2 - - subnet: 2001:db8:babe::1/48 + - subnet: 2001:db8:babe::/48 dev: ogstun2 metrics: server: diff --git a/configs/examples/5gc-tls-sepp3-315-010.yaml.in b/configs/examples/5gc-tls-sepp3-315-010.yaml.in index 945b2b4c72..86f637e34f 100644 --- a/configs/examples/5gc-tls-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-tls-sepp3-315-010.yaml.in @@ -113,8 +113,9 @@ smf: - address: 127.0.3.4 port: 9090 session: - - subnet: 10.47.0.1/16 - - subnet: 2001:db8:face::1/48 + - subnet: 10.47.0.0/16 + gateway: 10.47.0.1 + - subnet: 2001:db8:face::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -208,9 +209,10 @@ upf: server: - address: 127.0.3.7 session: - - subnet: 10.47.0.1/16 + - subnet: 10.47.0.0/16 + gateway: 10.47.0.1 dev: ogstun3 - - subnet: 2001:db8:face::1/48 + - subnet: 2001:db8:face::/48 dev: ogstun3 metrics: server: diff --git a/configs/examples/gnb-001-01-ue-001-01.yaml.in b/configs/examples/gnb-001-01-ue-001-01.yaml.in index 5f132056e9..0813ed2ffb 100644 --- a/configs/examples/gnb-001-01-ue-001-01.yaml.in +++ b/configs/examples/gnb-001-01-ue-001-01.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-001-01-ue-315-010.yaml.in b/configs/examples/gnb-001-01-ue-315-010.yaml.in index 20f8756d64..31f6f263e1 100644 --- a/configs/examples/gnb-001-01-ue-315-010.yaml.in +++ b/configs/examples/gnb-001-01-ue-315-010.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-001-01-ue-999-70.yaml.in b/configs/examples/gnb-001-01-ue-999-70.yaml.in index 16e2c65ac9..71917b2a6f 100644 --- a/configs/examples/gnb-001-01-ue-999-70.yaml.in +++ b/configs/examples/gnb-001-01-ue-999-70.yaml.in @@ -116,8 +116,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -198,8 +199,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-001-01.yaml.in b/configs/examples/gnb-315-010-ue-001-01.yaml.in index f970f2b8be..64491881f6 100644 --- a/configs/examples/gnb-315-010-ue-001-01.yaml.in +++ b/configs/examples/gnb-315-010-ue-001-01.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-315-010.yaml.in b/configs/examples/gnb-315-010-ue-315-010.yaml.in index 30c681a5da..f1e0e7a3d3 100644 --- a/configs/examples/gnb-315-010-ue-315-010.yaml.in +++ b/configs/examples/gnb-315-010-ue-315-010.yaml.in @@ -116,8 +116,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -198,8 +199,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-999-70.yaml.in b/configs/examples/gnb-315-010-ue-999-70.yaml.in index ff0cbcdef6..968fa4aedf 100644 --- a/configs/examples/gnb-315-010-ue-999-70.yaml.in +++ b/configs/examples/gnb-315-010-ue-999-70.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-001-01.yaml.in b/configs/examples/gnb-999-70-ue-001-01.yaml.in index 202a5f02c3..dbe260da82 100644 --- a/configs/examples/gnb-999-70-ue-001-01.yaml.in +++ b/configs/examples/gnb-999-70-ue-001-01.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-315-010.yaml.in b/configs/examples/gnb-999-70-ue-315-010.yaml.in index dea839c0d9..c5e7453c4f 100644 --- a/configs/examples/gnb-999-70-ue-315-010.yaml.in +++ b/configs/examples/gnb-999-70-ue-315-010.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-999-70.yaml.in b/configs/examples/gnb-999-70-ue-999-70.yaml.in index b1bd3534ba..8f593fa5ee 100644 --- a/configs/examples/gnb-999-70-ue-999-70.yaml.in +++ b/configs/examples/gnb-999-70-ue-999-70.yaml.in @@ -116,8 +116,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -198,8 +199,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/non3gpp.yaml.in b/configs/non3gpp.yaml.in index ac0477777f..7771c31a8d 100644 --- a/configs/non3gpp.yaml.in +++ b/configs/non3gpp.yaml.in @@ -110,8 +110,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -192,8 +193,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index 96f641bd16..f33f604618 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -34,8 +34,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -327,23 +328,26 @@ smf: # o Specific DNN/APN(e.g 'ims') uses 10.46.0.1/16, 2001:db8:babe::1/48 # (If the UE has unknown DNN/APN(not internet/ims), SMF/UPF will crash.) # session: -# - subnet: 10.45.0.1/16 +# - subnet: 10.45.0.0/16 +# gateway: 10.45.0.1 # dnn: internet -# - subnet: 2001:db8:cafe::1/48 +# - subnet: 2001:db8:cafe::/48 # dnn: internet -# - subnet: 10.46.0.1/16 +# - subnet: 10.46.0.0/16 +# gateway: 10.46.0.1 # dnn: ims -# - subnet: 2001:db8:babe::1/48 +# - subnet: 2001:db8:babe::/48 # dnn: ims # # o Pool Range # session: -# - subnet: 10.45.0.1/16 +# - subnet: 10.45.0.0/16 +# gateway: 10.45.0.1 # range: # - 10.45.0.100-10.45.0.200 # - 10.45.1.100- # - -10.45.0.200 -# - subnet: 2001:db8:cafe::1/48 +# - subnet: 2001:db8:cafe::/48 # range: # - 2001:db8:cafe:a0::0-2001:db8:cafe:b0::0 # - 2001:db8:cafe:c0::0-2001:db8:cafe:d0::0 diff --git a/configs/open5gs/upf.yaml.in b/configs/open5gs/upf.yaml.in index 353d7bb642..5965cb5a93 100644 --- a/configs/open5gs/upf.yaml.in +++ b/configs/open5gs/upf.yaml.in @@ -18,8 +18,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 @@ -70,14 +71,16 @@ upf: # $ sudo ip addr add 2001:db8:babe::1/48 dev ogstun3 # # session: -# - subnet: 10.45.0.1/16 +# - subnet: 10.45.0.0/16 +# gateway: 10.45.0.1 # dnn: internet -# - subnet: 2001:db8:cafe::1/48 +# - subnet: 2001:db8:cafe::/48 # dnn: internet # dev: ogstun2 -# - subnet: 10.46.0.1/16 +# - subnet: 10.46.0.0/16 +# gateway: 10.46.0.1 # dnn: ims # dev: ogstun3 -# - subnet: 2001:db8:babe::1/48 +# - subnet: 2001:db8:babe::/48 # dnn: ims # dev: ogstun3 diff --git a/configs/sample.yaml.in b/configs/sample.yaml.in index 2e7cfb8bd5..0ba574232d 100644 --- a/configs/sample.yaml.in +++ b/configs/sample.yaml.in @@ -118,8 +118,9 @@ smf: - address: 127.0.0.4 port: 9090 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -203,8 +204,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/slice.yaml.in b/configs/slice.yaml.in index 87a2731335..6e6944085c 100644 --- a/configs/slice.yaml.in +++ b/configs/slice.yaml.in @@ -110,8 +110,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -194,8 +195,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/srsenb.yaml.in b/configs/srsenb.yaml.in index 113c2177e6..2948f0f074 100644 --- a/configs/srsenb.yaml.in +++ b/configs/srsenb.yaml.in @@ -107,8 +107,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -184,8 +185,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/volte.yaml.in b/configs/volte.yaml.in index a2f1106dca..36ec7c3d2b 100644 --- a/configs/volte.yaml.in +++ b/configs/volte.yaml.in @@ -107,8 +107,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -187,8 +188,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/configs/vonr.yaml.in b/configs/vonr.yaml.in index 9108f0bcca..070b9d3657 100644 --- a/configs/vonr.yaml.in +++ b/configs/vonr.yaml.in @@ -110,8 +110,9 @@ smf: server: - address: 127.0.0.4 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 dns: - 8.8.8.8 - 8.8.4.4 @@ -193,8 +194,9 @@ upf: server: - address: 127.0.0.7 session: - - subnet: 10.45.0.1/16 - - subnet: 2001:db8:cafe::1/48 + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 metrics: server: - address: 127.0.0.7 diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 36860553d7..9252ef0d5f 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -743,6 +743,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) do { ogs_pfcp_subnet_t *subnet = NULL; const char *ipstr = NULL; + const char *gateway = NULL; const char *mask_or_numbits = NULL; const char *dnn = NULL; const char *dev = self.tun_ifname; @@ -781,6 +782,8 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) mask_or_numbits = (const char *)v; } } + } else if (!strcmp(subnet_key, "gateway")) { + gateway = ogs_yaml_iter_value(&subnet_iter); } else if (!strcmp(subnet_key, "apn") || !strcmp(subnet_key, "dnn")) { dnn = ogs_yaml_iter_value(&subnet_iter); @@ -825,7 +828,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) } subnet = ogs_pfcp_subnet_add( - ipstr, mask_or_numbits, dnn, dev); + ipstr, mask_or_numbits, gateway, dnn, dev); ogs_assert(subnet); subnet->num_of_range = num; @@ -2150,7 +2153,7 @@ ogs_pfcp_dev_t *ogs_pfcp_dev_find_by_ifname(const char *ifname) ogs_pfcp_subnet_t *ogs_pfcp_subnet_add( const char *ipstr, const char *mask_or_numbits, - const char *dnn, const char *ifname) + const char *gateway, const char *dnn, const char *ifname) { int rv; ogs_pfcp_dev_t *dev = NULL; @@ -2179,6 +2182,43 @@ ogs_pfcp_subnet_t *ogs_pfcp_subnet_add( subnet->family = subnet->gw.family; subnet->prefixlen = atoi(mask_or_numbits); + + if (memcmp(subnet->gw.sub, subnet->sub.sub, + sizeof(subnet->gw.sub)) != 0) { + char *subnet_string = NULL; + + if (subnet->family == AF_INET) { + subnet_string = ogs_ipv4_to_string(subnet->sub.sub[0]); + ogs_assert(subnet_string); + } else if (subnet->family == AF_INET6) { + subnet_string = ogs_ipv6addr_to_string( + (uint8_t*)&subnet->sub.sub[0]); + ogs_assert(subnet_string); + } + + ogs_warn("Please change the configuration files of " + "smf.yaml and upf.yaml as below."); + ogs_log_print(OGS_LOG_WARN, "\n<OLD Format>\n"); + ogs_log_print(OGS_LOG_WARN, "smf:\n"); + ogs_log_print(OGS_LOG_WARN, " session:\n"); + ogs_log_print(OGS_LOG_WARN, " - subnet: %s/%s\n", + ipstr, mask_or_numbits); + ogs_log_print(OGS_LOG_WARN, "\n<NEW Format>\n"); + ogs_log_print(OGS_LOG_WARN, "smf:\n"); + ogs_log_print(OGS_LOG_WARN, " session:\n"); + ogs_log_print(OGS_LOG_WARN, " - subnet: %s/%s\n", + subnet_string ? subnet_string : "Unknown", mask_or_numbits); + if (subnet->family == AF_INET) + ogs_log_print(OGS_LOG_WARN, " gateway: %s", ipstr); + ogs_log_print(OGS_LOG_WARN, "\n\n\n"); + + ogs_free(subnet_string); + } + } + + if (gateway) { + rv = ogs_ipsubnet(&subnet->gw, gateway, NULL); + ogs_assert(rv == OGS_OK); } if (dnn) diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index e77cd48691..aea2e64af7 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -491,7 +491,7 @@ ogs_pfcp_dev_t *ogs_pfcp_dev_find_by_ifname(const char *ifname); ogs_pfcp_subnet_t *ogs_pfcp_subnet_add( const char *ipstr, const char *mask_or_numbits, - const char *dnn, const char *ifname); + const char *gateway, const char *dnn, const char *ifname); ogs_pfcp_subnet_t *ogs_pfcp_subnet_next(ogs_pfcp_subnet_t *subnet); void ogs_pfcp_subnet_remove(ogs_pfcp_subnet_t *subnet); void ogs_pfcp_subnet_remove_all(void); From f960047ccb1007f233775a6a5f2cdbe6f08a607f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 14 Apr 2024 09:19:07 +0900 Subject: [PATCH 085/323] [SMF/UPF] Follow-up on Pull #3137 (Issues #2975) --- configs/310014.yaml.in | 2 ++ configs/csfb.yaml.in | 2 ++ configs/examples/5gc-sepp1-999-70.yaml.in | 2 ++ configs/examples/5gc-sepp2-001-01.yaml.in | 2 ++ configs/examples/5gc-sepp3-315-010.yaml.in | 2 ++ configs/examples/5gc-tls-sepp1-999-70.yaml.in | 2 ++ configs/examples/5gc-tls-sepp2-001-01.yaml.in | 2 ++ configs/examples/5gc-tls-sepp3-315-010.yaml.in | 2 ++ configs/examples/gnb-001-01-ue-001-01.yaml.in | 2 ++ configs/examples/gnb-001-01-ue-315-010.yaml.in | 2 ++ configs/examples/gnb-001-01-ue-999-70.yaml.in | 2 ++ configs/examples/gnb-315-010-ue-001-01.yaml.in | 2 ++ configs/examples/gnb-315-010-ue-315-010.yaml.in | 2 ++ configs/examples/gnb-315-010-ue-999-70.yaml.in | 2 ++ configs/examples/gnb-999-70-ue-001-01.yaml.in | 2 ++ configs/examples/gnb-999-70-ue-315-010.yaml.in | 2 ++ configs/examples/gnb-999-70-ue-999-70.yaml.in | 2 ++ configs/non3gpp.yaml.in | 2 ++ configs/open5gs/smf.yaml.in | 1 + configs/open5gs/upf.yaml.in | 1 + configs/sample.yaml.in | 2 ++ configs/slice.yaml.in | 2 ++ configs/srsenb.yaml.in | 2 ++ configs/volte.yaml.in | 2 ++ lib/pfcp/context.c | 4 +--- 25 files changed, 47 insertions(+), 3 deletions(-) diff --git a/configs/310014.yaml.in b/configs/310014.yaml.in index 6c4cefcc53..6299ad4ea3 100644 --- a/configs/310014.yaml.in +++ b/configs/310014.yaml.in @@ -112,6 +112,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -193,6 +194,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/csfb.yaml.in b/configs/csfb.yaml.in index 0688c928e6..9538a580ea 100644 --- a/configs/csfb.yaml.in +++ b/configs/csfb.yaml.in @@ -145,6 +145,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -223,6 +224,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/5gc-sepp1-999-70.yaml.in b/configs/examples/5gc-sepp1-999-70.yaml.in index 0a84d670f9..1bf052c94c 100644 --- a/configs/examples/5gc-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-sepp1-999-70.yaml.in @@ -115,6 +115,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -211,6 +212,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.1.7 diff --git a/configs/examples/5gc-sepp2-001-01.yaml.in b/configs/examples/5gc-sepp2-001-01.yaml.in index e8df582352..67a604e6c7 100644 --- a/configs/examples/5gc-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-sepp2-001-01.yaml.in @@ -115,6 +115,7 @@ smf: - subnet: 10.46.0.0/16 gateway: 10.46.0.1 - subnet: 2001:db8:babe::/48 + gateway: 2001:db8:babe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -212,6 +213,7 @@ upf: gateway: 10.46.0.1 dev: ogstun2 - subnet: 2001:db8:babe::/48 + gateway: 2001:db8:babe::1 dev: ogstun2 metrics: server: diff --git a/configs/examples/5gc-sepp3-315-010.yaml.in b/configs/examples/5gc-sepp3-315-010.yaml.in index cfbb9b7ea4..d37817813b 100644 --- a/configs/examples/5gc-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-sepp3-315-010.yaml.in @@ -115,6 +115,7 @@ smf: - subnet: 10.47.0.0/16 gateway: 10.47.0.1 - subnet: 2001:db8:face::/48 + gateway: 2001:db8:face::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -212,6 +213,7 @@ upf: gateway: 10.47.0.1 dev: ogstun3 - subnet: 2001:db8:face::/48 + gateway: 2001:db8:face::1 dev: ogstun3 metrics: server: diff --git a/configs/examples/5gc-tls-sepp1-999-70.yaml.in b/configs/examples/5gc-tls-sepp1-999-70.yaml.in index 523df19c8b..a06648ca90 100644 --- a/configs/examples/5gc-tls-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-tls-sepp1-999-70.yaml.in @@ -116,6 +116,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -212,6 +213,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.1.7 diff --git a/configs/examples/5gc-tls-sepp2-001-01.yaml.in b/configs/examples/5gc-tls-sepp2-001-01.yaml.in index 6a2d189af0..952eca531d 100644 --- a/configs/examples/5gc-tls-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-tls-sepp2-001-01.yaml.in @@ -116,6 +116,7 @@ smf: - subnet: 10.46.0.0/16 gateway: 10.46.0.1 - subnet: 2001:db8:babe::/48 + gateway: 2001:db8:babe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -213,6 +214,7 @@ upf: gateway: 10.46.0.1 dev: ogstun2 - subnet: 2001:db8:babe::/48 + gateway: 2001:db8:babe::1 dev: ogstun2 metrics: server: diff --git a/configs/examples/5gc-tls-sepp3-315-010.yaml.in b/configs/examples/5gc-tls-sepp3-315-010.yaml.in index 86f637e34f..6f2d2cc6a6 100644 --- a/configs/examples/5gc-tls-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-tls-sepp3-315-010.yaml.in @@ -116,6 +116,7 @@ smf: - subnet: 10.47.0.0/16 gateway: 10.47.0.1 - subnet: 2001:db8:face::/48 + gateway: 2001:db8:face::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -213,6 +214,7 @@ upf: gateway: 10.47.0.1 dev: ogstun3 - subnet: 2001:db8:face::/48 + gateway: 2001:db8:face::1 dev: ogstun3 metrics: server: diff --git a/configs/examples/gnb-001-01-ue-001-01.yaml.in b/configs/examples/gnb-001-01-ue-001-01.yaml.in index 0813ed2ffb..6775c45a53 100644 --- a/configs/examples/gnb-001-01-ue-001-01.yaml.in +++ b/configs/examples/gnb-001-01-ue-001-01.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-001-01-ue-315-010.yaml.in b/configs/examples/gnb-001-01-ue-315-010.yaml.in index 31f6f263e1..7f8a9bd79d 100644 --- a/configs/examples/gnb-001-01-ue-315-010.yaml.in +++ b/configs/examples/gnb-001-01-ue-315-010.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-001-01-ue-999-70.yaml.in b/configs/examples/gnb-001-01-ue-999-70.yaml.in index 71917b2a6f..2237b90f29 100644 --- a/configs/examples/gnb-001-01-ue-999-70.yaml.in +++ b/configs/examples/gnb-001-01-ue-999-70.yaml.in @@ -119,6 +119,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -202,6 +203,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-001-01.yaml.in b/configs/examples/gnb-315-010-ue-001-01.yaml.in index 64491881f6..678c4d4c8f 100644 --- a/configs/examples/gnb-315-010-ue-001-01.yaml.in +++ b/configs/examples/gnb-315-010-ue-001-01.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-315-010.yaml.in b/configs/examples/gnb-315-010-ue-315-010.yaml.in index f1e0e7a3d3..a902e02bd0 100644 --- a/configs/examples/gnb-315-010-ue-315-010.yaml.in +++ b/configs/examples/gnb-315-010-ue-315-010.yaml.in @@ -119,6 +119,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -202,6 +203,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-315-010-ue-999-70.yaml.in b/configs/examples/gnb-315-010-ue-999-70.yaml.in index 968fa4aedf..c8e511d913 100644 --- a/configs/examples/gnb-315-010-ue-999-70.yaml.in +++ b/configs/examples/gnb-315-010-ue-999-70.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-001-01.yaml.in b/configs/examples/gnb-999-70-ue-001-01.yaml.in index dbe260da82..57012a6e30 100644 --- a/configs/examples/gnb-999-70-ue-001-01.yaml.in +++ b/configs/examples/gnb-999-70-ue-001-01.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-315-010.yaml.in b/configs/examples/gnb-999-70-ue-315-010.yaml.in index c5e7453c4f..e1e1f79870 100644 --- a/configs/examples/gnb-999-70-ue-315-010.yaml.in +++ b/configs/examples/gnb-999-70-ue-315-010.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/examples/gnb-999-70-ue-999-70.yaml.in b/configs/examples/gnb-999-70-ue-999-70.yaml.in index 8f593fa5ee..a28f11a66f 100644 --- a/configs/examples/gnb-999-70-ue-999-70.yaml.in +++ b/configs/examples/gnb-999-70-ue-999-70.yaml.in @@ -119,6 +119,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -202,6 +203,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/non3gpp.yaml.in b/configs/non3gpp.yaml.in index 7771c31a8d..cb053eeda0 100644 --- a/configs/non3gpp.yaml.in +++ b/configs/non3gpp.yaml.in @@ -113,6 +113,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -196,6 +197,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index f33f604618..890d3ca946 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -37,6 +37,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 diff --git a/configs/open5gs/upf.yaml.in b/configs/open5gs/upf.yaml.in index 5965cb5a93..b368e41b27 100644 --- a/configs/open5gs/upf.yaml.in +++ b/configs/open5gs/upf.yaml.in @@ -21,6 +21,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/sample.yaml.in b/configs/sample.yaml.in index 0ba574232d..12f3f68594 100644 --- a/configs/sample.yaml.in +++ b/configs/sample.yaml.in @@ -121,6 +121,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -207,6 +208,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/slice.yaml.in b/configs/slice.yaml.in index 6e6944085c..b8ca7e1bfb 100644 --- a/configs/slice.yaml.in +++ b/configs/slice.yaml.in @@ -113,6 +113,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -198,6 +199,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/srsenb.yaml.in b/configs/srsenb.yaml.in index 2948f0f074..a30bbf520a 100644 --- a/configs/srsenb.yaml.in +++ b/configs/srsenb.yaml.in @@ -110,6 +110,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -188,6 +189,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/configs/volte.yaml.in b/configs/volte.yaml.in index 36ec7c3d2b..bad3225da8 100644 --- a/configs/volte.yaml.in +++ b/configs/volte.yaml.in @@ -110,6 +110,7 @@ smf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dns: - 8.8.8.8 - 8.8.4.4 @@ -191,6 +192,7 @@ upf: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 metrics: server: - address: 127.0.0.7 diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 9252ef0d5f..810939e687 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -2208,9 +2208,7 @@ ogs_pfcp_subnet_t *ogs_pfcp_subnet_add( ogs_log_print(OGS_LOG_WARN, " session:\n"); ogs_log_print(OGS_LOG_WARN, " - subnet: %s/%s\n", subnet_string ? subnet_string : "Unknown", mask_or_numbits); - if (subnet->family == AF_INET) - ogs_log_print(OGS_LOG_WARN, " gateway: %s", ipstr); - ogs_log_print(OGS_LOG_WARN, "\n\n\n"); + ogs_log_print(OGS_LOG_WARN, " gateway: %s\n\n\n", ipstr); ogs_free(subnet_string); } From 7973e45d16a81b287f817e740ea3641f617555d7 Mon Sep 17 00:00:00 2001 From: Oliver Smith <osmith@sysmocom.de> Date: Wed, 10 Apr 2024 16:28:49 +0200 Subject: [PATCH 086/323] [CORE] logger: add option to disable timestamps Add an option to disable printing the timestamp. This is useful to not have duplicate timestamps, when stderr is piped into a logging system that adds timestamps on its own. For example with systemd's journald: $ journalctl -u open5gs-smfd Apr 10 13:25:18 hostname open5gs-smfd[1582]: 04/10 13:25:18.274: [app] INFO: Configuration: '/etc/open5gs/smf.yaml' (../lib/app/ogs-init.c:130) Configuration change: ``` <OLD Format> logger: file: /var/log/open5gs/smf.log <NEW Format> logger: file: path: /var/log/open5gs/smf.log ``` Example config, to have no timestamps on stderr: ``` logger: default: timestamp: false file: path: /var/log/open5gs/smf.log timestamp: true ``` --- lib/app/ogs-context.h | 5 ++++ lib/app/ogs-init.c | 59 ++++++++++++++++++++++++++++++++++++++++--- lib/app/ogs-yaml.c | 28 ++++++++++++++++++++ lib/app/ogs-yaml.h | 1 + lib/core/ogs-log.c | 22 ++++++++++++++++ lib/core/ogs-log.h | 7 +++++ 6 files changed, 119 insertions(+), 3 deletions(-) diff --git a/lib/app/ogs-context.h b/lib/app/ogs-context.h index 3e8e11bea5..a9e9787c2d 100644 --- a/lib/app/ogs-context.h +++ b/lib/app/ogs-context.h @@ -36,10 +36,15 @@ typedef struct ogs_app_context_s { const char *db_uri; + struct { + ogs_log_ts_e timestamp; + } logger_default; + struct { const char *file; const char *level; const char *domain; + ogs_log_ts_e timestamp; } logger; ogs_queue_t *queue; diff --git a/lib/app/ogs-init.c b/lib/app/ogs-init.c index 2c117a4ff4..bb48229488 100644 --- a/lib/app/ogs-init.c +++ b/lib/app/ogs-init.c @@ -114,6 +114,9 @@ int ogs_app_initialize( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + ogs_log_set_timestamp(ogs_app()->logger_default.timestamp, + ogs_app()->logger.timestamp); + /************************************************************************** * Stage 5 : Setup Database Module */ @@ -254,6 +257,57 @@ static int context_validation(void) return OGS_OK; } +static void parse_config_logger_file(ogs_yaml_iter_t *logger_iter, + const char *logger_key) +{ + ogs_yaml_iter_t iter; + + /* Legacy format: + * logger: + * file: /var/log/open5gs/mme.log */ + if (!strcmp(logger_key, "file") && ogs_yaml_iter_has_value(logger_iter)) { + ogs_app()->logger.file = ogs_yaml_iter_value(logger_iter); + + ogs_warn("Please change the configuration file as below."); + ogs_log_print(OGS_LOG_WARN, "\n<OLD Format>\n"); + ogs_log_print(OGS_LOG_WARN, "logger:\n"); + ogs_log_print(OGS_LOG_WARN, " file: %s\n", ogs_app()->logger.file); + ogs_log_print(OGS_LOG_WARN, "\n<NEW Format>\n"); + ogs_log_print(OGS_LOG_WARN, "logger:\n"); + ogs_log_print(OGS_LOG_WARN, " file:\n"); + ogs_log_print(OGS_LOG_WARN, " path: %s\n", ogs_app()->logger.file); + ogs_log_print(OGS_LOG_WARN, "\n\n\n"); + return; + } + + /* Current format: + * logger: + * default: + * timestamp: false + * file: + * path: /var/log/open5gs/mme.log + * timestamp: true */ + ogs_yaml_iter_recurse(logger_iter, &iter); + while (ogs_yaml_iter_next(&iter)) { + const char *key = ogs_yaml_iter_key(&iter); + ogs_assert(key); + if (!strcmp(key, "timestamp")) { + ogs_log_ts_e ts = ogs_yaml_iter_bool(&iter) + ? OGS_LOG_TS_ENABLED + : OGS_LOG_TS_DISABLED; + if (!strcmp(logger_key, "default")) { + ogs_app()->logger_default.timestamp = ts; + } else if (!strcmp(logger_key, "file")) { + ogs_app()->logger.timestamp = ts; + } + } else if (!strcmp(key, "path")) { + if (!strcmp(logger_key, "file")) { + ogs_app()->logger.file = ogs_yaml_iter_value(&iter); + } + } + } +} + static int parse_config(void) { int rv; @@ -278,9 +332,8 @@ static int parse_config(void) while (ogs_yaml_iter_next(&logger_iter)) { const char *logger_key = ogs_yaml_iter_key(&logger_iter); ogs_assert(logger_key); - if (!strcmp(logger_key, "file")) { - ogs_app()->logger.file = ogs_yaml_iter_value(&logger_iter); - } else if (!strcmp(logger_key, "level")) { + parse_config_logger_file(&logger_iter, logger_key); + if (!strcmp(logger_key, "level")) { ogs_app()->logger.level = ogs_yaml_iter_value(&logger_iter); } else if (!strcmp(logger_key, "domain")) { diff --git a/lib/app/ogs-yaml.c b/lib/app/ogs-yaml.c index 168ec50e82..7853b704ef 100644 --- a/lib/app/ogs-yaml.c +++ b/lib/app/ogs-yaml.c @@ -178,6 +178,34 @@ const char *ogs_yaml_iter_value(ogs_yaml_iter_t *iter) return NULL; } +int ogs_yaml_iter_has_value(ogs_yaml_iter_t *iter) +{ + ogs_assert(iter); + ogs_assert(iter->document); + ogs_assert(iter->node); + + if (iter->node->type == YAML_SCALAR_NODE) { + return 1; + } else if (iter->node->type == YAML_MAPPING_NODE) { + yaml_node_t *node = NULL; + + ogs_assert(iter->pair); + node = yaml_document_get_node(iter->document, iter->pair->value); + ogs_assert(node); + return node->type == YAML_SCALAR_NODE; + } else if (iter->node->type == YAML_SEQUENCE_NODE) { + yaml_node_t *node = NULL; + + ogs_assert(iter->item); + node = yaml_document_get_node(iter->document, *iter->item); + ogs_assert(node); + return node->type == YAML_SCALAR_NODE; + } + + ogs_assert_if_reached(); + return 0; +} + int ogs_yaml_iter_bool(ogs_yaml_iter_t *iter) { const char *v = ogs_yaml_iter_value(iter); diff --git a/lib/app/ogs-yaml.h b/lib/app/ogs-yaml.h index 0fbd8646a6..ac23bead04 100644 --- a/lib/app/ogs-yaml.h +++ b/lib/app/ogs-yaml.h @@ -59,6 +59,7 @@ void ogs_yaml_iter_recurse(ogs_yaml_iter_t *parent, ogs_yaml_iter_t *iter); int ogs_yaml_iter_type(ogs_yaml_iter_t *iter); const char *ogs_yaml_iter_key(ogs_yaml_iter_t *iter); const char *ogs_yaml_iter_value(ogs_yaml_iter_t *iter); +int ogs_yaml_iter_has_value(ogs_yaml_iter_t *iter); int ogs_yaml_iter_bool(ogs_yaml_iter_t *iter); #ifdef __cplusplus diff --git a/lib/core/ogs-log.c b/lib/core/ogs-log.c index 5baf385fbd..ac43d6d7dc 100644 --- a/lib/core/ogs-log.c +++ b/lib/core/ogs-log.c @@ -340,6 +340,28 @@ void ogs_log_set_mask_level(const char *_mask, ogs_log_level_e level) } } +void ogs_log_set_timestamp(ogs_log_ts_e ts_default, ogs_log_ts_e ts_file) +{ + ogs_log_t *log; + + if (ts_default == OGS_LOG_TS_UNSET) + ts_default = OGS_LOG_TS_ENABLED; + + if (ts_file == OGS_LOG_TS_UNSET) + ts_file = ts_default; + + ogs_list_for_each(&log_list, log) { + switch (log->type) { + case OGS_LOG_FILE_TYPE: + log->print.timestamp = (ts_file == OGS_LOG_TS_ENABLED); + break; + default: + log->print.timestamp = (ts_default == OGS_LOG_TS_ENABLED); + break; + } + } +} + static ogs_log_level_e ogs_log_level_from_string(const char *string) { ogs_log_level_e level = OGS_ERROR; diff --git a/lib/core/ogs-log.h b/lib/core/ogs-log.h index 24a6b77d1b..547f196201 100644 --- a/lib/core/ogs-log.h +++ b/lib/core/ogs-log.h @@ -64,6 +64,12 @@ typedef enum { OGS_LOG_FULL = OGS_LOG_TRACE, } ogs_log_level_e; +typedef enum { + OGS_LOG_TS_UNSET, + OGS_LOG_TS_ENABLED, + OGS_LOG_TS_DISABLED, +} ogs_log_ts_e; + typedef struct ogs_log_s ogs_log_t; typedef struct ogs_log_domain_s ogs_log_domain_t; @@ -90,6 +96,7 @@ void ogs_log_install_domain(int *domain_id, int ogs_log_config_domain(const char *domain, const char *level); void ogs_log_set_mask_level(const char *mask, ogs_log_level_e level); +void ogs_log_set_timestamp(ogs_log_ts_e ts_default, ogs_log_ts_e ts_file); void ogs_log_vprintf(ogs_log_level_e level, int id, ogs_err_t err, const char *file, int line, const char *func, From 8abd35580b7f9f8c7d5eadd74bc2796be977df74 Mon Sep 17 00:00:00 2001 From: Oliver Smith <osmith@sysmocom.de> Date: Thu, 18 Apr 2024 12:28:49 +0200 Subject: [PATCH 087/323] configs, docs: adjust to logger config change --- configs/open5gs/amf.yaml.in | 3 ++- configs/open5gs/ausf.yaml.in | 3 ++- configs/open5gs/bsf.yaml.in | 3 ++- configs/open5gs/hss.yaml.in | 3 ++- configs/open5gs/mme.yaml.in | 3 ++- configs/open5gs/nrf.yaml.in | 3 ++- configs/open5gs/nssf.yaml.in | 3 ++- configs/open5gs/pcf.yaml.in | 3 ++- configs/open5gs/pcrf.yaml.in | 3 ++- configs/open5gs/scp.yaml.in | 3 ++- configs/open5gs/sepp1.yaml.in | 3 ++- configs/open5gs/sepp2.yaml.in | 3 ++- configs/open5gs/sgwc.yaml.in | 3 ++- configs/open5gs/sgwu.yaml.in | 3 ++- configs/open5gs/smf.yaml.in | 3 ++- configs/open5gs/udm.yaml.in | 3 ++- configs/open5gs/udr.yaml.in | 3 ++- configs/open5gs/upf.yaml.in | 3 ++- docs/_docs/troubleshoot/01-simple-issues.md | 3 ++- .../troubleshoot/02-now-in-github-issues.md | 3 ++- docs/_docs/tutorial/05-roaming.md | 18 ++++++++++++------ docs/_posts/2020-03-25-release-v1.2.2.md | 3 ++- 22 files changed, 54 insertions(+), 27 deletions(-) diff --git a/configs/open5gs/amf.yaml.in b/configs/open5gs/amf.yaml.in index 4f9dbf5441..24e2c97576 100644 --- a/configs/open5gs/amf.yaml.in +++ b/configs/open5gs/amf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/amf.log + file: + path: @localstatedir@/log/open5gs/amf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/ausf.yaml.in b/configs/open5gs/ausf.yaml.in index a7330403a4..db4c79f571 100644 --- a/configs/open5gs/ausf.yaml.in +++ b/configs/open5gs/ausf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/ausf.log + file: + path: @localstatedir@/log/open5gs/ausf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/bsf.yaml.in b/configs/open5gs/bsf.yaml.in index 95a6d93dad..37ceced210 100644 --- a/configs/open5gs/bsf.yaml.in +++ b/configs/open5gs/bsf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/bsf.log + file: + path: @localstatedir@/log/open5gs/bsf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/hss.yaml.in b/configs/open5gs/hss.yaml.in index 2e304c0211..2816bb8187 100644 --- a/configs/open5gs/hss.yaml.in +++ b/configs/open5gs/hss.yaml.in @@ -1,6 +1,7 @@ db_uri: mongodb://localhost/open5gs logger: - file: @localstatedir@/log/open5gs/hss.log + file: + path: @localstatedir@/log/open5gs/hss.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/mme.yaml.in b/configs/open5gs/mme.yaml.in index 5acf05fdc7..87c251b9dc 100644 --- a/configs/open5gs/mme.yaml.in +++ b/configs/open5gs/mme.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/mme.log + file: + path: @localstatedir@/log/open5gs/mme.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in index cd9e45febe..e082c0fb83 100644 --- a/configs/open5gs/nrf.yaml.in +++ b/configs/open5gs/nrf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/nrf.log + file: + path: @localstatedir@/log/open5gs/nrf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/nssf.yaml.in b/configs/open5gs/nssf.yaml.in index d185be250d..258ff7825e 100644 --- a/configs/open5gs/nssf.yaml.in +++ b/configs/open5gs/nssf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/nssf.log + file: + path: @localstatedir@/log/open5gs/nssf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index 2df2e9a36f..afe96458be 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -1,6 +1,7 @@ db_uri: mongodb://localhost/open5gs logger: - file: @localstatedir@/log/open5gs/pcf.log + file: + path: @localstatedir@/log/open5gs/pcf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/pcrf.yaml.in b/configs/open5gs/pcrf.yaml.in index 4cf913ab65..7ffa36990e 100644 --- a/configs/open5gs/pcrf.yaml.in +++ b/configs/open5gs/pcrf.yaml.in @@ -1,6 +1,7 @@ db_uri: mongodb://localhost/open5gs logger: - file: @localstatedir@/log/open5gs/pcrf.log + file: + path: @localstatedir@/log/open5gs/pcrf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/scp.yaml.in b/configs/open5gs/scp.yaml.in index 3388d8b053..3d80497eba 100644 --- a/configs/open5gs/scp.yaml.in +++ b/configs/open5gs/scp.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/scp.log + file: + path: @localstatedir@/log/open5gs/scp.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/sepp1.yaml.in b/configs/open5gs/sepp1.yaml.in index 7ff9dde81f..afa276a352 100644 --- a/configs/open5gs/sepp1.yaml.in +++ b/configs/open5gs/sepp1.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/sepp1.log + file: + path: @localstatedir@/log/open5gs/sepp1.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/sepp2.yaml.in b/configs/open5gs/sepp2.yaml.in index 9a381ca5d1..fc78fb2563 100644 --- a/configs/open5gs/sepp2.yaml.in +++ b/configs/open5gs/sepp2.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/sepp2.log + file: + path: @localstatedir@/log/open5gs/sepp2.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/sgwc.yaml.in b/configs/open5gs/sgwc.yaml.in index 9ccdaa0e84..bb8fee70e9 100644 --- a/configs/open5gs/sgwc.yaml.in +++ b/configs/open5gs/sgwc.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/sgwc.log + file: + path: @localstatedir@/log/open5gs/sgwc.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/sgwu.yaml.in b/configs/open5gs/sgwu.yaml.in index 9d72c92f85..dc9054260b 100644 --- a/configs/open5gs/sgwu.yaml.in +++ b/configs/open5gs/sgwu.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/sgwu.log + file: + path: @localstatedir@/log/open5gs/sgwu.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index 890d3ca946..3ec2fb6483 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/smf.log + file: + path: @localstatedir@/log/open5gs/smf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/udm.yaml.in b/configs/open5gs/udm.yaml.in index 9af015c00c..a6a718094d 100644 --- a/configs/open5gs/udm.yaml.in +++ b/configs/open5gs/udm.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/udm.log + file: + path: @localstatedir@/log/open5gs/udm.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/udr.yaml.in b/configs/open5gs/udr.yaml.in index 2c2e57bee9..f8fd4250c3 100644 --- a/configs/open5gs/udr.yaml.in +++ b/configs/open5gs/udr.yaml.in @@ -1,6 +1,7 @@ db_uri: mongodb://localhost/open5gs logger: - file: @localstatedir@/log/open5gs/udr.log + file: + path: @localstatedir@/log/open5gs/udr.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/configs/open5gs/upf.yaml.in b/configs/open5gs/upf.yaml.in index b368e41b27..d7c6d56487 100644 --- a/configs/open5gs/upf.yaml.in +++ b/configs/open5gs/upf.yaml.in @@ -1,5 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/upf.log + file: + path: @localstatedir@/log/open5gs/upf.log # level: info # fatal|error|warn|info(default)|debug|trace global: diff --git a/docs/_docs/troubleshoot/01-simple-issues.md b/docs/_docs/troubleshoot/01-simple-issues.md index bed0d10cae..c8a7d9018b 100644 --- a/docs/_docs/troubleshoot/01-simple-issues.md +++ b/docs/_docs/troubleshoot/01-simple-issues.md @@ -169,7 +169,8 @@ index a70143f08..e0dba560c 100644 +++ b/configs/open5gs/amf.yaml.in @@ -1,6 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/amf.log + file: + path: @localstatedir@/log/open5gs/amf.log -# level: info # fatal|error|warn|info(default)|debug|trace + level: debug diff --git a/docs/_docs/troubleshoot/02-now-in-github-issues.md b/docs/_docs/troubleshoot/02-now-in-github-issues.md index 8517632a34..06b26c352b 100644 --- a/docs/_docs/troubleshoot/02-now-in-github-issues.md +++ b/docs/_docs/troubleshoot/02-now-in-github-issues.md @@ -485,7 +485,8 @@ index a70143f08..e0dba560c 100644 +++ b/configs/open5gs/amf.yaml.in @@ -1,6 +1,6 @@ logger: - file: @localstatedir@/log/open5gs/amf.log + file: + path: @localstatedir@/log/open5gs/amf.log -# level: info # fatal|error|warn|info(default)|debug|trace + level: debug diff --git a/docs/_docs/tutorial/05-roaming.md b/docs/_docs/tutorial/05-roaming.md index 108d4d4217..e9f0b3a698 100644 --- a/docs/_docs/tutorial/05-roaming.md +++ b/docs/_docs/tutorial/05-roaming.md @@ -92,7 +92,8 @@ NRF shall follow TS23.003(28.3.2.3.2 Format of NRF FQDN) for routing. ```bash $ sh -c 'cat << EOF > ./install/etc/open5gs/h-nrf.yaml logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/h-nrf.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/h-nrf.log # level: info # fatal|error|warn|info(default)|debug|trace global: @@ -116,7 +117,8 @@ EOF' ```bash $ sh -c 'cat << EOF > ./install/etc/open5gs/h-scp.yaml logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/h-scp.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/h-scp.log # level: info # fatal|error|warn|info(default)|debug|trace global: @@ -302,7 +304,8 @@ $ diff -u ./install/etc/open5gs/pcf.yaml.old ./install/etc/open5gs/pcf.yaml @@ -1,4 +1,3 @@ -db_uri: mongodb://localhost/open5gs logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/pcf.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/pcf.log # level: info # fatal|error|warn|info(default)|debug|trace @@ -22,6 +21,29 @@ server: @@ -646,7 +649,8 @@ For now we will set up SEPP without using TLS. ```bash $ sh -c 'cat << EOF > ./install/etc/open5gs/sepp.yaml logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log # level: info # fatal|error|warn|info(default)|debug|trace max: @@ -966,7 +970,8 @@ For now we will set up SEPP without using TLS. ```bash $ sh -c 'cat << EOF > ./install/etc/open5gs/sepp.yaml logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log # level: info # fatal|error|warn|info(default)|debug|trace max: @@ -1286,7 +1291,8 @@ For now we will set up SEPP without using TLS. ```bash $ sh -c 'cat << EOF > ./install/etc/open5gs/sepp.yaml logger: - file: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log + file: + path: /home/acetcom/Documents/git/open5gs/install/var/log/open5gs/sepp.log # level: info # fatal|error|warn|info(default)|debug|trace max: diff --git a/docs/_posts/2020-03-25-release-v1.2.2.md b/docs/_posts/2020-03-25-release-v1.2.2.md index 7d82e8fa71..a540d51cee 100644 --- a/docs/_posts/2020-03-25-release-v1.2.2.md +++ b/docs/_posts/2020-03-25-release-v1.2.2.md @@ -25,7 +25,8 @@ Example of sgw.yaml to use this feature: ``` logger: - file: /var/log/open5gs/sgw.log + file: + path: /var/log/open5gs/sgw.log level: debug parameter: From 4ab22dc98e0e1c69662230bd767f211d9b398092 Mon Sep 17 00:00:00 2001 From: Oliver Smith <osmith@sysmocom.de> Date: Thu, 18 Apr 2024 12:49:48 +0200 Subject: [PATCH 088/323] docs: quickstart: add configure logging section Add a section that explains how to fix duplicate timestamps in journalctl. --- docs/_docs/guide/01-quickstart.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/_docs/guide/01-quickstart.md b/docs/_docs/guide/01-quickstart.md index fa11e1eb96..9f8d93169a 100644 --- a/docs/_docs/guide/01-quickstart.md +++ b/docs/_docs/guide/01-quickstart.md @@ -428,6 +428,34 @@ $ sudo systemctl restart open5gs-amfd $ sudo systemctl restart open5gs-upfd ``` +#### Configure logging + +The Open5GS components log to `/var/log/open5gs/*.log` and to `stderr` by +default. + +##### Avoid duplicate timestamps in journalctl + +Open5GS adds timestamps to each log line in the log file, and on `stderr`. If +you run Open5GS with systemd and prefer looking at the logs with `journalctl`, +then each line will have two timestamps. To fix this, disable the timestamp for +`stderr` with the following configuration change: + +```diff +diff --git a/configs/open5gs/mme.yaml.in b/configs/open5gs/mme.yaml.in +index 87c251b9d..599032b8a 100644 +--- a/configs/open5gs/mme.yaml.in ++++ b/configs/open5gs/mme.yaml.in +@@ -1,6 +1,9 @@ + logger: ++ default: ++ timestamp: false + file: + path: /var/log/open5gs/mme.log ++ timestamp: true + # level: info # fatal|error|warn|info(default)|debug|trace + + global: +``` #### Register Subscriber Information --- From a9b1b116b307bdb46895d2588bd7a71d9477fc92 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 18 Apr 2024 21:13:45 +0900 Subject: [PATCH 089/323] [SBI] Generate URI via HTTP.location as is (#3058) A friend in the community was trying to connect an SMF made by another manufacturer with an SBI interface and found a big problem with Open5GS. All of the code in the part that generates the Resource URI from HTTP.location is invalid. For example, suppose we create a Resource URI with SMContext as below. {apiRoot}/nsmf-pdusession/<apiVersion>/sm-contexts/{smContextRef} In this case, Open5GS extracted the {smContextRef} part of the HTTP.location and appended it to the beginning {apiRoot}/nsmf-pdusession/<apiVersion>/sm-contexts/. This implementation may not work properly if the apiRoot changes. Consider a different port number as shown below. <HTTP.location> 127.0.0.4:9999/nsmf-pdusession/v1/sm-contexts/1 The SMF may send an apiRoot to the AMF with a changed port number, in which case the AMF must honor it. Therefore, instead of extracting only the smContextRef from HTTP.location, we modified it to use the whole thing to create a Resource URI. We modified all NFs that use HTTP.location in the same way, not just SMFs. --- docs/_docs/guide/01-quickstart.md | 2 +- lib/sbi/context.c | 17 +++++ lib/sbi/context.h | 5 +- lib/sbi/nnrf-build.c | 12 +--- lib/sbi/nnrf-handler.c | 87 ++++++++++++++-------- lib/sbi/path.c | 5 ++ src/amf/context.c | 22 +++--- src/amf/context.h | 115 ++++++++++++++++++++++++++---- src/amf/gmm-handler.c | 10 +-- src/amf/gmm-sm.c | 22 ++---- src/amf/namf-handler.c | 16 ++--- src/amf/nausf-build.c | 8 +-- src/amf/nausf-handler.c | 47 ++++++++++-- src/amf/ngap-handler.c | 2 +- src/amf/npcf-build.c | 8 +-- src/amf/npcf-handler.c | 52 +++++++++++++- src/amf/nsmf-build.c | 25 ++++--- src/amf/nsmf-handler.c | 64 ++++++++++++++--- src/amf/nudm-build.c | 9 +-- src/amf/nudm-handler.c | 58 +++++++++++++-- src/amf/sbi-path.c | 2 +- src/ausf/context.c | 5 +- src/ausf/context.h | 20 +++++- src/ausf/nudm-handler.c | 41 +++++++++-- src/pcf/context.c | 5 +- src/pcf/context.h | 29 +++++++- src/pcf/nbsf-build.c | 8 +-- src/pcf/nbsf-handler.c | 46 ++++++++++-- src/smf/context.c | 5 +- src/smf/context.h | 29 +++++++- src/smf/gsm-sm.c | 12 ++-- src/smf/npcf-build.c | 13 ++-- src/smf/npcf-handler.c | 46 ++++++++++-- src/smf/nsmf-handler.c | 4 +- src/smf/pfcp-sm.c | 2 +- tests/af/context.c | 48 ++----------- tests/af/context.h | 38 ++++++++-- tests/af/npcf-build.c | 31 +++----- tests/af/npcf-handler.c | 35 ++++++++- 39 files changed, 744 insertions(+), 261 deletions(-) diff --git a/docs/_docs/guide/01-quickstart.md b/docs/_docs/guide/01-quickstart.md index 9f8d93169a..05ad59b28c 100644 --- a/docs/_docs/guide/01-quickstart.md +++ b/docs/_docs/guide/01-quickstart.md @@ -453,7 +453,7 @@ index 87c251b9d..599032b8a 100644 path: /var/log/open5gs/mme.log + timestamp: true # level: info # fatal|error|warn|info(default)|debug|trace - + global: ``` diff --git a/lib/sbi/context.c b/lib/sbi/context.c index daa84d60b0..10fd84c645 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -2493,12 +2493,26 @@ ogs_sbi_subscription_data_t *ogs_sbi_subscription_data_add(void) return subscription_data; } +void ogs_sbi_subscription_data_set_resource_uri( + ogs_sbi_subscription_data_t *subscription_data, char *resource_uri) +{ + ogs_assert(subscription_data); + ogs_assert(resource_uri); + + if (subscription_data->resource_uri) + ogs_free(subscription_data->resource_uri); + subscription_data->resource_uri = ogs_strdup(resource_uri); + ogs_assert(subscription_data->resource_uri); +} + void ogs_sbi_subscription_data_set_id( ogs_sbi_subscription_data_t *subscription_data, char *id) { ogs_assert(subscription_data); ogs_assert(id); + if (subscription_data->id) + ogs_free(subscription_data->id); subscription_data->id = ogs_strdup(id); ogs_assert(subscription_data->id); } @@ -2516,6 +2530,9 @@ void ogs_sbi_subscription_data_remove( if (subscription_data->notification_uri) ogs_free(subscription_data->notification_uri); + if (subscription_data->resource_uri) + ogs_free(subscription_data->resource_uri); + if (subscription_data->req_nf_instance_id) ogs_free(subscription_data->req_nf_instance_id); diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 1c22f7c476..55e431d876 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -286,6 +286,7 @@ typedef struct ogs_sbi_subscription_data_s { OpenAPI_nf_type_e req_nf_type; /* reqNfType */ OpenAPI_nf_status_e nf_status; char *notification_uri; + char *resource_uri; struct { OpenAPI_nf_type_e nf_type; /* nfType */ @@ -295,7 +296,7 @@ typedef struct ogs_sbi_subscription_data_s { uint64_t requester_features; uint64_t nrf_supported_features; - void *client; /* only used in SERVER */ + void *client; } ogs_sbi_subscription_data_t; typedef struct ogs_sbi_smf_info_s { @@ -515,6 +516,8 @@ void ogs_sbi_subscription_spec_remove( void ogs_sbi_subscription_spec_remove_all(void); ogs_sbi_subscription_data_t *ogs_sbi_subscription_data_add(void); +void ogs_sbi_subscription_data_set_resource_uri( + ogs_sbi_subscription_data_t *subscription_data, char *resource_uri); void ogs_sbi_subscription_data_set_id( ogs_sbi_subscription_data_t *subscription_data, char *id); void ogs_sbi_subscription_data_remove( diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index fd0953e1b0..6d3eb814b4 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -1712,11 +1712,7 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_update( memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_PATCH; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NNRF_NFM; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_SUBSCRIPTIONS; - message.h.resource.component[1] = subscription_data->id; + message.h.uri = subscription_data->resource_uri; message.http.content_type = (char *)OGS_SBI_CONTENT_PATCH_TYPE; @@ -1771,11 +1767,7 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_unsubscribe( memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NNRF_NFM; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_SUBSCRIPTIONS; - message.h.resource.component[1] = subscription_data->id; + message.h.uri = subscription_data->resource_uri; message.http.custom.callback = (char *)OGS_SBI_CALLBACK_NNRF_NFMANAGEMENT_NF_STATUS_NOTIFY; diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index b36c7c375e..cd94fd3952 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -824,6 +824,17 @@ void ogs_nnrf_nfm_handle_nf_status_subscribe( { OpenAPI_subscription_data_t *SubscriptionData = NULL; + int rv; + ogs_sbi_message_t message; + ogs_sbi_header_t header; + + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + ogs_assert(recvmsg); ogs_assert(subscription_data); @@ -833,44 +844,62 @@ void ogs_nnrf_nfm_handle_nf_status_subscribe( return; } - if (recvmsg->http.location) { - int rv; - ogs_sbi_message_t message; - ogs_sbi_header_t header; + if (!recvmsg->http.location) { + ogs_error("No http.location"); + return; + } - memset(&header, 0, sizeof(header)); - header.uri = recvmsg->http.location; + memset(&header, 0, sizeof(header)); + header.uri = recvmsg->http.location; - rv = ogs_sbi_parse_header(&message, &header); - if (rv != OGS_OK) { - ogs_error("Cannot parse http.location [%s]", - recvmsg->http.location); - return; - } + rv = ogs_sbi_parse_header(&message, &header); + if (rv != OGS_OK) { + ogs_error("Cannot parse http.location [%s]", + recvmsg->http.location); + return; + } + + if (!message.h.resource.component[1]) { + ogs_error("No Subscription ID [%s]", recvmsg->http.location); + ogs_sbi_header_free(&header); + return; + } + + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("Invalid URI [%s]", header.uri); + ogs_sbi_header_free(&header); + return; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("%s: ogs_sbi_client_add()", OGS_FUNC); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("%s: ogs_sbi_client_add() failed", OGS_FUNC); - if (!message.h.resource.component[1]) { - ogs_error("No Subscription ID [%s]", recvmsg->http.location); ogs_sbi_header_free(&header); + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + return; } + } + OGS_SBI_SETUP_CLIENT(subscription_data, client); - ogs_sbi_subscription_data_set_id( - subscription_data, message.h.resource.component[1]); + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); - ogs_sbi_header_free(&header); + ogs_sbi_subscription_data_set_resource_uri( + subscription_data, header.uri); + ogs_sbi_subscription_data_set_id( + subscription_data, message.h.resource.component[1]); - } else if (SubscriptionData->subscription_id) { - /* - * For compatibility with v2.5.x and lower versions - * - * Deprecated : It will be removed soon. - */ - ogs_sbi_subscription_data_set_id( - subscription_data, SubscriptionData->subscription_id); - } else { - ogs_error("No Subscription ID"); - return; - } + ogs_sbi_header_free(&header); /* SBI Features */ if (SubscriptionData->nrf_supported_features) { diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 66dd8ef811..0ab3cf081f 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -313,6 +313,11 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) ogs_free(fqdn); ogs_freeaddrinfo(addr); ogs_freeaddrinfo(addr6); + + if (!client) { + ogs_fatal("No Client : [%s]", request->h.uri); + ogs_assert_if_reached(); + } } if (scp_client) { diff --git a/src/amf/context.c b/src/amf/context.c index 7fa8e183b6..c6ba6f3879 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1676,13 +1676,17 @@ void amf_ue_remove(amf_ue_t *amf_ue) /* Clear SubscribedInfo */ amf_clear_subscribed_info(amf_ue); - if (amf_ue->policy_association_id) - ogs_free(amf_ue->policy_association_id); - if (amf_ue->data_change_subscription_id) - ogs_free(amf_ue->data_change_subscription_id); + PCF_AM_POLICY_CLEAR(amf_ue); + if (amf_ue->policy_association.client) + ogs_sbi_client_remove(amf_ue->policy_association.client); - if (amf_ue->confirmation_url_for_5g_aka) - ogs_free(amf_ue->confirmation_url_for_5g_aka); + UDM_SDM_CLEAR(amf_ue); + if (amf_ue->data_change_subscription.client) + ogs_sbi_client_remove(amf_ue->data_change_subscription.client); + + CLEAR_5G_AKA_CONFIRMATION(amf_ue); + if (amf_ue->confirmation_for_5g_aka.client) + ogs_sbi_client_remove(amf_ue->confirmation_for_5g_aka.client); /* Free UeRadioCapability */ OGS_ASN_CLEAR_DATA(&amf_ue->ueRadioCapability); @@ -2249,8 +2253,10 @@ void amf_sess_remove(amf_sess_t *sess) ogs_list_count(&sess->sbi.xact_list)); ogs_sbi_object_free(&sess->sbi); - if (sess->sm_context_ref) - ogs_free(sess->sm_context_ref); + CLEAR_SESSION_CONTEXT(sess); + + if (sess->sm_context.client) + ogs_sbi_client_remove(sess->sm_context.client); if (sess->payload_container) ogs_pkbuf_free(sess->payload_container); diff --git a/src/amf/context.h b/src/amf/context.h index 33bcd5d021..4b3ab39e4a 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -290,13 +290,33 @@ struct amf_ue_s { /* PCF sends the RESPONSE * of [POST] /npcf-am-polocy-control/v1/policies */ #define PCF_AM_POLICY_ASSOCIATED(__aMF) \ - ((__aMF) && ((__aMF)->policy_association_id)) - + ((__aMF) && ((__aMF)->policy_association.id)) #define PCF_AM_POLICY_CLEAR(__aMF) \ - OGS_MEM_CLEAR((__aMF)->policy_association_id); -#define PCF_AM_POLICY_STORE(__aMF, __iD) \ - OGS_STRING_DUP((__aMF)->policy_association_id, __iD); - char *policy_association_id; + do { \ + ogs_assert((__aMF)); \ + if ((__aMF)->policy_association.resource_uri) \ + ogs_free((__aMF)->policy_association.resource_uri); \ + (__aMF)->policy_association.resource_uri = NULL; \ + if ((__aMF)->policy_association.id) \ + ogs_free((__aMF)->policy_association.id); \ + (__aMF)->policy_association.id = NULL; \ + } while(0) +#define PCF_AM_POLICY_STORE(__aMF, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__aMF)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + PCF_AM_POLICY_CLEAR(__aMF); \ + (__aMF)->policy_association.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__aMF)->policy_association.resource_uri); \ + (__aMF)->policy_association.id = ogs_strdup(__iD); \ + ogs_assert((__aMF)->policy_association.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } policy_association; /* 5GMM Capability */ struct { @@ -322,7 +342,27 @@ struct amf_ue_s { /* Security Context */ ogs_nas_ue_security_capability_t ue_security_capability; ogs_nas_ue_network_capability_t ue_network_capability; - char *confirmation_url_for_5g_aka; +#define CHECK_5G_AKA_CONFIRMATION(__aMF) \ + ((__aMF) && ((__aMF)->confirmation_for_5g_aka.resource_uri)) +#define STORE_5G_AKA_CONFIRMATION(__aMF, __rESOURCE_URI) \ + do { \ + ogs_assert((__aMF)); \ + CLEAR_5G_AKA_CONFIRMATION(__aMF); \ + (__aMF)->confirmation_for_5g_aka.resource_uri = \ + ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__aMF)->confirmation_for_5g_aka.resource_uri); \ + } while(0) +#define CLEAR_5G_AKA_CONFIRMATION(__aMF) \ + do { \ + ogs_assert((__aMF)); \ + if ((__aMF)->confirmation_for_5g_aka.resource_uri) \ + ogs_free((__aMF)->confirmation_for_5g_aka.resource_uri); \ + (__aMF)->confirmation_for_5g_aka.resource_uri = NULL; \ + } while(0) + struct { + char *resource_uri; + ogs_sbi_client_t *client; + } confirmation_for_5g_aka; uint8_t rand[OGS_RAND_LEN]; uint8_t autn[OGS_AUTN_LEN]; uint8_t xres_star[OGS_MAX_RES_LEN]; @@ -468,8 +508,34 @@ struct amf_ue_s { /* SubscriptionId of Subscription to Data Change Notification to UDM */ #define UDM_SDM_SUBSCRIBED(__aMF) \ - ((__aMF) && ((__aMF)->data_change_subscription_id)) - char *data_change_subscription_id; + ((__aMF) && ((__aMF)->data_change_subscription.id)) +#define UDM_SDM_CLEAR(__aMF) \ + do { \ + ogs_assert((__aMF)); \ + if ((__aMF)->data_change_subscription.resource_uri) \ + ogs_free((__aMF)->data_change_subscription.resource_uri); \ + (__aMF)->data_change_subscription.resource_uri = NULL; \ + if ((__aMF)->data_change_subscription.id) \ + ogs_free((__aMF)->data_change_subscription.id); \ + (__aMF)->data_change_subscription.id = NULL; \ + } while(0) +#define UDM_SDM_STORE(__aMF, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__aMF)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + UDM_SDM_CLEAR(__aMF); \ + (__aMF)->data_change_subscription.resource_uri = \ + ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__aMF)->data_change_subscription.resource_uri); \ + (__aMF)->data_change_subscription.id = ogs_strdup(__iD); \ + ogs_assert((__aMF)->data_change_subscription.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } data_change_subscription; struct { /* @@ -499,18 +565,37 @@ typedef struct amf_sess_s { uint8_t pti; /* Procedure Trasaction Identity */ #define SESSION_CONTEXT_IN_SMF(__sESS) \ - ((__sESS) && (__sESS)->sm_context_ref) -#define CLEAR_SM_CONTEXT_REF(__sESS) \ + ((__sESS) && (__sESS)->sm_context.ref) +#define STORE_SESSION_CONTEXT(__sESS, __rESOURCE_URI, __rEF) \ + do { \ + ogs_assert(__sESS); \ + ogs_assert(__rESOURCE_URI); \ + ogs_assert(__rEF); \ + CLEAR_SESSION_CONTEXT(__sESS); \ + (__sESS)->sm_context.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->sm_context.resource_uri); \ + (__sESS)->sm_context.ref = ogs_strdup(__rEF); \ + ogs_assert((__sESS)->sm_context.ref); \ + } while(0); +#define CLEAR_SESSION_CONTEXT(__sESS) \ do { \ ogs_assert(__sESS); \ - ogs_assert((__sESS)->sm_context_ref); \ - ogs_free((__sESS)->sm_context_ref); \ - (__sESS)->sm_context_ref = NULL; \ + if ((__sESS)->sm_context.ref) \ + ogs_free((__sESS)->sm_context.ref); \ + (__sESS)->sm_context.ref = NULL; \ + if ((__sESS)->sm_context.resource_uri) \ + ogs_free((__sESS)->sm_context.resource_uri); \ + (__sESS)->sm_context.resource_uri = NULL; \ } while(0); /* SMF sends the RESPONSE * of [POST] /nsmf-pdusession/v1/sm-contexts */ - char *sm_context_ref; + struct { + char *resource_uri; + char *ref; + ogs_sbi_client_t *client; + } sm_context; + bool pdu_session_release_complete_received; bool pdu_session_resource_release_response_received; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 16a9eb1e3a..1d85335a9a 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1283,9 +1283,11 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, sess->s_nssai.sd.v = selected_slice->s_nssai.sd.v; ogs_info("UE SUPI[%s] DNN[%s] S_NSSAI[SST:%d SD:0x%x] " - "smContextRef [%s]", + "smContextRef[%s] smContextResourceURI[%s]", amf_ue->supi, sess->dnn, sess->s_nssai.sst, sess->s_nssai.sd.v, - sess->sm_context_ref ? sess->sm_context_ref : "NULL"); + sess->sm_context.ref ? sess->sm_context.ref : "NULL", + sess->sm_context.resource_uri ? + sess->sm_context.resource_uri : "NULL"); if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -1435,7 +1437,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, sess->pdu_session_release_complete_received = true; if (sess->pdu_session_resource_release_response_received == true) - CLEAR_SM_CONTEXT_REF(sess); + CLEAR_SESSION_CONTEXT(sess); break; default: break; @@ -1676,7 +1678,7 @@ static void amf_namf_comm_decode_ue_session_context_list( sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); ogs_assert(sess); - sess->sm_context_ref = PduSessionContext->sm_context_ref; + sess->sm_context.ref = PduSessionContext->sm_context_ref; if (PduSessionContext->s_nssai) { memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 64a20e785a..69e1f85e3a 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -274,9 +274,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) ogs_warn("[%s] Ignore SBI message", amf_ue->suci); break; CASE(OGS_SBI_HTTP_METHOD_DELETE) - if (amf_ue->confirmation_url_for_5g_aka) - ogs_free(amf_ue->confirmation_url_for_5g_aka); - amf_ue->confirmation_url_for_5g_aka = NULL; + CLEAR_5G_AKA_CONFIRMATION(amf_ue); if (state == AMF_RELEASE_SM_CONTEXT_NO_STATE || state == AMF_UE_INITIATED_DE_REGISTERED) { @@ -378,10 +376,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) */ if (state == AMF_RELEASE_SM_CONTEXT_NO_STATE || state == AMF_UE_INITIATED_DE_REGISTERED) { - if (amf_ue->data_change_subscription_id) { - ogs_free(amf_ue->data_change_subscription_id); - amf_ue->data_change_subscription_id = NULL; - } + UDM_SDM_CLEAR(amf_ue); r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, @@ -447,7 +442,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) if (state == AMF_RELEASE_SM_CONTEXT_NO_STATE || state == AMF_UE_INITIATED_DE_REGISTERED) { - if (amf_ue->confirmation_url_for_5g_aka) { + if (CHECK_5G_AKA_CONFIRMATION(amf_ue)) { r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, @@ -857,9 +852,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) ogs_warn("[%s] Ignore SBI message", amf_ue->suci); break; CASE(OGS_SBI_HTTP_METHOD_DELETE) - if (amf_ue->confirmation_url_for_5g_aka) - ogs_free(amf_ue->confirmation_url_for_5g_aka); - amf_ue->confirmation_url_for_5g_aka = NULL; + CLEAR_5G_AKA_CONFIRMATION(amf_ue); if (state == AMF_RELEASE_SM_CONTEXT_NO_STATE || state == AMF_UE_INITIATED_DE_REGISTERED) { @@ -967,10 +960,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) AMF_NETWORK_INITIATED_IMPLICIT_DE_REGISTERED || state == AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { - if (amf_ue->data_change_subscription_id) { - ogs_free(amf_ue->data_change_subscription_id); - amf_ue->data_change_subscription_id = NULL; - } + UDM_SDM_CLEAR(amf_ue); r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, @@ -1044,7 +1034,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) state == AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { - if (amf_ue->confirmation_url_for_5g_aka) { + if (amf_ue->confirmation_for_5g_aka.resource_uri) { r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index d1b97cffe8..6fb1a91b52 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -246,7 +246,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer( amf_ue->supi, sess->psi, N1N2MessageTransferReqData-> n1n2_failure_txf_notif_uri); - return OGS_ERROR;; + return OGS_ERROR; } client = ogs_sbi_client_find( @@ -287,7 +287,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer( header.resource.component[1] = amf_ue->supi; header.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES; - header.resource.component[3] = sess->sm_context_ref; + header.resource.component[3] = sess->sm_context.ref; sendmsg.http.location = ogs_sbi_server_uri(server, &header); @@ -349,13 +349,12 @@ int amf_namf_comm_handle_n1_n2_message_transfer( header.resource.component[1] = amf_ue->supi; header.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES; - header.resource.component[3] = sess->sm_context_ref; + header.resource.component[3] = sess->sm_context.ref; sendmsg.http.location = ogs_sbi_server_uri(server, &header); /* Store Paging Info */ - AMF_SESS_STORE_PAGING_INFO( - sess, sendmsg.http.location, NULL); + AMF_SESS_STORE_PAGING_INFO(sess, sendmsg.http.location, NULL); /* Store 5GSM Message */ AMF_SESS_STORE_5GSM_MESSAGE(sess, @@ -424,13 +423,12 @@ int amf_namf_comm_handle_n1_n2_message_transfer( header.resource.component[1] = amf_ue->supi; header.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES; - header.resource.component[3] = sess->sm_context_ref; + header.resource.component[3] = sess->sm_context.ref; sendmsg.http.location = ogs_sbi_server_uri(server, &header); /* Store Paging Info */ - AMF_SESS_STORE_PAGING_INFO( - sess, sendmsg.http.location, NULL); + AMF_SESS_STORE_PAGING_INFO(sess, sendmsg.http.location, NULL); /* Store 5GSM Message */ AMF_SESS_STORE_5GSM_MESSAGE(sess, @@ -1174,7 +1172,7 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *am ogs_assert(sNSSAI); PduSessionContext->pdu_session_id = sess->psi; - PduSessionContext->sm_context_ref = sess->sm_context_ref; + PduSessionContext->sm_context_ref = sess->sm_context.ref; sNSSAI->sst = sess->s_nssai.sst; sNSSAI->sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index 72c8aee607..f3d69bf17e 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -87,11 +87,11 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate_delete( ogs_sbi_request_t *request = NULL; ogs_assert(amf_ue); - ogs_assert(amf_ue->confirmation_url_for_5g_aka); + ogs_assert(amf_ue->confirmation_for_5g_aka.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; - message.h.uri = amf_ue->confirmation_url_for_5g_aka; + message.h.uri = amf_ue->confirmation_for_5g_aka.resource_uri; request = ogs_sbi_build_request(&message); ogs_expect(request); @@ -110,11 +110,11 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate_confirmation( OpenAPI_confirmation_data_t *ConfirmationData = NULL; ogs_assert(amf_ue); - ogs_assert(amf_ue->confirmation_url_for_5g_aka); + ogs_assert(amf_ue->confirmation_for_5g_aka.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_PUT; - message.h.uri = amf_ue->confirmation_url_for_5g_aka; + message.h.uri = amf_ue->confirmation_for_5g_aka.resource_uri; ConfirmationData = ogs_calloc(1, sizeof(*ConfirmationData)); if (!ConfirmationData) { diff --git a/src/amf/nausf-handler.c b/src/amf/nausf-handler.c index d5cd875bff..0e4c94ef1a 100644 --- a/src/amf/nausf-handler.c +++ b/src/amf/nausf-handler.c @@ -30,9 +30,21 @@ int amf_nausf_auth_handle_authenticate( OpenAPI_map_t *LinksValueScheme = NULL; OpenAPI_lnode_t *node = NULL; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + ogs_assert(amf_ue); ogs_assert(message); + if (!message->http.location) { + ogs_error("[%s] No http.location", amf_ue->suci); + return OGS_ERROR; + } + UeAuthenticationCtx = message->UeAuthenticationCtx; if (!UeAuthenticationCtx) { ogs_error("[%s] No UeAuthenticationCtx", amf_ue->suci); @@ -92,11 +104,36 @@ int amf_nausf_auth_handle_authenticate( return OGS_ERROR; } - if (amf_ue->confirmation_url_for_5g_aka) - ogs_free(amf_ue->confirmation_url_for_5g_aka); - amf_ue->confirmation_url_for_5g_aka = - ogs_strdup(LinksValueSchemeValue->href); - ogs_assert(amf_ue->confirmation_url_for_5g_aka); + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, message->http.location); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s] Invalid URI [%s]", + amf_ue->suci, message->http.location); + return OGS_ERROR; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s] ogs_sbi_client_add()", amf_ue->suci); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s] ogs_sbi_client_add() failed", amf_ue->suci); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + return OGS_ERROR; + } + } + + OGS_SBI_SETUP_CLIENT(&amf_ue->confirmation_for_5g_aka, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + STORE_5G_AKA_CONFIRMATION(amf_ue, message->http.location); ogs_ascii_to_hex(AV5G_AKA->rand, strlen(AV5G_AKA->rand), amf_ue->rand, sizeof(amf_ue->rand)); diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index e9e2b87686..da4829acb8 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -2516,7 +2516,7 @@ void ngap_handle_pdu_session_resource_release_response( sess->pdu_session_resource_release_response_received = true; if (sess->pdu_session_release_complete_received == true) - CLEAR_SM_CONTEXT_REF(sess); + CLEAR_SESSION_CONTEXT(sess); } } diff --git a/src/amf/npcf-build.c b/src/amf/npcf-build.c index ba42634120..616771cec2 100644 --- a/src/amf/npcf-build.c +++ b/src/amf/npcf-build.c @@ -221,15 +221,11 @@ ogs_sbi_request_t *amf_npcf_am_policy_control_build_delete( ogs_assert(amf_ue); ogs_assert(amf_ue->supi); - ogs_assert(amf_ue->policy_association_id); + ogs_assert(amf_ue->policy_association.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; - message.h.service.name = - (char *)OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_POLICIES; - message.h.resource.component[1] = amf_ue->policy_association_id; + message.h.uri = amf_ue->policy_association.resource_uri; request = ogs_sbi_build_request(&message); ogs_expect(request); diff --git a/src/amf/npcf-handler.c b/src/amf/npcf-handler.c index 2ba4a58a20..ff59e977a0 100644 --- a/src/amf/npcf-handler.c +++ b/src/amf/npcf-handler.c @@ -35,6 +35,13 @@ int amf_npcf_am_policy_control_handle_create( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_CREATED) { ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, recvmsg->res_status); @@ -98,12 +105,53 @@ int amf_npcf_am_policy_control_handle_create( return OGS_ERROR; } + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s] Invalid URI [%s]", amf_ue->supi, header.uri); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_gmm_reject_from_sbi( + amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + return OGS_ERROR; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s] ogs_sbi_client_add()", amf_ue->supi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s] ogs_sbi_client_add() failed", amf_ue->supi); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_gmm_reject_from_sbi( + amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + return OGS_ERROR; + } + } + + OGS_SBI_SETUP_CLIENT(&amf_ue->policy_association, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + PCF_AM_POLICY_STORE(amf_ue, header.uri, message.h.resource.component[1]); + /* SBI Features */ supported_features = ogs_uint64_from_string(PolicyAssociation->supp_feat); amf_ue->am_policy_control_features &= supported_features; - PCF_AM_POLICY_STORE(amf_ue, message.h.resource.component[1]); - OpenAPI_list_for_each(PolicyAssociation->triggers, node) { if (node->data) { OpenAPI_request_trigger_e trigger = (intptr_t)node->data; diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 4a36649a98..1945b37750 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -272,17 +272,15 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_update_sm_context( ogs_assert(param); ogs_assert(sess); - ogs_assert(sess->sm_context_ref); + ogs_assert(sess->sm_context.resource_uri); amf_ue = sess->amf_ue; ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_CONTEXTS; - message.h.resource.component[1] = sess->sm_context_ref; - message.h.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_MODIFY; + message.h.uri = ogs_msprintf("%s/%s", + sess->sm_context.resource_uri, OGS_SBI_RESOURCE_NAME_MODIFY); + ogs_assert(message.h.uri); memset(&ueLocation, 0, sizeof(ueLocation)); memset(&SmContextUpdateData, 0, sizeof(SmContextUpdateData)); @@ -377,6 +375,8 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_update_sm_context( ogs_expect(request); end: + if (message.h.uri) + ogs_free(message.h.uri); if (ueLocation.nr_location) { if (ueLocation.nr_location->ue_location_timestamp) ogs_free(ueLocation.nr_location->ue_location_timestamp); @@ -405,18 +405,15 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_release_sm_context( OpenAPI_user_location_t ueLocation; ogs_assert(sess); - ogs_assert(sess->sm_context_ref); + ogs_assert(sess->sm_context.resource_uri); amf_ue = sess->amf_ue; ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_SM_CONTEXTS; - message.h.resource.component[1] = sess->sm_context_ref; - message.h.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_RELEASE; + message.h.uri = ogs_msprintf("%s/%s", + sess->sm_context.resource_uri, OGS_SBI_RESOURCE_NAME_RELEASE); + ogs_assert(message.h.uri); memset(&SmContextReleaseData, 0, sizeof(SmContextReleaseData)); @@ -460,6 +457,8 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_release_sm_context( ogs_expect(request); end: + if (message.h.uri) + ogs_free(message.h.uri); if (ueLocation.nr_location) { if (ueLocation.nr_location->ue_location_timestamp) ogs_free(ueLocation.nr_location->ue_location_timestamp); diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 09aad02934..c4ea1e5af7 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -56,6 +56,13 @@ int amf_nsmf_pdusession_handle_create_sm_context( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + if (!recvmsg->http.location) { ogs_error("[%d:%d] No http.location", sess->psi, sess->pti); r = nas_5gs_send_back_gsm_message(ran_ue, sess, @@ -97,6 +104,55 @@ int amf_nsmf_pdusession_handle_create_sm_context( return OGS_ERROR; } + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s:%d] Invalid URI [%s]", + amf_ue->supi, sess->psi, header.uri); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_back_gsm_message(ran_ue, sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, + AMF_NAS_BACKOFF_TIME); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + return OGS_ERROR; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s:%d] ogs_sbi_client_add()", amf_ue->supi, sess->psi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s:%d] ogs_sbi_client_add() failed", + amf_ue->supi, sess->psi); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_back_gsm_message(ran_ue, sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, + AMF_NAS_BACKOFF_TIME); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + return OGS_ERROR; + } + } + OGS_SBI_SETUP_CLIENT(&sess->sm_context, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + STORE_SESSION_CONTEXT( + sess, header.uri, message.h.resource.component[1]); + + ogs_sbi_header_free(&header); + if (sess->pdu_session_establishment_accept) { /* * [1-SERVER] /namf-comm/v1/ue-contexts/{supi}/n1-n2-messages @@ -117,7 +173,6 @@ int amf_nsmf_pdusession_handle_create_sm_context( ogs_error("[%d:%d] nas_5gs_send_to_gnb() failed", sess->psi, sess->pti); - ogs_sbi_header_free(&header); r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); @@ -128,13 +183,6 @@ int amf_nsmf_pdusession_handle_create_sm_context( } } - if (sess->sm_context_ref) - ogs_free(sess->sm_context_ref); - sess->sm_context_ref = ogs_strdup(message.h.resource.component[1]); - ogs_assert(sess->sm_context_ref); - - ogs_sbi_header_free(&header); - } else { OpenAPI_sm_context_create_error_t *SmContextCreateError = NULL; OpenAPI_ref_to_binary_data_t *n1SmMsg = NULL; diff --git a/src/amf/nudm-build.c b/src/amf/nudm-build.c index 2aff3561f1..e20093c83d 100644 --- a/src/amf/nudm-build.c +++ b/src/amf/nudm-build.c @@ -255,16 +255,11 @@ ogs_sbi_request_t *amf_nudm_sdm_build_subscription_delete( ogs_assert(amf_ue); ogs_assert(amf_ue->supi); - ogs_assert(amf_ue->data_change_subscription_id); + ogs_assert(amf_ue->data_change_subscription.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NUDM_SDM; - message.h.api.version = (char *)OGS_SBI_API_V2; - message.h.resource.component[0] = amf_ue->supi; - message.h.resource.component[1] = - (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; - message.h.resource.component[2] = amf_ue->data_change_subscription_id; + message.h.uri = amf_ue->data_change_subscription.resource_uri; request = ogs_sbi_build_request(&message); ogs_expect(request); diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index fdea91eecc..2eb3e109d0 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -246,7 +246,7 @@ int amf_nudm_sdm_handle_provisioned( break; CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA) - if (amf_ue->data_change_subscription_id) { + if (UDM_SDM_SUBSCRIBED(amf_ue)) { /* we already have a SDM subscription to UDM; continue without * subscribing again */ r = amf_ue_sbi_discover_and_send( @@ -272,6 +272,13 @@ int amf_nudm_sdm_handle_provisioned( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + if (!recvmsg->http.location) { ogs_error("[%s] No http.location", amf_ue->supi); r = nas_5gs_send_gmm_reject_from_sbi( @@ -288,10 +295,12 @@ int amf_nudm_sdm_handle_provisioned( if (rv != OGS_OK) { ogs_error("[%s] Cannot parse http.location [%s]", amf_ue->supi, recvmsg->http.location); + r = nas_5gs_send_gmm_reject_from_sbi( amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + return OGS_ERROR; } @@ -304,13 +313,52 @@ int amf_nudm_sdm_handle_provisioned( amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + + return OGS_ERROR; + } + + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s] Invalid URI [%s]", amf_ue->supi, header.uri); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_gmm_reject_from_sbi( + amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return OGS_ERROR; } - if (amf_ue->data_change_subscription_id) - ogs_free(amf_ue->data_change_subscription_id); - amf_ue->data_change_subscription_id = - ogs_strdup(message.h.resource.component[2]); + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s] ogs_sbi_client_add()", amf_ue->supi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s] ogs_sbi_client_add() failed", amf_ue->supi); + + ogs_sbi_header_free(&header); + r = nas_5gs_send_gmm_reject_from_sbi( + amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + return OGS_ERROR; + } + } + + OGS_SBI_SETUP_CLIENT(&amf_ue->policy_association, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + UDM_SDM_STORE(amf_ue, header.uri, message.h.resource.component[2]); ogs_sbi_header_free(&header); diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index c48d3e49e1..52103c6f4c 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -505,7 +505,7 @@ void amf_sbi_send_release_session( ogs_assert(r != OGS_ERROR); /* Prevent to invoke SMF for this session */ - CLEAR_SM_CONTEXT_REF(sess); + CLEAR_SESSION_CONTEXT(sess); } void amf_sbi_send_release_all_sessions( diff --git a/src/ausf/context.c b/src/ausf/context.c index 6b96d4dd44..06cfa209b1 100644 --- a/src/ausf/context.c +++ b/src/ausf/context.c @@ -184,8 +184,9 @@ void ausf_ue_remove(ausf_ue_t *ausf_ue) ogs_free(ausf_ue->supi); } - if (ausf_ue->auth_events_url) - ogs_free(ausf_ue->auth_events_url); + AUTH_EVENT_CLEAR(ausf_ue); + if (ausf_ue->auth_event.client) + ogs_sbi_client_remove(ausf_ue->auth_event.client); if (ausf_ue->serving_network_name) ogs_free(ausf_ue->serving_network_name); diff --git a/src/ausf/context.h b/src/ausf/context.h index 6da3a06c33..ab76f48a63 100644 --- a/src/ausf/context.h +++ b/src/ausf/context.h @@ -52,7 +52,25 @@ struct ausf_ue_s { char *serving_network_name; OpenAPI_auth_type_e auth_type; - char *auth_events_url; +#define AUTH_EVENT_CLEAR(__aUSF) \ + do { \ + ogs_assert((__aUSF)); \ + if ((__aUSF)->auth_event.resource_uri) \ + ogs_free((__aUSF)->auth_event.resource_uri); \ + (__aUSF)->auth_event.resource_uri = NULL; \ + } while(0) +#define AUTH_EVENT_STORE(__aUSF, __rESOURCE_URI) \ + do { \ + ogs_assert((__aUSF)); \ + ogs_assert((__rESOURCE_URI)); \ + AUTH_EVENT_CLEAR(__aUSF); \ + (__aUSF)->auth_event.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__aUSF)->auth_event.resource_uri); \ + } while(0) + struct { + char *resource_uri; + ogs_sbi_client_t *client; + } auth_event; OpenAPI_auth_result_e auth_result; uint8_t rand[OGS_RAND_LEN]; diff --git a/src/ausf/nudm-handler.c b/src/ausf/nudm-handler.c index 91d835170e..7061cf6d45 100644 --- a/src/ausf/nudm-handler.c +++ b/src/ausf/nudm-handler.c @@ -244,8 +244,7 @@ bool ausf_nudm_ueau_handle_get(ausf_ue_t *ausf_ue, sendmsg.UeAuthenticationCtx = &UeAuthenticationCtx; - response = ogs_sbi_build_response(&sendmsg, - OGS_SBI_HTTP_STATUS_CREATED); + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_CREATED); ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); @@ -286,6 +285,13 @@ bool ausf_nudm_ueau_handle_result_confirmation_inform(ausf_ue_t *ausf_ue, OpenAPI_confirmation_data_response_t ConfirmationDataResponse; OpenAPI_auth_event_t *AuthEvent = NULL; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + ogs_assert(ausf_ue); ogs_assert(stream); @@ -308,10 +314,33 @@ bool ausf_nudm_ueau_handle_result_confirmation_inform(ausf_ue_t *ausf_ue, return false; } - if (ausf_ue->auth_events_url) - ogs_free(ausf_ue->auth_events_url); - ausf_ue->auth_events_url = ogs_strdup(recvmsg->http.location); - ogs_assert(ausf_ue->auth_events_url); + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, recvmsg->http.location); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s] Invalid URI [%s]", + ausf_ue->suci, recvmsg->http.location); + + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "Invalid URI", ausf_ue->suci)); + + return false; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s] ogs_sbi_client_add()", ausf_ue->suci); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + ogs_assert(client); + } + + OGS_SBI_SETUP_CLIENT(&ausf_ue->auth_event, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + AUTH_EVENT_STORE(ausf_ue, recvmsg->http.location); memset(&ConfirmationDataResponse, 0, sizeof(ConfirmationDataResponse)); diff --git a/src/pcf/context.c b/src/pcf/context.c index 924eb464ed..5514649825 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -495,8 +495,9 @@ void pcf_sess_remove(pcf_sess_t *sess) ogs_assert(sess->sm_policy_id); ogs_free(sess->sm_policy_id); - if (sess->binding_id) - ogs_free(sess->binding_id); + PCF_BINDING_CLEAR(sess); + if (sess->binding.client) + ogs_sbi_client_remove(sess->binding.client); if (sess->dnn) ogs_free(sess->dnn); diff --git a/src/pcf/context.h b/src/pcf/context.h index 87d446ec3e..b8756390d0 100644 --- a/src/pcf/context.h +++ b/src/pcf/context.h @@ -81,7 +81,34 @@ struct pcf_sess_s { /* BSF sends the RESPONSE * of [POST] /nbsf-management/v1/PcfBindings */ - char *binding_id; +#define PCF_BINDING_ASSOCIATED(__sESS) \ + ((__sESS) && ((__sESS)->binding.id)) +#define PCF_BINDING_CLEAR(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + if ((__sESS)->binding.resource_uri) \ + ogs_free((__sESS)->binding.resource_uri); \ + (__sESS)->binding.resource_uri = NULL; \ + if ((__sESS)->binding.id) \ + ogs_free((__sESS)->binding.id); \ + (__sESS)->binding.id = NULL; \ + } while(0) +#define PCF_BINDING_STORE(__sESS, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__sESS)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + PCF_BINDING_CLEAR(__sESS); \ + (__sESS)->binding.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->binding.resource_uri); \ + (__sESS)->binding.id = ogs_strdup(__iD); \ + ogs_assert((__sESS)->binding.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } binding; uint8_t psi; /* PDU Session Identity */ diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index 685e0fab3c..9dc7850047 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -189,15 +189,11 @@ ogs_sbi_request_t *pcf_nbsf_management_build_de_register( ogs_assert(sess); pcf_ue = sess->pcf_ue; ogs_assert(pcf_ue); - ogs_assert(sess->binding_id); + ogs_assert(sess->binding.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NBSF_MANAGEMENT; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_PCF_BINDINGS; - message.h.resource.component[1] = sess->binding_id; + message.h.uri = sess->binding.resource_uri; request = ogs_sbi_build_request(&message); ogs_expect(request); diff --git a/src/pcf/nbsf-handler.c b/src/pcf/nbsf-handler.c index 84c3ddbb48..9176efc423 100644 --- a/src/pcf/nbsf-handler.c +++ b/src/pcf/nbsf-handler.c @@ -62,6 +62,13 @@ bool pcf_nbsf_management_handle_register( OpenAPI_list_t *PolicyCtrlReqTriggers = NULL; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + ogs_assert(sess); pcf_ue = sess->pcf_ue; ogs_assert(pcf_ue); @@ -115,10 +122,39 @@ bool pcf_nbsf_management_handle_register( goto cleanup; } - if (sess->binding_id) - ogs_free(sess->binding_id); - sess->binding_id = ogs_strdup(message.h.resource.component[1]); - ogs_assert(sess->binding_id); + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + strerror = ogs_msprintf("[%s:%d] Invalid URI [%s]", + pcf_ue->supi, sess->psi, header.uri); + ogs_sbi_header_free(&header); + goto cleanup; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s:%d] ogs_sbi_client_add()", pcf_ue->supi, sess->psi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + strerror = ogs_msprintf("[%s:%d] ogs_sbi_client_add() failed", + pcf_ue->supi, sess->psi); + + ogs_sbi_header_free(&header); + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + goto cleanup; + } + } + + OGS_SBI_SETUP_CLIENT(&sess->binding, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + PCF_BINDING_STORE(sess, header.uri, message.h.resource.component[1]); ogs_sbi_header_free(&header); @@ -324,7 +360,7 @@ bool pcf_nbsf_management_handle_register( memset(&header, 0, sizeof(header)); header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; header.api.version = (char *)OGS_SBI_API_V1; - header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_POLICIES; + header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; header.resource.component[1] = sess->sm_policy_id; memset(&sendmsg, 0, sizeof(sendmsg)); diff --git a/src/smf/context.c b/src/smf/context.c index 125f8df694..8108471d25 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1729,8 +1729,9 @@ void smf_sess_remove(smf_sess_t *sess) if (sess->namf.client) ogs_sbi_client_remove(sess->namf.client); - if (sess->policy_association_id) - ogs_free(sess->policy_association_id); + PCF_SM_POLICY_CLEAR(sess); + if (sess->policy_association.client) + ogs_sbi_client_remove(sess->policy_association.client); if (sess->session.name) ogs_free(sess->session.name); diff --git a/src/smf/context.h b/src/smf/context.h index 62d0ee559f..87a84caeea 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -284,7 +284,34 @@ typedef struct smf_sess_s { /* PCF sends the RESPONSE * of [POST] /npcf-smpolocycontrol/v1/policies */ - char *policy_association_id; +#define PCF_SM_POLICY_ASSOCIATED(__sESS) \ + ((__sESS) && ((__sESS)->policy_association.id)) +#define PCF_SM_POLICY_CLEAR(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + if ((__sESS)->policy_association.resource_uri) \ + ogs_free((__sESS)->policy_association.resource_uri); \ + (__sESS)->policy_association.resource_uri = NULL; \ + if ((__sESS)->policy_association.id) \ + ogs_free((__sESS)->policy_association.id); \ + (__sESS)->policy_association.id = NULL; \ + } while(0) +#define PCF_SM_POLICY_STORE(__sESS, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__sESS)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + PCF_SM_POLICY_CLEAR(__sESS); \ + (__sESS)->policy_association.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->policy_association.resource_uri); \ + (__sESS)->policy_association.id = ogs_strdup(__iD); \ + ogs_assert((__sESS)->policy_association.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } policy_association; OpenAPI_up_cnx_state_e up_cnx_state; diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index b42ddbd9c7..107b6cc37a 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -944,9 +944,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) } else { SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_DELETE) - if (sess->policy_association_id) - ogs_free(sess->policy_association_id); - sess->policy_association_id = NULL; + PCF_SM_POLICY_CLEAR(sess); if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { @@ -1085,7 +1083,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST: - if (sess->policy_association_id) { + if (PCF_SM_POLICY_ASSOCIATED(sess)) { smf_npcf_smpolicycontrol_param_t param; memset(&param, 0, sizeof(param)); @@ -1822,7 +1820,7 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - if (sess->policy_association_id) { + if (PCF_SM_POLICY_ASSOCIATED(sess)) { smf_npcf_smpolicycontrol_param_t param; int r = 0; @@ -1864,9 +1862,7 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) } else { SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_DELETE) - if (sess->policy_association_id) - ogs_free(sess->policy_association_id); - sess->policy_association_id = NULL; + PCF_SM_POLICY_CLEAR(sess); if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { diff --git a/src/smf/npcf-build.c b/src/smf/npcf-build.c index b59adccf58..f4ca9b88fa 100644 --- a/src/smf/npcf-build.c +++ b/src/smf/npcf-build.c @@ -303,15 +303,13 @@ ogs_sbi_request_t *smf_npcf_smpolicycontrol_build_delete( ogs_assert(sess->sm_context_ref); smf_ue = sess->smf_ue; ogs_assert(smf_ue); - ogs_assert(sess->policy_association_id); + ogs_assert(sess->policy_association.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; - message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; - message.h.resource.component[1] = sess->policy_association_id; - message.h.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_DELETE; + message.h.uri = ogs_msprintf("%s/%s", + sess->policy_association.resource_uri, + OGS_SBI_RESOURCE_NAME_DELETE); memset(&SmPolicyDeleteData, 0, sizeof(SmPolicyDeleteData)); @@ -400,6 +398,9 @@ ogs_sbi_request_t *smf_npcf_smpolicycontrol_build_delete( end: + if (message.h.uri) + ogs_free(message.h.uri); + if (ueLocation.nr_location) { if (ueLocation.nr_location->ue_location_timestamp) ogs_free(ueLocation.nr_location->ue_location_timestamp); diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 631363fdab..b3ed198ace 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -296,6 +296,13 @@ bool smf_npcf_smpolicycontrol_handle_create( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + ogs_assert(sess); smf_ue = sess->smf_ue; ogs_assert(smf_ue); @@ -331,10 +338,39 @@ bool smf_npcf_smpolicycontrol_handle_create( return false; } - if (sess->policy_association_id) - ogs_free(sess->policy_association_id); - sess->policy_association_id = ogs_strdup(message.h.resource.component[1]); - ogs_assert(sess->policy_association_id); + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s:%d] Invalid URI [%s]", + smf_ue->supi, sess->psi, header.uri); + ogs_sbi_header_free(&header); + return OGS_ERROR; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s:%d] ogs_sbi_client_add()", smf_ue->supi, sess->psi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s:%d] ogs_sbi_client_add() failed", + smf_ue->supi, sess->psi); + + ogs_sbi_header_free(&header); + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + return OGS_ERROR; + } + } + + OGS_SBI_SETUP_CLIENT(&sess->policy_association, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + PCF_SM_POLICY_STORE(sess, header.uri, message.h.resource.component[1]); ogs_sbi_header_free(&header); @@ -719,7 +755,7 @@ bool smf_npcf_smpolicycontrol_handle_terminate_notify( ogs_assert(true == ogs_sbi_send_http_status_no_content(stream)); - if (sess->policy_association_id) { + if (PCF_SM_POLICY_ASSOCIATED(sess)) { memset(&param, 0, sizeof(param)); r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NPCF_SMPOLICYCONTROL, NULL, diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 0b3c769a62..08fd8225c5 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -756,7 +756,7 @@ bool smf_nsmf_handle_update_sm_context( ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - } else if (sess->policy_association_id) { + } else if (PCF_SM_POLICY_ASSOCIATED(sess)) { smf_npcf_smpolicycontrol_param_t param; memset(&param, 0, sizeof(param)); @@ -862,7 +862,7 @@ bool smf_nsmf_handle_release_sm_context( SmContextReleaseData->_5g_mm_cause_value; } - if (sess->policy_association_id) { + if (PCF_SM_POLICY_ASSOCIATED(sess)) { r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NPCF_SMPOLICYCONTROL, NULL, smf_npcf_smpolicycontrol_build_delete, diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 2fe69d1f39..084b2f1842 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -535,7 +535,7 @@ static void reselect_upf(ogs_pfcp_node_t *node) ogs_error("[%s:%s] EPC restoration is not implemented", smf_ue->imsi_bcd, sess->session.name); } else { - if (sess->policy_association_id) { + if (PCF_SM_POLICY_ASSOCIATED(sess)) { smf_npcf_smpolicycontrol_param_t param; ogs_info("[%s:%d] SMF-initiated Deletion", diff --git a/tests/af/context.c b/tests/af/context.c index 21d4e21565..466bf77e14 100644 --- a/tests/af/context.c +++ b/tests/af/context.c @@ -27,8 +27,6 @@ static OGS_POOL(af_sess_pool, af_sess_t); static int context_initialized = 0; -static void clear_pcf_app_session_id(af_sess_t *sess); - void af_context_init(void) { ogs_assert(context_initialized == 0); @@ -144,9 +142,9 @@ af_sess_t *af_sess_add_by_ue_address(ogs_ip_t *ue_address) ogs_assert(sess); memset(sess, 0, sizeof *sess); - sess->af_app_session_id = ogs_msprintf("%d", + sess->app_session.af.id = ogs_msprintf("%d", (int)ogs_pool_index(&af_sess_pool, sess)); - ogs_assert(sess->af_app_session_id); + ogs_assert(sess->app_session.af.id); if (ue_address->ipv4) { sess->ipv4addr = ogs_ipv4_to_string(ue_address->addr); @@ -182,10 +180,12 @@ void af_sess_remove(af_sess_t *sess) /* Free SBI object memory */ ogs_sbi_object_free(&sess->sbi); - if (sess->af_app_session_id) - ogs_free(sess->af_app_session_id); + if (sess->app_session.af.id) + ogs_free(sess->app_session.af.id); - clear_pcf_app_session_id(sess); + PCF_APP_SESSION_CLEAR(sess); + if (sess->app_session.pcf.client) + ogs_sbi_client_remove(sess->app_session.pcf.client); if (sess->ipv4addr) ogs_free(sess->ipv4addr); @@ -227,33 +227,6 @@ void af_sess_remove_all(void) af_sess_remove(sess); } -static void clear_pcf_app_session_id(af_sess_t *sess) -{ - ogs_assert(sess); - - if (sess->pcf_app_session_id) { - ogs_hash_set(self.pcf_app_session_id_hash, - &sess->pcf_app_session_id, sizeof(sess->pcf_app_session_id), NULL); - ogs_free(sess->pcf_app_session_id); - } -} - -bool af_sess_set_pcf_app_session_id(af_sess_t *sess, char *pcf_app_session_id) -{ - ogs_assert(sess); - ogs_assert(pcf_app_session_id); - - clear_pcf_app_session_id(sess); - - sess->pcf_app_session_id = ogs_strdup(pcf_app_session_id); - ogs_assert(sess->pcf_app_session_id); - - ogs_hash_set(self.pcf_app_session_id_hash, - &sess->pcf_app_session_id, strlen(sess->pcf_app_session_id), sess); - - return true; -} - af_sess_t *af_sess_find(uint32_t index) { return ogs_pool_find(&af_sess_pool, index); @@ -265,13 +238,6 @@ af_sess_t *af_sess_find_by_af_app_session_id(char *af_app_session_id) return af_sess_find(atoll(af_app_session_id)); } -af_sess_t *af_sess_find_by_pcf_app_session_id(char *pcf_app_session_id) -{ - ogs_assert(pcf_app_session_id); - return (af_sess_t *)ogs_hash_get(self.pcf_app_session_id_hash, - pcf_app_session_id, strlen(pcf_app_session_id)); -} - void af_sess_associate_pcf_client(af_sess_t *sess) { ogs_sbi_client_t *client = NULL; diff --git a/tests/af/context.h b/tests/af/context.h index 4f22cfe808..8df27e553c 100644 --- a/tests/af/context.h +++ b/tests/af/context.h @@ -52,8 +52,39 @@ typedef struct af_sess_s { uint64_t policyauthorization_features; - char *af_app_session_id; - char *pcf_app_session_id; +#define PCF_APP_SESSION_ASSOCIATED(__sESS) \ + ((__sESS) && ((__sESS)->app_session.pcf_id)) +#define PCF_APP_SESSION_CLEAR(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + if ((__sESS)->app_session.pcf.resource_uri) \ + ogs_free((__sESS)->app_session.pcf.resource_uri); \ + (__sESS)->app_session.pcf.resource_uri = NULL; \ + if ((__sESS)->app_session.pcf.id) \ + ogs_free((__sESS)->app_session.pcf.id); \ + (__sESS)->app_session.pcf.id = NULL; \ + } while(0) +#define PCF_APP_SESSION_STORE(__sESS, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__sESS)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + PCF_APP_SESSION_CLEAR(__sESS); \ + (__sESS)->app_session.pcf.resource_uri = ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->app_session.pcf.resource_uri); \ + (__sESS)->app_session.pcf.id = ogs_strdup(__iD); \ + ogs_assert((__sESS)->app_session.pcf.id); \ + } while(0) + struct { + struct { + char *id; + } af; + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } pcf; + } app_session; char *ipv4addr; char *ipv6addr; @@ -91,11 +122,8 @@ af_sess_t *af_sess_add_by_ue_address(ogs_ip_t *ue_address); void af_sess_remove(af_sess_t *sess); void af_sess_remove_all(void); -bool af_sess_set_pcf_app_session_id(af_sess_t *sess, char *pcf_app_session_id); - af_sess_t *af_sess_find(uint32_t index); af_sess_t *af_sess_find_by_af_app_session_id(char *af_app_session_id); -af_sess_t *af_sess_find_by_pcf_app_session_id(char *pcf_app_session_id); void af_sess_associate_pcf_client(af_sess_t *sess); diff --git a/tests/af/npcf-build.c b/tests/af/npcf-build.c index 45ae43209a..688a72f66e 100644 --- a/tests/af/npcf-build.c +++ b/tests/af/npcf-build.c @@ -54,7 +54,7 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create( af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); - ogs_assert(sess->af_app_session_id); + ogs_assert(sess->app_session.af.id); af_param = data; ogs_assert(af_param); @@ -82,7 +82,7 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create( header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; - header.resource.component[1] = (char *)sess->af_app_session_id; + header.resource.component[1] = (char *)sess->app_session.af.id; AscReqData.notif_uri = ogs_sbi_server_uri(server, &header); ogs_assert(AscReqData.notif_uri); @@ -379,19 +379,14 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_update( af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); - ogs_assert(sess->pcf_app_session_id); + ogs_assert(sess->app_session.pcf.resource_uri); af_param = data; ogs_assert(af_param); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_PATCH; - message.h.service.name = - (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; - message.h.resource.component[1] = sess->pcf_app_session_id; + message.h.uri = sess->app_session.pcf.resource_uri; message.AppSessionContextUpdateDataPatch = &AppSessionContextUpdateDataPatch; @@ -604,22 +599,18 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_delete( ogs_sbi_request_t *request = NULL; ogs_assert(sess); - ogs_assert(sess->pcf_app_session_id); + ogs_assert(sess->app_session.pcf.resource_uri); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; - message.h.service.name = - (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; - message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; - message.h.resource.component[1] = sess->pcf_app_session_id; - message.h.resource.component[2] = - (char *)OGS_SBI_RESOURCE_NAME_DELETE; + message.h.uri = ogs_msprintf("%s/%s", + sess->app_session.pcf.resource_uri, OGS_SBI_RESOURCE_NAME_DELETE); request = ogs_sbi_build_request(&message); ogs_expect(request); + ogs_free(message.h.uri); + return request; } @@ -658,7 +649,7 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create_video( af_npcf_policyauthorization_param_t *af_param; ogs_assert(sess); - ogs_assert(sess->af_app_session_id); + ogs_assert(sess->app_session.af.id); af_param = data; ogs_assert(af_param); @@ -685,7 +676,7 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create_video( header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_APP_SESSIONS; - header.resource.component[1] = (char *)sess->af_app_session_id; + header.resource.component[1] = (char *)sess->app_session.af.id; AscReqData.notif_uri = ogs_sbi_server_uri(server, &header); ogs_assert(AscReqData.notif_uri); diff --git a/tests/af/npcf-handler.c b/tests/af/npcf-handler.c index b7ceda1620..7967623778 100644 --- a/tests/af/npcf-handler.c +++ b/tests/af/npcf-handler.c @@ -28,6 +28,13 @@ void af_npcf_policyauthorization_handle_create( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + OpenAPI_app_session_context_t *AppSessionContext = NULL; OpenAPI_app_session_context_req_data_t *AscReqData = NULL; @@ -83,11 +90,35 @@ void af_npcf_policyauthorization_handle_create( goto cleanup; } + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s:%s] Invalid URI [%s]", + sess->ipv4addr ? sess->ipv4addr : "Unknown", + sess->ipv6addr ? sess->ipv6addr : "Unknown", + header.uri); + goto cleanup; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s:%s] ogs_sbi_client_add()", + sess->ipv4addr ? sess->ipv4addr : "Unknown", + sess->ipv6addr ? sess->ipv6addr : "Unknown"); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + ogs_assert(client); + } + OGS_SBI_SETUP_CLIENT(&sess->app_session.pcf, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + PCF_APP_SESSION_STORE(sess, header.uri, message.h.resource.component[1]); + supported_features = ogs_uint64_from_string(AscReqData->supp_feat); sess->policyauthorization_features &= supported_features; - af_sess_set_pcf_app_session_id(sess, message.h.resource.component[1]); - cleanup: ogs_sbi_header_free(&header); } From d14304461b8f5d1bf1fbfba20fc47cca5f828457 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 18 Apr 2024 21:32:25 +0900 Subject: [PATCH 090/323] Oops! Fix the compile error! --- src/ausf/nudm-handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ausf/nudm-handler.c b/src/ausf/nudm-handler.c index 7061cf6d45..338fa4b1f3 100644 --- a/src/ausf/nudm-handler.c +++ b/src/ausf/nudm-handler.c @@ -322,7 +322,7 @@ bool ausf_nudm_ueau_handle_result_confirmation_inform(ausf_ue_t *ausf_ue, ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "Invalid URI", ausf_ue->suci)); + recvmsg, "Invalid URI", ausf_ue->suci, NULL)); return false; } From c0a520f32a3c70aefc393f74ced365004fe8be75 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Fri, 16 Feb 2024 16:48:23 +0100 Subject: [PATCH 091/323] systemd: network: Add explicit routes towards tundev for UE pool of addresses When running the open5gs package with systemd network config, the 1st IP address of the UE pool configured in open5gs-upfd config file for ogstun is being assigned to the interface through this file. That was discussed as being a desirable default setup. However, in the event a user wants a setup where no IP address is assigned to the tundev, then it's not enough removing the IP address, because then the implicit routing rules regarding the subnet of the IP address added automatically by the kernel are also removed. This patch adds config sections to set up the routing explicitly, with the aim to get the routing still applied if the user decides to comment out the IP address, so that packets are still forwarded properly in that case. Related: https://osmocom.org/issues/6361 --- configs/systemd/99-open5gs.network | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/configs/systemd/99-open5gs.network b/configs/systemd/99-open5gs.network index eed7ce116c..215eb362f6 100644 --- a/configs/systemd/99-open5gs.network +++ b/configs/systemd/99-open5gs.network @@ -5,6 +5,14 @@ Name=ogstun Address=10.45.0.1/16 Address=2001:db8:cafe::1/48 +[Route] +Gateway=0.0.0.0 +Destination=10.45.0.0/16 + +[Route] +Gateway=:: +Destination=2001:db8:cafe::0/48 + [Link] MTUBytes=1400 RequiredForOnline=false From 426fa3f84a0cb332e9971ad9408935838cf98fa6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 19 Apr 2024 21:22:24 +0900 Subject: [PATCH 092/323] Release v2.7.1 --- debian/changelog | 30 ++++++++++++++++++++++++++++++ meson.build | 4 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index c21a99277b..5810857ffd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,33 @@ +open5gs (2.7.1) unstable; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Fri, 19 Apr 2024 21:21:46 +0900 + +open5gs (2.7.1~mantic) mantic; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Fri, 19 Apr 2024 21:18:53 +0900 + +open5gs (2.7.1~bionic) bionic; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Fri, 19 Apr 2024 21:16:21 +0900 + +open5gs (2.7.1~jammy) jammy; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Fri, 19 Apr 2024 21:11:30 +0900 + +open5gs (2.7.1~focal) focal; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Fri, 19 Apr 2024 21:08:46 +0900 + open5gs (2.7.0) unstable; urgency=medium * 5G Roaming with SEPP diff --git a/meson.build b/meson.build index 1854a0ea81..54f800a791 100644 --- a/meson.build +++ b/meson.build @@ -16,7 +16,7 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. project('open5gs', 'c', 'cpp', - version : '2.7.0', + version : '2.7.1', license : 'AGPL-3.0-or-later', meson_version : '>= 0.43.0', default_options : [ @@ -25,7 +25,7 @@ project('open5gs', 'c', 'cpp', ], ) -libogslib_version = '2.7.0' +libogslib_version = '2.7.1' prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir')) From 4c00edd839c279963f2d123904bc35771b6e5b25 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 19 Apr 2024 21:24:08 +0900 Subject: [PATCH 093/323] Update document for v2.7.1 --- docs/_posts/2024-04-19-release-v2.7.1.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/_posts/2024-04-19-release-v2.7.1.md diff --git a/docs/_posts/2024-04-19-release-v2.7.1.md b/docs/_posts/2024-04-19-release-v2.7.1.md new file mode 100644 index 0000000000..3f001cc086 --- /dev/null +++ b/docs/_posts/2024-04-19-release-v2.7.1.md @@ -0,0 +1,15 @@ +--- +title: "v2.7.1 - Bug Fixed" +date: 2024-04-19 21:23:00 +0900 +categories: + - Release +tags: + - News + - Release +head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>" +--- + +See [Release Note](https://github.com/open5gs/open5gs/releases/tag/v2.7.1) + +Download -- [v2.7.1.tar.gz](https://github.com/open5gs/open5gs/archive/v2.7.1.tar.gz) +{: .notice--info} From 819861be2f499d8cd9985a02a3b7d2251a964971 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 27 Apr 2024 09:18:11 +0900 Subject: [PATCH 094/323] [DOCS] Update Helm Chars Links (#3173) --- docs/_pages/docs.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index 876fc3c719..24acec7cae 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -75,8 +75,10 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - [srsRAN with eUPF(eBPF/XDP UPF)](https://github.com/s5uishida/open5gs_epc_srsran_eupf_sample_config) - @gradiant helm charts - - [Open5GS EPC and SRS LTE in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-srslte.html) - - [Open5GS NGC and UERANSIM in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-ueransim-gnb.html) - - [Open5GS NGC and OpenAirInterface GNB with ettus USRP in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-oaignb.html) - - [Open5GS EPC and SRS ENB with ettus USRP in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-srsenb.html) - - [Open5GS with Service Communication Proxy in kubernetes](https://gradiant.github.io/openverso-charts/open5gs-scp.html) + - [Open5GS and srsRAN-5G in kubernetes](https://gradiant.github.io/5g-charts/open5gs-srsran-5g-zmq.html) + - [Open5GS and srsLTE in kubernetes](https://gradiant.github.io/5g-charts/open5gs-srslte.html) + - [Open5GS and UERANSIM](https://gradiant.github.io/5g-charts/open5gs-ueransim-gnb.html) + - [Open5GS and PacketRusher](https://gradiant.github.io/5g-charts/open5gs-packetrusher.html) + - [Open5GS and OAI-GNB](https://gradiant.github.io/5g-charts/open5gs-oaignb.html) + - [Open5GS and srsenb](https://gradiant.github.io/5g-charts/open5gs-srsenb.html) + - [Open5GS with SCP(Service Communication Proxy](https://gradiant.github.io/5g-charts/open5gs-scp.html) From f6c0ded7b487a7974c1e58b0d86c40174d018adc Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 30 Apr 2024 21:28:54 +0900 Subject: [PATCH 095/323] [NSSF] Added POST nnrf-nfm/nf-status-notify When NSSF was first implemented, nf-status-notify was not required. This is because there was no need to be notified if other NFs were registered or de-registered in the NRF. However, this situation changed with the addition of SEPP. NSSFs can be notified whenever a SEPP registers or de-registers an NRF. Therefore, we added nf-status-notify, which was not implemented when the NSSF was originally created. --- src/nssf/nssf-sm.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/nssf/nssf-sm.c b/src/nssf/nssf-sm.c index a62c42a36f..9bd349ee49 100644 --- a/src/nssf/nssf-sm.c +++ b/src/nssf/nssf-sm.c @@ -97,6 +97,35 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) } SWITCH(message.h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM) + + SWITCH(message.h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_NF_STATUS_NOTIFY) + SWITCH(message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_nnrf_nfm_handle_nf_status_notify(stream, &message); + break; + + DEFAULT + ogs_error("Invalid HTTP method [%s]", message.h.method); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, &message, + "Invalid HTTP method", message.h.method, NULL)); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + message.h.resource.component[0]); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, &message, + "Invalid resource name", + message.h.resource.component[0], NULL)); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION) SWITCH(message.h.resource.component[0]) From 048a74005bf524d2bf186000e85876540d8868f9 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 30 Apr 2024 22:09:18 +0900 Subject: [PATCH 096/323] [SEC] Heap overflow in parse PLMN-ID (#3154) An assert shall be triggered if sepp_node is corrupted. ``` pwndbg> p *sepp_node $5 = { lnode = { prev = 0x0, next = 0xaaaac920c638 }, receiver = 0xaaaac9230990 "sepp2.localdomain", negotiated_security_scheme = OpenAPI_security_capability_TLS, target_apiroot_supported = true, plmn_id = {{ mcc1 = 6 '\006', mcc2 = 6 '\006', mcc3 = 6 '\006', mnc1 = 6 '\006', mnc2 = 6 '\006', mnc3 = 6 '\006' } <repeats 12 times>}, num_of_plmn_id = 6710887, target_plmn_id_presence = false, target_plmn_id = { mcc1 = 0 '\000', mcc2 = 0 '\000', mcc3 = 0 '\000', mnc1 = 0 '\000', mnc2 = 0 '\000', mnc3 = 0 '\000' }, supported_features = 1, sm = { init = 0xaaaaada181fc <sepp_handshake_state_initial>, fini = 0xaaaaada18390 <sepp_handshake_state_final>, state = 0xaaaaada194b4 <sepp_handshake_state_established> }, t_establish_interval = 0xffffa7d6c4e0, client = 0xaaaac91af010, n32f = { client = 0xaaaac91af090 } } pwndbg> p/x sepp_node.num_of_plmn_id $6 = 0x666667 ``` --- .github/workflows/meson-ci.yml | 2 +- lib/sbi/nnrf-handler.c | 38 +++++++++++++++++++++++++++++++--- src/sepp/n32c-handler.c | 16 ++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/.github/workflows/meson-ci.yml b/.github/workflows/meson-ci.yml index 971850c5b0..13e0c4fe2f 100644 --- a/.github/workflows/meson-ci.yml +++ b/.github/workflows/meson-ci.yml @@ -35,7 +35,7 @@ jobs: sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 - name: Install the dependencies for building the source code. - run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson + run: brew install mongo-c-driver libgcrypt libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson - name: Check out repository code uses: actions/checkout@main - name: Setup Meson Build diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index cd94fd3952..8be2079946 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -54,6 +54,15 @@ void ogs_nnrf_nfm_handle_nf_register( OpenAPI_list_for_each(NFProfile->plmn_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (ogs_local_conf()->num_of_serving_plmn_id >= + OGS_ARRAY_SIZE(ogs_local_conf()->serving_plmn_id)) { + ogs_error("OVERFLOW NFProfile->plmn_list [%d:%d:%d]", + ogs_local_conf()->num_of_serving_plmn_id, + OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE( + ogs_local_conf()->serving_plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &ogs_local_conf()->serving_plmn_id[ ogs_local_conf()->num_of_serving_plmn_id], PlmnId); @@ -96,6 +105,13 @@ void ogs_nnrf_nfm_handle_nf_profile( OpenAPI_list_for_each(NFProfile->plmn_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (nf_instance->num_of_plmn_id >= + OGS_ARRAY_SIZE(nf_instance->plmn_id)) { + ogs_error("OVERFLOW NFProfile->plmn_list [%d:%d:%d]", + nf_instance->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(nf_instance->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &nf_instance->plmn_id[nf_instance->num_of_plmn_id], PlmnId); nf_instance->num_of_plmn_id++; @@ -467,8 +483,12 @@ static void handle_smf_info( TaiRangeItem = node->data; if (TaiRangeItem && TaiRangeItem->plmn_id && TaiRangeItem->tac_range_list) { - ogs_assert(nf_info->smf.num_of_nr_tai_range < - OGS_MAX_NUM_OF_TAI); + + if (nf_info->smf.num_of_nr_tai_range >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiRangeItem [%d:%d]", + nf_info->smf.num_of_nr_tai_range, OGS_MAX_NUM_OF_TAI); + break; + } ogs_sbi_parse_plmn_id( &nf_info->smf.nr_tai_range @@ -709,7 +729,13 @@ static void handle_amf_info( TaiItem = node->data; if (TaiItem && TaiItem->plmn_id && TaiItem->tac) { ogs_5gs_tai_t *nr_tai = NULL; - ogs_assert(nf_info->amf.num_of_nr_tai < OGS_MAX_NUM_OF_TAI); + + if (nf_info->amf.num_of_nr_tai >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiItem [%d:%d]", + nf_info->amf.num_of_nr_tai, OGS_MAX_NUM_OF_TAI); + break; + } + nr_tai = &nf_info->amf.nr_tai[nf_info->amf.num_of_nr_tai]; ogs_assert(nr_tai); ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); @@ -726,6 +752,12 @@ static void handle_amf_info( ogs_assert(nf_info->amf.num_of_nr_tai_range < OGS_MAX_NUM_OF_TAI); + if (nf_info->amf.num_of_nr_tai_range >= OGS_MAX_NUM_OF_TAI) { + ogs_error("OVERFLOW TaiRangeItem [%d:%d]", + nf_info->amf.num_of_nr_tai_range, OGS_MAX_NUM_OF_TAI); + break; + } + ogs_sbi_parse_plmn_id( &nf_info->amf.nr_tai_range [nf_info->amf.num_of_nr_tai_range].plmn_id, diff --git a/src/sepp/n32c-handler.c b/src/sepp/n32c-handler.c index 7c4a9a8a58..0a091eaf04 100644 --- a/src/sepp/n32c-handler.c +++ b/src/sepp/n32c-handler.c @@ -118,6 +118,14 @@ bool sepp_n32c_handshake_handle_security_capability_request( OpenAPI_list_for_each(SecNegotiateReqData->plmn_id_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (sepp_node->num_of_plmn_id >= + OGS_ARRAY_SIZE(sepp_node->plmn_id)) { + ogs_error("OVERFLOW SecNegotiateReqData->plmn_id_list " + "[%d:%d:%d]", + sepp_node->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(sepp_node->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &sepp_node->plmn_id[sepp_node->num_of_plmn_id], PlmnId); sepp_node->num_of_plmn_id++; @@ -185,6 +193,14 @@ bool sepp_n32c_handshake_handle_security_capability_response( OpenAPI_list_for_each(SecNegotiateRspData->plmn_id_list, node) { OpenAPI_plmn_id_t *PlmnId = node->data; if (PlmnId) { + if (sepp_node->num_of_plmn_id >= + OGS_ARRAY_SIZE(sepp_node->plmn_id)) { + ogs_error("OVERFLOW SecNegotiateRspData->plmn_id_list " + "[%d:%d:%d]", + sepp_node->num_of_plmn_id, OGS_MAX_NUM_OF_PLMN, + (int)OGS_ARRAY_SIZE(sepp_node->plmn_id)); + break; + } ogs_sbi_parse_plmn_id( &sepp_node->plmn_id[sepp_node->num_of_plmn_id], PlmnId); sepp_node->num_of_plmn_id++; From e89aa79efe629ae90f59dcdf8847c117d9a7da86 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 30 Apr 2024 22:24:44 +0900 Subject: [PATCH 097/323] [SEC] Stack overflow in open5gs-hssd/s6a (#3155) An assert shall be triggered if a stack corruption occurs. The vulnerable code path is in src/hss/hss-s6a-path.c: ``` static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, struct session *session, void *opaque, enum disp_action *act) { .. ogs_plmn_id_t visited_plmn_id; .. ret = fd_msg_search_avp(qry, ogs_diam_visited_plmn_id, &avp); ogs_assert(ret == 0); ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); memcpy(&visited_plmn_id, hdr->avp_value->os.data, hdr->avp_value->os.len); ``` --- .github/workflows/meson-ci.yml | 2 +- src/hss/hss-s6a-path.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/meson-ci.yml b/.github/workflows/meson-ci.yml index 13e0c4fe2f..971850c5b0 100644 --- a/.github/workflows/meson-ci.yml +++ b/.github/workflows/meson-ci.yml @@ -35,7 +35,7 @@ jobs: sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 - name: Install the dependencies for building the source code. - run: brew install mongo-c-driver libgcrypt libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson + run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson - name: Check out repository code uses: actions/checkout@main - name: Setup Meson Build diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 3dc1ca3a03..fac0c8fdb5 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -180,7 +180,8 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); - memcpy(&visited_plmn_id, hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(&visited_plmn_id, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, sizeof(visited_plmn_id))); milenage_generate(opc, auth_info.amf, auth_info.k, ogs_uint64_to_buffer(auth_info.sqn, OGS_SQN_LEN, sqn), auth_info.rand, @@ -910,7 +911,8 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); ret = fd_msg_avp_hdr(avp, &hdr); ogs_assert(ret == 0); - memcpy(&visited_plmn_id, hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(&visited_plmn_id, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, sizeof(visited_plmn_id))); ret = fd_msg_search_avp(qry, ogs_diam_s6a_ulr_flags, &avp); ogs_assert(ret == 0); From 7ea82cb87bb65c3694d8d7c7a5efed1c4d3c9304 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 1 May 2024 14:49:18 +0900 Subject: [PATCH 098/323] [SEC] Heap overflow in open5gs-mmed/s6a (#3156) An assert shall be triggered. The vulnerable code path is in src/mme/mme-fd-path.c: ``` /* s6a process Subscription-Data from avp */ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_subscription_data_t *subscription_data, mme_ue_t *mme_ue, uint32_t *subdatamask) { ... /* AVP: 'MSISDN'( 701 ) * The MSISDN AVP is of type OctetString. This AVP contains an MSISDN, * in international number format as described in ITU-T Rec E.164 [8], * encoded as a TBCD-string, i.e. digits from 0 through 9 are encoded * 0000 to 1001; 1111 is used as a filler when there is an odd number * of digits; bits 8 to 5 of octet n encode digit 2n; bits 4 to 1 of * octet n encode digit 2(n-1)+1. * Reference: 3GPP TS 29.329 */ ret = fd_avp_search_avp(avp, ogs_diam_s6a_msisdn, &avpch1); ogs_assert(ret == 0); if (avpch1) { ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.data && hdr->avp_value->os.len) { mme_ue->msisdn_len = hdr->avp_value->os.len; /* 1 */ memcpy(mme_ue->msisdn, hdr->avp_value->os.data, ogs_min(mme_ue->msisdn_len, OGS_MAX_MSISDN_LEN)); /* 2 */ ogs_buffer_to_bcd(mme_ue->msisdn, mme_ue->msisdn_len, mme_ue->msisdn_bcd); /* 3 */ *subdatamask = (*subdatamask | OGS_DIAM_S6A_SUBDATA_MSISDN); } } ``` --- src/mme/mme-fd-path.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index bd2b2684db..ba9fb0c0dd 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -80,9 +80,9 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.data && hdr->avp_value->os.len) { - mme_ue->msisdn_len = hdr->avp_value->os.len; - memcpy(mme_ue->msisdn, hdr->avp_value->os.data, - ogs_min(mme_ue->msisdn_len, OGS_MAX_MSISDN_LEN)); + mme_ue->msisdn_len = + ogs_min(hdr->avp_value->os.len, OGS_MAX_MSISDN_LEN); + memcpy(mme_ue->msisdn, hdr->avp_value->os.data, mme_ue->msisdn_len); ogs_buffer_to_bcd(mme_ue->msisdn, mme_ue->msisdn_len, mme_ue->msisdn_bcd); *subdatamask = (*subdatamask | OGS_DIAM_S6A_SUBDATA_MSISDN); @@ -103,9 +103,10 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); if (hdr->avp_value->os.data && hdr->avp_value->os.len) { - mme_ue->a_msisdn_len = hdr->avp_value->os.len; + mme_ue->a_msisdn_len = + ogs_min(hdr->avp_value->os.len, OGS_MAX_MSISDN_LEN); memcpy(mme_ue->a_msisdn, hdr->avp_value->os.data, - ogs_min(mme_ue->a_msisdn_len, OGS_MAX_MSISDN_LEN)); + mme_ue->a_msisdn_len); ogs_buffer_to_bcd(mme_ue->a_msisdn, mme_ue->a_msisdn_len, mme_ue->a_msisdn_bcd); *subdatamask = (*subdatamask | OGS_DIAM_S6A_SUBDATA_A_MSISDN); @@ -986,9 +987,11 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) if (avp) { ret = fd_msg_avp_hdr(avp_xres, &hdr); ogs_assert(ret == 0); + e_utran_vector->xres_len = + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->xres)); memcpy(e_utran_vector->xres, - hdr->avp_value->os.data, hdr->avp_value->os.len); - e_utran_vector->xres_len = hdr->avp_value->os.len; + hdr->avp_value->os.data, e_utran_vector->xres_len); } else { ogs_error("no_XRES"); error++; @@ -999,8 +1002,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) if (avp) { ret = fd_msg_avp_hdr(avp_kasme, &hdr); ogs_assert(ret == 0); - memcpy(e_utran_vector->kasme, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->kasme, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->kasme))); } else { ogs_error("no_KASME"); error++; @@ -1010,8 +1014,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ret = fd_avp_search_avp(avp_e_utran_vector, ogs_diam_s6a_rand, &avp_rand); if (avp) { ret = fd_msg_avp_hdr(avp_rand, &hdr); - memcpy(e_utran_vector->rand, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->rand, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->rand))); } else { ogs_error("no_RAND"); error++; @@ -1022,8 +1027,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) if (avp) { ret = fd_msg_avp_hdr(avp_autn, &hdr); ogs_assert(ret == 0); - memcpy(e_utran_vector->autn, - hdr->avp_value->os.data, hdr->avp_value->os.len); + memcpy(e_utran_vector->autn, hdr->avp_value->os.data, + ogs_min(hdr->avp_value->os.len, + OGS_ARRAY_SIZE(e_utran_vector->autn))); } else { ogs_error("no_AUTN"); error++; From b57722178a8ac508ec6ed508f86dcefd868d2afe Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 1 May 2024 16:23:13 +0900 Subject: [PATCH 099/323] [SEC] Heap overflow in open5gs-mmed/s1ap (#3153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assert shall be triggered if the mme_enb_t object is corrupted. ``` $ gdb -q -p `pidof open5gs-mmed` .. Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1". 0x0000ffff90deb46c in __GI___sigtimedwait (set=set@entry=0xfffffe63be68, info=info@entry=0xfffffe63bda8, timeout=timeout@entry=0x0) at ../sysdeps/unix/sysv/linux/sigtimedwait.c:61 61 ../sysdeps/unix/sysv/linux/sigtimedwait.c: No such file or directory. Breakpoint 1 at 0xaaaabef69250: file ../src/mme/s1ap-handler.c, line 199. [Switching to Thread 0xffff1efdef00 (LWP 20348)] Thread 38 "open5gs-mmed" hit Breakpoint 1, s1ap_handle_s1_setup_request (enb=0xffff9029b5a0, message=0xffff1efdc498) at ../src/mme/s1ap-handler.c:199 warning: Source file is more recent than executable. 199 if (maximum_number_of_enbs_is_reached()) { (gdb) p enb.supported_ta_list $1 = {{plmn_id = {mcc1 = 0 '\000', mcc2 = 0 '\000', mcc3 = 1 '\001', mnc1 = 15 '\017', mnc2 = 0 '\000', mnc3 = 1 '\001'}, tac = 1} <repeats 256 times>} (gdb) p enb $2 = (mme_enb_t *) 0xffff9029b5a0 (gdb) p *enb $3 = {lnode = {prev = 0x0, next = 0x0}, sm = {init = 0xaaaabef66540 <s1ap_state_initial>, fini = 0xaaaabef66640 <s1ap_state_final>, state = 0xaaaabef66730 <s1ap_state_operational>}, enb_id = 1, plmn_id = { mcc1 = 1 '\001', mcc2 = 2 '\002', mcc3 = 3 '\003', mnc1 = 15 '\017', mnc2 = 4 '\004', mnc3 = 5 '\005'}, sctp = {type = 1, sock = 0xfffedc000bd0, addr = 0xfffedc000e70, poll = {read = 0xffff9032a0f0, write = 0x0}, write_queue = {prev = 0x0, next = 0x0}}, state = {s1_setup_success = false}, max_num_of_ostreams = 30, ostream_id = 0, num_of_supported_ta_list = 258, supported_ta_list = {{plmn_id = { mcc1 = 0 '\000', mcc2 = 0 '\000', mcc3 = 1 '\001', mnc1 = 15 '\017', mnc2 = 0 '\000', mnc3 = 1 '\001'}, tac = 1} <repeats 256 times>}, s1_reset_ack = 0x10f100000110f100, enb_ue_list = {prev = 0x1, next = 0x0}} pwndbg> vmmap enb LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA Start End Perm Size Offset File 0xffff8edd4000 0xffff8ede4000 ---p 10000 0 [anon_ffff8edd4] ► 0xffff8ede4000 0xffff90650000 rw-p 186c000 0 [anon_ffff8ede4] +0x1517010 0xffff90650000 0xffff90659000 r-xp 9000 0 /usr/lib/aarch64-linux-gnu/libffi.so.8.1.0 ``` The value s1_reset_ack = 0x10f100000110f100 shall contain a function pointer, but has been corrupted. The following patch will abort the process: ```diff $ diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index dff401ded..55a1f7e1b 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -178,6 +178,7 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, ogs_s1ap_message_t *message) SupportedTAs_Item->broadcastPLMNs.list.array[j]; ogs_assert(pLMNidentity); + ogs_assert(enb->num_of_supported_ta_list < OGS_ARRAY_SIZE(enb->supported_ta_list)); memcpy(&enb->supported_ta_list[enb->num_of_supported_ta_list].tac, tAC->buf, sizeof(uint16_t)); enb->supported_ta_list[enb->num_of_supported_ta_list].tac = @@ -310,6 +311,7 @@ void s1ap_handle_enb_configuration_update( SupportedTAs_Item->broadcastPLMNs.list.array[j]; ogs_assert(pLMNidentity); + ogs_assert(enb->num_of_supported_ta_list < OGS_ARRAY_SIZE(enb->supported_ta_list)); memcpy(&enb->supported_ta_list[ enb->num_of_supported_ta_list].tac, tAC->buf, sizeof(uint16_t)); ``` --- .github/workflows/meson-ci.yml | 2 +- src/amf/ngap-handler.c | 70 ++++++++++++++++++++++++++++++++++ src/mme/s1ap-handler.c | 20 ++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/.github/workflows/meson-ci.yml b/.github/workflows/meson-ci.yml index 971850c5b0..5fcf95bc7b 100644 --- a/.github/workflows/meson-ci.yml +++ b/.github/workflows/meson-ci.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: macos-latest: name: Build and Test on MacOS Latest - runs-on: macos-latest +# runs-on: macos-latest steps: # - name: Install MongoDB with Package Manager # run: | diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index da4829acb8..c386334bb4 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -209,6 +209,16 @@ void ngap_handle_ng_setup_request(amf_gnb_t *gnb, ogs_ngap_message_t *message) i++) { NGAP_SupportedTAItem_t *SupportedTAItem = NULL; + if (gnb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list " + "[%d:%d:%d]", + gnb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_list)); + break; + } + SupportedTAItem = (NGAP_SupportedTAItem_t *) SupportedTAList->list.array[i]; if (!SupportedTAItem) { @@ -235,6 +245,17 @@ void ngap_handle_ng_setup_request(amf_gnb_t *gnb, ogs_ngap_message_t *message) NGAP_BroadcastPLMNItem_t *BroadcastPLMNItem = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; + if (gnb->supported_ta_list[i].num_of_bplmn_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list[i].bplmn_list)) { + ogs_error("OVERFLOW GNB->supported_ta_list.num_of_bplmn_list " + "[%d:%d:%d]", + gnb->supported_ta_list[i].num_of_bplmn_list, + OGS_MAX_NUM_OF_BPLMN, + (int)OGS_ARRAY_SIZE( + gnb->supported_ta_list[i].bplmn_list)); + break; + } + BroadcastPLMNItem = (NGAP_BroadcastPLMNItem_t *) SupportedTAItem->broadcastPLMNList.list.array[j]; if (!BroadcastPLMNItem) { @@ -268,6 +289,19 @@ void ngap_handle_ng_setup_request(amf_gnb_t *gnb, ogs_ngap_message_t *message) NGAP_SliceSupportItem_t *SliceSupportItem = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; + if (gnb->supported_ta_list[i].bplmn_list[j].num_of_s_nssai >= + OGS_ARRAY_SIZE( + gnb->supported_ta_list[i].bplmn_list[j].s_nssai)) { + ogs_error("OVERFLOW GNB->supported_ta_list." + "bplmn_list.num_of_s_nssai [%d:%d:%d]", + gnb->supported_ta_list[i].bplmn_list[j]. + num_of_s_nssai, + OGS_MAX_NUM_OF_SLICE_SUPPORT, + (int)OGS_ARRAY_SIZE(gnb-> + supported_ta_list[i].bplmn_list[j].s_nssai)); + break; + } + SliceSupportItem = (NGAP_SliceSupportItem_t *) BroadcastPLMNItem->tAISliceSupportList.list.array[k]; if (!SliceSupportItem) { @@ -4272,6 +4306,16 @@ void ngap_handle_ran_configuration_update( i++) { NGAP_SupportedTAItem_t *SupportedTAItem = NULL; + if (gnb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list " + "[%d:%d:%d]", + gnb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_list)); + break; + } + SupportedTAItem = (NGAP_SupportedTAItem_t *) SupportedTAList->list.array[i]; if (!SupportedTAItem) { @@ -4299,6 +4343,17 @@ void ngap_handle_ran_configuration_update( NGAP_BroadcastPLMNItem_t *BroadcastPLMNItem = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; + if (gnb->supported_ta_list[i].num_of_bplmn_list >= + OGS_ARRAY_SIZE(gnb->supported_ta_list[i].bplmn_list)) { + ogs_error("OVERFLOW GNB->supported_ta_list." + "num_of_bplm_list [%d:%d:%d]", + gnb->supported_ta_list[i].num_of_bplmn_list, + OGS_MAX_NUM_OF_BPLMN, + (int)OGS_ARRAY_SIZE( + gnb->supported_ta_list[i].bplmn_list)); + break; + } + BroadcastPLMNItem = (NGAP_BroadcastPLMNItem_t *) SupportedTAItem->broadcastPLMNList.list.array[j]; if (!BroadcastPLMNItem) { @@ -4333,6 +4388,21 @@ void ngap_handle_ran_configuration_update( NGAP_SliceSupportItem_t *SliceSupportItem = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; + if (gnb->supported_ta_list[i]. + bplmn_list[j].num_of_s_nssai >= + OGS_ARRAY_SIZE(gnb->supported_ta_list[i]. + bplmn_list[j].s_nssai)) { + ogs_error("OVERFLOW GNB->num_of_supported_ta_list." + "bplmn_list.num_of_s_nssai" + "[%d:%d:%d]", + gnb->supported_ta_list[i].bplmn_list[j]. + num_of_s_nssai, + OGS_MAX_NUM_OF_SLICE_SUPPORT, + (int)OGS_ARRAY_SIZE(gnb->supported_ta_list[i]. + bplmn_list[j].s_nssai)); + break; + } + SliceSupportItem = (NGAP_SliceSupportItem_t *) BroadcastPLMNItem->tAISliceSupportList.list.array[k]; if (!SliceSupportItem) { diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index dff401dedf..116a6e7961 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -178,6 +178,16 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, ogs_s1ap_message_t *message) SupportedTAs_Item->broadcastPLMNs.list.array[j]; ogs_assert(pLMNidentity); + if (enb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(enb->supported_ta_list)) { + ogs_error("OVERFLOW ENB->num_of_supported_ta_list " + "[%d:%d:%d]", + enb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(enb->supported_ta_list)); + break; + } + memcpy(&enb->supported_ta_list[enb->num_of_supported_ta_list].tac, tAC->buf, sizeof(uint16_t)); enb->supported_ta_list[enb->num_of_supported_ta_list].tac = @@ -310,6 +320,16 @@ void s1ap_handle_enb_configuration_update( SupportedTAs_Item->broadcastPLMNs.list.array[j]; ogs_assert(pLMNidentity); + if (enb->num_of_supported_ta_list >= + OGS_ARRAY_SIZE(enb->supported_ta_list)) { + ogs_error("OVERFLOW ENB->num_of_supported_ta_list " + "[%d:%d:%d]", + enb->num_of_supported_ta_list, + OGS_MAX_NUM_OF_SUPPORTED_TA, + (int)OGS_ARRAY_SIZE(enb->supported_ta_list)); + break; + } + memcpy(&enb->supported_ta_list[ enb->num_of_supported_ta_list].tac, tAC->buf, sizeof(uint16_t)); From 87b4e4535c77ded627cdb6f4e4e2e3ea761f40b7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 1 May 2024 16:50:05 +0900 Subject: [PATCH 100/323] [SEC] Stack overflow in PCRF/PCF (#3157) The indexes rx_message.ims_data.num_of_media_component and media_component->num_of_sub can overflow. ``` static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) .. /* Gwt Specific-Action */ case OGS_DIAM_RX_AVP_CODE_SPECIFIC_ACTION: break; /* Gwt Media-Component-Description */ case OGS_DIAM_RX_AVP_CODE_MEDIA_COMPONENT_DESCRIPTION: media_component = &rx_message.ims_data. media_component[rx_message.ims_data.num_of_media_component]; ret = fd_msg_browse(avpch1, MSG_BRW_FIRST_CHILD, &avpch2, NULL); ogs_assert(ret == 0); while (avpch2) { ret = fd_msg_avp_hdr(avpch2, &hdr); .. } fd_msg_browse(avpch2, MSG_BRW_NEXT, &avpch2, NULL); } rx_message.ims_data.num_of_media_component++; break; default: ogs_warn("Not supported(%d)", hdr->avp_code); break; } .. } ``` --- src/pcf/npcf-handler.c | 58 ++++++++++++++++++++++++++++++++++++++--- src/pcrf/pcrf-rx-path.c | 29 +++++++++++++++++++-- 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index 1754a1186c..66120f88e6 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -752,6 +752,15 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { + if (ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(ims_data.media_component)) { + ogs_error("OVERFLOW ims_data.num_of_media_component " + "[%d:%d:%d]", + ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE(ims_data.media_component)); + break; + } media_component = &ims_data. media_component[ims_data.num_of_media_component]; media_component->media_component_number = @@ -779,6 +788,15 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "[%d:%d:%d]", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->sub[media_component->num_of_sub]; SubComponentMap = node2->data; @@ -792,8 +810,15 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, OpenAPI_list_for_each(fDescList, node3) { ogs_flow_t *flow = NULL; - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= + OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow [%d:%d:%d]", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flow[sub->num_of_flow]; if (node3->data) { flow->description = ogs_strdup(node3->data); @@ -1200,6 +1225,15 @@ bool pcf_npcf_policyauthorization_handle_update( if (MediaComponentMap) { MediaComponent = MediaComponentMap->value; if (MediaComponent) { + if (ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(ims_data.media_component)) { + ogs_error("OVERFLOW ims_data.num_of_media_component " + "[%d:%d:%d]", + ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE(ims_data.media_component)); + break; + } media_component = &ims_data. media_component[ims_data.num_of_media_component]; @@ -1228,6 +1262,15 @@ bool pcf_npcf_policyauthorization_handle_update( SubComponentList = MediaComponent->med_sub_comps; OpenAPI_list_for_each(SubComponentList, node2) { + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "[%d:%d:%d]", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->sub[media_component->num_of_sub]; SubComponentMap = node2->data; @@ -1241,8 +1284,15 @@ bool pcf_npcf_policyauthorization_handle_update( OpenAPI_list_for_each(fDescList, node3) { ogs_flow_t *flow = NULL; - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= + OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow [%d:%d:%d]", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flow[sub->num_of_flow]; if (node3->data) { flow->description = ogs_strdup(node3->data); diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index 03dbc47c27..82149c3af2 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -229,6 +229,16 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, break; /* Gwt Media-Component-Description */ case OGS_DIAM_RX_AVP_CODE_MEDIA_COMPONENT_DESCRIPTION: + if (rx_message.ims_data.num_of_media_component >= + OGS_ARRAY_SIZE(rx_message.ims_data.media_component)) { + ogs_error("OVERFLOW rx_message.ims_data.num_of_media_component " + "[%d:%d:%d]", + rx_message.ims_data.num_of_media_component, + OGS_MAX_NUM_OF_MEDIA_COMPONENT, + (int)OGS_ARRAY_SIZE( + rx_message.ims_data.media_component)); + break; + } media_component = &rx_message.ims_data. media_component[rx_message.ims_data.num_of_media_component]; @@ -271,6 +281,15 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, media_component->flow_status = hdr->avp_value->i32; break; case OGS_DIAM_RX_AVP_CODE_MEDIA_SUB_COMPONENT: + if (media_component->num_of_sub >= + OGS_ARRAY_SIZE(media_component->sub)) { + ogs_error("OVERFLOW media_component->num_of_sub " + "[%d:%d:%d]", + media_component->num_of_sub, + OGS_MAX_NUM_OF_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(media_component->sub)); + break; + } sub = &media_component->sub[media_component->num_of_sub]; ret = fd_msg_browse(avpch2, MSG_BRW_FIRST_CHILD, @@ -300,8 +319,14 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, } break; case OGS_DIAM_RX_AVP_CODE_FLOW_DESCRIPTION: - ogs_assert(sub->num_of_flow < - OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT); + if (sub->num_of_flow >= OGS_ARRAY_SIZE(sub->flow)) { + ogs_error( + "OVERFLOW sub->num_of_flow [%d:%d:%d]", + sub->num_of_flow, + OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT, + (int)OGS_ARRAY_SIZE(sub->flow)); + break; + } flow = &sub->flow[sub->num_of_flow]; flow->description = ogs_strndup( (char*)hdr->avp_value->os.data, From 190b39a75c670af3aaf49b2b295df69134c0c903 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 22 Apr 2024 19:50:42 +0200 Subject: [PATCH 101/323] cosmetic: [MME] Fix wrong content in comment line --- src/mme/mme-s11-handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 795305a4ab..10ebeb73e0 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -197,7 +197,7 @@ void mme_s11_handle_create_session_response( if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - /* No need S5C TEID in PathSwitchRequest */ + /* No need PAA in PathSwitchRequest */ } else { From f16f6e3c6cd3f594c8e546b91e0bc2ba9c9e2847 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 22 Apr 2024 19:58:22 +0200 Subject: [PATCH 102/323] [MME] s11: Allow CreateSessionResponse with no PAA IE The PAA is already known (provided by SGSN through Gn SGSNContextResponse), so not mandatory for it to be set. --- src/mme/mme-s11-handler.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 10ebeb73e0..67d632bbfa 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -195,12 +195,14 @@ void mme_s11_handle_create_session_response( } - if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - + switch (create_action) { + case OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST: /* No need PAA in PathSwitchRequest */ - - } else { - + break; + case OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE: + /* No need PAA in 2G->4G mobility, it was already provided by SGSN peer */ + break; + default: if (rsp->pdn_address_allocation.presence) { ogs_paa_t paa; From eb28c514ea2b8e916962cd057c05d51b45f2e7e2 Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Fri, 10 May 2024 10:17:34 +0200 Subject: [PATCH 103/323] [MME] s11: Allow CreateSessionResponse with no S5c TEID IE The TEID is already known (provided by SGSN through Gn SGSNContextResponse), so not mandatory for it to be set. --- src/mme/mme-s11-handler.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 67d632bbfa..16d94bcca1 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -181,28 +181,20 @@ void mme_s11_handle_create_session_response( cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - - /* No need S5C TEID in PathSwitchRequest */ - - } else { - - if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) { - ogs_error("[%s] No S5C TEID [Cause:%d]", - mme_ue->imsi_bcd, session_cause); - cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; - } - - } - switch (create_action) { case OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST: - /* No need PAA in PathSwitchRequest */ + /* No need for PAA or S5C TEID in PathSwitchRequest */ break; case OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE: - /* No need PAA in 2G->4G mobility, it was already provided by SGSN peer */ + /* No need for PAA or S5C TEID in 2G->4G mobility, it was already provided by SGSN peer */ break; default: + if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) { + ogs_error("[%s] No S5C TEID [Cause:%d]", + mme_ue->imsi_bcd, session_cause); + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; + } + if (rsp->pdn_address_allocation.presence) { ogs_paa_t paa; From 9d8d560be71ce385c4315d5bd433888638d6c733 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 11 May 2024 16:26:04 +0900 Subject: [PATCH 104/323] [DOCKER] Change UID from 1000 to 2000 The ubuntu docker image defaults to UID 1000 as the ubuntu username, so change the UID of the open5gs default user acetcom to 2000. --- .github/workflows/meson-ci.yml | 2 +- docker/alpine/latest/dev/Dockerfile | 2 +- docker/debian/latest/dev/Dockerfile | 2 +- docker/fedora/latest/dev/Dockerfile | 2 +- docker/ubuntu/latest/dev/Dockerfile | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/meson-ci.yml b/.github/workflows/meson-ci.yml index 5fcf95bc7b..971850c5b0 100644 --- a/.github/workflows/meson-ci.yml +++ b/.github/workflows/meson-ci.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: macos-latest: name: Build and Test on MacOS Latest -# runs-on: macos-latest + runs-on: macos-latest steps: # - name: Install MongoDB with Package Manager # run: | diff --git a/docker/alpine/latest/dev/Dockerfile b/docker/alpine/latest/dev/Dockerfile index 9c97df3392..b0c74303a9 100644 --- a/docker/alpine/latest/dev/Dockerfile +++ b/docker/alpine/latest/dev/Dockerfile @@ -13,7 +13,7 @@ RUN apk update && \ sudo ARG username=acetcom -RUN adduser -u 1000 acetcom -D && \ +RUN adduser -u 2000 acetcom -D && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username} diff --git a/docker/debian/latest/dev/Dockerfile b/docker/debian/latest/dev/Dockerfile index d076975451..cc80b0dfeb 100644 --- a/docker/debian/latest/dev/Dockerfile +++ b/docker/debian/latest/dev/Dockerfile @@ -27,7 +27,7 @@ RUN apt-get update && \ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username} diff --git a/docker/fedora/latest/dev/Dockerfile b/docker/fedora/latest/dev/Dockerfile index 337f05af80..66b1283fdc 100644 --- a/docker/fedora/latest/dev/Dockerfile +++ b/docker/fedora/latest/dev/Dockerfile @@ -16,7 +16,7 @@ RUN dnf -y install \ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username} diff --git a/docker/ubuntu/latest/dev/Dockerfile b/docker/ubuntu/latest/dev/Dockerfile index 970dddb72a..d599439bdf 100644 --- a/docker/ubuntu/latest/dev/Dockerfile +++ b/docker/ubuntu/latest/dev/Dockerfile @@ -33,7 +33,7 @@ RUN apt-get update && \ COPY setup.sh /root ARG username=acetcom -RUN useradd -m --uid=1000 ${username} && \ +RUN useradd -m --uid=2000 ${username} && \ echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} && \ chmod 0440 /etc/sudoers.d/${username} From 7a9fea8aec44c3aec40e6fca547fb6ff30c7ca0f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 12 May 2024 10:07:28 +0900 Subject: [PATCH 105/323] [SBI] Re-factor NF Instance Context (#3093) Fixed not using Reference Count for adding/deleting NF Instances. Up until now, NF Instances have been managed by referencing the Reference Count. Initially, when an NF Instance is added, the Reference Count is incremented and when it is deleted, the Reference Count is decremented. If a UE discovers another NF Instance through the NF Discovery function, the Reference Count is incremented. And if a UE de-registers, the Reference Count of the discovered NF is decremented. However, there's a problem with this approach. When other NF is de-registered, there is no guarantee that it will be 100% notified. For example, if a UDM is de-registered, but an SCP is de-registered before it, the AMF will not be notified that the UDM has been de-registered. In situations where this is not clear, Reference Count cannot be used. Therefore, we have modified it to not use the Reference Count method. Also, when a UE connects, it is modified to always search whether an NF Instance exists by NF Instance ID whenever it is discovered. To do this, we modified lib/sbi/path.c as shown below. ```diff @@ -281,13 +281,15 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) } /* Target NF-Instance */ - nf_instance = sbi_object->service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sbi_object->service_type_array[service_type].nf_instance_id); if (!nf_instance) { nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + if (nf_instance) { + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); + } } ``` --- .github/workflows/meson-ci.yml | 88 +++++++++++++++++----------------- lib/sbi/context.c | 50 +++++++++---------- lib/sbi/context.h | 18 +++---- lib/sbi/nnrf-handler.c | 55 ++++++++------------- lib/sbi/path.c | 22 +++++---- src/amf/context.c | 10 ++-- src/amf/gmm-handler.c | 10 ++-- src/amf/namf-handler.c | 2 +- src/amf/nnrf-handler.c | 4 +- src/amf/nsmf-build.c | 8 ++-- src/amf/sbi-path.c | 2 +- src/ausf/nnrf-handler.c | 4 +- src/bsf/nnrf-handler.c | 4 +- src/nrf/nnrf-handler.c | 1 - src/nrf/nrf-sm.c | 10 ++-- src/pcf/nnrf-handler.c | 4 +- src/pcf/npcf-handler.c | 7 +-- src/pcf/nudr-handler.c | 7 +-- src/smf/nnrf-handler.c | 4 +- src/udm/nnrf-handler.c | 4 +- tests/af/nnrf-handler.c | 4 +- 21 files changed, 149 insertions(+), 169 deletions(-) diff --git a/.github/workflows/meson-ci.yml b/.github/workflows/meson-ci.yml index 971850c5b0..bea92d2291 100644 --- a/.github/workflows/meson-ci.yml +++ b/.github/workflows/meson-ci.yml @@ -2,51 +2,51 @@ name: Meson Continuous Integration on: [push, pull_request] jobs: - macos-latest: - name: Build and Test on MacOS Latest - runs-on: macos-latest - steps: -# - name: Install MongoDB with Package Manager +# macos-latest: +# name: Build and Test on MacOS Latest +# runs-on: macos-latest +# steps: +## - name: Install MongoDB with Package Manager +## run: | +## brew tap mongodb/brew +## brew install mongodb-community +## brew services start mongodb-community +# - name: Create the TUN device with the interface name `ogstun`. # run: | -# brew tap mongodb/brew -# brew install mongodb-community -# brew services start mongodb-community - - name: Create the TUN device with the interface name `ogstun`. - run: | - sudo ifconfig lo0 alias 127.0.0.2 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.3 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.4 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.6 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.7 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.8 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.9 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.10 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.11 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.12 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.13 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.14 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.15 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.16 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.17 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 - sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 - - name: Install the dependencies for building the source code. - run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson - - name: Check out repository code - uses: actions/checkout@main - - name: Setup Meson Build - run: PATH="/usr/local/opt/bison/bin:$PATH" PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" meson setup build - env: - CC: gcc - - name : Build Open5GS - run: ninja -C build - - name: Test Open5GS - run: sudo meson test -C build -v crypt unit - +# sudo ifconfig lo0 alias 127.0.0.2 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.3 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.4 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.5 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.6 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.7 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.8 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.9 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.10 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.11 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.12 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.13 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.14 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.15 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.16 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.17 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 +# sudo ifconfig lo0 alias 127.0.1.10 netmask 255.255.255.255 +# - name: Install the dependencies for building the source code. +# run: brew install mongo-c-driver libidn libmicrohttpd nghttp2 bison libusrsctp libtins talloc meson +# - name: Check out repository code +# uses: actions/checkout@main +# - name: Setup Meson Build +# run: PATH="/usr/local/opt/bison/bin:$PATH" PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" meson setup build +# env: +# CC: gcc +# - name : Build Open5GS +# run: ninja -C build +# - name: Test Open5GS +# run: sudo meson test -C build -v crypt unit +# ubuntu-latest: name: Build and Test on Ubuntu Latest runs-on: ubuntu-latest diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 10fd84c645..74eb0b58f5 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1085,8 +1085,6 @@ ogs_sbi_nf_instance_t *ogs_sbi_nf_instance_add(void) ogs_assert(nf_instance); memset(nf_instance, 0, sizeof(ogs_sbi_nf_instance_t)); - OGS_OBJECT_REF(nf_instance); - nf_instance->time.heartbeat_interval = ogs_local_conf()->time.nf_instance.heartbeat_interval; @@ -1096,10 +1094,10 @@ ogs_sbi_nf_instance_t *ogs_sbi_nf_instance_add(void) ogs_list_add(&ogs_sbi_self()->nf_instance_list, nf_instance); - ogs_debug("[%s] NFInstance added with Ref [%s:%d]", + ogs_debug("[%s] NFInstance added with Ref [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); return nf_instance; } @@ -1196,20 +1194,10 @@ void ogs_sbi_nf_instance_remove(ogs_sbi_nf_instance_t *nf_instance) { ogs_assert(nf_instance); - ogs_debug("[%s] NFInstance UnRef [%s:%d]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); - - if (OGS_OBJECT_IS_REF(nf_instance)) { - OGS_OBJECT_UNREF(nf_instance); - return; - } - - ogs_debug("[%s] NFInstance removed [%s:%d]", + ogs_debug("[%s] NFInstance removed [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_list_remove(&ogs_sbi_self()->nf_instance_list, nf_instance); @@ -1243,7 +1231,19 @@ ogs_sbi_nf_instance_t *ogs_sbi_nf_instance_find(char *id) { ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(id); + /* + * This is related to Issue #3093. + * + * We want to be able to use 'ogs_sbi_nf_instance_id_find(char *id)' + * even if the 'id' is NULL as in the use case below. + * + * ogs_sbi_nf_instance_find( + * sess->sbi.service_type_array[service_type].nf_instance_id)); + * + * To do so, we changed the 'assert(id)' to 'if (!id) return NULL', + * as shown below. + */ + if (!id) return NULL; ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { if (nf_instance->id && strcmp(nf_instance->id, id) == 0) @@ -2202,10 +2202,10 @@ void ogs_sbi_client_associate(ogs_sbi_nf_instance_t *nf_instance) client = nf_instance_find_client(nf_instance); ogs_assert(client); - ogs_debug("[%s] NFInstance associated [%s:%d]", + ogs_debug("[%s] NFInstance associated [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); OGS_SBI_SETUP_CLIENT(nf_instance, client); @@ -2273,16 +2273,12 @@ void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object) ogs_error("SBI running [%d]", ogs_list_count(&sbi_object->xact_list)); for (i = 0; i < OGS_SBI_MAX_NUM_OF_SERVICE_TYPE; i++) { - ogs_sbi_nf_instance_t *nf_instance = - sbi_object->service_type_array[i].nf_instance; - if (nf_instance) - ogs_sbi_nf_instance_remove(nf_instance); + if (sbi_object->service_type_array[i].nf_instance_id) + ogs_free(sbi_object->service_type_array[i].nf_instance_id); } for (i = 0; i < OGS_SBI_MAX_NUM_OF_NF_TYPE; i++) { - ogs_sbi_nf_instance_t *nf_instance = - sbi_object->nf_type_array[i].nf_instance; - if (nf_instance) - ogs_sbi_nf_instance_remove(nf_instance); + if (sbi_object->nf_type_array[i].nf_instance_id) + ogs_free(sbi_object->nf_type_array[i].nf_instance_id); } } diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 55e431d876..3589448dda 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -175,7 +175,6 @@ typedef struct ogs_sbi_nf_instance_s { #define NF_INSTANCE_CLIENT(__nFInstance) \ ((__nFInstance) ? ((__nFInstance)->client) : NULL) void *client; /* only used in CLIENT */ - unsigned int reference_count; /* reference count for memory free */ } ogs_sbi_nf_instance_t; typedef enum { @@ -193,7 +192,7 @@ typedef struct ogs_sbi_object_s { ogs_sbi_obj_type_e type; struct { - ogs_sbi_nf_instance_t *nf_instance; + char *nf_instance_id; } nf_type_array[OGS_SBI_MAX_NUM_OF_NF_TYPE], service_type_array[OGS_SBI_MAX_NUM_OF_SERVICE_TYPE]; @@ -459,19 +458,16 @@ void ogs_sbi_client_associate(ogs_sbi_nf_instance_t *nf_instance); int ogs_sbi_default_client_port(OpenAPI_uri_scheme_e scheme); -#define OGS_SBI_SETUP_NF_INSTANCE(__cTX, __nFInstance) \ +#define OGS_SBI_SETUP_NF_INSTANCE_ID(__cTX, __nFInstanceId) \ do { \ - ogs_assert(__nFInstance); \ + ogs_assert(__nFInstanceId); \ \ - if ((__cTX).nf_instance) { \ - ogs_warn("NF Instance [%s] updated [%s]", \ - OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ - (__nFInstance)->id); \ - ogs_sbi_nf_instance_remove((__cTX).nf_instance); \ + if ((__cTX).nf_instance_id) { \ + ogs_warn("NF Instance(ID) updated [%s]", (__nFInstanceId)); \ + ogs_free((__cTX).nf_instance_id); \ } \ \ - OGS_OBJECT_REF(__nFInstance); \ - ((__cTX).nf_instance) = (__nFInstance); \ + ((__cTX).nf_instance_id) = ogs_strdup(__nFInstanceId); \ } while(0) bool ogs_sbi_discovery_param_is_matched( diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 8be2079946..35ac9dd6e5 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -1087,13 +1087,12 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( nf_instance, message.h.resource.component[1]); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("(NRF-notify) NF registered [%s:%d]", - nf_instance->id, nf_instance->reference_count); + ogs_info("(NRF-notify) NF registered [%s]", nf_instance->id); } else { - ogs_warn("[%s] (NRF-notify) NF has already been added [%s:%d]", + ogs_warn("[%s] (NRF-notify) NF has already been added [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); @@ -1101,10 +1100,10 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); - ogs_info("[%s] (NRF-notify) NF Profile updated [%s:%d]", + ogs_info("[%s] (NRF-notify) NF Profile updated [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_sbi_client_associate(nf_instance); @@ -1120,27 +1119,13 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( OpenAPI_notification_event_type_NF_DEREGISTERED) { nf_instance = ogs_sbi_nf_instance_find(message.h.resource.component[1]); if (nf_instance) { - if (OGS_OBJECT_IS_REF(nf_instance)) { - /* There are references to other contexts. */ - ogs_warn("[%s] (NRF-notify) NF was referenced " - "in other contexts [%s:%d]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : - "NULL", - nf_instance->id, nf_instance->reference_count); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran( - nf_instance, ogs_sbi_nf_state_de_registered); - } else { - ogs_info("[%s] (NRF-notify) NF_DEREGISTERED event [%s:%d]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : - "NULL", - nf_instance->id, nf_instance->reference_count); - ogs_sbi_nf_fsm_fini((nf_instance)); - ogs_sbi_nf_instance_remove(nf_instance); - } + ogs_info("[%s] (NRF-notify) NF_DEREGISTERED event [%s]", + nf_instance->nf_type ? + OpenAPI_nf_type_ToString(nf_instance->nf_type) : + "NULL", + nf_instance->id); + ogs_sbi_nf_fsm_fini((nf_instance)); + ogs_sbi_nf_instance_remove(nf_instance); } else { ogs_warn("[%s] (NRF-notify) Not found", message.h.resource.component[1]); @@ -1216,15 +1201,15 @@ void ogs_nnrf_disc_handle_nf_discover_search_result( ogs_sbi_nf_instance_set_id(nf_instance, NFProfile->nf_instance_id); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("[%s] (NRF-discover) NF registered [%s:%d]", + ogs_info("[%s] (NRF-discover) NF registered [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); } else { - ogs_warn("[%s] (NRF-discover) NF has already been added [%s:%d]", + ogs_warn("[%s] (NRF-discover) NF has already been added [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); @@ -1254,15 +1239,15 @@ void ogs_nnrf_disc_handle_nf_discover_search_result( ogs_time_from_sec(nf_instance->time.validity_duration)); } else - ogs_warn("[%s] NF Instance validity-time should not 0 [%s:%d]", + ogs_warn("[%s] NF Instance validity-time should not 0 [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); - ogs_info("[%s] (NF-discover) NF Profile updated [%s:%d]", + ogs_info("[%s] (NF-discover) NF Profile updated [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); } } } diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 0ab3cf081f..d98d0bd342 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -208,22 +208,22 @@ static int client_discover_cb( ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("[%s] (SCP-discover) NF registered [%s:%d]", + ogs_info("[%s] (SCP-discover) NF registered [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); } else { - ogs_warn("[%s] (SCP-discover) NF has already been added [%s:%d]", + ogs_warn("[%s] (SCP-discover) NF has already been added [%s]", nf_instance->nf_type ? OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id, nf_instance->reference_count); + nf_instance->id); ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); } e = ogs_event_new(OGS_EVENT_SBI_CLIENT); @@ -281,13 +281,15 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) } /* Target NF-Instance */ - nf_instance = sbi_object->service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sbi_object->service_type_array[service_type].nf_instance_id); if (!nf_instance) { nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + if (nf_instance) { + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); + } } /* Target Client */ diff --git a/src/amf/context.c b/src/amf/context.c index c6ba6f3879..25dd7d507f 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2338,8 +2338,9 @@ void amf_sbi_select_nf( nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], + nf_instance->id); break; case OGS_SBI_OBJ_SESS_TYPE: sess = (amf_sess_t *)sbi_object; @@ -2352,8 +2353,9 @@ void amf_sbi_select_nf( false) continue; - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], + nf_instance->id); break; } break; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 1d85335a9a..156f98f866 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1305,8 +1305,9 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_sbi_discovery_option_set_tai( discovery_option, &amf_ue->nr_tai); - nf_instance = sess->sbi. - service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sess->sbi.service_type_array[service_type]. + nf_instance_id); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -1317,8 +1318,9 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, requester_nf_type, discovery_option); - nf_instance = sess->sbi. - service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sess->sbi.service_type_array[service_type]. + nf_instance_id); if (!nf_instance) ogs_info("No SMF Instance"); diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index 6fb1a91b52..e689f0013c 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1417,7 +1417,7 @@ int amf_namf_comm_handle_ue_context_transfer_request( UeContext._5g_mm_capability = encoded_gmm_capability; UeContext.pcf_id = amf_ue->sbi.service_type_array[ - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance->id; + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance_id; /* TODO UeContext.pcfAmPolicyUri */ /* TODO UeContext.pcfUePolicyUri */ diff --git a/src/amf/nnrf-handler.c b/src/amf/nnrf-handler.c index 95f9bf21fd..1a07ba5aeb 100644 --- a/src/amf/nnrf-handler.c +++ b/src/amf/nnrf-handler.c @@ -57,7 +57,9 @@ void amf_nnrf_handle_nf_discover( amf_sbi_select_nf(sbi_object, service_type, requester_nf_type, discovery_option); - nf_instance = sbi_object->service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sbi_object->service_type_array[service_type].nf_instance_id); + if (!nf_instance) { amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 1945b37750..da8766023b 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -36,7 +36,6 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( OpenAPI_snssai_t hplmnSnssai; OpenAPI_ref_to_binary_data_t n1SmMsg; OpenAPI_user_location_t ueLocation; - ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; ogs_assert(sess); amf_ue = sess->amf_ue; @@ -190,13 +189,12 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( goto end; } - pcf_nf_instance = amf_ue->sbi.service_type_array[ - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance; - if (!pcf_nf_instance) { + SmContextCreateData.pcf_id = amf_ue->sbi.service_type_array[ + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance_id; + if (!SmContextCreateData.pcf_id) { ogs_error("No pcf_nf_instance"); goto end; } - SmContextCreateData.pcf_id = pcf_nf_instance->id; message.SmContextCreateData = &SmContextCreateData; diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 52103c6f4c..4faf197f13 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -313,7 +313,7 @@ static int client_discover_cb( amf_sbi_select_nf(&sess->sbi, service_type, requester_nf_type, discovery_option); - if (!sess->sbi.service_type_array[service_type].nf_instance) { + if (!sess->sbi.service_type_array[service_type].nf_instance_id) { ogs_error("[%s:%d] (NF discover) No [%s]", amf_ue->supi, sess->psi, ogs_sbi_service_type_to_name(service_type)); diff --git a/src/ausf/nnrf-handler.c b/src/ausf/nnrf-handler.c index 8bf5d13efb..1a50d71fc4 100644 --- a/src/ausf/nnrf-handler.c +++ b/src/ausf/nnrf-handler.c @@ -62,8 +62,8 @@ void ausf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); ogs_expect(true == ausf_sbi_send_request(nf_instance, xact)); } diff --git a/src/bsf/nnrf-handler.c b/src/bsf/nnrf-handler.c index 8cb6866617..73de9a3ae8 100644 --- a/src/bsf/nnrf-handler.c +++ b/src/bsf/nnrf-handler.c @@ -62,8 +62,8 @@ void bsf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); ogs_expect(true == bsf_sbi_send_request(nf_instance, xact)); } diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 69bccb90d2..593a2d72cd 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -738,7 +738,6 @@ bool nrf_nnrf_handle_nf_profile_retrieval( ogs_assert(stream); ogs_assert(recvmsg); - ogs_assert(recvmsg->h.resource.component[1]); nf_instance = ogs_sbi_nf_instance_find(recvmsg->h.resource.component[1]); if (!nf_instance) { ogs_error("Not found [%s]", recvmsg->h.resource.component[1]); diff --git a/src/nrf/nrf-sm.c b/src/nrf/nrf-sm.c index 5a16a9e2fd..474cfd36aa 100644 --- a/src/nrf/nrf-sm.c +++ b/src/nrf/nrf-sm.c @@ -112,10 +112,8 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) break; DEFAULT - if (message.h.resource.component[1]) { - nf_instance = ogs_sbi_nf_instance_find( - message.h.resource.component[1]); - } + nf_instance = ogs_sbi_nf_instance_find( + message.h.resource.component[1]); if (!nf_instance) { SWITCH(message.h.method) @@ -165,9 +163,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) ogs_fsm_dispatch(&nf_instance->sm, e); if (OGS_FSM_CHECK(&nf_instance->sm, nrf_nf_state_de_registered)) { - ogs_info("[%s:%d] NF de-registered", - nf_instance->id, - nf_instance->reference_count); + ogs_info("[%s] NF de-registered", nf_instance->id); nrf_nf_fsm_fini(nf_instance); ogs_sbi_nf_instance_remove(nf_instance); } else if (OGS_FSM_CHECK(&nf_instance->sm, diff --git a/src/pcf/nnrf-handler.c b/src/pcf/nnrf-handler.c index 35fb52be36..2e7160954d 100644 --- a/src/pcf/nnrf-handler.c +++ b/src/pcf/nnrf-handler.c @@ -84,8 +84,8 @@ void pcf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); switch (service_type) { case OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION: diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index 66120f88e6..d944a9ed69 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -505,7 +505,8 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = sess->sbi.service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sess->sbi.service_type_array[service_type].nf_instance_id); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -513,9 +514,9 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, nf_instance = ogs_sbi_nf_instance_find_by_service_type( service_type, requester_nf_type); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( + OGS_SBI_SETUP_NF_INSTANCE_ID( sess->sbi.service_type_array[service_type], - nf_instance); + nf_instance->id); } if (nf_instance) { diff --git a/src/pcf/nudr-handler.c b/src/pcf/nudr-handler.c index f39407d27e..0ac1a6e58b 100644 --- a/src/pcf/nudr-handler.c +++ b/src/pcf/nudr-handler.c @@ -215,7 +215,8 @@ bool pcf_nudr_dr_handle_query_sm_data( service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = sess->sbi.service_type_array[service_type].nf_instance; + nf_instance = ogs_sbi_nf_instance_find( + sess->sbi.service_type_array[service_type].nf_instance_id); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -223,9 +224,9 @@ bool pcf_nudr_dr_handle_query_sm_data( nf_instance = ogs_sbi_nf_instance_find_by_service_type( service_type, requester_nf_type); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( + OGS_SBI_SETUP_NF_INSTANCE_ID( sess->sbi.service_type_array[service_type], - nf_instance); + nf_instance->id); } if (nf_instance) { diff --git a/src/smf/nnrf-handler.c b/src/smf/nnrf-handler.c index 41b60d2ec3..c1c99e7afb 100644 --- a/src/smf/nnrf-handler.c +++ b/src/smf/nnrf-handler.c @@ -62,8 +62,8 @@ void smf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); ogs_expect(true == smf_sbi_send_request(nf_instance, xact)); } diff --git a/src/udm/nnrf-handler.c b/src/udm/nnrf-handler.c index 0c5cafb600..b853c7774f 100644 --- a/src/udm/nnrf-handler.c +++ b/src/udm/nnrf-handler.c @@ -81,8 +81,8 @@ void udm_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); ogs_expect(true == udm_sbi_send_request(nf_instance, xact)); } diff --git a/tests/af/nnrf-handler.c b/tests/af/nnrf-handler.c index ccdf90a686..3163425c0a 100644 --- a/tests/af/nnrf-handler.c +++ b/tests/af/nnrf-handler.c @@ -62,8 +62,8 @@ void af_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); + OGS_SBI_SETUP_NF_INSTANCE_ID( + sbi_object->service_type_array[service_type], nf_instance->id); ogs_expect(true == af_sbi_send_request(nf_instance, xact)); } From 95de14c72bb24206665c68f33adfa0676ee7805e Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 17 May 2024 13:36:25 +0900 Subject: [PATCH 106/323] [SBI] SearchResult.validityPeriod 3600->30s (#3210) The validity time for NF Instances obtained through NF Discovery was not properly implemented. Since the validity was 3600 seconds(1 hour), which caused 5G Core to not work properly after 3600 seconds(1 hour). There was an issue where an NF Instance should be deleted when its validity time expired, but it was not working correctly due to incorrect use of reference count. Therefore, I have modified the Validity of NF Instances obtained through NF Discovery to work properly. I also changed the default value of valdityPeriod to 30 seconds. --- lib/app/ogs-config.c | 4 +-- lib/sbi/client.h | 13 ++++++++ lib/sbi/context.c | 30 ++--------------- lib/sbi/context.h | 56 +++++++++++++++++++++++++++---- lib/sbi/nf-sm.c | 48 +++++++++++---------------- lib/sbi/nf-sm.h | 1 - lib/sbi/nnrf-handler.c | 73 +++++++++++++++++++++-------------------- lib/sbi/path.c | 26 +++++++-------- src/amf/context.c | 10 +++--- src/amf/gmm-handler.c | 10 +++--- src/amf/namf-handler.c | 12 +++++-- src/amf/nnrf-handler.c | 4 +-- src/amf/nsmf-build.c | 9 +++-- src/amf/sbi-path.c | 3 +- src/ausf/nnrf-handler.c | 4 +-- src/bsf/nnrf-handler.c | 4 +-- src/nrf/nnrf-handler.c | 7 ++-- src/nrf/nrf-sm.c | 6 ++-- src/pcf/nnrf-handler.c | 4 +-- src/pcf/npcf-handler.c | 8 ++--- src/pcf/nudr-handler.c | 8 ++--- src/scp/sbi-path.c | 5 +-- src/smf/nnrf-handler.c | 4 +-- src/udm/nnrf-handler.c | 4 +-- tests/af/nnrf-handler.c | 4 +-- 25 files changed, 194 insertions(+), 163 deletions(-) diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index a4ccb95825..a8964ebf75 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -408,8 +408,8 @@ static int local_conf_prepare(void) * Heartbeat Interval(e.g: 10 seconds) + No Heartbeat Margin(1 second) */ local_conf.time.nf_instance.no_heartbeat_margin = 1; - /* 3600 seconds = 1 hour */ - local_conf.time.nf_instance.validity_duration = 3600; + /* 30 seconds */ + local_conf.time.nf_instance.validity_duration = 30; /* 86400 seconds = 1 day */ local_conf.time.subscription.validity_duration = 86400; diff --git a/lib/sbi/client.h b/lib/sbi/client.h index 221bc7c59d..d6687b38ed 100644 --- a/lib/sbi/client.h +++ b/lib/sbi/client.h @@ -57,6 +57,19 @@ extern "C" { OGS_OBJECT_REF(__pClient); \ ((__cTX)->client) = (__pClient); \ ogs_debug("CLIENT Ref [%d]", (__pClient)->reference_count); \ + if ((__pClient)->fqdn) { \ + ogs_info("NF EndPoint(fqdn) setup [%s:%d]", \ + (__pClient)->fqdn, (__pClient)->fqdn_port); \ + } \ + if ((__pClient)->addr) { \ + ogs_info("NF EndPoint(addr) setup [%s:%d]", \ + OGS_ADDR((__pClient)->addr, buf), OGS_PORT((__pClient)->addr)); \ + } \ + if ((__pClient)->addr6) { \ + ogs_info("NF EndPoint(addr6) setup [%s:%d]", \ + OGS_ADDR((__pClient)->addr6, buf), \ + OGS_PORT((__pClient)->addr6)); \ + } \ } while(0) typedef int (*ogs_sbi_client_cb_f)( diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 74eb0b58f5..9f3d3e8c24 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1231,19 +1231,7 @@ ogs_sbi_nf_instance_t *ogs_sbi_nf_instance_find(char *id) { ogs_sbi_nf_instance_t *nf_instance = NULL; - /* - * This is related to Issue #3093. - * - * We want to be able to use 'ogs_sbi_nf_instance_id_find(char *id)' - * even if the 'id' is NULL as in the use case below. - * - * ogs_sbi_nf_instance_find( - * sess->sbi.service_type_array[service_type].nf_instance_id)); - * - * To do so, we changed the 'assert(id)' to 'if (!id) return NULL', - * as shown below. - */ - if (!id) return NULL; + ogs_assert(id); ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { if (nf_instance->id && strcmp(nf_instance->id, id) == 0) @@ -2130,9 +2118,6 @@ bool ogs_sbi_discovery_param_is_matched( if (NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(nf_instance)) return false; - if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) - return false; - if (nf_instance->nf_type != target_nf_type) return false; @@ -2260,26 +2245,15 @@ ogs_sbi_client_t *ogs_sbi_client_find_by_service_type( return nf_service->client; } - return nf_instance->client; + return NULL; } void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object) { - int i; - ogs_assert(sbi_object); if (ogs_list_count(&sbi_object->xact_list)) ogs_error("SBI running [%d]", ogs_list_count(&sbi_object->xact_list)); - - for (i = 0; i < OGS_SBI_MAX_NUM_OF_SERVICE_TYPE; i++) { - if (sbi_object->service_type_array[i].nf_instance_id) - ogs_free(sbi_object->service_type_array[i].nf_instance_id); - } - for (i = 0; i < OGS_SBI_MAX_NUM_OF_NF_TYPE; i++) { - if (sbi_object->nf_type_array[i].nf_instance_id) - ogs_free(sbi_object->nf_type_array[i].nf_instance_id); - } } ogs_sbi_xact_t *ogs_sbi_xact_add( diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 3589448dda..82052913e0 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -192,7 +192,17 @@ typedef struct ogs_sbi_object_s { ogs_sbi_obj_type_e type; struct { - char *nf_instance_id; + ogs_sbi_nf_instance_t *nf_instance; + + /* + * Search.Result stored in nf_instance->time.validity_duration; + * + * validity_timeout = nf_instance->validity->timeout = + * ogs_get_monotonic_time() + nf_instance->time.validity_duration; + * + * if no validityPeriod in SearchResult, validity_timeout is 0. + */ + ogs_time_t validity_timeout; } nf_type_array[OGS_SBI_MAX_NUM_OF_NF_TYPE], service_type_array[OGS_SBI_MAX_NUM_OF_SERVICE_TYPE]; @@ -458,18 +468,50 @@ void ogs_sbi_client_associate(ogs_sbi_nf_instance_t *nf_instance); int ogs_sbi_default_client_port(OpenAPI_uri_scheme_e scheme); -#define OGS_SBI_SETUP_NF_INSTANCE_ID(__cTX, __nFInstanceId) \ +#define OGS_SBI_SETUP_NF_INSTANCE(__cTX, __nFInstance) \ do { \ - ogs_assert(__nFInstanceId); \ + ogs_assert(__nFInstance); \ + ogs_assert((__nFInstance)->id); \ + ogs_assert((__nFInstance)->t_validity); \ \ - if ((__cTX).nf_instance_id) { \ - ogs_warn("NF Instance(ID) updated [%s]", (__nFInstanceId)); \ - ogs_free((__cTX).nf_instance_id); \ + if ((__cTX).nf_instance) { \ + ogs_warn("[%s] NF Instance updated [type:%s validity:%ds]", \ + ((__cTX).nf_instance)->id, \ + OpenAPI_nf_type_ToString(((__cTX).nf_instance)->nf_type), \ + ((__cTX).nf_instance)->time.validity_duration); \ } \ \ - ((__cTX).nf_instance_id) = ogs_strdup(__nFInstanceId); \ + ((__cTX).nf_instance) = __nFInstance; \ + if ((__nFInstance)->time.validity_duration) { \ + ((__cTX).validity_timeout) = (__nFInstance)->t_validity->timeout; \ + } else { \ + ((__cTX).validity_timeout) = 0; \ + } \ + ogs_info("[%s] NF Instance setup [type:%s validity:%ds]", \ + (__nFInstance)->id, \ + OpenAPI_nf_type_ToString((__nFInstance)->nf_type), \ + (__nFInstance)->time.validity_duration); \ } while(0) +/* + * Search.Result stored in nf_instance->time.validity_duration; + * + * validity_timeout = nf_instance->validity->timeout = + * ogs_get_monotonic_time() + nf_instance->time.validity_duration; + * + * if no validityPeriod in SearchResult, validity_timeout is 0. + */ +#define OGS_SBI_GET_NF_INSTANCE(__cTX) \ + ((__cTX).validity_timeout == 0 || \ + (__cTX).validity_timeout > ogs_get_monotonic_time() ? \ + ((__cTX).nf_instance) : NULL) + +#define OGS_SBI_NF_INSTANCE_VALID(__nFInstance) \ + (((__nFInstance) && ((__nFInstance)->t_validity) && \ + ((__nFInstance)->time.validity_duration == 0 || \ + (__nFInstance)->t_validity->timeout > ogs_get_monotonic_time())) ? \ + true : false) + bool ogs_sbi_discovery_param_is_matched( ogs_sbi_nf_instance_t *nf_instance, OpenAPI_nf_type_e target_nf_type, diff --git a/lib/sbi/nf-sm.c b/lib/sbi/nf-sm.c index 39e2d76e1e..87aec76244 100644 --- a/lib/sbi/nf-sm.c +++ b/lib/sbi/nf-sm.c @@ -32,19 +32,6 @@ void ogs_sbi_nf_fsm_init(ogs_sbi_nf_instance_t *nf_instance) ogs_sbi_nf_state_initial, ogs_sbi_nf_state_final, &e); } -void ogs_sbi_nf_fsm_tran(ogs_sbi_nf_instance_t *nf_instance, void *state) -{ - ogs_event_t e; - - ogs_assert(nf_instance); - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - - memset(&e, 0, sizeof(e)); - e.sbi.data = nf_instance; - - ogs_fsm_tran(&nf_instance->sm, state, &e); -} - void ogs_sbi_nf_fsm_fini(ogs_sbi_nf_instance_t *nf_instance) { ogs_event_t e; @@ -307,7 +294,7 @@ void ogs_sbi_nf_state_registered(ogs_fsm_t *s, ogs_event_t *e) break; case OGS_TIMER_NF_INSTANCE_NO_HEARTBEAT: - ogs_error("[%s:%s] No heartbeat", + ogs_error("[%s] No heartbeat [type:%s]", NF_INSTANCE_ID(ogs_sbi_self()->nf_instance), OpenAPI_nf_type_ToString( NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance))); @@ -318,22 +305,24 @@ void ogs_sbi_nf_state_registered(ogs_fsm_t *s, ogs_event_t *e) ogs_assert(!NF_INSTANCE_TYPE_IS_NRF(nf_instance)); ogs_assert(nf_instance->id); - ogs_info("[%s] NF expired", nf_instance->id); + ogs_info("[%s] NF expired [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); OGS_FSM_TRAN(s, &ogs_sbi_nf_state_de_registered); break; default: - ogs_error("[%s:%s] Unknown timer[%s:%d]", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Unknown timer [type:%s timer:%s:%d]", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_timer_get_name(e->timer_id), e->timer_id); } break; default: - ogs_error("[%s:%s] Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Unknown event [type:%s event:%s]", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; } @@ -353,19 +342,20 @@ void ogs_sbi_nf_state_de_registered(ogs_fsm_t *s, ogs_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_TYPE_IS_NRF(nf_instance)) { - ogs_info("[%s] NF de-registered", - NF_INSTANCE_ID(ogs_sbi_self()->nf_instance)); - } + ogs_info("[%s] NF de-registered [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + ogs_sbi_nf_fsm_fini(nf_instance); + ogs_sbi_nf_instance_remove(nf_instance); break; case OGS_FSM_EXIT_SIG: break; default: - ogs_error("[%s:%s] Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Unknown event [type:%s event:%s]", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; } @@ -409,9 +399,9 @@ void ogs_sbi_nf_state_exception(ogs_fsm_t *s, ogs_event_t *e) break; default: - ogs_error("[%s:%s] Unknown timer[%s:%d]", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Unknown timer[type:%s timer:%s:%d]", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_timer_get_name(e->timer_id), e->timer_id); } break; @@ -437,9 +427,9 @@ void ogs_sbi_nf_state_exception(ogs_fsm_t *s, ogs_event_t *e) break; default: - ogs_error("[%s:%s] Unknown event %s", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Unknown event [type:%s event:%s]", nf_instance->id ? nf_instance->id : "Undefined", + OpenAPI_nf_type_ToString(nf_instance->nf_type), ogs_event_get_name(e)); break; } diff --git a/lib/sbi/nf-sm.h b/lib/sbi/nf-sm.h index 8873e61bae..c6b44e191c 100644 --- a/lib/sbi/nf-sm.h +++ b/lib/sbi/nf-sm.h @@ -29,7 +29,6 @@ extern "C" { #endif void ogs_sbi_nf_fsm_init(ogs_sbi_nf_instance_t *nf_instance); -void ogs_sbi_nf_fsm_tran(ogs_sbi_nf_instance_t *nf_instance, void *state); void ogs_sbi_nf_fsm_fini(ogs_sbi_nf_instance_t *nf_instance); void ogs_sbi_nf_state_initial(ogs_fsm_t *s, ogs_event_t *e); diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 35ac9dd6e5..c8072aea92 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -1087,23 +1087,23 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( nf_instance, message.h.resource.component[1]); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("(NRF-notify) NF registered [%s]", nf_instance->id); + ogs_info("[%s] (NRF-notify) NF registered", nf_instance->id); } else { - ogs_warn("[%s] (NRF-notify) NF has already been added [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + ogs_warn("[%s] (NRF-notify) NF has already been added [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("[%s] (NRF-notify) NF invalid state [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + } } ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); - ogs_info("[%s] (NRF-notify) NF Profile updated [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); + ogs_info("[%s] (NRF-notify) NF Profile updated [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); ogs_sbi_client_associate(nf_instance); @@ -1119,12 +1119,10 @@ bool ogs_nnrf_nfm_handle_nf_status_notify( OpenAPI_notification_event_type_NF_DEREGISTERED) { nf_instance = ogs_sbi_nf_instance_find(message.h.resource.component[1]); if (nf_instance) { - ogs_info("[%s] (NRF-notify) NF_DEREGISTERED event [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : - "NULL", - nf_instance->id); - ogs_sbi_nf_fsm_fini((nf_instance)); + ogs_info("[%s] (NRF-notify) NF_DEREGISTERED event [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + ogs_sbi_nf_fsm_fini(nf_instance); ogs_sbi_nf_instance_remove(nf_instance); } else { ogs_warn("[%s] (NRF-notify) Not found", @@ -1201,18 +1199,18 @@ void ogs_nnrf_disc_handle_nf_discover_search_result( ogs_sbi_nf_instance_set_id(nf_instance, NFProfile->nf_instance_id); ogs_sbi_nf_fsm_init(nf_instance); - ogs_info("[%s] (NRF-discover) NF registered [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); + ogs_info("[%s] (NRF-discover) NF registered [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); } else { - ogs_warn("[%s] (NRF-discover) NF has already been added [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + ogs_warn("[%s] (NRF-discover) NF has already been added [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("[%s] (NRF-notify) NF invalid state [type:%s]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type)); + } } if (NF_INSTANCE_ID_IS_OTHERS(nf_instance->id)) { @@ -1239,15 +1237,18 @@ void ogs_nnrf_disc_handle_nf_discover_search_result( ogs_time_from_sec(nf_instance->time.validity_duration)); } else - ogs_warn("[%s] NF Instance validity-time should not 0 [%s]", + ogs_warn("[%s] NF Instance validity-time should not 0 " + "[type:%s]", + nf_instance->id, nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); + OpenAPI_nf_type_ToString(nf_instance->nf_type) : + "NULL"); - ogs_info("[%s] (NF-discover) NF Profile updated [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", - nf_instance->id); + ogs_info("[%s] (NF-discover) NF Profile updated " + "[type:%s validity:%ds]", + nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type), + nf_instance->time.validity_duration); } } } diff --git a/lib/sbi/path.c b/lib/sbi/path.c index d98d0bd342..11462873e0 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -214,16 +214,17 @@ static int client_discover_cb( nf_instance->id); } else { ogs_warn("[%s] (SCP-discover) NF has already been added [%s]", - nf_instance->nf_type ? - OpenAPI_nf_type_ToString(nf_instance->nf_type) : "NULL", + OpenAPI_nf_type_ToString(nf_instance->nf_type), nf_instance->id); - - ogs_assert(OGS_FSM_STATE(&nf_instance->sm)); - ogs_sbi_nf_fsm_tran(nf_instance, ogs_sbi_nf_state_registered); + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) { + ogs_error("[%s] (SCP-discover) NF invalid state [%s]", + OpenAPI_nf_type_ToString(nf_instance->nf_type), + nf_instance->id); + } } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); } e = ogs_event_new(OGS_EVENT_SBI_CLIENT); @@ -281,15 +282,14 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) } /* Target NF-Instance */ - nf_instance = ogs_sbi_nf_instance_find( - sbi_object->service_type_array[service_type].nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sbi_object->service_type_array[service_type]); if (!nf_instance) { nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); - if (nf_instance) { - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); - } + if (nf_instance) + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); } /* Target Client */ diff --git a/src/amf/context.c b/src/amf/context.c index 25dd7d507f..c6ba6f3879 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2338,9 +2338,8 @@ void amf_sbi_select_nf( nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], - nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); break; case OGS_SBI_OBJ_SESS_TYPE: sess = (amf_sess_t *)sbi_object; @@ -2353,9 +2352,8 @@ void amf_sbi_select_nf( false) continue; - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], - nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); break; } break; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 156f98f866..790326edc9 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1305,9 +1305,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_sbi_discovery_option_set_tai( discovery_option, &amf_ue->nr_tai); - nf_instance = ogs_sbi_nf_instance_find( - sess->sbi.service_type_array[service_type]. - nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_array[service_type]); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -1318,9 +1317,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, requester_nf_type, discovery_option); - nf_instance = ogs_sbi_nf_instance_find( - sess->sbi.service_type_array[service_type]. - nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_array[service_type]); if (!nf_instance) ogs_info("No SMF Instance"); diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index e689f0013c..c6d63ac46c 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1333,6 +1333,8 @@ int amf_namf_comm_handle_ue_context_transfer_request( OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; + char *ue_context_id = NULL; char *encoded_gmm_capability = NULL; int status = OGS_SBI_HTTP_STATUS_OK; @@ -1416,8 +1418,14 @@ int amf_namf_comm_handle_ue_context_transfer_request( encoded_gmm_capability = amf_namf_comm_base64_encode_5gmm_capability(amf_ue); UeContext._5g_mm_capability = encoded_gmm_capability; - UeContext.pcf_id = amf_ue->sbi.service_type_array[ - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance_id; + pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( + amf_ue->sbi.service_type_array[ + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL]); + if (pcf_nf_instance) { + UeContext.pcf_id = pcf_nf_instance->id; + } else { + ogs_warn("No PCF NF Instnace"); + } /* TODO UeContext.pcfAmPolicyUri */ /* TODO UeContext.pcfUePolicyUri */ diff --git a/src/amf/nnrf-handler.c b/src/amf/nnrf-handler.c index 1a07ba5aeb..0666775f88 100644 --- a/src/amf/nnrf-handler.c +++ b/src/amf/nnrf-handler.c @@ -57,8 +57,8 @@ void amf_nnrf_handle_nf_discover( amf_sbi_select_nf(sbi_object, service_type, requester_nf_type, discovery_option); - nf_instance = ogs_sbi_nf_instance_find( - sbi_object->service_type_array[service_type].nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sbi_object->service_type_array[service_type]); if (!nf_instance) { amf_ue_t *amf_ue = NULL; diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index da8766023b..3612414d39 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -36,6 +36,7 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( OpenAPI_snssai_t hplmnSnssai; OpenAPI_ref_to_binary_data_t n1SmMsg; OpenAPI_user_location_t ueLocation; + ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; ogs_assert(sess); amf_ue = sess->amf_ue; @@ -189,12 +190,14 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( goto end; } - SmContextCreateData.pcf_id = amf_ue->sbi.service_type_array[ - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL].nf_instance_id; - if (!SmContextCreateData.pcf_id) { + pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( + amf_ue->sbi.service_type_array[ + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL]); + if (!pcf_nf_instance) { ogs_error("No pcf_nf_instance"); goto end; } + SmContextCreateData.pcf_id = pcf_nf_instance->id; message.SmContextCreateData = &SmContextCreateData; diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 4faf197f13..2dc1772a66 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -313,7 +313,8 @@ static int client_discover_cb( amf_sbi_select_nf(&sess->sbi, service_type, requester_nf_type, discovery_option); - if (!sess->sbi.service_type_array[service_type].nf_instance_id) { + if (!OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_array[service_type])) { ogs_error("[%s:%d] (NF discover) No [%s]", amf_ue->supi, sess->psi, ogs_sbi_service_type_to_name(service_type)); diff --git a/src/ausf/nnrf-handler.c b/src/ausf/nnrf-handler.c index 1a50d71fc4..8bf5d13efb 100644 --- a/src/ausf/nnrf-handler.c +++ b/src/ausf/nnrf-handler.c @@ -62,8 +62,8 @@ void ausf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); ogs_expect(true == ausf_sbi_send_request(nf_instance, xact)); } diff --git a/src/bsf/nnrf-handler.c b/src/bsf/nnrf-handler.c index 73de9a3ae8..8cb6866617 100644 --- a/src/bsf/nnrf-handler.c +++ b/src/bsf/nnrf-handler.c @@ -62,8 +62,8 @@ void bsf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); ogs_expect(true == bsf_sbi_send_request(nf_instance, xact)); } diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 593a2d72cd..593cfeb103 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -738,6 +738,7 @@ bool nrf_nnrf_handle_nf_profile_retrieval( ogs_assert(stream); ogs_assert(recvmsg); + ogs_assert(recvmsg->h.resource.component[1]); nf_instance = ogs_sbi_nf_instance_find(recvmsg->h.resource.component[1]); if (!nf_instance) { ogs_error("Not found [%s]", recvmsg->h.resource.component[1]); @@ -1175,12 +1176,12 @@ static void handle_nf_discover_search_result( * is not executed later in nrf_context_final(). */ - ogs_info("[%s:%s] (NF-discover) NF registered", + ogs_info("[%s] (NF-discover) NF registered [type:%s]", NFProfile->nf_instance_id, OpenAPI_nf_type_ToString(NFProfile->nf_type)); } else { - ogs_warn("[%s:%s] (NF-discover) NF has already been added", + ogs_warn("[%s] (NF-discover) NF has already been added [type:%s]", NFProfile->nf_instance_id, OpenAPI_nf_type_ToString(NFProfile->nf_type)); } @@ -1198,7 +1199,7 @@ static void handle_nf_discover_search_result( break; } - ogs_info("[%s:%s] (NF-discover) NF Profile updated", + ogs_info("[%s] (NF-discover) NF Profile updated [type:%s]", nf_instance->id, OpenAPI_nf_type_ToString(nf_instance->nf_type)); } diff --git a/src/nrf/nrf-sm.c b/src/nrf/nrf-sm.c index 474cfd36aa..4b13b79d93 100644 --- a/src/nrf/nrf-sm.c +++ b/src/nrf/nrf-sm.c @@ -112,8 +112,10 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) break; DEFAULT - nf_instance = ogs_sbi_nf_instance_find( - message.h.resource.component[1]); + if (message.h.resource.component[1]) { + nf_instance = ogs_sbi_nf_instance_find( + message.h.resource.component[1]); + } if (!nf_instance) { SWITCH(message.h.method) diff --git a/src/pcf/nnrf-handler.c b/src/pcf/nnrf-handler.c index 2e7160954d..35fb52be36 100644 --- a/src/pcf/nnrf-handler.c +++ b/src/pcf/nnrf-handler.c @@ -84,8 +84,8 @@ void pcf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); switch (service_type) { case OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION: diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index d944a9ed69..6065905420 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -505,8 +505,8 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = ogs_sbi_nf_instance_find( - sess->sbi.service_type_array[service_type].nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_array[service_type]); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -514,9 +514,9 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, nf_instance = ogs_sbi_nf_instance_find_by_service_type( service_type, requester_nf_type); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE_ID( + OGS_SBI_SETUP_NF_INSTANCE( sess->sbi.service_type_array[service_type], - nf_instance->id); + nf_instance); } if (nf_instance) { diff --git a/src/pcf/nudr-handler.c b/src/pcf/nudr-handler.c index 0ac1a6e58b..c800dc8b94 100644 --- a/src/pcf/nudr-handler.c +++ b/src/pcf/nudr-handler.c @@ -215,8 +215,8 @@ bool pcf_nudr_dr_handle_query_sm_data( service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - nf_instance = ogs_sbi_nf_instance_find( - sess->sbi.service_type_array[service_type].nf_instance_id); + nf_instance = OGS_SBI_GET_NF_INSTANCE( + sess->sbi.service_type_array[service_type]); if (!nf_instance) { OpenAPI_nf_type_e requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); @@ -224,9 +224,9 @@ bool pcf_nudr_dr_handle_query_sm_data( nf_instance = ogs_sbi_nf_instance_find_by_service_type( service_type, requester_nf_type); if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE_ID( + OGS_SBI_SETUP_NF_INSTANCE( sess->sbi.service_type_array[service_type], - nf_instance->id); + nf_instance); } if (nf_instance) { diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 50ad923d39..98f0a233b2 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -283,9 +283,10 @@ static int request_handler(ogs_sbi_request_t *request, void *data) client = ogs_sbi_client_find_by_service_type( nf_instance, service_type); if (!client) { - ogs_error("[%s:%s] Cannot find client [%s:%s]", - OpenAPI_nf_type_ToString(nf_instance->nf_type), + ogs_error("[%s] Cannot find client " + "[type:%s target_nf_type:%s service_name:%s]", nf_instance->id, + OpenAPI_nf_type_ToString(nf_instance->nf_type), OpenAPI_nf_type_ToString(target_nf_type), ogs_sbi_service_type_to_name(service_type)); } diff --git a/src/smf/nnrf-handler.c b/src/smf/nnrf-handler.c index c1c99e7afb..41b60d2ec3 100644 --- a/src/smf/nnrf-handler.c +++ b/src/smf/nnrf-handler.c @@ -62,8 +62,8 @@ void smf_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); ogs_expect(true == smf_sbi_send_request(nf_instance, xact)); } diff --git a/src/udm/nnrf-handler.c b/src/udm/nnrf-handler.c index b853c7774f..0c5cafb600 100644 --- a/src/udm/nnrf-handler.c +++ b/src/udm/nnrf-handler.c @@ -81,8 +81,8 @@ void udm_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); ogs_expect(true == udm_sbi_send_request(nf_instance, xact)); } diff --git a/tests/af/nnrf-handler.c b/tests/af/nnrf-handler.c index 3163425c0a..ccdf90a686 100644 --- a/tests/af/nnrf-handler.c +++ b/tests/af/nnrf-handler.c @@ -62,8 +62,8 @@ void af_nnrf_handle_nf_discover( return; } - OGS_SBI_SETUP_NF_INSTANCE_ID( - sbi_object->service_type_array[service_type], nf_instance->id); + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); ogs_expect(true == af_sbi_send_request(nf_instance, xact)); } From 80ab4c4a1b9d8f1926a4fa1bbd5af02ed712daa1 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 17 May 2024 14:27:30 +0900 Subject: [PATCH 107/323] [NF] Move ogs_log_config_domain() location (#3210) When we run the test, for example, ./tests/registration/registration simple-init, wee get an INFO message like the one below. ``` 05/17 14:24:03.933: [sbi] INFO: NF EndPoint(addr) setup [127.0.0.200:7777] (../lib/sbi/context.c:474) ``` When we run the code in Open5GS, the log level initially defaults to INFO. However, for test code, we change the log level to ERROR by automatically inserting the -e error option into argv. The reason for this is to prevent WARNING and INFO messages from appearing when the test code is run. However, the log level to ERROR is changed at the bottom of the initialize routine, which caused the above message to be printed during testing. To prevent this from being printed, I modified the code to change that log level to ERROR a little earlier. --- src/amf/init.c | 8 ++++---- src/ausf/init.c | 8 ++++---- src/bsf/init.c | 8 ++++---- src/hss/hss-init.c | 8 ++++---- src/mme/mme-init.c | 8 ++++---- src/nrf/init.c | 8 ++++---- src/nssf/init.c | 8 ++++---- src/pcf/init.c | 8 ++++---- src/pcrf/pcrf-init.c | 6 +++--- src/scp/init.c | 8 ++++---- src/sepp/init.c | 8 ++++---- src/sgwc/init.c | 8 ++++---- src/sgwu/init.c | 8 ++++---- src/smf/init.c | 8 ++++---- src/udm/init.c | 8 ++++---- src/udr/init.c | 8 ++++---- src/upf/init.c | 8 ++++---- tests/af/init.c | 8 ++++---- 18 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/amf/init.c b/src/amf/init.c index 9a43ecadf7..fe477a0245 100644 --- a/src/amf/init.c +++ b/src/amf/init.c @@ -38,6 +38,10 @@ int amf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_AMF); amf_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; @@ -50,10 +54,6 @@ int amf_initialize(void) rv = amf_context_nf_info(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); rv = amf_sbi_open(); diff --git a/src/ausf/init.c b/src/ausf/init.c index ac8824c0b9..c9d5b6cc5d 100644 --- a/src/ausf/init.c +++ b/src/ausf/init.c @@ -34,14 +34,14 @@ int ausf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_AUSF); ausf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = ausf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = ausf_context_parse_config(); if (rv != OGS_OK) return rv; rv = ausf_sbi_open(); diff --git a/src/bsf/init.c b/src/bsf/init.c index 6560c81782..118a50bd00 100644 --- a/src/bsf/init.c +++ b/src/bsf/init.c @@ -36,14 +36,14 @@ int bsf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_BSF); bsf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = bsf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = bsf_context_parse_config(); if (rv != OGS_OK) return rv; rv = bsf_sbi_open(); diff --git a/src/hss/hss-init.c b/src/hss/hss-init.c index 7d8139e83c..288a2c5373 100644 --- a/src/hss/hss-init.c +++ b/src/hss/hss-init.c @@ -41,14 +41,14 @@ int hss_initialize(void) hss_context_init(); hss_event_init(); - rv = ogs_metrics_context_parse_config(APP_NAME); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = hss_context_parse_config(); + rv = ogs_metrics_context_parse_config(APP_NAME); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = hss_context_parse_config(); if (rv != OGS_OK) return rv; ogs_metrics_context_open(ogs_metrics_self()); diff --git a/src/mme/mme-init.c b/src/mme/mme-init.c index 63729a7812..7ceaa1d300 100644 --- a/src/mme/mme-init.c +++ b/src/mme/mme-init.c @@ -52,6 +52,10 @@ int mme_initialize(void) rv = ogs_gtp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwc"); if (rv != OGS_OK) return rv; @@ -61,10 +65,6 @@ int mme_initialize(void) rv = mme_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); rv = mme_fd_init(); diff --git a/src/nrf/init.c b/src/nrf/init.c index 5bb3593da2..0a726b4261 100644 --- a/src/nrf/init.c +++ b/src/nrf/init.c @@ -34,14 +34,14 @@ int nrf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_NRF); nrf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, NULL, NULL); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = nrf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, NULL, NULL); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = nrf_context_parse_config(); if (rv != OGS_OK) return rv; rv = nrf_sbi_open(); diff --git a/src/nssf/init.c b/src/nssf/init.c index 08bed92472..757bd43686 100644 --- a/src/nssf/init.c +++ b/src/nssf/init.c @@ -34,14 +34,14 @@ int nssf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_NSSF); nssf_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = nssf_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = nssf_context_parse_config(); if (rv != OGS_OK) return rv; rv = nssf_sbi_open(); diff --git a/src/pcf/init.c b/src/pcf/init.c index f0d47ea926..d4ac258b52 100644 --- a/src/pcf/init.c +++ b/src/pcf/init.c @@ -37,6 +37,10 @@ int pcf_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_PCF); pcf_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; @@ -46,10 +50,6 @@ int pcf_initialize(void) rv = pcf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - ogs_metrics_context_open(ogs_metrics_self()); if (ogs_app()->db_uri) { diff --git a/src/pcrf/pcrf-init.c b/src/pcrf/pcrf-init.c index 3255568d4a..2635f87808 100644 --- a/src/pcrf/pcrf-init.c +++ b/src/pcrf/pcrf-init.c @@ -32,13 +32,13 @@ int pcrf_initialize(void) pcrf_context_init(); - rv = pcrf_context_parse_config(); - if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + rv = pcrf_context_parse_config(); + if (rv != OGS_OK) return rv; + if (ogs_app()->db_uri) { rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; diff --git a/src/scp/init.c b/src/scp/init.c index 561c3e3e67..e47e958525 100644 --- a/src/scp/init.c +++ b/src/scp/init.c @@ -36,14 +36,14 @@ int scp_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_SCP); scp_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "next_scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = scp_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "next_scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = scp_context_parse_config(); if (rv != OGS_OK) return rv; rv = scp_sbi_open(); diff --git a/src/sepp/init.c b/src/sepp/init.c index 03c0154fd2..9f0bbc1ee5 100644 --- a/src/sepp/init.c +++ b/src/sepp/init.c @@ -36,14 +36,14 @@ int sepp_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_SEPP); sepp_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = sepp_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = sepp_context_parse_config(); if (rv != OGS_OK) return rv; rv = sepp_sbi_open(); diff --git a/src/sgwc/init.c b/src/sgwc/init.c index 7f62d09b71..92dd9945fe 100644 --- a/src/sgwc/init.c +++ b/src/sgwc/init.c @@ -47,6 +47,10 @@ int sgwc_initialize(void) rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwu"); if (rv != OGS_OK) return rv; @@ -56,10 +60,6 @@ int sgwc_initialize(void) rv = sgwc_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = sgwc_gtp_open(); if (rv != OGS_OK) return rv; diff --git a/src/sgwu/init.c b/src/sgwu/init.c index 51e20c53db..858e7ce070 100644 --- a/src/sgwu/init.c +++ b/src/sgwu/init.c @@ -44,6 +44,10 @@ int sgwu_initialize(void) rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "sgwc"); if (rv != OGS_OK) return rv; @@ -53,10 +57,6 @@ int sgwu_initialize(void) rv = sgwu_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = sgwu_pfcp_open(); if (rv != OGS_OK) return rv; diff --git a/src/smf/init.c b/src/smf/init.c index bf7a18e0aa..2e70e86adb 100644 --- a/src/smf/init.c +++ b/src/smf/init.c @@ -51,6 +51,10 @@ int smf_initialize(void) rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "upf"); if (rv != OGS_OK) return rv; @@ -66,10 +70,6 @@ int smf_initialize(void) rv = smf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = ogs_pfcp_ue_pool_generate(); if (rv != OGS_OK) return rv; diff --git a/src/udm/init.c b/src/udm/init.c index 07eff108b8..5714bad9a0 100644 --- a/src/udm/init.c +++ b/src/udm/init.c @@ -34,14 +34,14 @@ int udm_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_UDM); udm_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = udm_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = udm_context_parse_config(); if (rv != OGS_OK) return rv; rv = udm_sbi_open(); diff --git a/src/udr/init.c b/src/udr/init.c index 99965ad7d5..831e02916b 100644 --- a/src/udr/init.c +++ b/src/udr/init.c @@ -34,14 +34,14 @@ int udr_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_UDR); udr_context_init(); - rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; - rv = udr_context_parse_config(); + rv = ogs_sbi_context_parse_config(APP_NAME, "nrf", "scp"); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); + rv = udr_context_parse_config(); if (rv != OGS_OK) return rv; rv = ogs_dbi_init(ogs_app()->db_uri); diff --git a/src/upf/init.c b/src/upf/init.c index ec14d4f35b..d5779c2ee9 100644 --- a/src/upf/init.c +++ b/src/upf/init.c @@ -47,6 +47,10 @@ int upf_initialize(void) rv = ogs_pfcp_xact_init(); if (rv != OGS_OK) return rv; + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + rv = ogs_gtp_context_parse_config(APP_NAME, "smf"); if (rv != OGS_OK) return rv; @@ -59,10 +63,6 @@ int upf_initialize(void) rv = upf_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = ogs_pfcp_ue_pool_generate(); if (rv != OGS_OK) return rv; diff --git a/tests/af/init.c b/tests/af/init.c index e3f733f9eb..d5b2f8ac79 100644 --- a/tests/af/init.c +++ b/tests/af/init.c @@ -37,6 +37,10 @@ int af_initialize(void) ogs_sbi_context_init(OpenAPI_nf_type_AF); af_context_init(); + rv = ogs_log_config_domain( + ogs_app()->logger.domain, ogs_app()->logger.level); + if (rv != OGS_OK) return rv; + no_scp = ogs_global_conf()->parameter.no_scp; no_nrf = ogs_global_conf()->parameter.no_nrf; @@ -52,10 +56,6 @@ int af_initialize(void) rv = af_context_parse_config(); if (rv != OGS_OK) return rv; - rv = ogs_log_config_domain( - ogs_app()->logger.domain, ogs_app()->logger.level); - if (rv != OGS_OK) return rv; - rv = af_sbi_open(); if (rv != 0) return OGS_ERROR; From bba0ebe6a4b17c9405c86a5c60edd9e8bc5be24b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 17 May 2024 20:25:49 +0900 Subject: [PATCH 108/323] [SEC] crash for IMSI/MSISDN/IMEI overflow (#3207) When using ogs_buffer_to_bcd(), an overflow occurs if the input buffer length is larger than the output bcd size, causing a crash. We adjusted the size of the input buffer length using ogs_min as follows. ``` sgwc_ue->imsi_len = ogs_min(imsi_len, OGS_MAX_IMSI_LEN); memcpy(sgwc_ue->imsi, imsi, sgwc_ue->imsi_len); ogs_buffer_to_bcd(sgwc_ue->imsi, sgwc_ue->imsi_len, sgwc_ue->imsi_bcd); ``` --- src/sgwc/context.c | 2 +- src/smf/context.c | 2 +- src/smf/s5c-handler.c | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 26187529c2..39b68ca07b 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -226,7 +226,7 @@ sgwc_ue_t *sgwc_ue_add(uint8_t *imsi, int imsi_len) &sgwc_ue->sgw_s11_teid, sizeof(sgwc_ue->sgw_s11_teid), sgwc_ue); /* Set IMSI */ - sgwc_ue->imsi_len = imsi_len; + sgwc_ue->imsi_len = ogs_min(imsi_len, OGS_MAX_IMSI_LEN); memcpy(sgwc_ue->imsi, imsi, sgwc_ue->imsi_len); ogs_buffer_to_bcd(sgwc_ue->imsi, sgwc_ue->imsi_len, sgwc_ue->imsi_bcd); diff --git a/src/smf/context.c b/src/smf/context.c index 8108471d25..bdb82055f5 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1049,7 +1049,7 @@ smf_ue_t *smf_ue_add_by_imsi(uint8_t *imsi, int imsi_len) if ((smf_ue = smf_ue_add()) == NULL) return NULL;; - smf_ue->imsi_len = imsi_len; + smf_ue->imsi_len = ogs_min(imsi_len, OGS_MAX_IMSI_LEN); memcpy(smf_ue->imsi, imsi, smf_ue->imsi_len); ogs_buffer_to_bcd(smf_ue->imsi, smf_ue->imsi_len, smf_ue->imsi_bcd); ogs_hash_set(self.imsi_hash, smf_ue->imsi, smf_ue->imsi_len, smf_ue); diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 65db0c587c..69f4caa587 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -410,16 +410,15 @@ uint8_t smf_s5c_handle_create_session_request( /* Set MSISDN */ if (req->msisdn.presence && req->msisdn.len && req->msisdn.data) { - smf_ue->msisdn_len = req->msisdn.len; - memcpy(smf_ue->msisdn, req->msisdn.data, - ogs_min(smf_ue->msisdn_len, OGS_MAX_MSISDN_LEN)); + smf_ue->msisdn_len = ogs_min(req->msisdn.len, OGS_MAX_MSISDN_LEN); + memcpy(smf_ue->msisdn, req->msisdn.data, smf_ue->msisdn_len); ogs_buffer_to_bcd(smf_ue->msisdn, smf_ue->msisdn_len, smf_ue->msisdn_bcd); } /* Set IMEI(SV) */ if (req->me_identity.presence && req->me_identity.len > 0) { - smf_ue->imeisv_len = req->me_identity.len; + smf_ue->imeisv_len = ogs_min(req->me_identity.len, OGS_MAX_IMEISV_LEN); memcpy(smf_ue->imeisv, (uint8_t*)req->me_identity.data, smf_ue->imeisv_len); ogs_buffer_to_bcd( From 4599b273fa7ebed0296da2b70a7c6b8f5aacd227 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 13:50:57 +0900 Subject: [PATCH 109/323] [MME] Problem keep changing PDN-Type (#3209) If the UE continuously attempts to Attach while changing PDN Type, it will cause the wrong IP to be assigned. (e.g PDU-Type : IPv4v6 -> IPv4 -> IPv4v6) This is because we use two variables at the same time, one to read and store the Static IP from the Subscriber DB and one to store the IP assigned from SMF, called session->paa. When the UE attaches with PDN-Type set to IPv4v6, MME saves the allocated IP in session->paa. However, MME thinks it has been assigned a static IP based on the information in session->paa, so changing the PDN-Type may result in the wrong IP being assigned. To solve this problem, I separated the variable(session->paa) that stores the allocated IP received from SMF and the variable(session->ue_ip) that stores the Static IP read from the Subscriber DB. Therefore, the information read from the Subscriber DB (session->session_type and session->ue_ip) should not be modified. --- lib/proto/types.h | 5 --- src/mme/esm-handler.c | 3 +- src/mme/mme-fd-path.c | 21 +++++-------- src/mme/mme-s11-build.c | 41 ++++++++++++------------ src/mme/mme-s11-handler.c | 32 +++++++++---------- src/mme/mme-s6a-handler.c | 4 +-- src/sgwc/s5c-handler.c | 14 +-------- tests/310014/epc-test.c | 3 +- tests/attach/auth-test.c | 15 ++++++--- tests/attach/crash-test.c | 3 +- tests/attach/emm-status-test.c | 3 +- tests/attach/guti-test.c | 30 ++++++++++++------ tests/attach/idle-test.c | 9 ++++-- tests/attach/issues-test.c | 33 +++++++++++++------- tests/attach/reset-test.c | 9 ++++-- tests/attach/simple-test.c | 3 +- tests/attach/ue-context-test.c | 15 ++++++--- tests/common/context.c | 5 +++ tests/common/esm-build.c | 4 +-- tests/common/esm-build.h | 2 +- tests/csfb/crash-test.c | 3 +- tests/csfb/mo-active-test.c | 3 +- tests/csfb/mo-idle-test.c | 15 ++++++--- tests/csfb/mo-sms-test.c | 3 +- tests/csfb/mt-active-test.c | 3 +- tests/csfb/mt-idle-test.c | 3 +- tests/csfb/mt-sms-test.c | 3 +- tests/handover/epc-s1-test.c | 9 ++++-- tests/handover/epc-x2-test.c | 6 ++-- tests/non3gpp/epdg-test.c | 9 ++++-- tests/volte/bearer-test.c | 6 ++-- tests/volte/cx-test.c | 6 ++-- tests/volte/rx-test.c | 57 ++++++++++++++++++++++------------ tests/volte/session-test.c | 9 ++++-- tests/volte/simple-test.c | 6 ++-- tests/volte/video-test.c | 6 ++-- 36 files changed, 234 insertions(+), 167 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 1c186d7f26..380748853b 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -379,11 +379,6 @@ ED2(uint8_t spare:4;, typedef struct ogs_paa_s { ED2(uint8_t spare:5;, /* 8.34 PDN Type */ -#define OGS_PDU_SESSION_TYPE_IS_VALID(x) \ - ((x) == OGS_PDU_SESSION_TYPE_IPV4 || \ - (x) == OGS_PDU_SESSION_TYPE_IPV6 || \ - (x) == OGS_PDU_SESSION_TYPE_IPV4V6) \ - uint8_t session_type:3;) union { /* PDU_SESSION_TYPE_IPV4 */ diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index 752f760c8b..100b33ec5d 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -231,8 +231,7 @@ int esm_handle_information_response(mme_sess_t *sess, ogs_assert_if_reached(); } - if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue) && - OGS_PDU_SESSION_TYPE_IS_VALID(sess->session->paa.session_type)) { + if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai); mme_ue->csmap = csmap; diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index ba9fb0c0dd..394621a4e2 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -379,34 +379,27 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_assert(ret == 0); if (addr.ogs_sa_family == AF_INET) { + session->ue_ip.addr = addr.sin.sin_addr.s_addr; if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4) { - session->paa.addr = - addr.sin.sin_addr.s_addr; } else if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - session->paa.both.addr = - addr.sin.sin_addr.s_addr; } else { ogs_error("Warning: Received a static IPv4 " - "address but PDN-Type does not include " - "IPv4. Ignoring..."); + "address but PDN-Type[%d] does not include " + "IPv4. Ignoring...", session->session_type); } } else if (addr.ogs_sa_family == AF_INET6) { + memcpy(session->ue_ip.addr6, + addr.sin6.sin6_addr.s6_addr, OGS_IPV6_LEN); if (session->session_type == OGS_PDU_SESSION_TYPE_IPV6) { - memcpy(session->paa.addr6, - addr.sin6.sin6_addr.s6_addr, - OGS_IPV6_LEN); } else if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - memcpy(session->paa.both.addr6, - addr.sin6.sin6_addr.s6_addr, - OGS_IPV6_LEN); } else { ogs_error("Warning: Received a static IPv6 " - "address but PDN-Type does not include " - "IPv6. Ignoring..."); + "address but PDN-Type[%d] does not include " + "IPv6. Ignoring...", session->session_type); } } else { ogs_error("Invalid family[%d]", diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index 2101130ad9..9b5b29fdfe 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -171,10 +171,14 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( req->selection_mode.u8 = OGS_GTP2_SELECTION_MODE_MS_OR_NETWORK_PROVIDED_APN; + ogs_debug("sess->request_type.type = %d", sess->request_type.type); + ogs_assert(sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4 || sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV6 || sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ogs_debug("session->session_type = %d", session->session_type); + if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4 || session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { @@ -185,25 +189,12 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( ogs_assert_if_reached(); } } else { - ogs_fatal("Invalid PDN_TYPE[%d]", session->session_type); - ogs_assert_if_reached(); + ogs_error("Invalid PDN-TYPE[%d]", session->session_type); + return NULL; } req->pdn_type.presence = 1; - /* If we started with both addrs (IPV4V6) but the above code - * (pdn_type & sess->request_type) truncates us down to just one, - * we need to change position of addresses in struct. */ - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4 && - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - uint32_t addr = session->paa.both.addr; - session->paa.addr = addr; - } - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6 && - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - uint8_t addr[16]; - memcpy(&addr, session->paa.both.addr6, OGS_IPV6_LEN); - memcpy(session->paa.addr6, &addr, OGS_IPV6_LEN); - } + ogs_debug("req->pdn_type.u8 = %d", req->pdn_type.u8); memset(&indication, 0, sizeof(ogs_gtp2_indication_t)); req->indication_flags.presence = 1; @@ -224,15 +215,23 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( indication.operation_indication = 1; session->paa.session_type = req->pdn_type.u8; + ogs_debug("session->paa.session_type = %d", session->paa.session_type); req->pdn_address_allocation.data = &session->paa; - if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4) + if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4) { req->pdn_address_allocation.len = OGS_PAA_IPV4_LEN; - else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6) + session->paa.addr = session->ue_ip.addr; + } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6) { req->pdn_address_allocation.len = OGS_PAA_IPV6_LEN; - else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) + memcpy(session->paa.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) { req->pdn_address_allocation.len = OGS_PAA_IPV4V6_LEN; - else - ogs_assert_if_reached(); + session->paa.both.addr = session->ue_ip.addr; + memcpy(session->paa.both.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + } else { + ogs_error("Invalid PDN-TYPE[%d:%d:%d]", req->pdn_type.u8, + session->session_type, sess->request_type.type); + return NULL; + } req->pdn_address_allocation.presence = 1; req->maximum_apn_restriction.presence = 1; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 16d94bcca1..547915c0ac 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -195,18 +195,7 @@ void mme_s11_handle_create_session_response( cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (rsp->pdn_address_allocation.presence) { - ogs_paa_t paa; - - memcpy(&paa, rsp->pdn_address_allocation.data, - rsp->pdn_address_allocation.len); - - if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) { - ogs_error("[%s] Unknown PDN Type [Session:%u, Cause:%d]", - mme_ue->imsi_bcd, paa.session_type, session_cause); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; - } - } else { + if (rsp->pdn_address_allocation.presence == 0) { ogs_error("[%s] No PDN Address Allocation [Cause:%d]", mme_ue->imsi_bcd, session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; @@ -380,9 +369,23 @@ void mme_s11_handle_create_session_response( if (rsp->pdn_address_allocation.presence) { memcpy(&session->paa, rsp->pdn_address_allocation.data, rsp->pdn_address_allocation.len); + /* + * Issue #3209 + * + * The Session-Type in the Subscriber DB should not be changed + * in case the UE can change the PDN-Type for the APN. + * (e.g IPv4v6 -> IPv4 -> IPv4v6) + * + * For resolving this problem, + * session->session_type and session->ue_ip should not be modified. + * + * Therefore, the code below will be deleted. + */ +#if 0 /* WILL BE DELETED */ session->session_type = session->paa.session_type; ogs_assert(OGS_OK == ogs_paa_to_ip(&session->paa, &session->ue_ip)); +#endif } /* ePCO */ @@ -426,14 +429,10 @@ void mme_s11_handle_create_session_response( OGS_NETWORK_ACCESS_MODE_ONLY_PACKET || mme_ue->nas_eps.attach.value == OGS_NAS_ATTACH_TYPE_EPS_ATTACH) { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( - session->paa.session_type)); r = nas_eps_send_attach_accept(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( - session->paa.session_type)); ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue)); } @@ -441,7 +440,6 @@ void mme_s11_handle_create_session_response( /* 3GPP TS 23.401 D.3.6 step 13, 14: */ mme_s6a_send_ulr(mme_ue->enb_ue, mme_ue); } else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) { - ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); r = nas_eps_send_activate_default_bearer_context_request( bearer, create_action); ogs_expect(r == OGS_OK); diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index 069900418b..ffc9a99586 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -355,8 +355,8 @@ static uint8_t mme_ue_session_from_slice_data(mme_ue_t *mme_ue, ogs_free(mme_ue->session[i].name); break; } - memcpy(&mme_ue->session[i].paa, &slice_data->session[i].paa, - sizeof(mme_ue->session[i].paa)); + memcpy(&mme_ue->session[i].ue_ip, &slice_data->session[i].ue_ip, + sizeof(mme_ue->session[i].ue_ip)); memcpy(&mme_ue->session[i].qos, &slice_data->session[i].qos, sizeof(mme_ue->session[i].qos)); diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index 377a7d5e22..23f77d9851 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -137,19 +137,7 @@ void sgwc_s5c_handle_create_session_response( ogs_error("No GTP TEID [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (rsp->pdn_address_allocation.presence) { - ogs_paa_t paa; - - memcpy(&paa, rsp->pdn_address_allocation.data, - ogs_min(sizeof(paa), rsp->pdn_address_allocation.len)); - - if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) { - ogs_error("Unknown PDN Type %u, Cause:%d", - paa.session_type, session_cause); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; - } - - } else { + if (rsp->pdn_address_allocation.presence == 0) { ogs_error("No PDN Address Allocation [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } diff --git a/tests/310014/epc-test.c b/tests/310014/epc-test.c index 18db2c524e..1789e36aab 100644 --- a/tests/310014/epc-test.c +++ b/tests/310014/epc-test.c @@ -95,7 +95,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); test_ue->attach_request_param.ms_network_feature_support = 1; diff --git a/tests/attach/auth-test.c b/tests/attach/auth-test.c index abbc9ca31d..622750b46b 100644 --- a/tests/attach/auth-test.c +++ b/tests/attach/auth-test.c @@ -97,7 +97,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -202,7 +203,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -277,7 +279,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -352,7 +355,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -445,7 +449,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/crash-test.c b/tests/attach/crash-test.c index a6654657ba..f51f9cc57e 100644 --- a/tests/attach/crash-test.c +++ b/tests/attach/crash-test.c @@ -180,7 +180,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/emm-status-test.c b/tests/attach/emm-status-test.c index 51b6b80e0d..2d95ebbbd5 100644 --- a/tests/attach/emm-status-test.c +++ b/tests/attach/emm-status-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/guti-test.c b/tests/attach/guti-test.c index 00cd87561b..1b4aeb685d 100644 --- a/tests/attach/guti-test.c +++ b/tests/attach/guti-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -233,7 +234,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -374,7 +376,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -522,7 +525,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -627,7 +631,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -764,7 +769,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -959,7 +965,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1309,7 +1316,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1392,7 +1400,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1522,7 +1531,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/idle-test.c b/tests/attach/idle-test.c index e565662012..b54835f6d1 100644 --- a/tests/attach/idle-test.c +++ b/tests/attach/idle-test.c @@ -97,7 +97,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -426,7 +427,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -711,7 +713,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/issues-test.c b/tests/attach/issues-test.c index 316737a17c..f8f4943b33 100644 --- a/tests/attach/issues-test.c +++ b/tests/attach/issues-test.c @@ -99,7 +99,8 @@ static void issues_1431_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -215,7 +216,8 @@ static void issues_1431_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -245,7 +247,8 @@ static void issues_1431_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -648,7 +651,8 @@ static void issues_2287_v263_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[0]->attach_request_param, @@ -786,7 +790,8 @@ static void issues_2287_v263_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[1]->attach_request_param, @@ -928,7 +933,8 @@ static void issues_2287_v263_func(abts_case *tc, void *data) sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[0]->attach_request_param, @@ -994,7 +1000,8 @@ static void issues_2287_v263_func(abts_case *tc, void *data) sess->pdn_connectivity_param.epco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[1]->attach_request_param, @@ -1080,7 +1087,8 @@ static void issues_2287_v263_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue[1], esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1450,7 +1458,8 @@ static void issues_2287_v264_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[1]->attach_request_param, @@ -1588,7 +1597,8 @@ static void issues_2287_v264_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[0]->attach_request_param, @@ -1724,7 +1734,8 @@ static void issues_2287_v264_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[1]->attach_request_param, diff --git a/tests/attach/reset-test.c b/tests/attach/reset-test.c index 044e329829..3b8e3a97a3 100644 --- a/tests/attach/reset-test.c +++ b/tests/attach/reset-test.c @@ -121,7 +121,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -369,7 +370,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[i]->attach_request_param, @@ -605,7 +607,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue[i]->attach_request_param, diff --git a/tests/attach/simple-test.c b/tests/attach/simple-test.c index 655fab1135..355f3a04a3 100644 --- a/tests/attach/simple-test.c +++ b/tests/attach/simple-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/attach/ue-context-test.c b/tests/attach/ue-context-test.c index 5826b0685f..688d1344dd 100644 --- a/tests/attach/ue-context-test.c +++ b/tests/attach/ue-context-test.c @@ -93,7 +93,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -257,7 +258,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -340,7 +342,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -556,7 +559,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -639,7 +643,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/common/context.c b/tests/common/context.c index afe0838992..cf1a9cbc6d 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -1551,6 +1551,11 @@ bson_t *test_db_new_simple(test_ue_t *test_ue) "unit", BCON_INT32(3), "}", "}", +#if 0 /* For static-IP test */ + "ue", "{", "ipv4", "1.1.1.1", "ipv6", "::1", "}", + "ue", "{", "ipv4", "1.1.1.1", "}", + "ue", "{", "ipv6", "::1", "}", +#endif "qos", "{", "index", BCON_INT32(9), "arp", "{", diff --git a/tests/common/esm-build.c b/tests/common/esm-build.c index e8ec4f760c..0da34ac9b4 100644 --- a/tests/common/esm-build.c +++ b/tests/common/esm-build.c @@ -20,7 +20,7 @@ #include "test-common.h" ogs_pkbuf_t *testesm_build_pdn_connectivity_request( - test_sess_t *sess, bool integrity_protected) + test_sess_t *sess, bool integrity_protected, uint8_t pdn_type) { ogs_nas_eps_message_t message; ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request = @@ -72,7 +72,7 @@ ogs_pkbuf_t *testesm_build_pdn_connectivity_request( message.esm.h.message_type = OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST; - request_type->type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; + request_type->type = pdn_type; request_type->value = sess->pdn_connectivity_param.request_type; ogs_assert(request_type->value); diff --git a/tests/common/esm-build.h b/tests/common/esm-build.h index 518ecbbc95..d7a00ba148 100644 --- a/tests/common/esm-build.h +++ b/tests/common/esm-build.h @@ -25,7 +25,7 @@ extern "C" { #endif ogs_pkbuf_t *testesm_build_pdn_connectivity_request( - test_sess_t *sess, bool integrity_protected); + test_sess_t *sess, bool integrity_protected, uint8_t pdn_type); ogs_pkbuf_t *testesm_build_pdn_disconnect_request(test_sess_t *sess); ogs_pkbuf_t *testesm_build_esm_information_response(test_sess_t *sess); ogs_pkbuf_t *testesm_build_activate_default_eps_bearer_context_accept( diff --git a/tests/csfb/crash-test.c b/tests/csfb/crash-test.c index c7649f69ee..7399f11ac3 100644 --- a/tests/csfb/crash-test.c +++ b/tests/csfb/crash-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mo-active-test.c b/tests/csfb/mo-active-test.c index 98d4947aa3..4955ab2edc 100644 --- a/tests/csfb/mo-active-test.c +++ b/tests/csfb/mo-active-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mo-idle-test.c b/tests/csfb/mo-idle-test.c index dadc7d9eb1..cbd02b9596 100644 --- a/tests/csfb/mo-idle-test.c +++ b/tests/csfb/mo-idle-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -380,7 +381,8 @@ static void test_issues3072_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -647,7 +649,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -915,7 +918,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1196,7 +1200,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mo-sms-test.c b/tests/csfb/mo-sms-test.c index 8dfeb920f7..91dbf173c3 100644 --- a/tests/csfb/mo-sms-test.c +++ b/tests/csfb/mo-sms-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mt-active-test.c b/tests/csfb/mt-active-test.c index 7a10a384a3..fea54af98b 100644 --- a/tests/csfb/mt-active-test.c +++ b/tests/csfb/mt-active-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mt-idle-test.c b/tests/csfb/mt-idle-test.c index 326445af85..224dbdd76f 100644 --- a/tests/csfb/mt-idle-test.c +++ b/tests/csfb/mt-idle-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/csfb/mt-sms-test.c b/tests/csfb/mt-sms-test.c index a254eb1811..7e254bfa97 100644 --- a/tests/csfb/mt-sms-test.c +++ b/tests/csfb/mt-sms-test.c @@ -96,7 +96,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/handover/epc-s1-test.c b/tests/handover/epc-s1-test.c index 5f0130ee39..ca2d205e47 100644 --- a/tests/handover/epc-s1-test.c +++ b/tests/handover/epc-s1-test.c @@ -114,7 +114,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -708,7 +709,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1030,7 +1032,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/handover/epc-x2-test.c b/tests/handover/epc-x2-test.c index 24811c1034..8181ef3f8d 100644 --- a/tests/handover/epc-x2-test.c +++ b/tests/handover/epc-x2-test.c @@ -110,7 +110,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -461,7 +462,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/non3gpp/epdg-test.c b/tests/non3gpp/epdg-test.c index 6dda4d8767..acf3415df5 100644 --- a/tests/non3gpp/epdg-test.c +++ b/tests/non3gpp/epdg-test.c @@ -433,7 +433,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_HANDOVER; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -557,7 +558,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -657,7 +659,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_HANDOVER; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/volte/bearer-test.c b/tests/volte/bearer-test.c index 8cbbdc6889..7cf94584d5 100644 --- a/tests/volte/bearer-test.c +++ b/tests/volte/bearer-test.c @@ -93,7 +93,8 @@ static void uni_directional_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -336,7 +337,8 @@ static void bi_directional_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, diff --git a/tests/volte/cx-test.c b/tests/volte/cx-test.c index 1f5d729337..828f6ef6a7 100644 --- a/tests/volte/cx-test.c +++ b/tests/volte/cx-test.c @@ -104,7 +104,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -221,7 +222,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/volte/rx-test.c b/tests/volte/rx-test.c index 62df3558aa..29896dc21b 100644 --- a/tests/volte/rx-test.c +++ b/tests/volte/rx-test.c @@ -99,7 +99,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -216,7 +217,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -609,7 +611,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -717,7 +720,8 @@ static void test2_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -958,7 +962,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1075,7 +1080,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1160,7 +1166,8 @@ static void test3_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1303,7 +1310,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1420,7 +1428,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1503,7 +1512,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -1639,7 +1649,8 @@ static void test4_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1827,7 +1838,8 @@ static void test5_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -1944,7 +1956,8 @@ static void test5_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -2328,7 +2341,8 @@ static void test6_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -2445,7 +2459,8 @@ static void test6_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -2748,7 +2763,8 @@ static void test7_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -2865,7 +2881,8 @@ static void test7_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -3148,7 +3165,8 @@ static void test_issues3109_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -3265,7 +3283,8 @@ static void test_issues3109_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/volte/session-test.c b/tests/volte/session-test.c index c7e089798d..51df557b2f 100644 --- a/tests/volte/session-test.c +++ b/tests/volte/session-test.c @@ -93,7 +93,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -201,7 +202,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -317,7 +319,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/volte/simple-test.c b/tests/volte/simple-test.c index 9e7fd9ce7d..4e834b5159 100644 --- a/tests/volte/simple-test.c +++ b/tests/volte/simple-test.c @@ -99,7 +99,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -216,7 +217,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); diff --git a/tests/volte/video-test.c b/tests/volte/video-test.c index 4ae7be6ee4..6a81633767 100644 --- a/tests/volte/video-test.c +++ b/tests/volte/video-test.c @@ -97,7 +97,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, false); + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); memset(&test_ue->attach_request_param, @@ -214,7 +215,8 @@ static void test1_func(abts_case *tc, void *data) sess->pdn_connectivity_param.pco = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; - esmbuf = testesm_build_pdn_connectivity_request(sess, true); + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); ABTS_PTR_NOTNULL(tc, esmbuf); sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); ABTS_PTR_NOTNULL(tc, sendbuf); From 05deed616ce9b3656b2b2c396a512f877c111325 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 19:48:03 +0900 Subject: [PATCH 110/323] [SEC] fix Assertion `0 < ogs_fadn_parse` (#3207) --- lib/pfcp/handler.c | 64 +++++++++++++++++++++++------------------ lib/pfcp/types.c | 8 ++++-- lib/proto/types.c | 4 +-- src/mme/sgsap-handler.c | 8 ++++-- src/sgwc/s11-handler.c | 9 ++++-- src/smf/context.c | 22 ++++++++------ src/upf/n4-handler.c | 8 ++++-- 7 files changed, 73 insertions(+), 50 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index e540c1d8e6..5bbb8d31df 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -518,12 +518,13 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess, if (message->pdi.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; - ogs_assert(0 < ogs_fqdn_parse(dnn, - message->pdi.network_instance.data, - ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN))); - - pdr->dnn = ogs_strdup(dnn); - ogs_assert(pdr->dnn); + if (ogs_fqdn_parse(dnn, message->pdi.network_instance.data, + ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN)) > 0) { + pdr->dnn = ogs_strdup(dnn); + ogs_assert(pdr->dnn); + } else { + ogs_error("Invalid pdi.network_instance"); + } } pdr->chid = false; @@ -855,14 +856,16 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_update_pdr(ogs_pfcp_sess_t *sess, if (message->pdi.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; - ogs_assert(0 < ogs_fqdn_parse(dnn, - message->pdi.network_instance.data, - ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN))); - - if (pdr->dnn) - ogs_free(pdr->dnn); - pdr->dnn = ogs_strdup(dnn); - ogs_assert(pdr->dnn); + if (ogs_fqdn_parse(dnn, message->pdi.network_instance.data, + ogs_min(message->pdi.network_instance.len, + OGS_MAX_DNN_LEN)) > 0) { + if (pdr->dnn) + ogs_free(pdr->dnn); + pdr->dnn = ogs_strdup(dnn); + ogs_assert(pdr->dnn); + } else { + ogs_error("Invalid pdi.network_instance"); + } } if (message->pdi.local_f_teid.presence) { @@ -964,13 +967,15 @@ ogs_pfcp_far_t *ogs_pfcp_handle_create_far(ogs_pfcp_sess_t *sess, if (message->forwarding_parameters.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; - ogs_assert(0 < ogs_fqdn_parse(dnn, + if (ogs_fqdn_parse(dnn, message->forwarding_parameters.network_instance.data, - ogs_min(message->forwarding_parameters.network_instance.len, - OGS_MAX_DNN_LEN))); - - far->dnn = ogs_strdup(dnn); - ogs_assert(far->dnn); + ogs_min(message->forwarding_parameters.network_instance.len, + OGS_MAX_DNN_LEN)) > 0) { + far->dnn = ogs_strdup(dnn); + ogs_assert(far->dnn); + } else { + ogs_error("Invalid forwarding_parameters.network_instance"); + } } if (message->forwarding_parameters.outer_header_creation.presence) { @@ -1069,15 +1074,18 @@ ogs_pfcp_far_t *ogs_pfcp_handle_update_far(ogs_pfcp_sess_t *sess, if (message->update_forwarding_parameters.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; - ogs_assert(0 < ogs_fqdn_parse(dnn, + if (ogs_fqdn_parse(dnn, message->update_forwarding_parameters.network_instance.data, - ogs_min(message->update_forwarding_parameters. - network_instance.len, OGS_MAX_DNN_LEN))); - - if (far->dnn) - ogs_free(far->dnn); - far->dnn = ogs_strdup(dnn); - ogs_assert(far->dnn); + ogs_min(message->update_forwarding_parameters. + network_instance.len, OGS_MAX_DNN_LEN)) > 0) { + if (far->dnn) + ogs_free(far->dnn); + far->dnn = ogs_strdup(dnn); + ogs_assert(far->dnn); + } else { + ogs_error("Invalid " + "update_forwarding_parameters.network_instance"); + } } if (message->update_forwarding_parameters. diff --git a/lib/pfcp/types.c b/lib/pfcp/types.c index 50debd3fee..1a4ebe81af 100644 --- a/lib/pfcp/types.c +++ b/lib/pfcp/types.c @@ -173,9 +173,11 @@ int16_t ogs_pfcp_parse_user_plane_ip_resource_info( int len = octet->len - size; if (info->assosi) len--; - ogs_assert(0 < ogs_fqdn_parse( - info->network_instance, (char *)octet->data + size, - ogs_min(len, OGS_MAX_APN_LEN))); + if (ogs_fqdn_parse(info->network_instance, (char *)octet->data + size, + ogs_min(len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid info->network_instance"); + info->network_instance[0] = 0; + } size += len; } diff --git a/lib/proto/types.c b/lib/proto/types.c index b6e4110b7b..f43f46f120 100644 --- a/lib/proto/types.c +++ b/lib/proto/types.c @@ -419,8 +419,8 @@ int ogs_fqdn_parse(char *dst, const char *src, int length) while (i+1 < length) { len = src[i++]; if ((j + len + 1) > length) { - ogs_error("Invalid FQDN encoding[len:%d] + 1 > length[%d]", - len, length); + ogs_error("Invalid FQDN encoding[j:%d+len:%d] + 1 > length[%d]", + j, len, length); ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)src, length); return 0; } diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index 5e7b204794..023cd5f114 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -332,9 +332,11 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) nas_mobile_identity_imsi_len = iter->length; break; case SGSAP_IE_VLR_NAME_TYPE: - ogs_assert(0 < ogs_fqdn_parse( - vlr_name, iter->value, - ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN))); + if (ogs_fqdn_parse(vlr_name, iter->value, + ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN)) <= 0) { + ogs_error("Invalid VLR-Name"); + return; + } break; case SGSAP_IE_LAI_TYPE: lai = iter->value; diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 8edec28400..8f3524ac38 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -203,6 +203,12 @@ void sgwc_s11_handle_create_session_request( if (req->access_point_name.presence == 0) { ogs_error("No APN"); cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; + } } if (req->sender_f_teid_for_control_plane.presence == 0) { ogs_error("No Sender F-TEID"); @@ -221,9 +227,6 @@ void sgwc_s11_handle_create_session_request( } /* Add Session */ - ogs_assert(0 < ogs_fqdn_parse(apn, - req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN))); sess = sgwc_sess_find_by_ebi(sgwc_ue, req->bearer_contexts_to_be_created[0].eps_bearer_id.u8); if (sess) { diff --git a/src/smf/context.c b/src/smf/context.c index bdb82055f5..f606c794fa 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1278,7 +1278,14 @@ smf_sess_t *smf_sess_add_by_gtp1_message(ogs_gtp1_message_t *message) if (req->access_point_name.presence == 0) { ogs_error("No APN"); return NULL; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + return NULL; + } } + if (req->sgsn_address_for_signalling.presence == 0) { ogs_error("No SGSN Address for signalling"); return NULL; @@ -1296,12 +1303,6 @@ smf_sess_t *smf_sess_add_by_gtp1_message(ogs_gtp1_message_t *message) return NULL; } - if ((ogs_fqdn_parse(apn, req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN+1))) <= 0) { - ogs_error("No APN"); - return NULL; - } - ogs_trace("smf_sess_add_by_message() [APN:%s]", apn); /* @@ -1349,15 +1350,18 @@ smf_sess_t *smf_sess_add_by_gtp2_message(ogs_gtp2_message_t *message) if (req->access_point_name.presence == 0) { ogs_error("No APN"); return NULL; + } else { + if (ogs_fqdn_parse(apn, req->access_point_name.data, + ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)) <= 0) { + ogs_error("Invalid APN"); + return NULL; + } } if (req->rat_type.presence == 0) { ogs_error("No RAT Type"); return NULL; } - ogs_assert(0 < ogs_fqdn_parse(apn, req->access_point_name.data, - ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN))); - ogs_trace("smf_sess_add_by_message() [APN:%s]", apn); /* diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index b9b0bf9b29..466cc89f0b 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -107,8 +107,12 @@ void upf_n4_handle_session_establishment_request( if (req->apn_dnn.presence) { char apn_dnn[OGS_MAX_DNN_LEN+1]; - ogs_assert(0 < ogs_fqdn_parse(apn_dnn, req->apn_dnn.data, - ogs_min(req->apn_dnn.len, OGS_MAX_DNN_LEN))); + if (ogs_fqdn_parse(apn_dnn, req->apn_dnn.data, + ogs_min(req->apn_dnn.len, OGS_MAX_DNN_LEN)) <= 0) { + ogs_error("Invalid APN"); + cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + goto cleanup; + } if (sess->apn_dnn) ogs_free(sess->apn_dnn); From 5f425445a8d14eae0419edee6b45afe9c822aabd Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 20:25:54 +0900 Subject: [PATCH 111/323] [SEC] Fix Assertion ogs_gtp2_parse_uli (#3209) --- lib/gtp/v2/types.c | 45 ++++++++++++++++++---- src/sgwc/s11-handler.c | 85 ++++++++++++++++++++++-------------------- src/smf/fd-path.c | 5 ++- src/smf/s5c-handler.c | 10 ++++- 4 files changed, 94 insertions(+), 51 deletions(-) diff --git a/lib/gtp/v2/types.c b/lib/gtp/v2/types.c index d7a4de3338..11da8c0990 100644 --- a/lib/gtp/v2/types.c +++ b/lib/gtp/v2/types.c @@ -629,7 +629,11 @@ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) size++; if (uli->flags.cgi) { - ogs_assert(size + sizeof(uli->cgi) <= octet->len); + if (size + sizeof(uli->cgi) > octet->len) { + ogs_error("size[%d]+sizeof(uli->cgi)[%d] > IE Length[%d]", + size, (int)sizeof(uli->cgi), octet->len); + return 0; + } memcpy(&uli->cgi, (unsigned char *)octet->data + size, sizeof(uli->cgi)); uli->cgi.lac = be16toh(uli->cgi.lac); @@ -637,7 +641,11 @@ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) size += sizeof(uli->cgi); } if (uli->flags.sai) { - ogs_assert(size + sizeof(uli->sai) <= octet->len); + if (size + sizeof(uli->sai) > octet->len) { + ogs_error("size[%d]+sizeof(uli->sai)[%d] > IE Length[%d]", + size, (int)sizeof(uli->sai), octet->len); + return 0; + } memcpy(&uli->sai, (unsigned char *)octet->data + size, sizeof(uli->sai)); uli->sai.lac = be16toh(uli->sai.lac); @@ -645,7 +653,11 @@ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) size += sizeof(uli->sai); } if (uli->flags.rai) { - ogs_assert(size + sizeof(uli->rai) <= octet->len); + if (size + sizeof(uli->rai) > octet->len) { + ogs_error("size[%d]+sizeof(uli->lai)[%d] > IE Length[%d]", + size, (int)sizeof(uli->lai), octet->len); + return 0; + } memcpy(&uli->rai, (unsigned char *)octet->data + size, sizeof(uli->rai)); uli->rai.lac = be16toh(uli->rai.lac); @@ -653,28 +665,44 @@ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) size += sizeof(uli->rai); } if (uli->flags.tai) { - ogs_assert(size + sizeof(uli->tai) <= octet->len); + if (size + sizeof(uli->tai) > octet->len) { + ogs_error("size[%d]+sizeof(uli->tai)[%d] > IE Length[%d]", + size, (int)sizeof(uli->tai), octet->len); + return 0; + } memcpy(&uli->tai, (unsigned char *)octet->data + size, sizeof(uli->tai)); uli->tai.tac = be16toh(uli->tai.tac); size += sizeof(uli->tai); } if (uli->flags.e_cgi) { - ogs_assert(size + sizeof(uli->e_cgi) <= octet->len); + if (size + sizeof(uli->e_cgi) > octet->len) { + ogs_error("size[%d]+sizeof(uli->e_cgi)[%d] > IE Length[%d]", + size, (int)sizeof(uli->e_cgi), octet->len); + return 0; + } memcpy(&uli->e_cgi, (unsigned char *)octet->data + size, sizeof(uli->e_cgi)); uli->e_cgi.cell_id = be32toh(uli->e_cgi.cell_id); size += sizeof(uli->e_cgi); } if (uli->flags.lai) { - ogs_assert(size + sizeof(uli->lai) <= octet->len); + if (size + sizeof(uli->lai) > octet->len) { + ogs_error("size[%d]+sizeof(uli->lai)[%d] > IE Length[%d]", + size, (int)sizeof(uli->lai), octet->len); + return 0; + } memcpy(&uli->lai, (unsigned char *)octet->data + size, sizeof(uli->lai)); uli->lai.lac = be16toh(uli->lai.lac); size += sizeof(uli->lai); } if (uli->flags.enodeb_id) { - ogs_assert(size + sizeof(uli->enodeb_id) <= octet->len); + if (size + sizeof(uli->enodeb_id) > octet->len) { + ogs_error("size[%d]+sizeof(uli->enodeb_id)[%d] > IE Length[%d]", + size, (int)sizeof(uli->enodeb_id), octet->len); + return 0; + } memcpy(&uli->enodeb_id, (unsigned char *)octet->data + size, sizeof(uli->enodeb_id)); uli->enodeb_id.enodeb_id = be16toh(uli->enodeb_id.enodeb_id); @@ -684,7 +712,8 @@ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) ogs_error("Extended Macro eNodeB ID in ULI not implemented! see 3GPP TS 29.274 8.21.8"); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length[%d] != Decoded[%d]", octet->len, size); return size; } diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 8f3524ac38..acea0083ea 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -242,21 +242,22 @@ void sgwc_s11_handle_create_session_request( /* Set User Location Information */ if (req->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); - ogs_assert(req->user_location_information.len == decoded); + if (req->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; - sgwc_ue->uli_presence = true; + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - - ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } /* Select SGW-U based on UE Location Information */ @@ -542,21 +543,22 @@ void sgwc_s11_handle_modify_bearer_request( if (req->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); - ogs_assert(req->user_location_information.len == decoded); - - sgwc_ue->uli_presence = true; + if (req->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", @@ -845,21 +847,22 @@ void sgwc_s11_handle_create_bearer_response( if (rsp->user_location_information.presence == 1) { decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information); - ogs_assert(rsp->user_location_information.len == decoded); - - sgwc_ue->uli_presence = true; - - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; - - ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + if (rsp->user_location_information.len == decoded) { + sgwc_ue->uli_presence = true; + + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } else + ogs_error("Invalid User Location Info(ULI)"); } ogs_assert(OGS_OK == diff --git a/src/smf/fd-path.c b/src/smf/fd-path.c index f239fa6fe1..0186f840f3 100644 --- a/src/smf/fd-path.c +++ b/src/smf/fd-path.c @@ -100,7 +100,10 @@ void smf_fd_msg_avp_add_3gpp_uli(smf_sess_t *sess, struct msg *req) /* GTPv2C and Diameter 3GPP-User-Location-Information encoding don't match */ uli_len = ogs_gtp2_parse_uli( &uli, &sess->gtp.user_location_information); - ogs_assert(sess->gtp.user_location_information.len == uli_len); + if (sess->gtp.user_location_information.len != uli_len) { + ogs_error("Invalid User Location Information(ULI)"); + return; + } ogs_assert(sess->gtp.user_location_information.data); ogs_assert(sess->gtp.user_location_information.len); diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 69f4caa587..0eb4b1123e 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -207,7 +207,15 @@ uint8_t smf_s5c_handle_create_session_request( if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_EUTRAN) { /* User Location Inforation is mandatory only for E-UTRAN */ ogs_assert(req->user_location_information.presence); - ogs_gtp2_parse_uli(&uli, &req->user_location_information); + if (req->user_location_information.presence == 0) { + ogs_error("No User Location Information(ULI)"); + return OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + } + decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); + if (req->user_location_information.len != decoded) { + ogs_error("Invalid User Location Information(ULI)"); + return OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT; + } memcpy(&sess->e_tai, &uli.tai, sizeof(sess->e_tai)); memcpy(&sess->e_cgi, &uli.e_cgi, sizeof(sess->e_cgi)); From bd4d925f0f10f776893e5a63bfed5c30692b7f62 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 21:06:40 +0900 Subject: [PATCH 112/323] [SEC] Fix Assertion ogs_pfcp_parse_user_plane_ip_resource_info() (#3207) --- lib/pfcp/handler.c | 16 ++++++++++++---- lib/pfcp/types.c | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 5bbb8d31df..88b4cbb7e7 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -94,6 +94,7 @@ bool ogs_pfcp_cp_handle_association_setup_request( ogs_pfcp_association_setup_request_t *req) { int i; + int16_t decoded; ogs_assert(xact); ogs_assert(node); @@ -112,8 +113,11 @@ bool ogs_pfcp_cp_handle_association_setup_request( if (message->presence == 0) break; - ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); - ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + decoded = ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); + if (message->len == decoded) + ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + else + ogs_error("Invalid User Plane IP Resource Info"); } if (req->up_function_features.presence) { @@ -143,6 +147,7 @@ bool ogs_pfcp_cp_handle_association_setup_response( ogs_pfcp_association_setup_response_t *rsp) { int i; + int16_t decoded; ogs_assert(xact); ogs_pfcp_xact_commit(xact); @@ -160,8 +165,11 @@ bool ogs_pfcp_cp_handle_association_setup_response( if (message->presence == 0) break; - ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); - ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + decoded = ogs_pfcp_parse_user_plane_ip_resource_info(&info, message); + if (message->len == decoded) + ogs_gtpu_resource_add(&node->gtpu_resource_list, &info); + else + ogs_error("Invalid User Plane IP Resource Info"); } if (rsp->up_function_features.presence) { diff --git a/lib/pfcp/types.c b/lib/pfcp/types.c index 1a4ebe81af..40dbde981f 100644 --- a/lib/pfcp/types.c +++ b/lib/pfcp/types.c @@ -149,14 +149,22 @@ int16_t ogs_pfcp_parse_user_plane_ip_resource_info( size++; if (info->teidri) { - ogs_assert(size + sizeof(info->teid_range) <= octet->len); + if (size + sizeof(info->teid_range) > octet->len) { + ogs_error("size[%d]+sizeof(info->teid_range)[%d] > IE Length[%d]", + size, (int)sizeof(info->teid_range), octet->len); + return 0; + } memcpy(&info->teid_range, (unsigned char *)octet->data + size, sizeof(info->teid_range)); size += sizeof(info->teid_range); } if (info->v4) { - ogs_assert(size + sizeof(info->addr) <= octet->len); + if (size + sizeof(info->addr) > octet->len) { + ogs_error("size[%d]+sizeof(info->addr)[%d] > IE Length[%d]", + size, (int)sizeof(info->addr), octet->len); + return 0; + } memcpy(&info->addr, (unsigned char *)octet->data + size, sizeof(info->addr)); @@ -164,14 +172,28 @@ int16_t ogs_pfcp_parse_user_plane_ip_resource_info( } if (info->v6) { - ogs_assert(size + OGS_IPV6_LEN <= octet->len); + if (size + OGS_IPV6_LEN > octet->len) { + ogs_error("size[%d]+OGS_IPV6_LEN[%d] > IE Length[%d]", + size, (int)OGS_IPV6_LEN, octet->len); + return 0; + } memcpy(&info->addr6, (unsigned char *)octet->data + size, OGS_IPV6_LEN); size += OGS_IPV6_LEN; } if (info->assoni) { int len = octet->len - size; + if (len <= 0) { + ogs_error("len[%d] octect->len[%d] size[%d]", len, octet->len, size); + return 0; + } + if (info->assosi) len--; + if (len <= 0) { + ogs_error("info->assosi[%d] len[%d] octect->len[%d] size[%d]", + info->assosi, len, octet->len, size); + return 0; + } if (ogs_fqdn_parse(info->network_instance, (char *)octet->data + size, ogs_min(len, OGS_MAX_APN_LEN)) <= 0) { @@ -182,14 +204,19 @@ int16_t ogs_pfcp_parse_user_plane_ip_resource_info( } if (info->assosi) { - ogs_assert(size + sizeof(info->source_interface) <= - octet->len); + if (size + sizeof(info->source_interface) > octet->len) { + ogs_error("size[%d]+sizeof(info->source_interface)[%d] > " + "IE Length[%d]", + size, (int)sizeof(info->source_interface), octet->len); + return 0; + } memcpy(&info->source_interface, (unsigned char *)octet->data + size, sizeof(info->source_interface)); size += sizeof(info->source_interface); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length[%d] != Decoded[%d]", octet->len, size); return size; } From b1bf2b10e2da1003bc8349c8df781771c4b4e5e2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 21:12:47 +0900 Subject: [PATCH 113/323] [SEC] Fix Assertion ogs_pfcp_f_seid_to_ip (#3207) --- src/sgwu/context.c | 4 ++++ src/upf/context.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/sgwu/context.c b/src/sgwu/context.c index a7bdd56b3c..43da6a591e 100644 --- a/src/sgwu/context.c +++ b/src/sgwu/context.c @@ -252,6 +252,10 @@ sgwu_sess_t *sgwu_sess_add_by_message(ogs_pfcp_message_t *message) ogs_error("No CP F-SEID"); return NULL; } + if (f_seid->ipv4 == 0 && f_seid->ipv6 == 0) { + ogs_error("No IPv4 or IPv6"); + return NULL; + } f_seid->seid = be64toh(f_seid->seid); sess = sgwu_sess_find_by_sgwc_sxa_f_seid(f_seid); diff --git a/src/upf/context.c b/src/upf/context.c index bd0737c098..6c4690de73 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -365,6 +365,10 @@ upf_sess_t *upf_sess_add_by_message(ogs_pfcp_message_t *message) ogs_error("No CP F-SEID"); return NULL; } + if (f_seid->ipv4 == 0 && f_seid->ipv6 == 0) { + ogs_error("No IPv4 or IPv6"); + return NULL; + } f_seid->seid = be64toh(f_seid->seid); sess = upf_sess_find_by_smf_n4_f_seid(f_seid); From 15ff23de7559435238abd9f7cfaed880e6db75e1 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 21:23:58 +0900 Subject: [PATCH 114/323] [SEC] Fix Assertion ogs_pfcp_parse_sdf_filter (#3207) --- lib/pfcp/handler.c | 10 +++++++-- lib/pfcp/types.c | 52 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 88b4cbb7e7..7c18636a93 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -432,7 +432,10 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess, len = ogs_pfcp_parse_sdf_filter( &sdf_filter, &message->pdi.sdf_filter[i]); - ogs_assert(message->pdi.sdf_filter[i].len == len); + if (message->pdi.sdf_filter[i].len != len) { + ogs_error("Invalid SDF Filter"); + break; + } /* Check Previous SDF Filter ID */ if (sdf_filter.bid) { @@ -774,7 +777,10 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_update_pdr(ogs_pfcp_sess_t *sess, len = ogs_pfcp_parse_sdf_filter( &sdf_filter, &message->pdi.sdf_filter[i]); - ogs_assert(message->pdi.sdf_filter[i].len == len); + if (message->pdi.sdf_filter[i].len != len) { + ogs_error("Invalid SDF Filter"); + break; + } /* Check Previous SDF Filter ID */ if (sdf_filter.bid) { diff --git a/lib/pfcp/types.c b/lib/pfcp/types.c index 40dbde981f..6cf0fe0baa 100644 --- a/lib/pfcp/types.c +++ b/lib/pfcp/types.c @@ -311,18 +311,32 @@ int16_t ogs_pfcp_parse_sdf_filter( memset(filter, 0, sizeof(ogs_pfcp_sdf_filter_t)); - ogs_assert(size + sizeof(filter->flags) <= octet->len); + if (size + sizeof(filter->flags) > octet->len) { + ogs_error("size[%d]+sizeof(filter->flags)[%d] > IE Length[%d]", + size, (int)sizeof(filter->flags), octet->len); + return 0; + } memcpy(&filter->flags, (unsigned char *)octet->data + size, sizeof(filter->flags)); size++; - ogs_assert(size + sizeof(filter->spare2) <= octet->len); + if (size + sizeof(filter->spare2) > octet->len) { + ogs_error("size[%d]+sizeof(filter->spare2)[%d] > IE Length[%d]", + size, (int)sizeof(filter->spare2), octet->len); + return 0; + } memcpy(&filter->spare2, (unsigned char *)octet->data + size, sizeof(filter->flags)); size++; if (filter->fd) { - ogs_assert(size + sizeof(filter->flow_description_len) <= octet->len); + if (size + sizeof(filter->flow_description_len) > octet->len) { + ogs_error("size[%d]+sizeof(filter->flow_description_len)[%d] " + "> IE Length[%d]", + size, (int)sizeof(filter->flow_description_len), + octet->len); + return 0; + } memcpy(&filter->flow_description_len, (unsigned char *)octet->data + size, sizeof(filter->flow_description_len)); @@ -334,7 +348,12 @@ int16_t ogs_pfcp_parse_sdf_filter( } if (filter->ttc) { - ogs_assert(size + sizeof(filter->tos_traffic_class) <= octet->len); + if (size + sizeof(filter->tos_traffic_class) > octet->len) { + ogs_error("size[%d]+sizeof(filter->tos_traffic_class)[%d] " + "> IE Length[%d]", + size, (int)sizeof(filter->tos_traffic_class), octet->len); + return 0; + } memcpy(&filter->tos_traffic_class, (unsigned char *)octet->data + size, sizeof(filter->tos_traffic_class)); @@ -343,8 +362,13 @@ int16_t ogs_pfcp_parse_sdf_filter( } if (filter->spi) { - ogs_assert(size + sizeof(filter->security_parameter_index) <= - octet->len); + if (size + sizeof(filter->security_parameter_index) > octet->len) { + ogs_error("size[%d]+sizeof(filter->security_parameter_index)[%d] " + "> IE Length[%d]", + size, (int)sizeof(filter->security_parameter_index), + octet->len); + return 0; + } memcpy(&filter->security_parameter_index, (unsigned char *)octet->data + size, sizeof(filter->security_parameter_index)); @@ -355,7 +379,11 @@ int16_t ogs_pfcp_parse_sdf_filter( if (filter->fl) { int bit24_len = 3; - ogs_assert(size + bit24_len <= octet->len); + if (size + bit24_len > octet->len) { + ogs_error("size[%d]+bit24_len[%d] > IE Length[%d]", + size, bit24_len, octet->len); + return 0; + } memcpy(&filter->flow_label, (unsigned char *)octet->data + size, bit24_len); filter->flow_label = be32toh(filter->flow_label); @@ -363,14 +391,20 @@ int16_t ogs_pfcp_parse_sdf_filter( } if (filter->bid) { - ogs_assert(size + sizeof(filter->sdf_filter_id) <= octet->len); + if (size + sizeof(filter->sdf_filter_id) > octet->len) { + ogs_error("size[%d]+sizeof(filter->sdf_filter_id)[%d]" + "> IE Length[%d]", + size, (int)sizeof(filter->sdf_filter_id), octet->len); + return 0; + } memcpy(&filter->sdf_filter_id, (unsigned char *)octet->data + size, sizeof(filter->sdf_filter_id)); filter->sdf_filter_id = be32toh(filter->sdf_filter_id); size += sizeof(filter->sdf_filter_id); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length[%d] != Decoded[%d]", octet->len, size); return size; } From 02d302b15aa316a1f39cb7d9592c96c9ff73f18b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 May 2024 21:34:17 +0900 Subject: [PATCH 115/323] [SEC] Fix Assertion ogs_pfcp_parse_volume (#3207) --- lib/pfcp/handler.c | 38 ++++++++++++++++++++++++++++++++++---- lib/pfcp/types.c | 21 ++++++++++++++++++++- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 7c18636a93..c1bac05bf2 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -1329,6 +1329,7 @@ ogs_pfcp_urr_t *ogs_pfcp_handle_create_urr(ogs_pfcp_sess_t *sess, ogs_pfcp_tlv_create_urr_t *message, uint8_t *cause_value, uint8_t *offending_ie_value) { + int16_t decoded; ogs_pfcp_urr_t *urr = NULL; ogs_assert(message); @@ -1377,12 +1378,26 @@ ogs_pfcp_urr_t *ogs_pfcp_handle_create_urr(ogs_pfcp_sess_t *sess, if (message->volume_threshold.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_threshold, &message->volume_threshold); + decoded = ogs_pfcp_parse_volume( + &urr->vol_threshold, &message->volume_threshold); + if (message->volume_threshold.len != decoded) { + ogs_error("Invalid Volume Threshold"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_THRESHOLD_TYPE; + return NULL; + } } if (message->volume_quota.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_quota, &message->volume_quota); + decoded = ogs_pfcp_parse_volume( + &urr->vol_quota, &message->volume_quota); + if (message->volume_quota.len != decoded) { + ogs_error("Invalid Volume Quota"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_QUOTA_TYPE; + return NULL; + } } if (message->event_threshold.presence && @@ -1431,6 +1446,7 @@ ogs_pfcp_urr_t *ogs_pfcp_handle_update_urr(ogs_pfcp_sess_t *sess, ogs_pfcp_tlv_update_urr_t *message, uint8_t *cause_value, uint8_t *offending_ie_value) { + int16_t decoded; ogs_pfcp_urr_t *urr = NULL; ogs_assert(message); @@ -1469,12 +1485,26 @@ ogs_pfcp_urr_t *ogs_pfcp_handle_update_urr(ogs_pfcp_sess_t *sess, if (message->volume_threshold.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_threshold, &message->volume_threshold); + decoded = ogs_pfcp_parse_volume( + &urr->vol_threshold, &message->volume_threshold); + if (message->volume_threshold.len != decoded) { + ogs_error("Invalid Volume Threshold"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_THRESHOLD_TYPE; + return NULL; + } } if (message->volume_quota.presence && (urr->meas_method & OGS_PFCP_MEASUREMENT_METHOD_VOLUME)) { - ogs_pfcp_parse_volume(&urr->vol_quota, &message->volume_quota); + decoded = ogs_pfcp_parse_volume( + &urr->vol_quota, &message->volume_quota); + if (message->volume_quota.len != decoded) { + ogs_error("Invalid Volume Quota"); + *cause_value = OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT; + *offending_ie_value = OGS_PFCP_VOLUME_QUOTA_TYPE; + return NULL; + } } if (message->event_threshold.presence && diff --git a/lib/pfcp/types.c b/lib/pfcp/types.c index 6cf0fe0baa..3538acf6c1 100644 --- a/lib/pfcp/types.c +++ b/lib/pfcp/types.c @@ -542,25 +542,44 @@ int16_t ogs_pfcp_parse_volume( size += sizeof(volume->flags); if (volume->tovol) { + if (size + sizeof(volume->total_volume) > octet->len) { + ogs_error("size[%d]+sizeof(volume->total_volume)[%d] " + "> IE Length[%d]", + size, (int)sizeof(volume->total_volume), octet->len); + return 0; + } memcpy(&volume->total_volume, (unsigned char *)octet->data + size, sizeof(volume->total_volume)); volume->total_volume = be64toh(volume->total_volume); size += sizeof(volume->total_volume); } if (volume->ulvol) { + if (size + sizeof(volume->uplink_volume) > octet->len) { + ogs_error("size[%d]+sizeof(volume->uplink_volume)[%d] " + "> IE Length[%d]", + size, (int)sizeof(volume->uplink_volume), octet->len); + return 0; + } memcpy(&volume->uplink_volume, (unsigned char *)octet->data + size, sizeof(volume->uplink_volume)); volume->uplink_volume = be64toh(volume->uplink_volume); size += sizeof(volume->uplink_volume); } if (volume->dlvol) { + if (size + sizeof(volume->downlink_volume) > octet->len) { + ogs_error("size[%d]+sizeof(volume->downlink_volume)[%d] " + "> IE Length[%d]", + size, (int)sizeof(volume->downlink_volume), octet->len); + return 0; + } memcpy(&volume->downlink_volume, (unsigned char *)octet->data + size, sizeof(volume->downlink_volume)); volume->downlink_volume = be64toh(volume->downlink_volume); size += sizeof(volume->downlink_volume); } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length[%d] != Decoded[%d]", octet->len, size); return size; } From 87d9cdf569c9dbd6c1f3c3f0240ba53f97917bfc Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 21 May 2024 21:06:17 +0900 Subject: [PATCH 116/323] [MME] Fixed ttcn3-mme-test-ogs (#2806) (#315) Try to fix the following error "MME_Tests.ttcn:955 : no SGSN Context Response from MME" MME_Tests.ttcn:1572 MME_Tests control part MME_Tests.ttcn:1457 TC_ue_cell_reselect_eutran_to_geran testcase --- src/mme/mme-context.h | 3 +++ src/mme/mme-gn-build.c | 4 ++-- src/mme/mme-gn-handler.c | 7 +++---- src/mme/mme-s11-handler.c | 6 ++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index dcfb8f1ae4..15a1fae70b 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -760,6 +760,9 @@ typedef struct mme_sess_s { ogs_session_t *session; + uint8_t pdp_type_num; + ogs_ip_t pdp_address; + /* Save Protocol Configuration Options from UE */ struct { uint8_t length; diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 53dfd83898..5ae3e81e5d 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -156,8 +156,8 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ .receive_npdu_nr = 0, .ul_teic = sess->pgw_s5c_teid, .pdp_type_org = OGS_PDP_EUA_ORG_IETF, - .pdp_type_num = {sess->session->session_type, }, - .pdp_address = {sess->session->ue_ip, }, + .pdp_type_num = {sess->pdp_type_num, }, + .pdp_address = {sess->pdp_address, }, .ggsn_address_c = sess->pgw_s5c_ip, .trans_id = sess->pti, }; diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index b9b6a60c10..a566ab2e3f 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -238,11 +238,10 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ } ogs_sess->smf_ip = gtp1_pdp_ctx->ggsn_address_c; ogs_sess->context_identifier = gtp1_pdp_ctx->pdp_ctx_id; - ogs_sess->session_type = gtp1_pdp_ctx->pdp_type_num[0]; - ogs_sess->ue_ip = gtp1_pdp_ctx->pdp_address[0]; + ogs_sess->paa.session_type = gtp1_pdp_ctx->pdp_type_num[0]; /* TODO: sess->paa with gtp1_pdp_ctx->pdp_address[0], using/implementing ogs_gtp2_ip_to_paa ? */ - ogs_ip_to_paa(&ogs_sess->ue_ip, &ogs_sess->paa); + ogs_ip_to_paa(&gtp1_pdp_ctx->pdp_address[0], &ogs_sess->paa); /* 3GPP TS 23.060 section 9.2.1A: "The QoS profiles of the PDP context and EPS bearer are mapped as specified in TS 23.401" * 3GPP TS 23.401 Annex E: "Mapping between EPS and Release 99 QoS parameters" @@ -266,7 +265,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ sess->session = ogs_sess; sess->pgw_s5c_teid = gtp1_pdp_ctx->ul_teic; sess->pgw_s5c_ip = gtp1_pdp_ctx->ggsn_address_c; - switch (ogs_sess->session_type) { + switch (ogs_sess->paa.session_type) { case OGS_PDU_SESSION_TYPE_IPV4: sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; break; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 547915c0ac..d5e2765860 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -381,11 +381,9 @@ void mme_s11_handle_create_session_response( * * Therefore, the code below will be deleted. */ -#if 0 /* WILL BE DELETED */ - session->session_type = session->paa.session_type; + sess->pdp_type_num = session->paa.session_type; ogs_assert(OGS_OK == - ogs_paa_to_ip(&session->paa, &session->ue_ip)); -#endif + ogs_paa_to_ip(&session->paa, &sess->pdp_address)); } /* ePCO */ From f401e7df14ccb15b02bb089e59e9875f97fe23a1 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 21 May 2024 17:16:06 +0200 Subject: [PATCH 117/323] Revert "[MME] Fixed ttcn3-mme-test-ogs (#2806) (#315)" This reverts commit 87d9cdf569c9dbd6c1f3c3f0240ba53f97917bfc. --- src/mme/mme-context.h | 3 --- src/mme/mme-gn-build.c | 4 ++-- src/mme/mme-gn-handler.c | 7 ++++--- src/mme/mme-s11-handler.c | 6 ++++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 15a1fae70b..dcfb8f1ae4 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -760,9 +760,6 @@ typedef struct mme_sess_s { ogs_session_t *session; - uint8_t pdp_type_num; - ogs_ip_t pdp_address; - /* Save Protocol Configuration Options from UE */ struct { uint8_t length; diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 5ae3e81e5d..53dfd83898 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -156,8 +156,8 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ .receive_npdu_nr = 0, .ul_teic = sess->pgw_s5c_teid, .pdp_type_org = OGS_PDP_EUA_ORG_IETF, - .pdp_type_num = {sess->pdp_type_num, }, - .pdp_address = {sess->pdp_address, }, + .pdp_type_num = {sess->session->session_type, }, + .pdp_address = {sess->session->ue_ip, }, .ggsn_address_c = sess->pgw_s5c_ip, .trans_id = sess->pti, }; diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index a566ab2e3f..b9b6a60c10 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -238,10 +238,11 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ } ogs_sess->smf_ip = gtp1_pdp_ctx->ggsn_address_c; ogs_sess->context_identifier = gtp1_pdp_ctx->pdp_ctx_id; - ogs_sess->paa.session_type = gtp1_pdp_ctx->pdp_type_num[0]; + ogs_sess->session_type = gtp1_pdp_ctx->pdp_type_num[0]; + ogs_sess->ue_ip = gtp1_pdp_ctx->pdp_address[0]; /* TODO: sess->paa with gtp1_pdp_ctx->pdp_address[0], using/implementing ogs_gtp2_ip_to_paa ? */ - ogs_ip_to_paa(&gtp1_pdp_ctx->pdp_address[0], &ogs_sess->paa); + ogs_ip_to_paa(&ogs_sess->ue_ip, &ogs_sess->paa); /* 3GPP TS 23.060 section 9.2.1A: "The QoS profiles of the PDP context and EPS bearer are mapped as specified in TS 23.401" * 3GPP TS 23.401 Annex E: "Mapping between EPS and Release 99 QoS parameters" @@ -265,7 +266,7 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ sess->session = ogs_sess; sess->pgw_s5c_teid = gtp1_pdp_ctx->ul_teic; sess->pgw_s5c_ip = gtp1_pdp_ctx->ggsn_address_c; - switch (ogs_sess->paa.session_type) { + switch (ogs_sess->session_type) { case OGS_PDU_SESSION_TYPE_IPV4: sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; break; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index d5e2765860..547915c0ac 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -381,9 +381,11 @@ void mme_s11_handle_create_session_response( * * Therefore, the code below will be deleted. */ - sess->pdp_type_num = session->paa.session_type; +#if 0 /* WILL BE DELETED */ + session->session_type = session->paa.session_type; ogs_assert(OGS_OK == - ogs_paa_to_ip(&session->paa, &sess->pdp_address)); + ogs_paa_to_ip(&session->paa, &session->ue_ip)); +#endif } /* ePCO */ From c6c73c1f70740115617f86407fbc5125a7f60910 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 21 May 2024 17:32:55 +0200 Subject: [PATCH 118/323] MME: Gn: Fill PDP Context requested from SGSN with IP allocated by SMF IP assigned from SMF: session->paa Static IP read from the Subscriber DB: session->ue_ip When passing the PDP context information to the SGSN, we actually wanna provide it with the IP address currently in use. --- src/mme/mme-gn-build.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 53dfd83898..8884ccbfbd 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -140,6 +140,7 @@ static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_p static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_decoded_t *pdpctx_dec) { mme_bearer_t *bearer = NULL; + int rv; *pdpctx_dec = (ogs_gtp1_pdp_context_decoded_t){ .ea = OGS_GTP1_PDPCTX_EXT_EUA_NO, @@ -156,14 +157,17 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ .receive_npdu_nr = 0, .ul_teic = sess->pgw_s5c_teid, .pdp_type_org = OGS_PDP_EUA_ORG_IETF, - .pdp_type_num = {sess->session->session_type, }, - .pdp_address = {sess->session->ue_ip, }, + .pdp_type_num = {sess->session->paa.session_type, }, .ggsn_address_c = sess->pgw_s5c_ip, .trans_id = sess->pti, }; ogs_cpystrn(pdpctx_dec->apn, sess->session->name, sizeof(pdpctx_dec->apn)); + rv = ogs_paa_to_ip(&sess->session->paa, &pdpctx_dec->pdp_address[0]); + if (rv != OGS_OK) + return rv; + ogs_list_for_each(&sess->bearer_list, bearer) { pdpctx_dec->nsapi = bearer->ebi; /* 3GPP TS 23.401 5.2.1, TS 23.060 14.4 */ pdpctx_dec->sapi = 3; /* FIXME. Using 3 = default for now. Maybe use 0 = UNASSIGNED ?*/ From 4f7f4ec6e59119dc7d7e44baf9279423bd9ab653 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 14 May 2024 08:08:33 +0200 Subject: [PATCH 119/323] [AMF] Fix for storing 5G AKA Confirmation URL HTTP Location header field does not contain the "5g-aka-confirmation" substring. Which means that when we try to delete the authentication from AUSF, it fails. /nausf-auth/v1/ue-authentications/1 vs /nausf-auth/v1/ue-authentications/1/5g-aka-confirmation --- src/amf/nausf-handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amf/nausf-handler.c b/src/amf/nausf-handler.c index 0e4c94ef1a..9ce6cab1ba 100644 --- a/src/amf/nausf-handler.c +++ b/src/amf/nausf-handler.c @@ -133,7 +133,7 @@ int amf_nausf_auth_handle_authenticate( ogs_freeaddrinfo(addr); ogs_freeaddrinfo(addr6); - STORE_5G_AKA_CONFIRMATION(amf_ue, message->http.location); + STORE_5G_AKA_CONFIRMATION(amf_ue, LinksValueSchemeValue->href); ogs_ascii_to_hex(AV5G_AKA->rand, strlen(AV5G_AKA->rand), amf_ue->rand, sizeof(amf_ue->rand)); From 2a4d8db72eac25dcd29ed313e82dcc347cca7d43 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 25 May 2024 15:14:58 +0900 Subject: [PATCH 120/323] [MME] Prevent the Session stored in DB (#3220) Fixed to not change the session information stored in the DB when transferring context from GERAN to EUTRAN. Note that the Tracking Area Update Procedure differs from the Attach Procedure in 5.3.2 in the point at which HSS and ULR/ULA are performed. 3GPP TS 23.401 Ch 5.3.3 Tracking Area Update procedures <Attach Procedure> 1. Security-mode complete 2. Update Location Request/Answer 3. Create Session Request/Response <Tracking Area Update Procedure> 1. Security-mode complete 2. Create Session Request/Response 3. Update Location Request/Answer When TAU creates a Create Session Request message, there is no session type information in the Subscriber DB that is received from HSS in the Update Location. Therefore, TAU does not reflect the Session Type but creates PDN Type by reflecting the information in the Request Type as it is. --- lib/proto/types.h | 1 - src/mme/esm-build.c | 24 ++++++------ src/mme/esm-handler.c | 11 +++--- src/mme/mme-context.h | 5 ++- src/mme/mme-gn-build.c | 4 +- src/mme/mme-gn-handler.c | 16 +++----- src/mme/mme-s11-build.c | 82 +++++++++++++++++++++++++++------------ src/mme/mme-s11-handler.c | 7 ++-- src/smf/context.c | 14 +++---- src/smf/context.h | 3 ++ src/smf/gn-build.c | 2 +- src/smf/gsm-build.c | 8 ++-- src/smf/gx-handler.c | 4 +- src/smf/npcf-handler.c | 4 +- src/smf/s5c-build.c | 2 +- 15 files changed, 110 insertions(+), 77 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 380748853b..45d0dfde05 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -603,7 +603,6 @@ typedef struct ogs_session_s { ogs_qos_t qos; ogs_bitrate_t ambr; /* APN-AMBR */ - ogs_paa_t paa; ogs_ip_t ue_ip; char **ipv4_framed_routes; char **ipv6_framed_routes; diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index 7813c1a6de..fa8d9def06 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -168,31 +168,31 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( * included in the ACTIVATE DEFAULT EPS BEARER CONTEXT REQUEST message. */ - pdn_address->pdn_type = session->paa.session_type; - if (sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdn_address->pdn_type = sess->paa.session_type; + if (sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV4; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; - } else if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV6; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; } - } else if (sess->request_type.type == OGS_PDU_SESSION_TYPE_IPV4) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->ue_request_type.type == OGS_PDU_SESSION_TYPE_IPV4) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV6) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV6; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED; activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; } - } else if (sess->request_type.type == OGS_PDU_SESSION_TYPE_IPV6) { - if (session->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + } else if (sess->ue_request_type.type == OGS_PDU_SESSION_TYPE_IPV6) { + if (sess->paa.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdn_address->pdn_type = OGS_PDU_SESSION_TYPE_IPV4; activate_default_eps_bearer_context_request->esm_cause = OGS_NAS_ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED; @@ -202,18 +202,18 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( } if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4) { - pdn_address->addr = session->paa.addr; + pdn_address->addr = sess->paa.addr; pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV4_LEN; ogs_debug(" IPv4"); } else if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV6) { memcpy(pdn_address->addr6, - session->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV6_LEN; ogs_debug(" IPv6"); } else if (pdn_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - pdn_address->both.addr = session->paa.both.addr; + pdn_address->both.addr = sess->paa.both.addr; memcpy(pdn_address->both.addr6, - session->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdn_address->length = OGS_NAS_PDU_ADDRESS_IPV4V6_LEN; ogs_debug(" IPv4v6"); } else { diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index 100b33ec5d..e97914778d 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -57,7 +57,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, return OGS_ERROR; } - memcpy(&sess->request_type, &req->request_type, sizeof(sess->request_type)); + memcpy(&sess->ue_request_type, + &req->request_type, sizeof(sess->ue_request_type)); security_protected_required = 0; if (req->presencemask & @@ -89,10 +90,10 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { uint8_t derived_pdn_type = - (sess->session->session_type & sess->request_type.type); + (sess->session->session_type & sess->ue_request_type.type); if (derived_pdn_type == 0) { ogs_error("Cannot derived PDN Type [UE:%d,HSS:%d]", - sess->request_type.type, sess->session->session_type); + sess->ue_request_type.type, sess->session->session_type); r = nas_eps_send_pdn_connectivity_reject( sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE, create_action); @@ -215,10 +216,10 @@ int esm_handle_information_response(mme_sess_t *sess, sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || sess->session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { uint8_t derived_pdn_type = - (sess->session->session_type & sess->request_type.type); + (sess->session->session_type & sess->ue_request_type.type); if (derived_pdn_type == 0) { ogs_error("Cannot derived PDN Type [UE:%d,HSS:%d]", - sess->request_type.type, sess->session->session_type); + sess->ue_request_type.type, sess->session->session_type); r = nas_eps_send_pdn_connectivity_reject( sess, OGS_NAS_ESM_CAUSE_UNKNOWN_PDN_TYPE, OGS_GTP_CREATE_IN_ATTACH_REQUEST); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index dcfb8f1ae4..f9b63fe11b 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -750,7 +750,7 @@ typedef struct mme_sess_s { ogs_ip_t pgw_s5c_ip; /* PDN Connectivity Request */ - ogs_nas_request_type_t request_type; + ogs_nas_request_type_t ue_request_type; /* mme_bearer_first(sess) : Default Bearer Context */ ogs_list_t bearer_list; @@ -760,6 +760,9 @@ typedef struct mme_sess_s { ogs_session_t *session; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + /* Save Protocol Configuration Options from UE */ struct { uint8_t length; diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 8884ccbfbd..e9f3b9f885 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -157,14 +157,14 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ .receive_npdu_nr = 0, .ul_teic = sess->pgw_s5c_teid, .pdp_type_org = OGS_PDP_EUA_ORG_IETF, - .pdp_type_num = {sess->session->paa.session_type, }, + .pdp_type_num = {sess->paa.session_type, }, .ggsn_address_c = sess->pgw_s5c_ip, .trans_id = sess->pti, }; ogs_cpystrn(pdpctx_dec->apn, sess->session->name, sizeof(pdpctx_dec->apn)); - rv = ogs_paa_to_ip(&sess->session->paa, &pdpctx_dec->pdp_address[0]); + rv = ogs_paa_to_ip(&sess->paa, &pdpctx_dec->pdp_address[0]); if (rv != OGS_OK) return rv; diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index b9b6a60c10..ca8090847b 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -238,11 +238,6 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ } ogs_sess->smf_ip = gtp1_pdp_ctx->ggsn_address_c; ogs_sess->context_identifier = gtp1_pdp_ctx->pdp_ctx_id; - ogs_sess->session_type = gtp1_pdp_ctx->pdp_type_num[0]; - ogs_sess->ue_ip = gtp1_pdp_ctx->pdp_address[0]; - /* TODO: sess->paa with gtp1_pdp_ctx->pdp_address[0], - using/implementing ogs_gtp2_ip_to_paa ? */ - ogs_ip_to_paa(&ogs_sess->ue_ip, &ogs_sess->paa); /* 3GPP TS 23.060 section 9.2.1A: "The QoS profiles of the PDP context and EPS bearer are mapped as specified in TS 23.401" * 3GPP TS 23.401 Annex E: "Mapping between EPS and Release 99 QoS parameters" @@ -266,18 +261,19 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ sess->session = ogs_sess; sess->pgw_s5c_teid = gtp1_pdp_ctx->ul_teic; sess->pgw_s5c_ip = gtp1_pdp_ctx->ggsn_address_c; - switch (ogs_sess->session_type) { + ogs_ip_to_paa(&gtp1_pdp_ctx->pdp_address[0], &sess->paa); + switch (gtp1_pdp_ctx->pdp_type_num[0]) { case OGS_PDU_SESSION_TYPE_IPV4: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4; break; case OGS_PDU_SESSION_TYPE_IPV6: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV6; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV6; break; case OGS_PDU_SESSION_TYPE_IPV4V6: - sess->request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; + sess->ue_request_type.type = OGS_NAS_EPS_PDN_TYPE_IPV4V6; break; } - sess->request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + sess->ue_request_type.value = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; /* NSAPI = EBI: 3GPP TS 23.401 5.2.1, TS 23.060 14.4A */ bearer = mme_bearer_find_by_sess_ebi(sess, gtp1_pdp_ctx->nsapi); diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index 9b5b29fdfe..faf427f1ee 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -171,26 +171,58 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( req->selection_mode.u8 = OGS_GTP2_SELECTION_MODE_MS_OR_NETWORK_PROVIDED_APN; - ogs_debug("sess->request_type.type = %d", sess->request_type.type); + ogs_debug("sess->ue_request_type.type = %d", sess->ue_request_type.type); - ogs_assert(sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4 || - sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV6 || - sess->request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ogs_assert(sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4 || + sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV6 || + sess->ue_request_type.type == OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ogs_debug("create_action %d", create_action); ogs_debug("session->session_type = %d", session->session_type); - if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4 || - session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || - session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - req->pdn_type.u8 = (session->session_type & sess->request_type.type); - if (req->pdn_type.u8 == 0) { - ogs_fatal("Cannot derive PDN Type [UE:%d,HSS:%d]", - sess->request_type.type, session->session_type); - ogs_assert_if_reached(); - } + /* + * 3GPP TS 23.401 + * Ch 5.3.3 Tracking Area Update procedures + * + * The Tracking Area Update Procedure differs + * from the Attach Procedure in 5.3.2 + * in the point at which HSS and ULR/ULA are performed. + * + * <Attach Procedure> + * 1. Security-mode complete + * 2. Update Location Request/Answer + * 3. Create Session Request/Response + * + * <Tracking Area Update Procedure> + * 1. Security-mode complete + * 2. Create Session Request/Response + * 3. Update Location Request/Answer + * + * When TAU creates a Create Session Request message, + * there is no session type information in the Subscriber DB + * that is received from HSS in the Update Location. + * + * Therefore, as shown below, TAU does not reflect the Session Type + * but creates PDN Type by reflecting the information + * in the Request Type as it is. + */ + if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { + req->pdn_type.u8 = sess->ue_request_type.type; } else { - ogs_error("Invalid PDN-TYPE[%d]", session->session_type); - return NULL; + if (session->session_type == OGS_PDU_SESSION_TYPE_IPV4 || + session->session_type == OGS_PDU_SESSION_TYPE_IPV6 || + session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + req->pdn_type.u8 = + (session->session_type & sess->ue_request_type.type); + if (req->pdn_type.u8 == 0) { + ogs_fatal("Cannot derive PDN Type [UE:%d,HSS:%d]", + sess->ue_request_type.type, session->session_type); + ogs_assert_if_reached(); + } + } else { + ogs_error("Invalid PDN-TYPE[%d]", session->session_type); + return NULL; + } } req->pdn_type.presence = 1; @@ -207,29 +239,29 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) indication.dual_address_bearer_flag = 1; - if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) + if (sess->ue_request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) indication.handover_indication = 1; if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST || create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) indication.operation_indication = 1; - session->paa.session_type = req->pdn_type.u8; - ogs_debug("session->paa.session_type = %d", session->paa.session_type); - req->pdn_address_allocation.data = &session->paa; + sess->paa.session_type = req->pdn_type.u8; + ogs_debug("sess->paa.session_type = %d", sess->paa.session_type); + req->pdn_address_allocation.data = &sess->paa; if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4) { req->pdn_address_allocation.len = OGS_PAA_IPV4_LEN; - session->paa.addr = session->ue_ip.addr; + sess->paa.addr = session->ue_ip.addr; } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6) { req->pdn_address_allocation.len = OGS_PAA_IPV6_LEN; - memcpy(session->paa.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + memcpy(sess->paa.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); } else if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6) { req->pdn_address_allocation.len = OGS_PAA_IPV4V6_LEN; - session->paa.both.addr = session->ue_ip.addr; - memcpy(session->paa.both.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); + sess->paa.both.addr = session->ue_ip.addr; + memcpy(sess->paa.both.addr6, session->ue_ip.addr6, OGS_IPV6_LEN); } else { ogs_error("Invalid PDN-TYPE[%d:%d:%d]", req->pdn_type.u8, - session->session_type, sess->request_type.type); + session->session_type, sess->ue_request_type.type); return NULL; } req->pdn_address_allocation.presence = 1; @@ -419,7 +451,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( mme_sess_t *sess = bearer->sess; ogs_assert(sess); - if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) { + if (sess->ue_request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) { indication.handover_indication = 1; req->indication_flags.presence = 1; req->indication_flags.data = &indication; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 547915c0ac..30af5cc1dc 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -367,7 +367,7 @@ void mme_s11_handle_create_session_response( /* PDN Addresss Allocation */ if (rsp->pdn_address_allocation.presence) { - memcpy(&session->paa, rsp->pdn_address_allocation.data, + memcpy(&sess->paa, rsp->pdn_address_allocation.data, rsp->pdn_address_allocation.len); /* * Issue #3209 @@ -382,9 +382,8 @@ void mme_s11_handle_create_session_response( * Therefore, the code below will be deleted. */ #if 0 /* WILL BE DELETED */ - session->session_type = session->paa.session_type; - ogs_assert(OGS_OK == - ogs_paa_to_ip(&session->paa, &session->ue_ip)); + session->session_type = sess->paa.session_type; + ogs_assert(OGS_OK == ogs_paa_to_ip(&sess->paa, &session->ue_ip)); #endif } diff --git a/src/smf/context.c b/src/smf/context.c index f606c794fa..c758f5fc4b 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1563,7 +1563,7 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) } } - sess->session.paa.session_type = sess->session.session_type; + sess->paa.session_type = sess->session.session_type; ogs_assert(sess->session.session_type); if (sess->ipv4) { @@ -1584,7 +1584,7 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) ogs_error("ogs_pfcp_ue_ip_alloc() failed[%d]", cause_value); return cause_value; } - sess->session.paa.addr = sess->ipv4->addr[0]; + sess->paa.addr = sess->ipv4->addr[0]; ogs_hash_set(smf_self()->ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, sess); } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { @@ -1598,8 +1598,8 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->session.paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; - memcpy(sess->session.paa.addr6, sess->ipv6->addr, OGS_IPV6_LEN); + sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + memcpy(sess->paa.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv6_hash, sess->ipv6->addr, OGS_IPV6_DEFAULT_PREFIX_LEN >> 3, sess); } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { @@ -1626,9 +1626,9 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->session.paa.both.addr = sess->ipv4->addr[0]; - sess->session.paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; - memcpy(sess->session.paa.both.addr6, sess->ipv6->addr, OGS_IPV6_LEN); + sess->paa.both.addr = sess->ipv4->addr[0]; + sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + memcpy(sess->paa.both.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, sess); ogs_hash_set(smf_self()->ipv6_hash, diff --git a/src/smf/context.h b/src/smf/context.h index 87a84caeea..930e7d6327 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -349,6 +349,9 @@ typedef struct smf_sess_s { uint8_t ue_session_type; uint8_t ue_ssc_mode; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + /* DNN */ char *full_dnn; diff --git a/src/smf/gn-build.c b/src/smf/gn-build.c index ee073c2a6d..a6c12b01ae 100644 --- a/src/smf/gn-build.c +++ b/src/smf/gn-build.c @@ -191,7 +191,7 @@ ogs_pkbuf_t *smf_gn_build_create_pdp_context_response( rsp->charging_id.u32 = sess->charging.id; /* End User Address */ - rv = ogs_paa_to_ip(&sess->session.paa, &ip_eua); + rv = ogs_paa_to_ip(&sess->paa, &ip_eua); rv = ogs_gtp1_ip_to_eua(sess->session.session_type, &ip_eua, &eua, &eua_len); rsp->end_user_address.presence = 1; diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index b67a9ba4c0..05153a0d51 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -154,16 +154,16 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) pdu_address->pdn_type = sess->session.session_type; if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4) { - pdu_address->addr = sess->session.paa.addr; + pdu_address->addr = sess->paa.addr; pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV4_LEN; } else if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV6) { memcpy(pdu_address->addr6, - sess->session.paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV6_LEN; } else if (pdu_address->pdn_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - pdu_address->both.addr = sess->session.paa.both.addr; + pdu_address->both.addr = sess->paa.both.addr; memcpy(pdu_address->both.addr6, - sess->session.paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); + sess->paa.both.addr6+(OGS_IPV6_LEN>>1), OGS_IPV6_LEN>>1); pdu_address->length = OGS_NAS_PDU_ADDRESS_IPV4V6_LEN; } else { ogs_error("Unexpected PDN Type %u", pdu_address->pdn_type); diff --git a/src/smf/gx-handler.c b/src/smf/gx-handler.c index 65b5c9199f..e9b6d043e3 100644 --- a/src/smf/gx-handler.c +++ b/src/smf/gx-handler.c @@ -153,12 +153,12 @@ uint32_t smf_gx_handle_cca_initial_request( /* Set UE IP Address to the Default DL PDR */ ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); /* Set UE-to-CP Flow-Description and Outer-Header-Creation */ diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index b3ed198ace..63435aa88b 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -517,12 +517,12 @@ bool smf_npcf_smpolicycontrol_handle_create( /* Set UE IP Address to the Default DL PDR */ ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->session.paa, + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); if (sess->session.ipv4_framed_routes && diff --git a/src/smf/s5c-build.c b/src/smf/s5c-build.c index 84ce971261..0a9d834ae9 100644 --- a/src/smf/s5c-build.c +++ b/src/smf/s5c-build.c @@ -101,7 +101,7 @@ ogs_pkbuf_t *smf_s5c_build_create_session_response( len = len; /* PDN Address Allocation */ - rsp->pdn_address_allocation.data = &sess->session.paa; + rsp->pdn_address_allocation.data = &sess->paa; if (sess->ipv4 && sess->ipv6) rsp->pdn_address_allocation.len = OGS_PAA_IPV4V6_LEN; else if (sess->ipv4) From 7062b9c0d6d34d7fec53d180404667ff9ab75e1b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 26 May 2024 14:40:11 +0900 Subject: [PATCH 121/323] [AMF] Follow-up on Context transfer (#3052) --- lib/nas/5gs/types.c | 18 - lib/nas/5gs/types.h | 2 - lib/sbi/context.c | 4 +- lib/sbi/message.c | 37 +- lib/sbi/message.h | 5 +- lib/sbi/path.c | 20 +- src/amf/context.c | 15 +- src/amf/context.h | 2 + src/amf/gmm-handler.c | 325 +++++----------- src/amf/gmm-handler.h | 2 + src/amf/gmm-sm.c | 112 +++--- src/amf/namf-build.c | 18 +- src/amf/namf-handler.c | 665 +++++++++++++++++++++++---------- src/amf/nausf-build.c | 14 +- src/ausf/ausf-sm.c | 2 +- src/nrf/nnrf-handler.c | 6 +- src/scp/sbi-path.c | 3 + tests/registration/guti-test.c | 489 +++++++++++++++++++++++- 18 files changed, 1171 insertions(+), 568 deletions(-) diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index cf576a64c9..f8a049debc 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -1082,21 +1082,3 @@ int ogs_nas_parse_qos_rules( return (int)(rule-first); } - -bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti) -{ - if ((guti->amf_id.region !=0) && - (guti->amf_id.set2 !=0) && - (guti->m_tmsi != 0) && - ((guti->nas_plmn_id.mcc1) !=0 || - (guti->nas_plmn_id.mcc2) !=0 || - (guti->nas_plmn_id.mcc3) !=0) && - ((guti->nas_plmn_id.mnc1) !=0 || - (guti->nas_plmn_id.mnc2) !=0 || - (guti->nas_plmn_id.mnc3) !=0)) { - - return true; - } - - return false; -} diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index 8262f616b0..cc35611dbc 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -1192,8 +1192,6 @@ typedef struct ogs_nas_rsn_s { uint8_t value; } __attribute__ ((packed)) ogs_nas_rsn_t; -bool ogs_nas_5gs_guti_is_valid(ogs_nas_5gs_guti_t *guti); - #ifdef __cplusplus } #endif diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 9f3d3e8c24..12ab902340 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1983,9 +1983,9 @@ bool ogs_sbi_discovery_option_is_matched( switch (nf_info->nf_type) { case OpenAPI_nf_type_AMF: if (requester_nf_type == OpenAPI_nf_type_AMF && - discovery_option->target_guami && + discovery_option->guami_presence && ogs_sbi_check_amf_info_guami(&nf_info->amf, - discovery_option->target_guami) == false) + &discovery_option->guami) == false) return false; break; case OpenAPI_nf_type_SMF: diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 07f5ce3098..322ca594ba 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -394,16 +394,18 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID, discovery_option->requester_nf_instance_id); } - if (discovery_option->target_guami) { + if (discovery_option->guami_presence) { char *v = ogs_sbi_discovery_option_build_guami(discovery_option); if (v) { ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_GUAMI, v); ogs_free(v); } else { - ogs_warn("build failed: service-names[%d:%s]", - discovery_option->num_of_service_names, - discovery_option->service_names[0]); + ogs_error("build failed: guami[PLMN_ID:%06x,AMF_ID:%d]", + ogs_plmn_id_hexdump( + &discovery_option->guami.plmn_id), + ogs_amf_id_hexdump( + &discovery_option->guami.amf_id)); } } if (ogs_sbi_self()->discovery_config.no_service_names == false && @@ -2940,8 +2942,6 @@ void ogs_sbi_discovery_option_free( ogs_free(discovery_option->requester_nf_instance_id); if (discovery_option->dnn) ogs_free(discovery_option->dnn); - if (discovery_option->target_guami) - ogs_free(discovery_option->target_guami); for (i = 0; i < discovery_option->num_of_service_names; i++) ogs_free(discovery_option->service_names[i]); @@ -3182,6 +3182,18 @@ void ogs_sbi_discovery_option_parse_snssais( ogs_free(v); } +void ogs_sbi_discovery_option_set_guami( + ogs_sbi_discovery_option_t *discovery_option, ogs_guami_t *guami) +{ + ogs_assert(discovery_option); + ogs_assert(guami); + + ogs_assert(discovery_option->guami_presence == false); + + memcpy(&discovery_option->guami, guami, sizeof(ogs_guami_t)); + discovery_option->guami_presence = true; +} + char *ogs_sbi_discovery_option_build_guami( ogs_sbi_discovery_option_t *discovery_option) { @@ -3190,9 +3202,9 @@ char *ogs_sbi_discovery_option_build_guami( char *v = NULL; ogs_assert(discovery_option); - ogs_assert(discovery_option->target_guami); + ogs_assert(discovery_option->guami_presence); - Guami = ogs_sbi_build_guami(discovery_option->target_guami); + Guami = ogs_sbi_build_guami(&discovery_option->guami); ogs_assert(Guami); guamiItem = OpenAPI_guami_convertToJSON(Guami); ogs_assert(guamiItem); @@ -3231,12 +3243,9 @@ void ogs_sbi_discovery_option_parse_guami( Guami = OpenAPI_guami_parseFromJSON(guamItem); if (Guami) { - ogs_guami_t *ogs_guami = NULL; - - discovery_option->target_guami = ogs_malloc(sizeof(*ogs_guami)); - ogs_assert(discovery_option->target_guami); - - ogs_sbi_parse_guami(discovery_option->target_guami, Guami); + ogs_guami_t guami; + ogs_sbi_parse_guami(&guami, Guami); + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); OpenAPI_guami_free(Guami); } else { ogs_error("OpenAPI_guami_parseFromJSON() failed : guami[%s]", diff --git a/lib/sbi/message.h b/lib/sbi/message.h index 7f5cd91091..281066bab2 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -435,7 +435,8 @@ typedef struct ogs_sbi_discovery_option_s { bool tai_presence; ogs_5gs_tai_t tai; - ogs_guami_t *target_guami; + bool guami_presence; + ogs_guami_t guami; int num_of_target_plmn_list; ogs_plmn_id_t target_plmn_list[OGS_MAX_NUM_OF_PLMN]; @@ -649,6 +650,8 @@ char *ogs_sbi_discovery_option_build_snssais( void ogs_sbi_discovery_option_parse_snssais( ogs_sbi_discovery_option_t *discovery_option, char *snssais); +void ogs_sbi_discovery_option_set_guami( + ogs_sbi_discovery_option_t *discovery_option, ogs_guami_t *guami); char *ogs_sbi_discovery_option_build_guami( ogs_sbi_discovery_option_t *discovery_option); void ogs_sbi_discovery_option_parse_guami( diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 11462873e0..76ff33d3a5 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -284,9 +284,14 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) /* Target NF-Instance */ nf_instance = OGS_SBI_GET_NF_INSTANCE( sbi_object->service_type_array[service_type]); + ogs_debug("OGS_SBI_GET_NF_INSTANCE [nf_instance:%p,service_name:%s]", + nf_instance, ogs_sbi_service_type_to_name(service_type)); if (!nf_instance) { nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( target_nf_type, requester_nf_type, discovery_option); + ogs_debug("ogs_sbi_nf_instance_find_by_discovery_param() " + "[nf_instance:%p,service_name:%s]", + nf_instance, ogs_sbi_service_type_to_name(service_type)); if (nf_instance) OGS_SBI_SETUP_NF_INSTANCE( sbi_object->service_type_array[service_type], nf_instance); @@ -337,6 +342,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) apiroot = ogs_sbi_client_apiroot(client); ogs_assert(apiroot); + ogs_debug("apiroot [%s]", apiroot); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_TARGET_APIROOT, apiroot); @@ -355,6 +361,8 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) */ if (discovery_option && discovery_option->target_nf_instance_id) { + ogs_debug("target_nf_instance_id [%s]", + discovery_option->target_nf_instance_id); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_INSTANCE_ID, discovery_option->target_nf_instance_id); @@ -362,6 +370,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_INSTANCE_ID, nf_instance->id); + ogs_debug("nf_instance->id [%s]", nf_instance->id); } if (discovery_option && discovery_option->num_of_snssais) { @@ -373,6 +382,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("snssai [%s]", v); if (encoded) { /* @@ -399,6 +409,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) } if (discovery_option && discovery_option->dnn) { + ogs_debug("dnn [%s]", discovery_option->dnn); ogs_sbi_header_set(request->http.headers, OGS_SBI_CUSTOM_DISCOVERY_DNN, discovery_option->dnn); } @@ -408,9 +419,11 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) char *v = ogs_sbi_discovery_option_build_tai(discovery_option); ogs_expect(v); + if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("tai [%s]", v); if (encoded) { ogs_sbi_header_set(request->http.headers, @@ -429,7 +442,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) discovery_option->tai.tac.v); } - if (discovery_option && discovery_option->target_guami) { + if (discovery_option && discovery_option->guami_presence) { bool rc = false; char *v = ogs_sbi_discovery_option_build_guami(discovery_option); ogs_expect(v); @@ -437,6 +450,7 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) if (v) { char *encoded = ogs_sbi_url_encode(v); ogs_expect(encoded); + ogs_debug("guami [%s]", v); if (encoded) { ogs_sbi_header_set(request->http.headers, @@ -451,9 +465,9 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) if (rc == false) ogs_error("build failed: guami[PLMN_ID:%06x,AMF_ID:%x]", ogs_plmn_id_hexdump( - &discovery_option->target_guami->plmn_id), + &discovery_option->guami.plmn_id), ogs_amf_id_hexdump( - &discovery_option->target_guami->amf_id)); + &discovery_option->guami.amf_id)); } if (discovery_option && diff --git a/src/amf/context.c b/src/amf/context.c index c6ba6f3879..57a19aea34 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1980,31 +1980,26 @@ static bool amf_namf_comm_parse_guti(ogs_nas_5gs_guti_t *guti, char *ue_context_ short index = 8; /* start parsing guti after "5g-guti-" */ - strncpy(mcc_string, &ue_context_id[index], LENGTH_OF_MCC); - mcc_string[LENGTH_OF_MCC] = '\0'; + ogs_cpystrn(mcc_string, &ue_context_id[index], LENGTH_OF_MCC+1); index += LENGTH_OF_MCC; if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN - 1) { /* mnc is 2 characters long */ - mnc_string[MIN_LENGTH_OF_MNC] = '\0'; - strncpy(mnc_string, &ue_context_id[index], MIN_LENGTH_OF_MNC); + ogs_cpystrn(mnc_string, &ue_context_id[index], MIN_LENGTH_OF_MNC+1); index += MIN_LENGTH_OF_MNC; } else if (strlen(ue_context_id) == OGS_MAX_5G_GUTI_LEN) { /* mnc is 3 characters long */ - mnc_string[MAX_LENGTH_OF_MNC] = '\0'; - strncpy(mnc_string, &ue_context_id[index], MAX_LENGTH_OF_MNC); + ogs_cpystrn(mnc_string, &ue_context_id[index], MAX_LENGTH_OF_MNC+1); index += MAX_LENGTH_OF_MNC; } else { ogs_error("Invalid Ue context id"); return false; } - strncpy(amf_id_string, &ue_context_id[index], LENGTH_OF_AMF_ID); - amf_id_string[LENGTH_OF_AMF_ID] = '\0'; + ogs_cpystrn(amf_id_string, &ue_context_id[index], LENGTH_OF_AMF_ID+1); index += LENGTH_OF_AMF_ID; - strncpy(tmsi_string, &ue_context_id[index], LENGTH_OF_TMSI); - tmsi_string[LENGTH_OF_TMSI] = '\0'; + ogs_cpystrn(tmsi_string, &ue_context_id[index], LENGTH_OF_TMSI+1); memset(&Plmn_id, 0, sizeof(Plmn_id)); Plmn_id.mcc = mcc_string; diff --git a/src/amf/context.h b/src/amf/context.h index 4b3ab39e4a..b61fce88bf 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -268,6 +268,8 @@ struct amf_ue_s { ogs_nas_5gs_guti_t guti; } current, next; + ogs_nas_5gs_guti_t old_guti; + /* UE Info */ ogs_guami_t *guami; uint16_t gnb_ostream_id; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 790326edc9..d8a734c615 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -48,7 +48,6 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, ogs_nas_5gs_mobile_identity_suci_t *mobile_identity_suci = NULL; ogs_nas_5gs_mobile_identity_guti_t *mobile_identity_guti = NULL; ogs_nas_ue_security_capability_t *ue_security_capability = NULL; - ogs_nas_5gs_guti_t nas_guti; ogs_assert(amf_ue); ran_ue = ran_ue_cycle(amf_ue->ran_ue); @@ -139,6 +138,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + memset(&amf_ue->old_guti, 0, sizeof(ogs_nas_5gs_guti_t)); + switch (mobile_identity_header->type) { case OGS_NAS_5GS_MOBILE_IDENTITY_SUCI: mobile_identity_suci = @@ -180,11 +181,12 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, } ogs_nas_5gs_mobile_identity_guti_to_nas_guti( - mobile_identity_guti, &nas_guti); + mobile_identity_guti, &amf_ue->old_guti); ogs_info("[%s] 5G-S_GUTI[AMF_ID:0x%x,M_TMSI:0x%x]", AMF_UE_HAVE_SUCI(amf_ue) ? amf_ue->suci : "Unknown ID", - ogs_amf_id_hexdump(&nas_guti.amf_id), nas_guti.m_tmsi); + ogs_amf_id_hexdump(&amf_ue->old_guti.amf_id), + amf_ue->old_guti.m_tmsi); break; default: ogs_error("Unknown SUCI type [%d]", mobile_identity_header->type); @@ -540,6 +542,86 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update( return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } +bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, + ogs_nas_5gs_registration_request_t *registration_request) +{ + ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL; + ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL; + + int i; + ogs_plmn_id_t plmn_id; + + ogs_assert(amf_ue); + ogs_assert(registration_request); + mobile_identity = &registration_request->mobile_identity; + mobile_identity_header = + (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + + if (mobile_identity_header->type != OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) { + return false; + } + + /* + * TODO : FIXME + * + * Typically, UEs send 5G-GUTIs with all 0. In such cases, + * we need to prevent context transfer betwen AMFs by the N14 interface + * because they are not included in served_guami. + * + * We don't yet know how to check for 5G GUTI conformance, + * so we've implemented the following as a temporary solution. + */ + if ((amf_ue->old_guti.amf_id.region == 0 && + amf_ue->old_guti.amf_id.set2 == 0) && + (amf_ue->old_guti.nas_plmn_id.mcc1 == 0 && + amf_ue->old_guti.nas_plmn_id.mcc2 == 0 && + amf_ue->old_guti.nas_plmn_id.mcc3 == 0) && + (amf_ue->old_guti.nas_plmn_id.mnc1 == 0 && + amf_ue->old_guti.nas_plmn_id.mnc2 == 0 && + amf_ue->old_guti.nas_plmn_id.mnc3 == 0)) { + return false; + } + + /* + * TS 23.502 + * 4.2.2.2.2 General Registration + * (Without UDSF Deployment): If the UE's 5G-GUTI was included in the + * Registration Request and the serving AMF has changed since last + * Registration procedure, the new AMF may invoke the + * Namf_Communication_UEContextTransfer service operation on the + * old AMF including the complete Registration Request NAS message, + * which may be integrity protected, as well as the Access Type, + * to request the UE's SUPI and UE Context. See clause 5.2.2.2.2 + * for details of this service operation. + */ + ogs_nas_to_plmn_id(&plmn_id, &amf_ue->old_guti.nas_plmn_id); + + ogs_info("[%s] 5G-S_GUTI[PLMN_ID:0x%x,AMF_ID:0x%x,M_TMSI:0x%x]", + AMF_UE_HAVE_SUCI(amf_ue) ? amf_ue->suci : "Unknown ID", + ogs_plmn_id_hexdump(&plmn_id), + ogs_amf_id_hexdump(&amf_ue->old_guti.amf_id), + amf_ue->old_guti.m_tmsi); + + for (i = 0; i < amf_self()->num_of_served_guami; i++) { + if (memcmp(&amf_self()->served_guami[i].plmn_id, + &plmn_id, OGS_PLMN_ID_LEN) == 0 && + memcmp(&amf_self()->served_guami[i].amf_id, + &amf_ue->old_guti.amf_id, sizeof(ogs_amf_id_t)) == 0) { + return false; + } + } + + ogs_info("Serving AMF Changed [NumberOfServedGuami:%d]", + amf_self()->num_of_served_guami); + for (i = 0; i < amf_self()->num_of_served_guami; i++) { + ogs_info("Served Guami[PLMN_ID:0x%x,AMF_ID:0x%x]", + ogs_plmn_id_hexdump(&amf_self()->served_guami[i].plmn_id), + ogs_amf_id_hexdump(&amf_self()->served_guami[i].amf_id)); + } + + return true; +} + ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_service_request_t *service_request) @@ -1540,243 +1622,6 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( return gmm_cause; } -static ogs_nas_5gmm_capability_t - amf_namf_comm_base64_decode_5gmm_capability(char *encoded) -{ - ogs_nas_5gmm_capability_t gmm_capability; - char *gmm_capability_octets_string = NULL; - uint8_t gmm_capability_iei = 0; - - memset(&gmm_capability, 0, sizeof(gmm_capability)); - gmm_capability_octets_string = - (char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char)); - ogs_assert(gmm_capability_octets_string); - - int len = ogs_base64_decode(gmm_capability_octets_string, encoded); - - if (len == 0) - ogs_error("Gmm capability not decoded"); - - ogs_assert(sizeof(gmm_capability_octets_string) <= - sizeof(gmm_capability) + 1); - - gmm_capability_iei = // not copied anywhere for now - gmm_capability_octets_string[0]; - if (gmm_capability_iei != - OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) { - ogs_error("Type of 5GMM capability IEI is incorrect"); - } - memcpy(&gmm_capability, - gmm_capability_octets_string + 1, - sizeof(gmm_capability)); - if (gmm_capability_octets_string) { - ogs_free(gmm_capability_octets_string); - } - - return gmm_capability; -} - -static ogs_nas_ue_security_capability_t - amf_namf_comm_base64_decode_ue_security_capability(char *encoded) -{ - ogs_nas_ue_security_capability_t ue_security_capability; - char *ue_security_capability_octets_string = NULL; - uint8_t ue_security_capability_iei = 0; - - memset(&ue_security_capability, 0, sizeof(ue_security_capability)); - ue_security_capability_octets_string = - (char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char)); - ogs_assert(ue_security_capability_octets_string); - - ogs_base64_decode(ue_security_capability_octets_string, encoded); - - ogs_assert(sizeof(ue_security_capability_octets_string) <= - sizeof(ogs_nas_ue_security_capability_t) + 1); - - ue_security_capability_iei = // not copied anywhere for now - ue_security_capability_octets_string[0]; - if (ue_security_capability_iei != - OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) { - ogs_error("UE security capability IEI is incorrect"); - } - - memcpy(&ue_security_capability, ue_security_capability_octets_string + 1, - sizeof(ue_security_capability)); - - if (ue_security_capability_octets_string) { - ogs_free(ue_security_capability_octets_string); - } - - return ue_security_capability; -} - -static void amf_namf_comm_decode_ue_mm_context_list( - amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) { - - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_for_each(MmContextList, node) { - - OpenAPI_mm_context_t *MmContext = NULL; - OpenAPI_list_t *AllowedNssaiList = NULL; - OpenAPI_lnode_t *node1 = NULL; - OpenAPI_list_t *NssaiMappingList = NULL; - int num_of_s_nssai = 0; - int num_of_nssai_mapping = 0; - - MmContext = node->data; - - AllowedNssaiList = MmContext->allowed_nssai; - NssaiMappingList = MmContext->nssai_mapping_list; - - OpenAPI_list_for_each(AllowedNssaiList, node1) { - OpenAPI_snssai_t *AllowedNssai = node1->data; - - ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE); - - amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sst = - (uint8_t)AllowedNssai->sst; - amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sd = - ogs_s_nssai_sd_from_string(AllowedNssai->sd); - - num_of_s_nssai++; - amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai; - } - - OpenAPI_list_for_each(NssaiMappingList, node1) { - OpenAPI_nssai_mapping_t *NssaiMapping = node1->data; - OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai; - - ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE); - - amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. - mapped_hplmn_sst = HSnssai->sst; - amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. - mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd); - - num_of_nssai_mapping++; - } - - if (MmContext->ue_security_capability) { - amf_ue->ue_security_capability = - amf_namf_comm_base64_decode_ue_security_capability( - MmContext->ue_security_capability); - } - } -} - -static void amf_namf_comm_decode_ue_session_context_list( - amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList) -{ - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_for_each(SessionContextList, node) { - OpenAPI_pdu_session_context_t *PduSessionContext; - PduSessionContext = node->data; - amf_sess_t *sess = NULL; - - sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); - ogs_assert(sess); - - sess->sm_context.ref = PduSessionContext->sm_context_ref; - - if (PduSessionContext->s_nssai) { - memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); - - sess->s_nssai.sst = PduSessionContext->s_nssai->sst; - sess->s_nssai.sd = ogs_s_nssai_sd_from_string( - PduSessionContext->s_nssai->sd); - } - - if (PduSessionContext->dnn) - sess->dnn = ogs_strdup(PduSessionContext->dnn); - if (PduSessionContext->access_type) - amf_ue->nas.access_type = (int)PduSessionContext->access_type; - } -} - -int amf_namf_comm_handle_ue_context_transfer_response( - ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) -{ - OpenAPI_ue_context_t *UeContext = NULL; - -ogs_error("V funkciji amf_namf_comm_handle_ue_context_transfer_response"); - - if (!recvmsg->UeContextTransferRspData) { - ogs_error("No UeContextTransferRspData"); - return OGS_ERROR; - } - - if (!recvmsg->UeContextTransferRspData->ue_context) { - ogs_error("No UE context"); - return OGS_ERROR; - } - - UeContext = recvmsg->UeContextTransferRspData->ue_context; - - if (UeContext->supi) { - amf_ue_set_supi(amf_ue, UeContext->supi); - if (!UeContext->supi_unauth_ind){ - amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS; - } - } - - if (UeContext->pei) { - if (amf_ue->pei) - ogs_free(amf_ue->pei); - amf_ue->pei = ogs_strdup(UeContext->pei); - } - - if (UeContext->sub_ue_ambr) { - amf_ue->ue_ambr.downlink = - ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink); - amf_ue->ue_ambr.uplink = - ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink); - } - - if (UeContext->seaf_data) { - if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) { - amf_ue->nas.ue.tsc = - (UeContext->seaf_data->ng_ksi->tsc == OpenAPI_sc_type_NATIVE) ? 0 : 1; - amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi; - - ogs_ascii_to_hex( - UeContext->seaf_data->key_amf->key_val, - strlen(UeContext->seaf_data->key_amf->key_val), - amf_ue->kamf, - sizeof(amf_ue->kamf)); - } - } - - if (UeContext->_5g_mm_capability) { - ogs_nas_5gmm_capability_t gmm_capability; - - gmm_capability = amf_namf_comm_base64_decode_5gmm_capability( - UeContext->_5g_mm_capability); - amf_ue->gmm_capability.lte_positioning_protocol_capability = - (bool)gmm_capability.lte_positioning_protocol_capability; - amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach; - amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode; - } - - if (UeContext->pcf_id) { - /* TODO */ - } - - /* TODO UeContext->pcfAmPolicyUri */ - /* TODO UeContext->pcfUePolicyUri */ - - if (UeContext->mm_context_list) - amf_namf_comm_decode_ue_mm_context_list(amf_ue, UeContext->mm_context_list); - - if (UeContext->session_context_list) - amf_namf_comm_decode_ue_session_context_list(amf_ue, UeContext->session_context_list); - - /* TODO ueRadioCapability */ - - return OGS_OK; -} - static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id) { int i; diff --git a/src/amf/gmm-handler.h b/src/amf/gmm-handler.h index 3e735aa9e6..f750b86bd3 100644 --- a/src/amf/gmm-handler.h +++ b/src/amf/gmm-handler.h @@ -33,6 +33,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_handle_registration_update( ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request); +bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, + ogs_nas_5gs_registration_request_t *registration_request); ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 69e1f85e3a..3832d44a7e 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -67,7 +67,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_message_t *sbi_message = NULL; - int r, state = 0; + int r, state = 0, xact_count; ogs_assert(s); ogs_assert(e); @@ -298,7 +298,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) state == AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { - int xact_count = amf_sess_xact_count(amf_ue); + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && @@ -549,21 +549,31 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + r = OGS_ERROR; + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { - r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); - ogs_expect(r == OGS_OK); + r = amf_namf_comm_handle_ue_context_transfer_response( + sbi_message, amf_ue); + if (r != OGS_OK) { + ogs_error("failed to handle " + "UE_CONTEXT_TRANSFER response"); + } + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); } - int xact_count = amf_sess_xact_count(amf_ue); - - if (!AMF_UE_HAVE_SUCI(amf_ue)) { - CLEAR_AMF_UE_TIMER(amf_ue->t3570); - r = nas_5gs_send_identity_request(amf_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; + if (r != OGS_OK) { + if (!AMF_UE_HAVE_SUCI(amf_ue)) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } } + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); @@ -579,7 +589,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) } OGS_FSM_TRAN(s, &gmm_state_authentication); - break; DEFAULT @@ -1182,9 +1191,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; - ogs_nas_5gs_registration_request_t *registration_request = NULL; - ogs_nas_5gs_mobile_identity_header_t *mobile_identity_header = NULL; - ogs_nas_5gs_mobile_identity_t *mobile_identity = NULL; ogs_assert(e); @@ -1243,64 +1249,32 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; } - registration_request = &nas_message->gmm.registration_request; - mobile_identity = &registration_request->mobile_identity; - mobile_identity_header = - (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; + if (gmm_registration_request_from_old_amf(amf_ue, + &nas_message->gmm.registration_request) == true) { + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; - /* Check if registration is done with GUTI */ - if (mobile_identity_header && mobile_identity_header->type == - OGS_NAS_5GS_MOBILE_IDENTITY_GUTI && - ogs_nas_5gs_guti_is_valid(&amf_ue->current.guti)) { + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); - /* - * TS 23.502 - * 4.2.2.2.2 General Registration - * (Without UDSF Deployment): If the UE's 5G-GUTI was included in the - * Registration Request and the serving AMF has changed since last - * Registration procedure, the new AMF may invoke the - * Namf_Communication_UEContextTransfer service operation on the - * old AMF including the complete Registration Request NAS message, - * which may be integrity protected, as well as the Access Type, - * to request the UE's SUPI and UE Context. See clause 5.2.2.2.2 - * for details of this service operation. - */ - - int state = e->h.sbi.state; - bool serving_guami = false; - int i; - - /* Compare all serving guamis with guami from UE's GUTI */ - for (i = 0; i < amf_self()->num_of_served_guami; i++) { - if ((memcmp(&amf_self()->served_guami[i].amf_id, - &amf_ue->current.guti.amf_id, - sizeof(ogs_amf_id_t)) == 0) && - (memcmp(&amf_self()->served_guami[i].plmn_id, - &amf_ue->current.guti.nas_plmn_id, - OGS_PLMN_ID_LEN) == 0)) { - - serving_guami = true; - break; - } - } - if (!serving_guami) { - /* Guami from UE is not this AMF's serving guami - send UEContextTransfer */ - ogs_sbi_discovery_option_t *discovery_option = NULL; + /* Configure Home PLMN ID */ + ogs_nas_to_plmn_id( + &amf_ue->home_plmn_id, &amf_ue->old_guti.nas_plmn_id); - discovery_option = ogs_sbi_discovery_option_new(); - ogs_assert(discovery_option); + memcpy(&guami.plmn_id, &amf_ue->home_plmn_id, + sizeof(ogs_plmn_id_t)); + memcpy(&guami.amf_id, &amf_ue->old_guti.amf_id, + sizeof(ogs_amf_id_t)); - memcpy(discovery_option->target_guami, - amf_ue->guami, sizeof(ogs_guami_t)); + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); - int r = amf_ue_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, - amf_namf_comm_build_ue_context_transfer, - amf_ue, state, nas_message); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - } + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_ue_context_transfer, + amf_ue, state, nas_message); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; } if (!AMF_UE_HAVE_SUCI(amf_ue)) { diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c index 72d423de65..ca6c46c9d8 100644 --- a/src/amf/namf-build.c +++ b/src/amf/namf-build.c @@ -19,7 +19,7 @@ #include "namf-build.h" -static char* ogs_guti_to_string(amf_ue_t *amf_ue) +static char* ogs_guti_to_string(ogs_nas_5gs_guti_t *nas_guti) { ogs_plmn_id_t plmn_id; char plmn_id_buff[OGS_PLMNIDSTRLEN]; @@ -27,11 +27,13 @@ static char* ogs_guti_to_string(amf_ue_t *amf_ue) char *tmsi = NULL; char *guti = NULL; + ogs_assert(nas_guti); + memset(&plmn_id, 0, sizeof(plmn_id)); - ogs_nas_to_plmn_id(&plmn_id, &amf_ue->current.guti.nas_plmn_id); + ogs_nas_to_plmn_id(&plmn_id, &nas_guti->nas_plmn_id); - amf_id = ogs_amf_id_to_string(&amf_ue->current.guti.amf_id); - tmsi = ogs_uint32_to_0string(*(amf_ue->current.m_tmsi)); + amf_id = ogs_amf_id_to_string(&nas_guti->amf_id); + tmsi = ogs_uint32_to_0string(nas_guti->m_tmsi); guti = ogs_msprintf("5g-guti-%s%s%s", ogs_plmn_id_to_string(&plmn_id, plmn_id_buff), @@ -56,7 +58,7 @@ static char* amf_ue_to_context_id(amf_ue_t *amf_ue) if (amf_ue->supi) { ue_context_id = ogs_strdup(amf_ue->supi); } else { - ue_context_id = ogs_guti_to_string(amf_ue); + ue_context_id = ogs_guti_to_string(&amf_ue->old_guti); } return ue_context_id; @@ -83,11 +85,9 @@ ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NAMF_COMM; message.h.api.version = (char *)OGS_SBI_API_V1; - message.h.resource.component[0] = - (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; + message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; message.h.resource.component[1] = ue_context_id; - message.h.resource.component[2] = - (char *)OGS_SBI_RESOURCE_NAME_TRANSFER; + message.h.resource.component[2] = (char *)OGS_SBI_RESOURCE_NAME_TRANSFER; message.UeContextTransferReqData = &UeContextTransferReqData; request = ogs_sbi_build_request(&message); diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index c6d63ac46c..e31c313db8 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1078,6 +1078,286 @@ int amf_namf_callback_handle_sdm_data_change_notify( return OGS_OK; } +static char *amf_namf_comm_base64_encode_ue_security_capability( + ogs_nas_ue_security_capability_t ue_security_capability); +static char *amf_namf_comm_base64_encode_5gmm_capability(amf_ue_t *amf_ue); +static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list( + amf_ue_t *amf_ue); +static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list( + amf_ue_t *amf_ue); + +int amf_namf_comm_handle_ue_context_transfer_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + ogs_sbi_response_t *response = NULL; + ogs_sbi_message_t sendmsg; + amf_ue_t *amf_ue = NULL; + + OpenAPI_ambr_t *UeAmbr = NULL; + OpenAPI_list_t *MmContextList = NULL; + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *SessionContextList = NULL; + OpenAPI_pdu_session_context_t *PduSessionContext = NULL; + OpenAPI_lnode_t *node = NULL; + OpenAPI_ue_context_t UeContext; + OpenAPI_seaf_data_t SeafData; + OpenAPI_ng_ksi_t Ng_ksi; + OpenAPI_key_amf_t Key_amf; + OpenAPI_sc_type_e Tsc_type; + + OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + + ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; + + char *ue_context_id = NULL; + char *encoded_gmm_capability = NULL; + int status = OGS_SBI_HTTP_STATUS_OK; + char hxkamf_string[OGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE)]; + char *strerror = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData)); + memset(&UeContext, 0, sizeof(UeContext)); + UeContextTransferRspData.ue_context = &UeContext; + + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.UeContextTransferRspData = &UeContextTransferRspData; + + ue_context_id = recvmsg->h.resource.component[1]; + if (!ue_context_id) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("No UE context ID"); + goto cleanup; + } + + amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + if (!amf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); + goto cleanup; + } + + if (amf_ue->supi) { + UeContext.supi = amf_ue->supi; + if (amf_ue->auth_result != + OpenAPI_auth_result_AUTHENTICATION_SUCCESS) { + UeContext.is_supi_unauth_ind = true; + UeContext.supi_unauth_ind = amf_ue->auth_result; + } + } + + /* TODO UeContext.gpsi_list */ + + if (amf_ue->pei) { + UeContext.pei = amf_ue->pei; + } + + if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) { + UeAmbr = ogs_calloc(1, sizeof(*UeAmbr)); + ogs_assert(UeAmbr); + + if (amf_ue->ue_ambr.uplink > 0) + UeAmbr->uplink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS); + if (amf_ue->ue_ambr.downlink > 0) + UeAmbr->downlink = ogs_sbi_bitrate_to_string( + amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS); + UeContext.sub_ue_ambr = UeAmbr; + } + + if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) { + memset(&SeafData, 0, sizeof(SeafData)); + Tsc_type = (amf_ue->nas.ue.tsc == 0) ? + OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED; + + memset(&Ng_ksi, 0, sizeof(Ng_ksi)); + SeafData.ng_ksi = &Ng_ksi; + Ng_ksi.tsc = Tsc_type; + Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi; + + memset(&Key_amf, 0, sizeof(Key_amf)); + SeafData.key_amf = &Key_amf; + OpenAPI_key_amf_type_e temp_key_type = + (OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF; + Key_amf.key_type = temp_key_type; + ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf), + hxkamf_string, sizeof(hxkamf_string)); + Key_amf.key_val = hxkamf_string; + UeContext.seaf_data = &SeafData; + } + + encoded_gmm_capability = + amf_namf_comm_base64_encode_5gmm_capability(amf_ue); + UeContext._5g_mm_capability = encoded_gmm_capability; + + pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( + amf_ue->sbi.service_type_array[ + OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL]); + if (pcf_nf_instance) { + UeContext.pcf_id = pcf_nf_instance->id; + } else { + ogs_warn("No PCF NF Instnace"); + } + + /* TODO UeContext.pcfAmPolicyUri */ + /* TODO UeContext.pcfUePolicyUri */ + + MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue); + UeContext.mm_context_list = MmContextList; + + if (recvmsg->UeContextTransferReqData->reason == + OpenAPI_transfer_reason_MOBI_REG) { + SessionContextList = + amf_namf_comm_encode_ue_session_context_list(amf_ue); + UeContext.session_context_list = SessionContextList; + } + + /* TODO ueRadioCapability */ + + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + if (encoded_gmm_capability) + ogs_free(encoded_gmm_capability); + + if (UeAmbr) + OpenAPI_ambr_free(UeAmbr); + + if (SessionContextList) { + OpenAPI_list_for_each(SessionContextList, node) { + PduSessionContext = node->data; + OpenAPI_pdu_session_context_free(PduSessionContext); + } + OpenAPI_list_free(SessionContextList); + } + + if (MmContextList) { + OpenAPI_list_for_each(MmContextList, node) { + MmContext = node->data; + OpenAPI_mm_context_free(MmContext); + } + OpenAPI_list_free(MmContextList); + } + + /* + * Context TRANSFERRED !!! + * So, we removed UE context. + */ + if (amf_ue->ran_ue) + ran_ue_remove(amf_ue->ran_ue); + amf_ue_remove(amf_ue); + + return OGS_OK; + +cleanup: + ogs_assert(strerror); + ogs_error("%s", strerror); + + ogs_assert(true == + ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); + ogs_free(strerror); + + return OGS_ERROR; +} + +static ogs_nas_5gmm_capability_t + amf_namf_comm_base64_decode_5gmm_capability(char *encoded); +static ogs_nas_ue_security_capability_t + amf_namf_comm_base64_decode_ue_security_capability(char *encoded); +static void amf_namf_comm_decode_ue_mm_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList); +static void amf_namf_comm_decode_ue_session_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList); + +int amf_namf_comm_handle_ue_context_transfer_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) +{ + OpenAPI_ue_context_t *UeContext = NULL; + + if (!recvmsg->UeContextTransferRspData) { + ogs_error("No UeContextTransferRspData"); + return OGS_ERROR; + } + + if (!recvmsg->UeContextTransferRspData->ue_context) { + ogs_error("No UE context"); + return OGS_ERROR; + } + + UeContext = recvmsg->UeContextTransferRspData->ue_context; + + if (!UeContext->supi) { + ogs_error("No SUPI"); + return OGS_ERROR; + } + + amf_ue_set_supi(amf_ue, UeContext->supi); + if (!UeContext->supi_unauth_ind){ + amf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS; + } + + if (UeContext->pei) { + if (amf_ue->pei) + ogs_free(amf_ue->pei); + amf_ue->pei = ogs_strdup(UeContext->pei); + } + + if (UeContext->sub_ue_ambr) { + amf_ue->ue_ambr.downlink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->downlink); + amf_ue->ue_ambr.uplink = + ogs_sbi_bitrate_from_string(UeContext->sub_ue_ambr->uplink); + } + + if (UeContext->seaf_data) { + if (UeContext->seaf_data->ng_ksi->tsc != OpenAPI_sc_type_NULL) { + amf_ue->nas.ue.tsc = + (UeContext->seaf_data->ng_ksi->tsc == + OpenAPI_sc_type_NATIVE) ? 0 : 1; + amf_ue->nas.ue.ksi = (uint8_t)UeContext->seaf_data->ng_ksi->ksi; + + ogs_ascii_to_hex( + UeContext->seaf_data->key_amf->key_val, + strlen(UeContext->seaf_data->key_amf->key_val), + amf_ue->kamf, + sizeof(amf_ue->kamf)); + } + } + + if (UeContext->_5g_mm_capability) { + ogs_nas_5gmm_capability_t gmm_capability; + + gmm_capability = amf_namf_comm_base64_decode_5gmm_capability( + UeContext->_5g_mm_capability); + amf_ue->gmm_capability.lte_positioning_protocol_capability = + (bool)gmm_capability.lte_positioning_protocol_capability; + amf_ue->gmm_capability.ho_attach = (bool)gmm_capability.ho_attach; + amf_ue->gmm_capability.s1_mode = (bool)gmm_capability.s1_mode; + } + + if (UeContext->pcf_id) { + /* TODO */ + } + + /* TODO UeContext->pcfAmPolicyUri */ + /* TODO UeContext->pcfUePolicyUri */ + + if (UeContext->mm_context_list) + amf_namf_comm_decode_ue_mm_context_list( + amf_ue, UeContext->mm_context_list); + + if (UeContext->session_context_list) + amf_namf_comm_decode_ue_session_context_list( + amf_ue, UeContext->session_context_list); + + /* TODO ueRadioCapability */ + + return OGS_OK; +} + static char *amf_namf_comm_base64_encode_ue_security_capability( ogs_nas_ue_security_capability_t ue_security_capability) { @@ -1088,24 +1368,23 @@ static char *amf_namf_comm_base64_encode_ue_security_capability( ue_security_capability.length + sizeof(ue_security_capability.length) + sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE); - /* Security guarantee */ - num_of_octets = ogs_min( - num_of_octets, sizeof(ue_security_capability) + 1); /* - * size [sizeof(ue_security_capability) + 1] is a sum of lengths: - * ue_security_capability (9 octets) + - * type (1 octet) - */ + * size [sizeof(ue_security_capability) + 1] is a sum of lengths: + * ue_security_capability (9 octets) + + * type (1 octet) + */ char security_octets_string[sizeof(ue_security_capability) + 1]; + /* Security guarantee */ + num_of_octets = ogs_min( + num_of_octets, sizeof(ue_security_capability) + 1); enc_len = ogs_base64_encode_len(num_of_octets); - enc = ogs_malloc(enc_len); + enc = ogs_calloc(1, enc_len); ogs_assert(enc); - memset(enc, 0, sizeof(*enc)); - security_octets_string[0] = - (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE; + security_octets_string[0] = (uint8_t) + OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE; memcpy(security_octets_string + 1, &ue_security_capability, num_of_octets); ogs_base64_encode(enc , security_octets_string, num_of_octets); @@ -1127,32 +1406,36 @@ static char *amf_namf_comm_base64_encode_5gmm_capability(amf_ue_t *amf_ue) nas_gmm_capability.ho_attach = amf_ue->gmm_capability.ho_attach; nas_gmm_capability.s1_mode = amf_ue->gmm_capability.s1_mode; - uint8_t num_of_octets = + uint8_t num_of_octets; + + char gmm_capability_octets_string[sizeof(ogs_nas_5gmm_capability_t) + 1]; + + num_of_octets = nas_gmm_capability.length + sizeof(nas_gmm_capability.length) + - sizeof((uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); + sizeof((uint8_t) + OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); /* Security guarantee. + 1 stands for 5GMM capability IEI */ num_of_octets = ogs_min( num_of_octets, sizeof(ogs_nas_5gmm_capability_t) + 1); - char gmm_capability_octets_string[sizeof(ogs_nas_5gmm_capability_t) + 1]; - enc_len = ogs_base64_encode_len(num_of_octets); - enc = ogs_malloc(enc_len); + enc = ogs_calloc(1, enc_len); ogs_assert(enc); - memset(enc, 0, sizeof(*enc)); /* Fill the bytes of data */ gmm_capability_octets_string[0] = (uint8_t)OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE; - memcpy(gmm_capability_octets_string + 1, &nas_gmm_capability, num_of_octets); + memcpy(gmm_capability_octets_string + 1, + &nas_gmm_capability, num_of_octets); ogs_base64_encode(enc, gmm_capability_octets_string, num_of_octets); return enc; } -static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *amf_ue) +static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list( + amf_ue_t *amf_ue) { ogs_assert(amf_ue); @@ -1172,14 +1455,18 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_session_context_list(amf_ue_t *am ogs_assert(sNSSAI); PduSessionContext->pdu_session_id = sess->psi; - PduSessionContext->sm_context_ref = sess->sm_context.ref; + ogs_assert(sess->sm_context.resource_uri); + PduSessionContext->sm_context_ref = + ogs_strdup(sess->sm_context.resource_uri); sNSSAI->sst = sess->s_nssai.sst; sNSSAI->sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); PduSessionContext->s_nssai = sNSSAI; - PduSessionContext->dnn = sess->dnn; - PduSessionContext->access_type = (OpenAPI_access_type_e)amf_ue->nas.access_type; + ogs_assert(sess->dnn); + PduSessionContext->dnn = ogs_strdup(sess->dnn); + PduSessionContext->access_type = + (OpenAPI_access_type_e)amf_ue->nas.access_type; OpenAPI_list_add(PduSessionList, PduSessionContext); } @@ -1196,7 +1483,6 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) ogs_assert(amf_ue); - MmContextList = OpenAPI_list_create(); ogs_assert(MmContextList); @@ -1241,7 +1527,6 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) if (amf_ue->allowed_nssai.num_of_s_nssai) { OpenAPI_list_t *AllowedNssaiList; - OpenAPI_list_t *NssaiMappingList; /* This IE shall be present if the source AMF and the target AMF are * in the same PLMN and if available. When present, this IE shall @@ -1249,14 +1534,7 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) */ AllowedNssaiList = OpenAPI_list_create(); - /* This IE shall be present if the source AMF and the target AMF are - * in the same PLMN and if available. When present, this IE shall - * contain the mapping of the allowed NSSAI for the UE. - */ - NssaiMappingList = OpenAPI_list_create(); - ogs_assert(AllowedNssaiList); - ogs_assert(NssaiMappingList); for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { OpenAPI_snssai_t *AllowedNssai; @@ -1271,40 +1549,7 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) OpenAPI_list_add(AllowedNssaiList, AllowedNssai); } - for (i = 0; i < amf_ue->allowed_nssai.num_of_s_nssai; i++) { - OpenAPI_nssai_mapping_t *NssaiMapping; - OpenAPI_snssai_t *HSnssai; - OpenAPI_snssai_t *MappedSnssai; - - NssaiMapping = ogs_calloc(1, sizeof(*NssaiMapping)); - ogs_assert(NssaiMapping); - - /* Indicates the S-NSSAI in home PLMN */ - HSnssai = ogs_calloc(1, sizeof(*HSnssai)); - ogs_assert(HSnssai); - - HSnssai->sst = - amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sst; - HSnssai->sd = - ogs_s_nssai_sd_to_string( - amf_ue->allowed_nssai.s_nssai[i].mapped_hplmn_sd); - NssaiMapping->h_snssai = HSnssai; - - /* Indicates the mapped S-NSSAI in the serving PLMN */ - MappedSnssai = ogs_calloc(1, sizeof(*MappedSnssai)); - ogs_assert(MappedSnssai); - - /* MappedSnssai must be defined, else - "nssaiMappingList" will not convert to json*/ - MappedSnssai->sst = 0; - MappedSnssai->sd = ogs_strdup(""); - NssaiMapping->mapped_snssai = MappedSnssai; - - OpenAPI_list_add(NssaiMappingList, NssaiMapping); - } - MmContext->allowed_nssai = AllowedNssaiList; - MmContext->nssai_mapping_list = NssaiMappingList; } OpenAPI_list_add(MmContextList, MmContext); @@ -1312,169 +1557,205 @@ static OpenAPI_list_t *amf_namf_comm_encode_ue_mm_context_list(amf_ue_t *amf_ue) return MmContextList; } -int amf_namf_comm_handle_ue_context_transfer_request( - ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +static ogs_nas_5gmm_capability_t + amf_namf_comm_base64_decode_5gmm_capability(char *encoded) { - ogs_sbi_response_t *response = NULL; - ogs_sbi_message_t sendmsg; - amf_ue_t *amf_ue = NULL; + ogs_nas_5gmm_capability_t gmm_capability; + char *gmm_capability_octets_string = NULL; + uint8_t gmm_capability_iei = 0; + int len; - OpenAPI_ambr_t *UeAmbr = NULL; - OpenAPI_list_t *MmContextList = NULL; - OpenAPI_mm_context_t *MmContext = NULL; - OpenAPI_list_t *SessionContextList = NULL; - OpenAPI_pdu_session_context_t *PduSessionContext = NULL; - OpenAPI_lnode_t *node = NULL; - OpenAPI_ue_context_t UeContext; - OpenAPI_seaf_data_t SeafData; - OpenAPI_ng_ksi_t Ng_ksi; - OpenAPI_key_amf_t Key_amf; - OpenAPI_sc_type_e Tsc_type; + memset(&gmm_capability, 0, sizeof(gmm_capability)); + gmm_capability_octets_string = + (char*) ogs_calloc(sizeof(gmm_capability) + 1, sizeof(char)); + ogs_assert(gmm_capability_octets_string); - OpenAPI_ue_context_transfer_rsp_data_t UeContextTransferRspData; + len = ogs_base64_decode(gmm_capability_octets_string, encoded); - ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; + if (len == 0) + ogs_error("Gmm capability not decoded"); - char *ue_context_id = NULL; - char *encoded_gmm_capability = NULL; - int status = OGS_SBI_HTTP_STATUS_OK; - char hxkamf_string[OGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE)]; - char *strerror = NULL; + ogs_assert(sizeof(gmm_capability_octets_string) <= + sizeof(gmm_capability) + 1); - ogs_assert(stream); - ogs_assert(recvmsg); + gmm_capability_iei = // not copied anywhere for now + gmm_capability_octets_string[0]; + if (gmm_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE) { + ogs_error("Type of 5GMM capability IEI is incorrect"); + } + memcpy(&gmm_capability, + gmm_capability_octets_string + 1, + sizeof(gmm_capability)); + if (gmm_capability_octets_string) { + ogs_free(gmm_capability_octets_string); + } - memset(&UeContextTransferRspData, 0, sizeof(UeContextTransferRspData)); - memset(&UeContext, 0, sizeof(UeContext)); - UeContextTransferRspData.ue_context = &UeContext; + return gmm_capability; +} - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.UeContextTransferRspData = &UeContextTransferRspData; +static ogs_nas_ue_security_capability_t + amf_namf_comm_base64_decode_ue_security_capability(char *encoded) +{ + ogs_nas_ue_security_capability_t ue_security_capability; + char *ue_security_capability_octets_string = NULL; + uint8_t ue_security_capability_iei = 0; - ue_context_id = recvmsg->h.resource.component[1]; - if (!ue_context_id) { - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - strerror = ogs_msprintf("No UE context ID"); - goto cleanup; - } + memset(&ue_security_capability, 0, sizeof(ue_security_capability)); + ue_security_capability_octets_string = + (char*) ogs_calloc(sizeof(ue_security_capability), sizeof(char)); + ogs_assert(ue_security_capability_octets_string); - amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); - if (!amf_ue) { - status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); - goto cleanup; - } + ogs_base64_decode(ue_security_capability_octets_string, encoded); - if (amf_ue->supi) { - UeContext.supi = amf_ue->supi; - if (amf_ue->auth_result != - OpenAPI_auth_result_AUTHENTICATION_SUCCESS) { - UeContext.is_supi_unauth_ind = true; - UeContext.supi_unauth_ind = amf_ue->auth_result; - } + ogs_assert(sizeof(ue_security_capability_octets_string) <= + sizeof(ogs_nas_ue_security_capability_t) + 1); + + ue_security_capability_iei = // not copied anywhere for now + ue_security_capability_octets_string[0]; + if (ue_security_capability_iei != + OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE) { + ogs_error("UE security capability IEI is incorrect"); } - /* TODO UeContext.gpsi_list */ + memcpy(&ue_security_capability, ue_security_capability_octets_string + 1, + sizeof(ue_security_capability)); - if (amf_ue->pei) { - UeContext.pei = amf_ue->pei; + if (ue_security_capability_octets_string) { + ogs_free(ue_security_capability_octets_string); } - if ((amf_ue->ue_ambr.uplink > 0) || (amf_ue->ue_ambr.downlink > 0)) { - UeAmbr = ogs_malloc(sizeof(*UeAmbr)); - ogs_assert(UeAmbr); - memset(UeAmbr, 0, sizeof(*UeAmbr)); + return ue_security_capability; +} - if (amf_ue->ue_ambr.uplink > 0) - UeAmbr->uplink = ogs_sbi_bitrate_to_string( - amf_ue->ue_ambr.uplink, OGS_SBI_BITRATE_KBPS); - if (amf_ue->ue_ambr.downlink > 0) - UeAmbr->downlink = ogs_sbi_bitrate_to_string( - amf_ue->ue_ambr.downlink, OGS_SBI_BITRATE_KBPS); - UeContext.sub_ue_ambr = UeAmbr; - } +static void amf_namf_comm_decode_ue_mm_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *MmContextList) { - if ((amf_ue->nas.ue.ksi != 0) && (amf_ue->nas.ue.tsc != 0)) { - memset(&SeafData, 0, sizeof(SeafData)); - Tsc_type = (amf_ue->nas.ue.tsc == 0) ? - OpenAPI_sc_type_NATIVE : OpenAPI_sc_type_MAPPED; + OpenAPI_lnode_t *node = NULL; - memset(&Ng_ksi, 0, sizeof(Ng_ksi)); - SeafData.ng_ksi = &Ng_ksi; - Ng_ksi.tsc = Tsc_type; - Ng_ksi.ksi = (int)amf_ue->nas.ue.ksi; + OpenAPI_list_for_each(MmContextList, node) { - memset(&Key_amf, 0, sizeof(Key_amf)); - SeafData.key_amf = &Key_amf; - OpenAPI_key_amf_type_e temp_key_type = - (OpenAPI_key_amf_type_e)OpenAPI_key_amf_type_KAMF; - Key_amf.key_type = temp_key_type; - ogs_hex_to_ascii(amf_ue->kamf, sizeof(amf_ue->kamf), - hxkamf_string, sizeof(hxkamf_string)); - Key_amf.key_val = hxkamf_string; - UeContext.seaf_data = &SeafData; - } + OpenAPI_mm_context_t *MmContext = NULL; + OpenAPI_list_t *AllowedNssaiList = NULL; + OpenAPI_lnode_t *node1 = NULL; + OpenAPI_list_t *NssaiMappingList = NULL; + int num_of_s_nssai = 0; + int num_of_nssai_mapping = 0; - encoded_gmm_capability = amf_namf_comm_base64_encode_5gmm_capability(amf_ue); - UeContext._5g_mm_capability = encoded_gmm_capability; + MmContext = node->data; - pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( - amf_ue->sbi.service_type_array[ - OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL]); - if (pcf_nf_instance) { - UeContext.pcf_id = pcf_nf_instance->id; - } else { - ogs_warn("No PCF NF Instnace"); - } + AllowedNssaiList = MmContext->allowed_nssai; + NssaiMappingList = MmContext->nssai_mapping_list; - /* TODO UeContext.pcfAmPolicyUri */ - /* TODO UeContext.pcfUePolicyUri */ + OpenAPI_list_for_each(AllowedNssaiList, node1) { + OpenAPI_snssai_t *AllowedNssai = node1->data; - MmContextList = amf_namf_comm_encode_ue_mm_context_list(amf_ue); - UeContext.mm_context_list = MmContextList; + ogs_assert(num_of_s_nssai < OGS_MAX_NUM_OF_SLICE); - if (recvmsg->UeContextTransferReqData->reason == - OpenAPI_transfer_reason_MOBI_REG) { - SessionContextList = amf_namf_comm_encode_ue_session_context_list(amf_ue); - UeContext.session_context_list = SessionContextList; - } + amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sst = + (uint8_t)AllowedNssai->sst; + amf_ue->allowed_nssai.s_nssai[num_of_s_nssai].sd = + ogs_s_nssai_sd_from_string(AllowedNssai->sd); - /* TODO ueRadioCapability */ + num_of_s_nssai++; + amf_ue->allowed_nssai.num_of_s_nssai = num_of_s_nssai; + } - response = ogs_sbi_build_response(&sendmsg, status); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + OpenAPI_list_for_each(NssaiMappingList, node1) { + OpenAPI_nssai_mapping_t *NssaiMapping = node1->data; + OpenAPI_snssai_t *HSnssai = NssaiMapping->h_snssai; - if (encoded_gmm_capability) - ogs_free(encoded_gmm_capability); - if (UeAmbr) - OpenAPI_ambr_free(UeAmbr); + ogs_assert(num_of_nssai_mapping < OGS_MAX_NUM_OF_SLICE); - if (SessionContextList) { - OpenAPI_list_for_each(SessionContextList, node) { - PduSessionContext = node->data; - OpenAPI_pdu_session_context_free(PduSessionContext); + amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. + mapped_hplmn_sst = HSnssai->sst; + amf_ue->allowed_nssai.s_nssai[num_of_nssai_mapping]. + mapped_hplmn_sd = ogs_s_nssai_sd_from_string(HSnssai->sd); + + num_of_nssai_mapping++; } - OpenAPI_list_free(SessionContextList); - } - if (MmContextList) { - OpenAPI_list_for_each(MmContextList, node) { - MmContext = node->data; - OpenAPI_mm_context_free(MmContext); + if (MmContext->ue_security_capability) { + amf_ue->ue_security_capability = + amf_namf_comm_base64_decode_ue_security_capability( + MmContext->ue_security_capability); } - OpenAPI_list_free(MmContextList); } +} - return OGS_OK; +static void amf_namf_comm_decode_ue_session_context_list( + amf_ue_t *amf_ue, OpenAPI_list_t *SessionContextList) +{ + OpenAPI_lnode_t *node = NULL; -cleanup: - ogs_assert(strerror); - ogs_error("%s", strerror); + OpenAPI_list_for_each(SessionContextList, node) { + OpenAPI_pdu_session_context_t *PduSessionContext; + PduSessionContext = node->data; + amf_sess_t *sess = NULL; - ogs_assert(true == - ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); - ogs_free(strerror); + int rv; + ogs_sbi_message_t message; + ogs_sbi_header_t header; - return OGS_ERROR; + if (!PduSessionContext->sm_context_ref) { + ogs_error("No smContextRef [PSI:%d]", + PduSessionContext->pdu_session_id); + continue; + } + + if (!PduSessionContext->s_nssai) { + ogs_error("No sNSSI [PSI:%d]", PduSessionContext->pdu_session_id); + continue; + } + + if (!PduSessionContext->dnn) { + ogs_error("No DNN [PSI:%d]", PduSessionContext->pdu_session_id); + continue; + } + + if (!PduSessionContext->access_type) { + ogs_error("No accessType [PSI:%d]", + PduSessionContext->pdu_session_id); + continue; + } + + memset(&header, 0, sizeof(header)); + header.uri = PduSessionContext->sm_context_ref; + + rv = ogs_sbi_parse_header(&message, &header); + if (rv != OGS_OK) { + ogs_error("[%d] Cannot parse sm_context_ref [%s]", + PduSessionContext->pdu_session_id, + PduSessionContext->sm_context_ref); + continue; + } + + if (!message.h.resource.component[1]) { + ogs_error("[%d] No SmContextRef [%s]", + PduSessionContext->pdu_session_id, + PduSessionContext->sm_context_ref); + + ogs_sbi_header_free(&header); + continue; + } + + sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); + ogs_assert(sess); + + sess->sm_context.resource_uri = + ogs_strdup(PduSessionContext->sm_context_ref); + sess->sm_context.ref = + ogs_strdup(message.h.resource.component[1]); + + memset(&sess->s_nssai, 0, sizeof(sess->s_nssai)); + + sess->s_nssai.sst = PduSessionContext->s_nssai->sst; + sess->s_nssai.sd = ogs_s_nssai_sd_from_string( + PduSessionContext->s_nssai->sd); + + sess->dnn = ogs_strdup(PduSessionContext->dnn); + amf_ue->nas.access_type = (int)PduSessionContext->access_type; + + ogs_sbi_header_free(&header); + } } diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index f3d69bf17e..5330744bc9 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -46,8 +46,18 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate( memset(&AuthenticationInfo, 0, sizeof(AuthenticationInfo)); - ogs_assert(amf_ue->suci); - AuthenticationInfo.supi_or_suci = amf_ue->suci; + if (amf_ue->suci) + AuthenticationInfo.supi_or_suci = amf_ue->suci; + else + AuthenticationInfo.supi_or_suci = amf_ue->supi; + + if (!AuthenticationInfo.supi_or_suci) { + ogs_error("No SUPI[%s] or SUCI[%s]", + amf_ue->supi ? amf_ue->supi : "NULL", + amf_ue->suci ? amf_ue->suci : "NULL"); + goto end; + } + AuthenticationInfo.serving_network_name = ogs_serving_network_name_from_plmn_id(&amf_ue->nr_tai.plmn_id); if (!AuthenticationInfo.serving_network_name) { diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index f17bb4348e..a6ac432c2c 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -125,7 +125,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) CASE(OGS_SBI_HTTP_METHOD_POST) if (message.AuthenticationInfo && message.AuthenticationInfo->supi_or_suci) { - ausf_ue = ausf_ue_find_by_suci( + ausf_ue = ausf_ue_find_by_suci_or_supi( message.AuthenticationInfo->supi_or_suci); if (!ausf_ue) { ausf_ue = ausf_ue_add( diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 593cfeb103..5dc81ef203 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -835,12 +835,12 @@ bool nrf_nnrf_handle_nf_discover( &discovery_option->tai.plmn_id), discovery_option->tai.tac.v); } - if (discovery_option->target_guami) { + if (discovery_option->guami_presence) { ogs_debug("guami[PLMN_ID:%06x,AMF_ID:%x]", ogs_plmn_id_hexdump( - &discovery_option->target_guami->plmn_id), + &discovery_option->guami.plmn_id), ogs_amf_id_hexdump( - &discovery_option->target_guami->amf_id)); + &discovery_option->guami.amf_id)); } if (discovery_option->num_of_target_plmn_list) { for (i = 0; i < discovery_option->num_of_target_plmn_list; i++) diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 98f0a233b2..9c6eb6aead 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -233,6 +233,9 @@ static int request_handler(ogs_sbi_request_t *request, void *data) } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TAI)) { if (val) ogs_sbi_discovery_option_parse_tai(discovery_option, val); + } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_GUAMI)) { + if (val) + ogs_sbi_discovery_option_parse_guami(discovery_option, val); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_DISCOVERY_TARGET_PLMN_LIST)) { if (val) discovery_option->num_of_target_plmn_list = diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index c3c536e390..54065d16c3 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -497,7 +497,7 @@ static void test1_func(abts_case *tc, void *data) static void test2_func(abts_case *tc, void *data) { int rv; - ogs_socknode_t *ngap; + ogs_socknode_t *ngap, *ngap2; ogs_socknode_t *gtpu; ogs_pkbuf_t *gmmbuf; ogs_pkbuf_t *gsmbuf; @@ -539,7 +539,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; - /* gNB connects to AMF */ + /* gNB connects to AMF(default configuration) */ ngap = testngap_client(AF_INET); ABTS_PTR_NOTNULL(tc, ngap); @@ -1517,14 +1517,499 @@ static void test4_issues2839_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +#define CONTEXT_TRANSFER_TEST 0 +#define OLD_AMF_NOT_FOUND 0 + +#if CONTEXT_TRANSFER_TEST +static void context_transfer_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap, *ngap2; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF(default configuration) */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to AMF(127.0.1.5) */ + ngap2 = testsctp_client("127.0.1.5", OGS_NGAP_SCTP_PORT); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 22); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Registration request */ + test_ue->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.s1_ue_network_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 1; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Router Solicitation */ + rv = test_gtpu_send_slacc_rs(gtpu, qos_flow); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U Router Advertisement */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + testgtpu_recv(test_ue, recvbuf); + +#if !defined(__FreeBSD__) + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV6); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); +#endif + + ogs_msleep(300); + + /* Send Registration request + * - Update Registration request type + * - Uplink Data Status */ + test_ue->nas.registration.value = + OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; + + test_ue->registration_request_param.uplink_data_status = 1; + test_ue->registration_request_param.psimask.uplink_data_status = + 1 << sess->psi; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + test_ue->registration_request_param.guti = 1; +#if OLD_AMF_NOT_FOUND + test_ue->nas_5gs_guti.amf_id.pointer = 2; +#endif + gmmbuf = testgmm_build_registration_request(test_ue, NULL, true, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, true, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if OLD_AMF_NOT_FOUND + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send PDU session establishment request */ + sess = test_sess_find_by_psi(test_ue, 5); + ogs_assert(sess); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue->ngap_procedure_code); + + /* Send GTP-U ICMP Packet */ + qos_flow = test_qos_flow_find_by_qfi(sess, 1); + ogs_assert(qos_flow); + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Router Solicitation */ + rv = test_gtpu_send_slacc_rs(gtpu, qos_flow); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U Router Advertisement */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + testgtpu_recv(test_ue, recvbuf); + +#if !defined(__FreeBSD__) + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, qos_flow, TEST_PING_IPV6); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); +#endif + + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF(127.0.1.5) */ + testgnb_ngap_close(ngap2); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} +#endif + abts_suite *test_guti(abts_suite *suite) { suite = ADD_SUITE(suite) +#if !CONTEXT_TRANSFER_TEST abts_run_test(suite, test1_func, NULL); abts_run_test(suite, test2_func, NULL); abts_run_test(suite, test3_func, NULL); abts_run_test(suite, test4_issues2839_func, NULL); +#else + abts_run_test(suite, context_transfer_func, NULL); +#endif return suite; } From 1111b06ac466cd9620c0135b0eabee16450b2aa8 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 26 May 2024 15:01:21 +0900 Subject: [PATCH 122/323] [AMF] Fixed issue context transfer (#3052) When the second AMF, which is the transfer, runs later than the SMF, there is no client information. Fixed to pre-create the Client when the Resource URI is transferred. --- src/amf/namf-handler.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index e31c313db8..3c66a30dc8 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1697,6 +1697,13 @@ static void amf_namf_comm_decode_ue_session_context_list( ogs_sbi_message_t message; ogs_sbi_header_t header; + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + if (!PduSessionContext->sm_context_ref) { ogs_error("No smContextRef [PSI:%d]", PduSessionContext->pdu_session_id); @@ -1742,6 +1749,39 @@ static void amf_namf_comm_decode_ue_session_context_list( sess = amf_sess_add(amf_ue, PduSessionContext->pdu_session_id); ogs_assert(sess); + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_error("[%s:%d] Invalid URI [%s]", + amf_ue->supi, sess->psi, header.uri); + + ogs_sbi_header_free(&header); + continue; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s:%d] ogs_sbi_client_add()", amf_ue->supi, sess->psi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_error("[%s:%d] ogs_sbi_client_add() failed", + amf_ue->supi, sess->psi); + + ogs_sbi_header_free(&header); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + continue; + } + } + OGS_SBI_SETUP_CLIENT(&sess->sm_context, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + sess->sm_context.resource_uri = ogs_strdup(PduSessionContext->sm_context_ref); sess->sm_context.ref = From 53a63e1b4084d83fded638a7c14e92a93dcf4ea5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 31 May 2024 22:27:30 +0900 Subject: [PATCH 123/323] [MME/GTP] Managing multiple GTP xact (#3240) Consider the following situation. ``` 1. SMF->SGW-C->MME: First Update Bearer Request 2. MME->UE: First Modify EPS bearer context request 3. SMF->SGW-C->MME: Second Update Bearer Request 4. MME->UE: Second Modify EPS bearer context request 5. UE->MME: First Modify EPS bearer context accept 6. MME->SGW-C->SMF: First Update Bearer Response 7. UE->MME: Second Modify EPS bearer context accept 8. MME->SGW-C->SMF: Second Update Bearer Response ``` Until now, only one GTP transaction was managed for one bearer. Therefore, if the UE does not send an EPS Modify bearer accept to the MME, and the SMF/SGW-C sends an Update Bearer Request to the MME, The NEW update bearer request overwrites the OLD that was previously managed. So we modified it to manage them simultaneously. However, we don't know if this is the right way to implement it. So if the SMF/SGW-C sends 5 MMEs of Update Bearer Request and the UE sends only 3 MMEs of Modify EPS bearer context accept, we have no way to associate it. Therefore, it's implemented so that we just process them sequentially and 2 of them are just timeout. --- lib/gtp/xact.c | 14 ++ lib/gtp/xact.h | 20 ++ src/mme/mme-context.c | 8 + src/mme/mme-context.h | 20 +- src/mme/mme-gtp-path.c | 24 ++- src/mme/mme-path.c | 8 +- src/mme/mme-s11-handler.c | 116 ++++++++++- tests/volte/rx-test.c | 393 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 594 insertions(+), 9 deletions(-) diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index ffec8621a3..97899ebcbc 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -803,6 +803,20 @@ static void holding_timeout(void *data) xact->step, xact->seq[xact->step-1].type, OGS_ADDR(&xact->gnode->addr, buf), OGS_PORT(&xact->gnode->addr)); + /* + * Even for remotely created transactions, there are things + * that need to be done, such as returning memory + * when the transaction is deleted after a holding timeout. + * We added a Callback Function for that purpose. + * + * You can set it up and use it as follows. + * + * xact->cb = gtp_remote_holding_timeout; + * xact->data = bearer; + */ + if (xact->cb) + xact->cb(xact, xact->data); + ogs_gtp_xact_delete(xact); } } diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index 8955629ccc..4d948e7a5a 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -58,6 +58,26 @@ extern "C" { */ typedef struct ogs_gtp_xact_s { ogs_lnode_t node; /**< A node of list */ + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * In the above situation, while NAS-ESM messages are exchanged + * between the MME and UE, the bearer may have multiple transactions + * that need to be managed. to_update_node is used as a node + * in the Transaction List related to Update Bearer Request/Response. + */ + ogs_lnode_t to_update_node; + ogs_pool_id_t index; uint8_t gtp_version; /**< 1 or 2 */ diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index b08b9b5062..113508c97d 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -4149,6 +4149,8 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) ogs_assert(bearer); memset(bearer, 0, sizeof *bearer); + ogs_list_init(&bearer->update.xact_list); + ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi_node); ogs_assert(bearer->ebi_node); @@ -4176,6 +4178,7 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) void mme_bearer_remove(mme_bearer_t *bearer) { mme_event_t e; + ogs_gtp_xact_t *xact = NULL, *next_xact = NULL; ogs_assert(bearer); ogs_assert(bearer->mme_ue); @@ -4195,6 +4198,11 @@ void mme_bearer_remove(mme_bearer_t *bearer) if (bearer->ebi_node) ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi_node); + ogs_list_for_each_entry_safe(&bearer->update.xact_list, + next_xact, xact, to_update_node) { + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + } + ogs_pool_free(&mme_bearer_pool, bearer); } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index f9b63fe11b..aab5b3793a 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -873,9 +873,27 @@ typedef struct mme_bearer_s { mme_ue_t *mme_ue; mme_sess_t *sess; + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * We'll start by managing only Update Bearer Request/Response + * as a list so that we can manage multiple of them. + */ struct { ogs_gtp_xact_t *xact; - } create, update, delete, notify; + } create, delete, notify; + struct { + ogs_list_t xact_list; + } update; } mme_bearer_t; void mme_context_init(void); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 0ef1da82d7..46ee566b98 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -427,7 +427,7 @@ int mme_gtp_send_update_bearer_response( { int rv; - ogs_gtp_xact_t *xact = NULL; + ogs_gtp_xact_t *xact = NULL, *next_xact = NULL; mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; @@ -439,7 +439,27 @@ int mme_gtp_send_update_bearer_response( ogs_assert(mme_ue); sgw_ue = mme_ue->sgw_ue; ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->update.xact); + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * After sending the Update Bearer Response, remove the corresponding + * Transaction Node from the list managed by the Bearer Context. + */ + ogs_list_for_each_entry_safe( + &bearer->update.xact_list, next_xact, xact, to_update_node) { + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + break; + } if (!xact) { ogs_warn("GTP transaction(UPDATE) has already been removed"); return OGS_OK; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 5e84400ce2..ee9e2bc127 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -218,7 +218,13 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) mme_gtp_send_update_bearer_response( bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE)); } else { - ogs_gtp_xact_t *xact = ogs_gtp_xact_cycle(bearer->update.xact); + ogs_gtp_xact_t *xact = NULL; + + /* Get the first Entry */ + ogs_list_for_each_entry( + &bearer->update.xact_list, xact, to_update_node) { + break; + } if (!xact) { ogs_error("No GTP xact"); goto cleanup; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 30af5cc1dc..7dadfcfe66 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -59,6 +59,94 @@ static uint8_t esm_cause_from_gtp(uint8_t gtp_cause) return OGS_NAS_ESM_CAUSE_NETWORK_FAILURE; } +static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) +{ + char buf[OGS_ADDRSTRLEN]; + mme_bearer_t *bearer = data; + uint8_t type; + + ogs_assert(xact); + bearer = mme_bearer_cycle(bearer); + ogs_assert(bearer); + + type = xact->seq[xact->step-1].type; + + ogs_warn("[%d] %s HOLDING TIMEOUT " + "for step %d type %d peer [%s]:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + + /* + * Issues #3240 + * + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + */ + switch (type) { + case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE: + /* + * In this case, a timeout occurs while waiting + * for Modify EPS bearer context accept from UE. + * + * If the UE does not send a Modify EPS bearer context accept, + * the MME fails to send an Update Bearer Response. + * + * Therefore, we need to delete the Transaction Node + * that was managed by the Bearer Context from the List. + */ + if (ogs_list_exists( + &bearer->update.xact_list, + &xact->to_update_node) == true) { + ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); + } else { + ogs_error("[%d] %s HAVE ALREADY BEEN REMOVED " + "for step %d type %d peer [%s]:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + } + break; + case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: + /* + * The following is the case where the UE sends + * Modify EPS bearer context accept to the MME. + * + * In this case, the MME sends Update Bearer Response + * to SGW-C and deletes the Transaction Node. + * + * Therefore, there is no need to delete the Transaction Node + * from the list managed by the Bearer Context here. + */ + if (ogs_list_exists( + &bearer->update.xact_list, + &xact->to_update_node) == true) { + ogs_error("[%d] %s SHOULD HAVE REMOVED " + "for step %d type %d peer [%s]:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + } + break; + default: + ogs_fatal("Unknown type[%d]", type); + ogs_assert_if_reached(); + break; + } +} + void mme_s11_handle_echo_request( ogs_gtp_xact_t *xact, ogs_gtp2_echo_request_t *req) { @@ -1045,13 +1133,31 @@ void mme_s11_handle_update_bearer_request( } /* - * Save Transaction. It will be handled after EMM-attached + * Issues #3240 * - * You should not remove OLD bearer->xact. - * If GTP-xact Holding timer is expired, - * OLD bearer->xact memory will be automatically removed. + * SMF->SGW-C->MME: First Update Bearer Request + * MME->UE: First Modify EPS bearer context request + * SMF->SGW-C->MME: Second Update Bearer Request + * MME->UE: Second Modify EPS bearer context request + * UE->MME: First Modify EPS bearer context accept + * MME->SGW-C->SMF: First Update Bearer Response + * UE->MME: Second Modify EPS bearer context accept + * MME->SGW-C->SMF: Second Update Bearer Response + * + * If the UE does not send a Modify EPS bearer context accept, + * the MME cannot send an Update Bearer Response to the SGW-C. + * + * In this case, REMOTE holding timeout occurs, and a callback function + * is registered as follows to free memory. + * + * Also, as shown above, multiple Update Bearer Request/Response can occur, + * so we manage the Transaction Node as a list within the Bearer Context. */ - bearer->update.xact = xact; + + xact->cb = gtp_remote_holding_timeout; + xact->data = bearer; + + ogs_list_add(&bearer->update.xact_list, &xact->to_update_node); if (req->bearer_contexts.bearer_level_qos.presence == 1) { /* Bearer QoS */ diff --git a/tests/volte/rx-test.c b/tests/volte/rx-test.c index 29896dc21b..4875384f12 100644 --- a/tests/volte/rx-test.c +++ b/tests/volte/rx-test.c @@ -3410,6 +3410,398 @@ static void test_issues3109_func(abts_case *tc, void *data) } #endif +static void test_issues3240_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + uint8_t *rx_sid = NULL; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "1032548691"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1079baf; + test_ue->nas.ksi = 0; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_ims(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.ms_network_capability = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.pco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send PDN Connectivity Request */ + sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + sess->pti = 5; + + sess->pdn_connectivity_param.apn = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, true, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive E-RABSetupRequest + + * Activate default EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate default EPS bearer context accept */ + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, true); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send AA-Request */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 1, 1); + + /* Receive E-RABSetupRequest + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABSetup, + test_ue->s1ap_procedure_code); + + /* Send E-RABSetupResponse */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 7); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* DELAY is needed in dedicated EPS bearer */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send AA-Request without Flow */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 2, 1); + + /* Receive E-RABModifyRequest + + * Modify EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABModify, + test_ue->s1ap_procedure_code); + + /* Send E-RABModifyResponse */ + sendbuf = test_s1ap_build_e_rab_modify_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send AA-Request without Flow */ + test_rx_send_aar_audio(&rx_sid, sess, + OGS_DIAM_RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI, 1, 1); + + /* BEFORE receiving Modify EPS bearer context accept + * + * Receive E-RABModifyRequest + + * Modify EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + S1AP_ProcedureCode_id_E_RABModify, + test_ue->s1ap_procedure_code); + + /* Send Modify EPS bearer context accept */ + esmbuf = testesm_build_modify_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait for sending Update Bearer Response */ + ogs_msleep(100); + + /* Send E-RABModifyResponse */ + sendbuf = test_s1ap_build_e_rab_modify_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Modify EPS bearer context accept */ + esmbuf = testesm_build_modify_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Wait for sending Update Bearer Response */ + ogs_msleep(100); + + /* Send Detach Request */ + emmbuf = testemm_build_detach_request(test_ue, 1, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UEContextReleaseCommand */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + abts_suite *test_rx(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -3424,6 +3816,7 @@ abts_suite *test_rx(abts_suite *suite) #if 0 /* disable this issues3109 test because of a lot of ERROR messages. */ abts_run_test(suite, test_issues3109_func, NULL); #endif + abts_run_test(suite, test_issues3240_func, NULL); return suite; } From cf7af787dd22360c71828a3b33a3ff35a8c03b11 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 3 Jun 2024 21:40:23 +0900 Subject: [PATCH 124/323] [AMF/MME] Fix the gNB/eNB ID hash setting When setting hashes, we typically delete and set hashes that are set to OLD. A hash set to OLD should be deleted by setting it to NULL, but here we're deleting it with a value of NEW. Therefore, we modified it to delete the OLD gNB/eNB ID instead of NEW by setting a NULL value to Hash as Key. --- src/amf/context.c | 2 +- src/mme/mme-context.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/amf/context.c b/src/amf/context.c index 57a19aea34..affa5c68a0 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1290,7 +1290,7 @@ int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id) { ogs_assert(gnb); - ogs_hash_set(self.gnb_id_hash, &gnb_id, sizeof(gnb_id), NULL); + ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); gnb->gnb_id = gnb_id; ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), gnb); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 113508c97d..a26c7df370 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2894,7 +2894,7 @@ int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id) { ogs_assert(enb); - ogs_hash_set(self.enb_id_hash, &enb_id, sizeof(enb_id), NULL); + ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); enb->enb_id = enb_id; ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), enb); From 0de416e43f6c7bf00e4b0ae06e2d1e057bb29ec2 Mon Sep 17 00:00:00 2001 From: errdemk <erdem8kara@gmail.com> Date: Fri, 31 May 2024 10:12:42 +0200 Subject: [PATCH 125/323] [UDM] Added Amf3GppAccessRegistration Information Retrieval Feature --- src/udm/nudm-handler.c | 39 +++++++++++++++++++++++++++++++++++++++ src/udm/nudm-handler.h | 2 ++ src/udm/ue-sm.c | 23 +++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 2aa6d638b1..4f2923b320 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -480,6 +480,45 @@ bool udm_nudm_uecm_handle_amf_registration_update( return true; } +bool udm_nudm_uecm_handle_amf_registration_get( + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + ogs_sbi_message_t sendmsg; + ogs_sbi_response_t *response = NULL; + + ogs_assert(udm_ue); + ogs_assert(stream); + ogs_assert(recvmsg); + + SWITCH(recvmsg->h.resource.component[1]) + CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS) + if (udm_ue->amf_3gpp_access_registration == NULL) { + ogs_error("Invalid UE Identifier [%s]", + udm_ue->suci); + return false; + } + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.Amf3GppAccessRegistration = + OpenAPI_amf3_gpp_access_registration_copy( + sendmsg.Amf3GppAccessRegistration, + udm_ue->amf_3gpp_access_registration); + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); + ogs_assert(response); + ogs_sbi_server_send_response(stream, response); + + OpenAPI_amf3_gpp_access_registration_free( + sendmsg.Amf3GppAccessRegistration); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + recvmsg->h.resource.component[3]); + return false; + END + + return true; +} + bool udm_nudm_uecm_handle_smf_registration( udm_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message) { diff --git a/src/udm/nudm-handler.h b/src/udm/nudm-handler.h index e1412a512b..f3de6a556d 100644 --- a/src/udm/nudm-handler.h +++ b/src/udm/nudm-handler.h @@ -35,6 +35,8 @@ bool udm_nudm_uecm_handle_amf_registration( udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); bool udm_nudm_uecm_handle_amf_registration_update( udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); +bool udm_nudm_uecm_handle_amf_registration_get( + udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); bool udm_nudm_uecm_handle_smf_registration( udm_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); diff --git a/src/udm/ue-sm.c b/src/udm/ue-sm.c index a312341831..cf4164af92 100644 --- a/src/udm/ue-sm.c +++ b/src/udm/ue-sm.c @@ -144,6 +144,29 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) "Invalid HTTP method", message->h.method, NULL)); END break; + CASE(OGS_SBI_HTTP_METHOD_GET) + SWITCH(message->h.resource.component[1]) + CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS) + r = udm_nudm_uecm_handle_amf_registration_get( + udm_ue, stream, message); + if (!r) + { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, message, + "Invalid UE Identifier", message->h.method, NULL)); + } + break; + + DEFAULT + ogs_error("[%s] Invalid resource name [%s]", + udm_ue->suci, message->h.resource.component[1]); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, message, + "Invalid resource name", message->h.method, NULL)); + END + break; DEFAULT ogs_error("[%s] Invalid HTTP method [%s]", udm_ue->suci, message->h.method); From f0206c79f619f8e3c091918aeb8623a07f2a13b6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 5 Jun 2024 13:41:21 +0900 Subject: [PATCH 126/323] Follow up on #3249 --- src/pcf/pcf-sm.c | 60 ++++++++++++++++++++++++++++++++++++++++-------- src/udm/udm-sm.c | 18 +++++++-------- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 10381a1a4f..8b060cb79f 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -176,23 +176,63 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES) if (!message.h.resource.component[1]) { if (message.SmPolicyContextData && - message.SmPolicyContextData->supi) { + message.SmPolicyContextData->supi && + message.SmPolicyContextData->pdu_session_id) { + pcf_ue = pcf_ue_find_by_supi( message.SmPolicyContextData->supi); if (!pcf_ue) { - pcf_ue = pcf_ue_add( - message.SmPolicyContextData->supi); - ogs_assert(pcf_ue); + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + pcf_ue = pcf_ue_add( + message.SmPolicyContextData->supi); + if (!pcf_ue) { + ogs_error("[%s:%d] Invalid Request [%s]", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } else + ogs_debug("[%s:%d] PCF UE added", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id); + } else { + ogs_error("[%s:%d] Invalid HTTP method [%s]", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } } - if (message.SmPolicyContextData->pdu_session_id) { + + if (pcf_ue) { sess = pcf_sess_find_by_psi(pcf_ue, message. SmPolicyContextData->pdu_session_id); if (!sess) { - sess = pcf_sess_add(pcf_ue, message. - SmPolicyContextData->pdu_session_id); - ogs_assert(sess); - ogs_debug("[%s:%d] PCF session added", - pcf_ue->supi, sess->psi); + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + sess = pcf_sess_add(pcf_ue, message. + SmPolicyContextData->pdu_session_id); + if (!sess) { + ogs_error("[%s:%d] " + "Invalid Request [%s]", + message.SmPolicyContextData-> + supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } else + ogs_debug("[%s:%d] PCF session added", + pcf_ue->supi, sess->psi); + } else { + ogs_error("[%s:%d] " + "Invalid HTTP method [%s]", + message.SmPolicyContextData->supi, + message.SmPolicyContextData-> + pdu_session_id, + message.h.method); + } } } } diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index ec0f7f1e43..754c3b9fd7 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -164,15 +164,15 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_ue = udm_ue_find_by_suci_or_supi( message.h.resource.component[0]); if (!udm_ue) { - udm_ue = udm_ue_add(message.h.resource.component[0]); - if (!udm_ue) { - ogs_error("Invalid Request [%s]", - message.h.resource.component[0]); - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - &message, NULL, NULL, NULL)); - break; + if (!strcmp(message.h.method, + OGS_SBI_HTTP_METHOD_POST)) { + udm_ue = udm_ue_add(message.h.resource.component[0]); + if (!udm_ue) { + ogs_error("Invalid Request [%s]", + message.h.resource.component[0]); + } + } else { + ogs_error("Invalid HTTP method [%s]", message.h.method); } } } From d0f628848471852c91b16dc5725cd604cd2d320d Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 10 Jun 2024 10:05:25 +0900 Subject: [PATCH 127/323] Remove feature request in Issue template --- .github/ISSUE_TEMPLATE/bugreport.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 48 --------------------- 2 files changed, 1 insertion(+), 49 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml diff --git a/.github/ISSUE_TEMPLATE/bugreport.yaml b/.github/ISSUE_TEMPLATE/bugreport.yaml index bdfb0a30d2..81c5256d84 100644 --- a/.github/ISSUE_TEMPLATE/bugreport.yaml +++ b/.github/ISSUE_TEMPLATE/bugreport.yaml @@ -18,7 +18,7 @@ body: attributes: label: Open5GS Release, Revision, or Tag description: Please check if your issue has been resolved in the latest release. - placeholder: v2.6.0 + placeholder: v2.7.1 validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml deleted file mode 100644 index 6c739b053c..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Feature request -description: Propose an enhancement to Open5GS -labels: ['Enhancement', 'triage'] -body: - - type: markdown - attributes: - value: > - ## Feature request - Please submit your feature request using the form. If your proposal is not sufficiently - well formed, we may request further clarification and expansion. If you're unsure about - how to formulate your request, please start a [discussion instead](https://github.com/open5gs/open5gs/dicsussions/). - - - type: input - attributes: - label: Open5GS Release, Revision, or Tag - placeholder: v2.6.0 - validations: - required: true - - - type: input - attributes: - label: Components and subsystems - description: Which subsystems and components would this feature be relevant to? - validations: - required: true - - - type: textarea - attributes: - label: Proposed functionality - description: > - Provide a detailed description of the feature or behaviour you are proposing. Please include any - Please include any relevant 3GPP standards and references and include any specific changes to - current protocols, processing pipelines, DIAMETER requests/responses, and interfaces. The more detail - you provide, the greater the chance your proposal has of being discussed. - - If your feature request does not include anything actionable or sufficient details, you may be asked - to provide further clarification or your request may be rejected. - validations: - required: true - - - type: textarea - attributes: - label: External dependencies - description: > - Please detail any new dependencies or implementations that this feature might introduce. e.g. Does the - proposal require the installation of additional packages? Are there further external nodes which may be - required for integration testing? (Not all feature requests will introduce new dependencies) - From 9e19d28c4b122c3f6c73d9465db49596d5a96200 Mon Sep 17 00:00:00 2001 From: nik-netlox <66406124+nik-netlox@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:14:48 +0900 Subject: [PATCH 128/323] Update docs.md --- docs/_pages/docs.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index 24acec7cae..99c1a8221f 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -82,3 +82,6 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - [Open5GS and OAI-GNB](https://gradiant.github.io/5g-charts/open5gs-oaignb.html) - [Open5GS and srsenb](https://gradiant.github.io/5g-charts/open5gs-srsenb.html) - [Open5GS with SCP(Service Communication Proxy](https://gradiant.github.io/5g-charts/open5gs-scp.html) + +- @loxilb + - [Exploring 5G SCP with Open5GS and LoxiLB](https://dev.to/nikhilmalik/5g-service-communication-proxy-with-loxilb-4242) From 2e180796e475ebd1ab804d64b19440c5acb6e45d Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Fri, 1 Mar 2024 20:07:26 +0100 Subject: [PATCH 129/323] [MME] Fix GUTI <-> RAI/PTMSI derivation functions The algorithms described in 3GPP TS 23.003 Ch. 2.8.2.1.2 an 2.8.2.2.2 are not directly the inverse of each other. To send a SGSN Context Request (in 2G -> 4G mobility) the algorithm in 2.8.2.2.2 has to be done in reverse (like mentioned in 2.8.2.2.3 - Mapping in the new MME). When parsing an SGSN Context Request (for 4G -> 2G mobility) the reverse of 2.8.2.1.2 (as described in 2.8.2.1.3) has to be used. PTMSI signature handling is added in a separate commit. --- src/mme/emm-sm.c | 2 +- src/mme/mme-gn-build.c | 8 +++----- src/mme/mme-gn-handler.c | 10 ++++------ src/mme/mme-gn-handler.h | 2 +- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 340fda7df0..9b101b0ec0 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -504,7 +504,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (emm_tau_request_ue_comes_from_gb_or_iu(&message->emm.tracking_area_update_request)) { ogs_info("TAU request : UE comes from SGSN, attempt retrieving context"); - guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, NULL, NULL); + guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, NULL); sgsn = mme_sgsn_find_by_routing_address(&rai, 0xffff); if (!sgsn) { ogs_plmn_id_t plmn_id; diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index e9f3b9f885..47e987be7d 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -194,7 +194,6 @@ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( ogs_gtp1_sgsn_context_request_t *req = NULL; ogs_nas_rai_t rai; mme_p_tmsi_t ptmsi; - uint32_t ptmsi_sig; ogs_gtp1_gsn_addr_t mme_gnc_gsnaddr, mme_gnc_alt_gsnaddr; int gsn_len; int rv; @@ -206,11 +205,13 @@ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( req = &gtp1_message.sgsn_context_request; memset(&gtp1_message, 0, sizeof(ogs_gtp1_message_t)); - guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, &ptmsi, &ptmsi_sig); + guti_to_rai_ptmsi(&mme_ue->next.guti, &rai, &ptmsi); req->imsi.presence = 0; req->routeing_area_identity.presence = 1; + /* Needs to be big-endian */ + rai.lai.lac = htons(rai.lai.lac); req->routeing_area_identity.data = &rai; req->routeing_area_identity.len = sizeof(ogs_nas_rai_t); @@ -219,9 +220,6 @@ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( req->packet_tmsi.presence = 1; req->packet_tmsi.u32 = be32toh(ptmsi); - req->p_tmsi_signature.presence = 1; - req->p_tmsi_signature.u24 = ptmsi_sig; - req->ms_validated.presence = 0; req->tunnel_endpoint_identifier_control_plane.presence = 1; diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index ca8090847b..4092f73a7d 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -69,22 +69,20 @@ static int decode_global_enb_id(S1AP_Global_ENB_ID_t *glob_enb_id, const uint8_t return OGS_OK; } -/* 3GPP TS 23.003 2.8.2.1 Mapping from GUTI to RAI, P-TMSI and P-TMSI signature */ -void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, mme_p_tmsi_t *ptmsi, uint32_t *ptmsi_sig) +/* 3GPP TS 23.003 2.8.2.2 Mapping RAI and P-TMSI from GUTI (in the MME) */ +void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, mme_p_tmsi_t *ptmsi) { rai->lai.nas_plmn_id = nas_guti->nas_plmn_id; rai->lai.lac = nas_guti->mme_gid; - rai->rac = nas_guti->mme_code; + rai->rac = (nas_guti->m_tmsi >> 16) & 0xff; if (ptmsi) *ptmsi = 0xC0000000 | (nas_guti->m_tmsi & 0x3f000000) | (nas_guti->mme_code & 0x0ff) << 16 | (nas_guti->m_tmsi & 0x0000ffff); - if (ptmsi_sig) - *ptmsi_sig = (nas_guti->m_tmsi & 0x00ff0000); } -/* 3GPP TS 23.003 2.8.2.2 Mapping from RAI and P-TMSI to GUTI */ +/* 3GPP TS 23.003 2.8.2.1 Mapping GUTI from RAI, P-TMSI and P-TMSI signature (in the MME) */ static void rai_ptmsi_to_guti(const ogs_nas_rai_t *rai, mme_p_tmsi_t ptmsi, uint32_t ptmsi_sig, ogs_nas_eps_guti_t *nas_guti) { nas_guti->nas_plmn_id = rai->lai.nas_plmn_id; diff --git a/src/mme/mme-gn-handler.h b/src/mme/mme-gn-handler.h index 0c3a6156f3..af422006c2 100644 --- a/src/mme/mme-gn-handler.h +++ b/src/mme/mme-gn-handler.h @@ -45,7 +45,7 @@ void mme_gn_handle_ran_information_relay( ogs_gtp_xact_t *xact, ogs_gtp1_ran_information_relay_t *req); void guti_to_rai_ptmsi(const ogs_nas_eps_guti_t *nas_guti, ogs_nas_rai_t *rai, - mme_p_tmsi_t *ptmsi, uint32_t *ptmsi_sig); + mme_p_tmsi_t *ptmsi); #ifdef __cplusplus } From 71e263c0a14e1aff359fe5c8437638299d18b22c Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Tue, 5 Mar 2024 18:21:47 +0100 Subject: [PATCH 130/323] [MME] Pass PTMSI signature through to mme_gn_build_sgsn_context_request 3GPP TS 23.003 Ch. 2.8.2.2.2 (Mapping in the UE) states "The P-TMSI signature is sent intact to the MME." So simply use the PTMSI signature from the TAU and pass it throught to the SGSN Context Request. --- src/mme/emm-sm.c | 5 ++++- src/mme/mme-gn-build.c | 7 ++++++- src/mme/mme-gn-build.h | 2 +- src/mme/mme-gtp-path.c | 4 ++-- src/mme/mme-gtp-path.h | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 9b101b0ec0..8992bbadfd 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -291,6 +291,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_nas_eps_message_t *message = NULL; ogs_nas_rai_t rai; ogs_nas_security_header_type_t h; + ogs_nas_p_tmsi_signature_t *ptmsi_sig = NULL; ogs_assert(e); @@ -517,7 +518,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, OGS_FSM_TRAN(s, &emm_state_exception); break; } - mme_gtp1_send_sgsn_context_request(sgsn, mme_ue); + if (message->emm.tracking_area_update_request.presencemask & OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE) + ptmsi_sig = &message->emm.tracking_area_update_request.old_p_tmsi_signature; + mme_gtp1_send_sgsn_context_request(sgsn, mme_ue, ptmsi_sig); /* FIXME: use a specific FSM state here to state we are waiting for resolution from Gn? */ break; } diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index 47e987be7d..b7e6995370 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -188,7 +188,7 @@ static int sess_fill_pdp_context_decoded(mme_sess_t *sess, ogs_gtp1_pdp_context_ /* 3GPP TS 29.060 7.5.3 SGSN Context Request */ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( - mme_ue_t *mme_ue) + mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig) { ogs_gtp1_message_t gtp1_message; ogs_gtp1_sgsn_context_request_t *req = NULL; @@ -220,6 +220,11 @@ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( req->packet_tmsi.presence = 1; req->packet_tmsi.u32 = be32toh(ptmsi); + if (ptmsi_sig) { + req->p_tmsi_signature.presence = 1; + req->p_tmsi_signature.u24 = *ptmsi_sig >> 8; + } + req->ms_validated.presence = 0; req->tunnel_endpoint_identifier_control_plane.presence = 1; diff --git a/src/mme/mme-gn-build.h b/src/mme/mme-gn-build.h index 642ff174be..b83df6db63 100644 --- a/src/mme/mme-gn-build.h +++ b/src/mme/mme-gn-build.h @@ -31,7 +31,7 @@ extern "C" { #endif ogs_pkbuf_t *mme_gn_build_sgsn_context_request( - mme_ue_t *mme_ue); + mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig); ogs_pkbuf_t *mme_gn_build_sgsn_context_response( mme_ue_t *mme_ue, uint8_t cause); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 46ee566b98..aaf0a423ec 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -787,7 +787,7 @@ int mme_gtp_send_bearer_resource_command( *************************/ int mme_gtp1_send_sgsn_context_request( - mme_sgsn_t *sgsn, mme_ue_t *mme_ue) + mme_sgsn_t *sgsn, mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig) { int rv; ogs_gtp1_header_t h; @@ -800,7 +800,7 @@ int mme_gtp1_send_sgsn_context_request( h.type = OGS_GTP1_SGSN_CONTEXT_REQUEST_TYPE; h.teid = 0; - pkbuf = mme_gn_build_sgsn_context_request(mme_ue); + pkbuf = mme_gn_build_sgsn_context_request(mme_ue, ptmsi_sig); if (!pkbuf) { ogs_error("mme_gn_build_ran_information_relay() failed"); return OGS_ERROR; diff --git a/src/mme/mme-gtp-path.h b/src/mme/mme-gtp-path.h index f741559c56..3ef1b7ad47 100644 --- a/src/mme/mme-gtp-path.h +++ b/src/mme/mme-gtp-path.h @@ -56,7 +56,7 @@ int mme_gtp_send_bearer_resource_command( mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message); int mme_gtp1_send_sgsn_context_request( - mme_sgsn_t *sgsn, mme_ue_t *mme_ue); + mme_sgsn_t *sgsn, mme_ue_t *mme_ue, const ogs_nas_p_tmsi_signature_t *ptmsi_sig); int mme_gtp1_send_sgsn_context_response( mme_ue_t *mme_ue, uint8_t cause, ogs_gtp_xact_t *xact); From dc2e167a8f74d95829c87242063e8824de84f5b4 Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Tue, 5 Mar 2024 18:27:38 +0100 Subject: [PATCH 131/323] [MME] Avoid duplicate be32toh() in mme_gn_build_sgsn_context_request() tlv_add_leaf() should already convert the byte order. --- src/mme/mme-gn-build.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index b7e6995370..aa9d8f9513 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -218,7 +218,7 @@ ogs_pkbuf_t *mme_gn_build_sgsn_context_request( req->temporary_logical_link_identifier.presence = 0; req->packet_tmsi.presence = 1; - req->packet_tmsi.u32 = be32toh(ptmsi); + req->packet_tmsi.u32 = ptmsi; if (ptmsi_sig) { req->p_tmsi_signature.presence = 1; From b26f1f310f989086d5aaaa4b6a6da192c31f7023 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 12 Jun 2024 18:19:42 +0900 Subject: [PATCH 132/323] [POOL] Added hash id to pool (#3196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pool library has the following issues with XXX_cycle, including mme_enb_cycle()/amf_ue_cycle() ``` INIT POOL(SIZE:5) Alloc Node1 Alloc Node2 Alloc Node3 Alloc Node4 Alloc Node5 Free Node4 Free Node3 PoolCycle(Node4) is NULL (Freed...OK!) PoolCycle(Node3) is NULL (Freed...OK!) Alloc Node6 Alloc Node7 PoolCycle(Node4) is Not NULL (Freed...but NOK!) PoolCycle(Node3) is Not NULL (Freed...but NOK!) PoolCycle(Node6) is Not NULL (Allocated...OK!) PoolCycle(Node7) is Not NULL (Allocated...OK!) ``` If we use ogs_poll_alloc() to create and allocate a node, the correct behavior of calling ogs_pool_free() on this node and then later calling ogs_pool_cycle() on this node must always return NULL. However, the behavior of calling ogs_pool_cycle() on this node in the future may return a “valid” pointer. To solve the problem, we added hash id to the pool memory and ogs_pool_find_by_id() function is added. --- lib/core/ogs-pool.h | 51 ++++++++++++++++++++++++++++++++++++------ tests/sctp/abts-main.c | 3 +++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index eb435cffc0..5df5a4f9f0 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -28,7 +28,10 @@ extern "C" { #endif -typedef uint32_t ogs_pool_id_t; +#define OGS_MIN_POOL_ID 1 +#define OGS_MAX_POOL_ID 0x7fffffff + +typedef int32_t ogs_pool_id_t; #define OGS_POOL(pool, type) \ struct { \ @@ -36,6 +39,9 @@ typedef uint32_t ogs_pool_id_t; int head, tail; \ int size, avail; \ type **free, *array, **index; \ + \ + ogs_hash_t *id_hash; \ + ogs_pool_id_t id; \ } pool /* @@ -57,6 +63,9 @@ typedef uint32_t ogs_pool_id_t; (pool)->free[i] = &((pool)->array[i]); \ (pool)->index[i] = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -70,6 +79,9 @@ typedef uint32_t ogs_pool_id_t; free((pool)->free); \ free((pool)->array); \ free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) /* @@ -93,6 +105,9 @@ typedef uint32_t ogs_pool_id_t; (pool)->free[i] = &((pool)->array[i]); \ (pool)->index[i] = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -108,14 +123,11 @@ typedef uint32_t ogs_pool_id_t; ogs_free((pool)->free); \ ogs_free((pool)->array); \ ogs_free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) -#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) -#define ogs_pool_find(pool, _index) \ - (_index > 0 && _index <= (pool)->size) ? (pool)->index[_index-1] : NULL -#define ogs_pool_cycle(pool, node) \ - ogs_pool_find((pool), ogs_pool_index((pool), (node))) - #define ogs_pool_alloc(pool, node) do { \ *(node) = NULL; \ if ((pool)->avail > 0) { \ @@ -136,6 +148,31 @@ typedef uint32_t ogs_pool_id_t; } \ } while (0) +#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) +#define ogs_pool_find(pool, _index) \ + (_index > 0 && _index <= (pool)->size) ? (pool)->index[_index-1] : NULL +#define ogs_pool_cycle(pool, node) \ + ogs_pool_find((pool), ogs_pool_index((pool), (node))) + +#define ogs_pool_id_calloc(pool, node) do { \ + ogs_pool_alloc(pool, node); \ + if (*node) { \ + memset(*(node), 0, sizeof(**(node))); \ + (*(node))->id = OGS_NEXT_ID((pool)->id, 1, OGS_MAX_POOL_ID); \ + ogs_hash_set((pool)->id_hash, \ + &((*(node))->id), sizeof(ogs_pool_id_t), *(node)); \ + } \ +} while (0) + +#define ogs_pool_id_free(pool, node) do { \ + ogs_hash_set((pool)->id_hash, \ + &((node)->id), sizeof(ogs_pool_id_t), NULL); \ + ogs_pool_free(pool, node); \ +} while (0) + +#define ogs_pool_find_by_id(pool, id) \ + ogs_hash_get((pool)->id_hash, &id, sizeof(ogs_pool_id_t)) + #define ogs_pool_size(pool) ((pool)->size) #define ogs_pool_avail(pool) ((pool)->avail) diff --git a/tests/sctp/abts-main.c b/tests/sctp/abts-main.c index a9759eb575..67fa1a0d82 100644 --- a/tests/sctp/abts-main.c +++ b/tests/sctp/abts-main.c @@ -33,6 +33,9 @@ static void terminate(void) { ogs_sctp_final(); + ogs_app_config_final(); + ogs_app_context_final(); + ogs_pkbuf_default_destroy(); ogs_core_terminate(); } From 40e146d45a554c83fb4b71b78348f1ef3fe84d12 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 10 Jun 2024 17:03:22 +0900 Subject: [PATCH 133/323] [POOL] change cycle to hash id in xact (#3196) I created ogs_sbi_xact_find_by_id() with a hash to replace ogs_sbi_xact_cycle(). Modified to find the xact via xact->id when making an HTTP request with the SBI client function and waiting for the HTTP response. --- lib/core/ogs-macros.h | 3 +++ lib/core/ogs-pool.h | 2 ++ lib/sbi/context.c | 18 +++++++-------- lib/sbi/context.h | 4 +++- lib/sbi/path.c | 52 ++++++++++++++++++++++++++++++------------- src/amf/amf-sm.c | 43 ++++++++++++++++++++++++----------- src/amf/sbi-path.c | 10 +++++---- src/ausf/ausf-sm.c | 29 ++++++++++++++++++------ src/bsf/bsf-sm.c | 22 ++++++++++++++---- src/pcf/pcf-sm.c | 44 ++++++++++++++++++++++++------------ src/scp/scp-sm.c | 10 +++++++-- src/smf/smf-sm.c | 36 +++++++++++++++++++++--------- src/udm/udm-sm.c | 36 +++++++++++++++++++++--------- tests/af/af-sm.c | 29 ++++++++++++++++++------ 14 files changed, 242 insertions(+), 96 deletions(-) diff --git a/lib/core/ogs-macros.h b/lib/core/ogs-macros.h index 85710a6d96..630c7fbc22 100644 --- a/lib/core/ogs-macros.h +++ b/lib/core/ogs-macros.h @@ -222,6 +222,9 @@ static ogs_inline ogs_uint24_t ogs_htobe24(ogs_uint24_t x) ((__oBJ)->reference_count)-- #define OGS_OBJECT_IS_REF(__oBJ) ((__oBJ)->reference_count > 1) +#define OGS_POINTER_TO_UINT(u) ((uintptr_t)(u)) +#define OGS_UINT_TO_POINTER(u) ((void *)(uintptr_t)(u)) + #ifdef __cplusplus } #endif diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index 5df5a4f9f0..e8a696d9c9 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -165,6 +165,8 @@ typedef int32_t ogs_pool_id_t; } while (0) #define ogs_pool_id_free(pool, node) do { \ + ogs_assert(((node)->id) >= OGS_MIN_POOL_ID && \ + ((node)->id) <= OGS_MAX_POOL_ID); \ ogs_hash_set((pool)->id_hash, \ &((node)->id), sizeof(ogs_pool_id_t), NULL); \ ogs_pool_free(pool, node); \ diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 12ab902340..703a12facb 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -2266,12 +2266,11 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( ogs_assert(sbi_object); - ogs_pool_alloc(&xact_pool, &xact); + ogs_pool_id_calloc(&xact_pool, &xact); if (!xact) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_alloc() failed"); return NULL; } - memset(xact, 0, sizeof(ogs_sbi_xact_t)); xact->sbi_object = sbi_object; xact->service_type = service_type; @@ -2301,13 +2300,14 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( xact->discovery_option = discovery_option; xact->t_response = ogs_timer_add( - ogs_app()->timer_mgr, ogs_timer_sbi_client_wait_expire, xact); + ogs_app()->timer_mgr, ogs_timer_sbi_client_wait_expire, + OGS_UINT_TO_POINTER(xact->id)); if (!xact->t_response) { ogs_error("ogs_timer_add() failed"); if (xact->discovery_option) ogs_sbi_discovery_option_free(xact->discovery_option); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); return NULL; } @@ -2324,7 +2324,7 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( ogs_sbi_discovery_option_free(xact->discovery_option); ogs_timer_delete(xact->t_response); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); return NULL; } @@ -2383,7 +2383,7 @@ void ogs_sbi_xact_remove(ogs_sbi_xact_t *xact) ogs_free(xact->target_apiroot); ogs_list_remove(&sbi_object->xact_list, xact); - ogs_pool_free(&xact_pool, xact); + ogs_pool_id_free(&xact_pool, xact); } void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object) @@ -2396,9 +2396,9 @@ void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object) ogs_sbi_xact_remove(xact); } -ogs_sbi_xact_t *ogs_sbi_xact_cycle(ogs_sbi_xact_t *xact) +ogs_sbi_xact_t *ogs_sbi_xact_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&xact_pool, xact); + return ogs_pool_find_by_id(&xact_pool, id); } ogs_sbi_subscription_spec_t *ogs_sbi_subscription_spec_add( diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 82052913e0..1f422e6949 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -216,6 +216,8 @@ typedef ogs_sbi_request_t *(*ogs_sbi_build_f)( typedef struct ogs_sbi_xact_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + ogs_sbi_service_type_e service_type; OpenAPI_nf_type_e requester_nf_type; ogs_sbi_discovery_option_t *discovery_option; @@ -545,7 +547,7 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( ogs_sbi_build_f build, void *context, void *data); void ogs_sbi_xact_remove(ogs_sbi_xact_t *xact); void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object); -ogs_sbi_xact_t *ogs_sbi_xact_cycle(ogs_sbi_xact_t *xact); +ogs_sbi_xact_t *ogs_sbi_xact_find_by_id(ogs_pool_id_t id); ogs_sbi_subscription_spec_t *ogs_sbi_subscription_spec_add( OpenAPI_nf_type_e nf_type, const char *service_name); diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 76ff33d3a5..218b2705a8 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -90,6 +90,7 @@ static int client_discover_cb( ogs_event_t *e = NULL; ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = 0; ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -99,10 +100,10 @@ static int client_discover_cb( ogs_hash_index_t *hi = NULL; char *producer_id = NULL; - xact = data; - ogs_assert(xact); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - xact = ogs_sbi_xact_cycle(xact); + xact = ogs_sbi_xact_find_by_id(xact_id); if (!xact) { ogs_error("SBI transaction has already been removed"); if (response) @@ -349,7 +350,8 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) ogs_free(apiroot); rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, ogs_sbi_client_handler, request, xact); + scp_client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; @@ -486,7 +488,8 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) } rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, client_discover_cb, request, xact); + scp_client, client_discover_cb, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; } @@ -498,7 +501,8 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) /* If `client` instance is available, use direct communication */ rc = ogs_sbi_send_request_to_client( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); return (rc == true) ? OGS_OK : OGS_ERROR; @@ -558,7 +562,8 @@ int ogs_sbi_discover_only(ogs_sbi_xact_t *xact) } rc = ogs_sbi_client_send_request( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -680,7 +685,8 @@ bool ogs_sbi_send_request_to_nf_instance( } rc = ogs_sbi_client_send_request( - nrf_client, sepp_discover_handler, nrf_request, xact); + nrf_client, sepp_discover_handler, nrf_request, + OGS_UINT_TO_POINTER(xact->id)); if (rc == false) { ogs_error("ogs_sbi_client_send_request() failed"); ogs_sbi_xact_remove(xact); @@ -693,7 +699,8 @@ bool ogs_sbi_send_request_to_nf_instance( } rc = ogs_sbi_send_request_to_client( - client, ogs_sbi_client_handler, request, xact); + client, ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id)); if (rc == false) { ogs_error("ogs_sbi_send_request_to_client() failed"); ogs_sbi_xact_remove(xact); @@ -856,26 +863,40 @@ static int sepp_discover_handler( char *strerror = NULL; ogs_sbi_message_t message; - ogs_sbi_xact_t *xact = data; + ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_client_t *scp_client = NULL, *sepp_client = NULL; - ogs_assert(xact); - request = xact->request; - ogs_assert(request); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - if (status != OGS_OK) { + xact = ogs_sbi_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("SBI transaction has already been removed"); + if (response) + ogs_sbi_response_free(response); + return OGS_ERROR; + } + + if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "sepp_discover_handler() failed [%d]", status); + if (response) + ogs_sbi_response_free(response); + ogs_sbi_xact_remove(xact); + return OGS_ERROR; } ogs_assert(response); + request = xact->request; + ogs_assert(request); rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { @@ -915,7 +936,8 @@ static int sepp_discover_handler( if (false == ogs_sbi_client_send_via_scp_or_sepp( scp_client ? scp_client : sepp_client, - ogs_sbi_client_handler, request, xact)) { + ogs_sbi_client_handler, request, + OGS_UINT_TO_POINTER(xact->id))) { strerror = ogs_msprintf("ogs_sbi_client_send_via_scp_or_sepp() failed"); goto cleanup; } diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index e2df53c4d1..25dd34c117 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -65,6 +65,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; int state = AMF_CREATE_SM_CONTEXT_NO_STATE; ogs_sbi_stream_t *stream = NULL; ogs_sbi_request_t *sbi_request = NULL; @@ -365,8 +366,17 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(sbi_message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(sbi_message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -395,10 +405,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -429,10 +440,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -545,10 +557,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; CASE(OGS_SBI_SERVICE_NAME_NNSSF_NSSELECTION) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -667,9 +680,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 2dc1772a66..ee3c6cb498 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -211,6 +211,7 @@ static int client_discover_cb( ogs_sbi_message_t message; ogs_sbi_xact_t *xact = NULL; + ogs_pool_id_t xact_id = 0; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -218,10 +219,10 @@ static int client_discover_cb( ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; - xact = data; - ogs_assert(xact); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); - xact = ogs_sbi_xact_cycle(xact); + xact = ogs_sbi_xact_find_by_id(xact_id); if (!xact) { ogs_error("SBI transaction has already been removed"); if (response) @@ -391,7 +392,8 @@ int amf_sess_sbi_discover_by_nsi( } return ogs_sbi_client_send_request( - client, client_discover_cb, xact->request, xact) == true ? OGS_OK : OGS_ERROR; + client, client_discover_cb, xact->request, + OGS_UINT_TO_POINTER(xact->id)) == true ? OGS_OK : OGS_ERROR; } void amf_sbi_send_activating_session( diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index a6ac432c2c..31689e8d6e 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -46,6 +46,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; ausf_ue_t *ausf_ue = NULL; @@ -267,8 +268,17 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -293,10 +303,11 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) break; CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -413,9 +424,13 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/bsf/bsf-sm.c b/src/bsf/bsf-sm.c index 730038e077..31baef4e86 100644 --- a/src/bsf/bsf-sm.c +++ b/src/bsf/bsf-sm.c @@ -51,6 +51,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; bsf_sm_debug(e); @@ -285,8 +286,17 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -393,9 +403,13 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 8b060cb79f..c5ca15b2a3 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -48,6 +48,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -428,8 +429,17 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -458,10 +468,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) CASE(OGS_SBI_RESOURCE_NAME_POLICY_DATA) SWITCH(message.h.resource.component[3]) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -494,10 +505,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) break; CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -552,11 +564,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_PCF_BINDINGS) + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); - - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -687,9 +699,13 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/scp/scp-sm.c b/src/scp/scp-sm.c index 587ab1ac46..4b2fda0d4f 100644 --- a/src/scp/scp-sm.c +++ b/src/scp/scp-sm.c @@ -47,6 +47,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; scp_sm_debug(e); @@ -297,9 +298,14 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_fatal("xact_id = %d", sbi_xact_id); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 40715ea970..ef4c679a46 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -77,6 +77,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_response_t *sbi_response = NULL; ogs_sbi_message_t sbi_message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; ogs_nas_5gs_message_t nas_message; ogs_pkbuf_t *pkbuf = NULL; @@ -763,8 +764,17 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(sbi_message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(sbi_message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -791,10 +801,11 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -829,10 +840,11 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) int state = 0; bool unknown_res_status = false; - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -988,9 +1000,13 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index 754c3b9fd7..36ee9879f8 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -47,6 +47,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; udm_ue_t *udm_ue = NULL; udm_sess_t *sess = NULL; @@ -337,8 +338,17 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -367,10 +377,11 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTION_DATA) SWITCH(message.h.resource.component[3]) CASE(OGS_SBI_RESOURCE_NAME_SMF_REGISTRATIONS) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -409,10 +420,11 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) break; DEFAULT - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -534,9 +546,13 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; diff --git a/tests/af/af-sm.c b/tests/af/af-sm.c index ba19eb63ee..b1158388ff 100644 --- a/tests/af/af-sm.c +++ b/tests/af/af-sm.c @@ -52,6 +52,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; + ogs_pool_id_t sbi_xact_id = 0; af_sm_debug(e); @@ -278,8 +279,17 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); + if (!sbi_xact) { + /* CLIENT_WAIT timer could remove SBI transaction + * before receiving SBI message */ + ogs_error("SBI transaction has already been removed"); + break; + } SWITCH(message.h.method) CASE(OGS_SBI_HTTP_METHOD_GET) @@ -306,10 +316,11 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NBSF_MANAGEMENT) SWITCH(message.h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_PCF_BINDINGS) - sbi_xact = e->h.sbi.data; - ogs_assert(sbi_xact); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); - sbi_xact = ogs_sbi_xact_cycle(sbi_xact); + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ @@ -478,9 +489,13 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) * 4. timer expiration event is processed. (double-free SBI xact) * * To avoid double-free SBI xact, - * we need to check ogs_sbi_xact_cycle() + * we need to check ogs_sbi_xact_find_by_id() */ - sbi_xact = ogs_sbi_xact_cycle(e->h.sbi.data); + sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && + sbi_xact_id <= OGS_MAX_POOL_ID); + + sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { ogs_error("SBI transaction has already been removed"); break; From 6cb518539bcbdfa5e2561c1a781d1b106e77b72a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 12 Jun 2024 14:35:05 +0900 Subject: [PATCH 134/323] [POOL] refactor memory in HTTP server (#3196) Removed ogs_pool_cycle() from HTTP2 session and stream context and changed it to find by hash id. --- lib/pfcp/xact.h | 2 +- lib/sbi/context.c | 4 +- lib/sbi/context.h | 3 +- lib/sbi/mhd-server.c | 39 ++++++--- lib/sbi/nghttp2-server.c | 44 ++++++---- lib/sbi/server.c | 18 ++-- lib/sbi/server.h | 13 ++- src/amf/amf-sm.c | 30 +++++-- src/ausf/ausf-sm.c | 39 +++++++-- src/ausf/sbi-path.c | 4 +- src/ausf/ue-sm.c | 27 ++++-- src/bsf/bsf-sm.c | 25 ++++-- src/bsf/sbi-path.c | 4 +- src/nrf/nf-sm.c | 28 +++++-- src/nrf/nrf-sm.c | 14 +++- src/nssf/nssf-sm.c | 15 +++- src/pcf/am-sm.c | 27 ++++-- src/pcf/nnrf-handler.c | 5 +- src/pcf/pcf-sm.c | 57 ++++++++++--- src/pcf/sbi-path.c | 12 ++- src/pcf/sm-sm.c | 27 ++++-- src/scp/context.c | 6 +- src/scp/context.h | 4 +- src/scp/sbi-path.c | 92 +++++++++++++++------ src/scp/scp-sm.c | 23 ++++-- src/sepp/context.c | 6 +- src/sepp/context.h | 4 +- src/sepp/handshake-sm.c | 41 ++++++++-- src/sepp/sbi-path.c | 39 +++++++-- src/sepp/sepp-sm.c | 14 +++- src/smf/gsm-sm.c | 172 ++++++++++++++++++++++++++++++++------- src/smf/n4-handler.c | 4 +- src/smf/nas-path.c | 10 ++- src/smf/ngap-path.c | 9 +- src/smf/pfcp-path.c | 26 +++++- src/smf/sbi-path.c | 7 +- src/smf/smf-sm.c | 45 ++++++---- src/udm/sbi-path.c | 6 +- src/udm/sess-sm.c | 25 +++++- src/udm/udm-sm.c | 50 +++++++++--- src/udm/ue-sm.c | 27 ++++-- src/udr/udr-sm.c | 15 +++- tests/af/af-sm.c | 19 ++++- 43 files changed, 838 insertions(+), 243 deletions(-) diff --git a/lib/pfcp/xact.h b/lib/pfcp/xact.h index 0229883c31..b21f058dff 100644 --- a/lib/pfcp/xact.h +++ b/lib/pfcp/xact.h @@ -74,7 +74,7 @@ typedef struct ogs_pfcp_xact_s { uint8_t gtp_pti; /**< GTP Procedure transaction identity */ uint8_t gtp_cause; /**< GTP Cause Value */ - void *assoc_stream; /**< Associated SBI session */ + ogs_pool_id_t assoc_stream_id; /**< Associated SBI session ID */ bool epc; /**< EPC or 5GC */ diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 703a12facb..337c70e203 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -2268,7 +2268,7 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( ogs_pool_id_calloc(&xact_pool, &xact); if (!xact) { - ogs_error("ogs_pool_id_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 1f422e6949..1520ce0b3e 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -225,7 +225,8 @@ typedef struct ogs_sbi_xact_s { ogs_sbi_request_t *request; ogs_timer_t *t_response; - ogs_sbi_stream_t *assoc_stream; + ogs_pool_id_t assoc_stream_id; + int state; char *target_apiroot; diff --git a/lib/sbi/mhd-server.c b/lib/sbi/mhd-server.c index a5d3eef7fc..c2ca0a97bf 100644 --- a/lib/sbi/mhd-server.c +++ b/lib/sbi/mhd-server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -41,6 +41,9 @@ static bool server_send_response( static ogs_sbi_server_t *server_from_stream(ogs_sbi_stream_t *stream); +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream); +static void *stream_find_by_id(ogs_pool_id_t id); + const ogs_sbi_server_actions_t ogs_mhd_server_actions = { server_init, server_final, @@ -52,6 +55,8 @@ const ogs_sbi_server_actions_t ogs_mhd_server_actions = { server_send_response, server_from_stream, + id_from_stream, + stream_find_by_id, }; static void run(short when, ogs_socket_t fd, void *data); @@ -79,6 +84,8 @@ static void session_timer_expired(void *data); typedef struct ogs_sbi_session_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + struct MHD_Connection *connection; ogs_sbi_request_t *request; @@ -125,9 +132,8 @@ static ogs_sbi_session_t *session_add(ogs_sbi_server_t *server, ogs_assert(request); ogs_assert(connection); - ogs_pool_alloc(&session_pool, &sbi_sess); + ogs_pool_id_calloc(&session_pool, &sbi_sess); ogs_assert(sbi_sess); - memset(sbi_sess, 0, sizeof(ogs_sbi_session_t)); sbi_sess->server = server; sbi_sess->request = request; @@ -137,7 +143,7 @@ static ogs_sbi_session_t *session_add(ogs_sbi_server_t *server, ogs_app()->timer_mgr, session_timer_expired, sbi_sess); if (!sbi_sess->timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&session_pool, sbi_sess); + ogs_pool_id_free(&session_pool, sbi_sess); return NULL; } @@ -170,7 +176,7 @@ static void session_remove(ogs_sbi_session_t *sbi_sess) MHD_resume_connection(connection); - ogs_pool_free(&session_pool, sbi_sess); + ogs_pool_id_free(&session_pool, sbi_sess); } static void session_timer_expired(void *data) @@ -320,12 +326,8 @@ static bool server_send_rspmem_persistent( ogs_sbi_session_t *sbi_sess = NULL; ogs_assert(response); - - sbi_sess = ogs_pool_cycle(&session_pool, (ogs_sbi_session_t *)stream); - if (!sbi_sess) { - ogs_error("session has already been removed"); - return true; - } + sbi_sess = (ogs_sbi_session_t *)stream; + ogs_assert(sbi_sess); connection = sbi_sess->connection; ogs_assert(connection); @@ -571,7 +573,7 @@ static _MHD_Result access_handler( ogs_assert(sbi_sess); ogs_assert(server->cb); - if (server->cb(request, sbi_sess) != OGS_OK) { + if (server->cb(request, OGS_UINT_TO_POINTER(sbi_sess->id)) != OGS_OK) { ogs_warn("server callback error"); ogs_assert(true == ogs_sbi_server_send_error((ogs_sbi_stream_t *)sbi_sess, @@ -608,3 +610,16 @@ static ogs_sbi_server_t *server_from_stream(ogs_sbi_stream_t *stream) return sbi_sess->server; } + +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream) +{ + ogs_sbi_session_t *sbi_sess = (ogs_sbi_session_t *)stream; + + ogs_assert(sbi_sess); + return sbi_sess->id; +} + +static void *stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&session_pool, id); +} diff --git a/lib/sbi/nghttp2-server.c b/lib/sbi/nghttp2-server.c index 4352d46e10..de8cc2a1cf 100644 --- a/lib/sbi/nghttp2-server.c +++ b/lib/sbi/nghttp2-server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,9 @@ static bool server_send_response( static ogs_sbi_server_t *server_from_stream(ogs_sbi_stream_t *stream); +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream); +static void *stream_find_by_id(ogs_pool_id_t id); + const ogs_sbi_server_actions_t ogs_nghttp2_server_actions = { server_init, server_final, @@ -50,6 +53,9 @@ const ogs_sbi_server_actions_t ogs_nghttp2_server_actions = { server_send_response, server_from_stream, + + id_from_stream, + stream_find_by_id, }; struct h2_settings { @@ -81,6 +87,8 @@ typedef struct ogs_sbi_session_s { typedef struct ogs_sbi_stream_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + int32_t stream_id; ogs_sbi_request_t *request; bool memory_overflow; @@ -360,7 +368,9 @@ static int server_start(ogs_sbi_server_t *server, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback); - context = ogs_sbi_server_id_context(server); + ogs_assert(server->id >= OGS_MIN_POOL_ID && + server->id <= OGS_MAX_POOL_ID); + context = ogs_msprintf("%d", server->id); if (!context) { ogs_error("ogs_sbi_server_id_context() failed"); @@ -580,12 +590,7 @@ static bool server_send_rspmem_persistent( return false; } - stream = ogs_pool_cycle(&stream_pool, stream); - if (!stream) { - ogs_error("stream has already been removed"); - return true; - } - + ogs_assert(stream); sbi_sess = stream->session; ogs_assert(sbi_sess); ogs_assert(sbi_sess->session); @@ -706,17 +711,16 @@ static ogs_sbi_stream_t *stream_add( ogs_assert(sbi_sess); - ogs_pool_alloc(&stream_pool, &stream); + ogs_pool_id_calloc(&stream_pool, &stream); if (!stream) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } - memset(stream, 0, sizeof(ogs_sbi_stream_t)); stream->request = ogs_sbi_request_new(); if (!stream->request) { ogs_error("ogs_sbi_request_new() failed"); - ogs_pool_free(&stream_pool, stream); + ogs_pool_id_free(&stream_pool, stream); return NULL; } @@ -743,7 +747,7 @@ static void stream_remove(ogs_sbi_stream_t *stream) ogs_assert(stream->request); ogs_sbi_request_free(stream->request); - ogs_pool_free(&stream_pool, stream); + ogs_pool_id_free(&stream_pool, stream); } static void stream_remove_all(ogs_sbi_session_t *sbi_sess) @@ -756,6 +760,17 @@ static void stream_remove_all(ogs_sbi_session_t *sbi_sess) stream_remove(stream); } +static ogs_pool_id_t id_from_stream(ogs_sbi_stream_t *stream) +{ + ogs_assert(stream); + return stream->id; +} + +static void *stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&stream_pool, id); +} + static ogs_sbi_session_t *session_add( ogs_sbi_server_t *server, ogs_sock_t *sock) { @@ -1169,7 +1184,8 @@ static int on_frame_recv(nghttp2_session *session, break; } - if (server->cb(request, stream) != OGS_OK) { + if (server->cb(request, + OGS_UINT_TO_POINTER(stream->id)) != OGS_OK) { ogs_warn("server callback error"); ogs_assert(true == ogs_sbi_server_send_error(stream, diff --git a/lib/sbi/server.c b/lib/sbi/server.c index 49cf3015ef..f0c1e207e2 100644 --- a/lib/sbi/server.c +++ b/lib/sbi/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -62,9 +62,8 @@ ogs_sbi_server_t *ogs_sbi_server_add( ogs_assert(addr); ogs_assert(scheme); - ogs_pool_alloc(&server_pool, &server); + ogs_pool_id_calloc(&server_pool, &server); ogs_assert(server); - memset(server, 0, sizeof(ogs_sbi_server_t)); if (interface) server->interface = ogs_strdup(interface); @@ -114,7 +113,7 @@ void ogs_sbi_server_remove(ogs_sbi_server_t *server) if (server->cert) ogs_free(server->cert); - ogs_pool_free(&server_pool, server); + ogs_pool_id_free(&server_pool, server); } void ogs_sbi_server_remove_all(void) @@ -238,12 +237,17 @@ bool ogs_sbi_server_send_error(ogs_sbi_stream_t *stream, ogs_sbi_server_t *ogs_sbi_server_from_stream(ogs_sbi_stream_t *stream) { - return ogs_sbi_server_actions.from_stream(stream); + return ogs_sbi_server_actions.server_from_stream(stream); } -char *ogs_sbi_server_id_context(ogs_sbi_server_t *server) +ogs_pool_id_t ogs_sbi_id_from_stream(ogs_sbi_stream_t *stream) { - return ogs_msprintf("%d", (int)ogs_pool_index(&server_pool, server)); + return ogs_sbi_server_actions.id_from_stream(stream); +} + +void *ogs_sbi_stream_find_by_id(ogs_pool_id_t id) +{ + return ogs_sbi_server_actions.stream_find_by_id(id); } static ogs_sbi_server_t *ogs_sbi_server_find_by_interface( diff --git a/lib/sbi/server.h b/lib/sbi/server.h index ddd5e96c6e..af58a0cf14 100644 --- a/lib/sbi/server.h +++ b/lib/sbi/server.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -37,6 +37,8 @@ typedef struct ogs_sbi_server_s { ogs_socknode_t node; ogs_sockaddr_t *advertise; + ogs_pool_id_t id; + char *interface; OpenAPI_uri_scheme_e scheme; char *private_key, *cert; @@ -64,7 +66,10 @@ typedef struct ogs_sbi_server_actions_s { bool (*send_response)( ogs_sbi_stream_t *stream, ogs_sbi_response_t *response); - ogs_sbi_server_t *(*from_stream)(ogs_sbi_stream_t *stream); + ogs_sbi_server_t *(*server_from_stream)(ogs_sbi_stream_t *stream); + + ogs_pool_id_t (*id_from_stream)(ogs_sbi_stream_t *stream); + void *(*stream_find_by_id)(ogs_pool_id_t id); } ogs_sbi_server_actions_t; void ogs_sbi_server_init(int num_of_session_pool, int num_of_stream_pool); @@ -96,7 +101,9 @@ bool ogs_sbi_server_send_problem( ogs_sbi_stream_t *stream, OpenAPI_problem_details_t *problem); ogs_sbi_server_t *ogs_sbi_server_from_stream(ogs_sbi_stream_t *stream); -char *ogs_sbi_server_id_context(ogs_sbi_server_t *server); + +ogs_pool_id_t ogs_sbi_id_from_stream(ogs_sbi_stream_t *stream); +void *ogs_sbi_stream_find_by_id(ogs_pool_id_t id); ogs_sbi_server_t *ogs_sbi_server_first(void); ogs_sbi_server_t *ogs_sbi_server_next(ogs_sbi_server_t *current); diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 25dd34c117..8ed983a9ac 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -68,6 +68,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_pool_id_t sbi_xact_id = 0; int state = AMF_CREATE_SM_CONTEXT_NO_STATE; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -90,8 +91,16 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_request = e->h.sbi.request; ogs_assert(sbi_request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&sbi_message, sbi_request); if (rv != OGS_OK) { @@ -374,7 +383,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -413,7 +423,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -448,7 +459,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -565,7 +577,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -688,7 +701,8 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index 31689e8d6e..87b9fa62e1 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -64,8 +65,16 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -276,7 +285,8 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -311,14 +321,17 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } ausf_ue = (ausf_ue_t *)sbi_xact->sbi_object; ogs_assert(ausf_ue); - e->h.sbi.data = sbi_xact->assoc_stream; + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -432,16 +445,24 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed [%d]", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, diff --git a/src/ausf/sbi-path.c b/src/ausf/sbi-path.c index 34d252b384..fee434b4f4 100644 --- a/src/ausf/sbi-path.c +++ b/src/ausf/sbi-path.c @@ -100,7 +100,9 @@ int ausf_sbi_discover_and_send( return OGS_ERROR; } - xact->assoc_stream = stream; + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { diff --git a/src/ausf/ue-sm.c b/src/ausf/ue-sm.c index a701aac964..b67ac4f68d 100644 --- a/src/ausf/ue-sm.c +++ b/src/ausf/ue-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,6 +56,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ausf_ue_t *ausf_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -76,8 +77,16 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) @@ -145,8 +154,16 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ausf_ue = e->ausf_ue; ogs_assert(ausf_ue); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) diff --git a/src/bsf/bsf-sm.c b/src/bsf/bsf-sm.c index 31baef4e86..6f8124e82a 100644 --- a/src/bsf/bsf-sm.c +++ b/src/bsf/bsf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -44,6 +44,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) bsf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -67,8 +68,16 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -294,7 +303,8 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -411,11 +421,14 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */ diff --git a/src/bsf/sbi-path.c b/src/bsf/sbi-path.c index 5d5383ad41..33284baa8b 100644 --- a/src/bsf/sbi-path.c +++ b/src/bsf/sbi-path.c @@ -100,7 +100,9 @@ int bsf_sbi_discover_and_send( return OGS_ERROR; } - xact->assoc_stream = stream; + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { diff --git a/src/nrf/nf-sm.c b/src/nrf/nf-sm.c index 545d68bd04..e012ae2911 100644 --- a/src/nrf/nf-sm.c +++ b/src/nrf/nf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019,2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -85,6 +85,7 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -105,8 +106,16 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM) @@ -176,6 +185,7 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_sbi_response_t *response = NULL; @@ -218,8 +228,16 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NNRF_NFM) diff --git a/src/nrf/nrf-sm.c b/src/nrf/nrf-sm.c index 4b13b79d93..beebe48910 100644 --- a/src/nrf/nrf-sm.c +++ b/src/nrf/nrf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) { int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -63,8 +64,15 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { diff --git a/src/nssf/nssf-sm.c b/src/nssf/nssf-sm.c index 9bd349ee49..4e6a97f4f5 100644 --- a/src/nssf/nssf-sm.c +++ b/src/nssf/nssf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -43,6 +43,7 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -64,8 +65,16 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { diff --git a/src/pcf/am-sm.c b/src/pcf/am-sm.c index 74c1dacd91..d29d5e0c2a 100644 --- a/src/pcf/am-sm.c +++ b/src/pcf/am-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_ue_t *pcf_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -60,8 +61,16 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) @@ -91,8 +100,16 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) diff --git a/src/pcf/nnrf-handler.c b/src/pcf/nnrf-handler.c index 35fb52be36..64ab2c487b 100644 --- a/src/pcf/nnrf-handler.c +++ b/src/pcf/nnrf-handler.c @@ -49,7 +49,10 @@ void pcf_nnrf_handle_nf_discover( ogs_assert(requester_nf_type); discovery_option = xact->discovery_option; - stream = xact->assoc_stream; + + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); SearchResult = recvmsg->SearchResult; if (!SearchResult) { diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index c5ca15b2a3..3b01a6a9ca 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -39,6 +39,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -70,8 +71,16 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -437,7 +446,8 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -476,14 +486,19 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed [%d]", + sbi_xact_id); break; } pcf_ue = (pcf_ue_t *)sbi_xact->sbi_object; ogs_assert(pcf_ue); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -513,14 +528,19 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sess = (pcf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -572,14 +592,17 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sess = (pcf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -707,15 +730,17 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); service_type = sbi_xact->service_type; @@ -755,6 +780,12 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) } ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed [%d]", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index 2dff9a07f7..b012dc89a1 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -146,7 +146,11 @@ static int pcf_sbi_discover_and_send( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { @@ -196,7 +200,11 @@ int pcf_sess_sbi_discover_only( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } return ogs_sbi_discover_only(xact); } diff --git a/src/pcf/sm-sm.c b/src/pcf/sm-sm.c index 527f40930b..6e48aa1ec6 100644 --- a/src/pcf/sm-sm.c +++ b/src/pcf/sm-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -42,6 +42,7 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -64,8 +65,16 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) @@ -161,8 +170,16 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) diff --git a/src/scp/context.c b/src/scp/context.c index 1014f0223b..46f42ae3e6 100644 --- a/src/scp/context.c +++ b/src/scp/context.c @@ -304,11 +304,11 @@ int scp_context_parse_config(void) return OGS_OK; } -scp_assoc_t *scp_assoc_add(ogs_sbi_stream_t *stream) +scp_assoc_t *scp_assoc_add(ogs_pool_id_t stream_id) { scp_assoc_t *assoc = NULL; - ogs_assert(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); ogs_pool_alloc(&scp_assoc_pool, &assoc); if (!assoc) { @@ -318,7 +318,7 @@ scp_assoc_t *scp_assoc_add(ogs_sbi_stream_t *stream) } memset(assoc, 0, sizeof *assoc); - assoc->stream = stream; + assoc->stream_id = stream_id; assoc->discovery_option = ogs_sbi_discovery_option_new(); ogs_assert(assoc->discovery_option); diff --git a/src/scp/context.h b/src/scp/context.h index f7b26e53cc..e9420d63f5 100644 --- a/src/scp/context.h +++ b/src/scp/context.h @@ -43,7 +43,7 @@ typedef struct scp_assoc_s scp_assoc_t; typedef struct scp_assoc_s { ogs_lnode_t lnode; - ogs_sbi_stream_t *stream; + ogs_pool_id_t stream_id; ogs_sbi_client_t *client; ogs_sbi_client_t *nrf_client; @@ -67,7 +67,7 @@ scp_context_t *scp_self(void); int scp_context_parse_config(void); -scp_assoc_t *scp_assoc_add(ogs_sbi_stream_t *stream); +scp_assoc_t *scp_assoc_add(ogs_pool_id_t stream_id); void scp_assoc_remove(scp_assoc_t *assoc); void scp_assoc_remove_all(void); diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 9c6eb6aead..86d148271b 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -110,7 +110,8 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_hash_index_t *hi; ogs_sbi_client_t *client = NULL, *nrf_client = NULL, *next_scp = NULL; ogs_sbi_client_t *sepp_client = NULL; - ogs_sbi_stream_t *stream = data; + ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; @@ -133,10 +134,19 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_assert(request); ogs_assert(request->h.uri); - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } /* SCP Context */ - assoc = scp_assoc_add(stream); + assoc = scp_assoc_add(stream_id); if (!assoc) { ogs_error("scp_assoc_add() failed"); return OGS_ERROR; @@ -621,10 +631,13 @@ static int response_handler( { scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_assert(assoc); - stream = assoc->stream; - ogs_assert(stream); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -632,13 +645,17 @@ static int response_handler( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "response_handler() failed [%d]", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "response_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); - return OGS_ERROR; } @@ -652,9 +669,14 @@ static int response_handler( ogs_error("No NF-Instance ID"); } - ogs_expect(true == ogs_sbi_server_send_response(stream, response)); scp_assoc_remove(assoc); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } + ogs_expect(true == ogs_sbi_server_send_response(stream, response)); + return OGS_OK; } @@ -667,6 +689,7 @@ static int nf_discover_handler( scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -680,9 +703,6 @@ static int nf_discover_handler( ogs_sbi_client_t *sepp_client = NULL; ogs_assert(assoc); - stream = assoc->stream; - - ogs_assert(stream); request = assoc->request; ogs_assert(request); service_type = assoc->service_type; @@ -695,18 +715,27 @@ static int nf_discover_handler( discovery_option = assoc->discovery_option; ogs_assert(discovery_option); + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); + if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "nf_discover_handler() failed [%d]", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "nf_discover_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); return OGS_ERROR; } @@ -789,6 +818,12 @@ static int nf_discover_handler( ogs_assert(strerror); ogs_error("%s", strerror); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, @@ -796,8 +831,6 @@ static int nf_discover_handler( ogs_free(strerror); - scp_assoc_remove(assoc); - ogs_sbi_response_free(response); ogs_sbi_message_free(&message); @@ -813,17 +846,17 @@ static int sepp_discover_handler( scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_client_t *sepp_client = NULL; ogs_assert(assoc); - ogs_assert(assoc->target_apiroot); - stream = assoc->stream; - ogs_assert(stream); - request = assoc->request; - ogs_assert(request); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -831,12 +864,17 @@ static int sepp_discover_handler( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "sepp_discover_handler() failed [%d]", status); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "sepp_discover_handler() failed", NULL, NULL)); - scp_assoc_remove(assoc); return OGS_ERROR; } @@ -869,6 +907,10 @@ static int sepp_discover_handler( goto cleanup; } + ogs_assert(assoc->target_apiroot); + request = assoc->request; + ogs_assert(request); + if (false == send_request( sepp_client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); @@ -884,6 +926,12 @@ static int sepp_discover_handler( ogs_assert(strerror); ogs_error("%s", strerror); + scp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error( stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, @@ -891,8 +939,6 @@ static int sepp_discover_handler( ogs_free(strerror); - scp_assoc_remove(assoc); - ogs_sbi_response_free(response); ogs_sbi_message_free(&message); diff --git a/src/scp/scp-sm.c b/src/scp/scp-sm.c index 4b2fda0d4f..c77a0b345c 100644 --- a/src/scp/scp-sm.c +++ b/src/scp/scp-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -63,8 +64,16 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -301,17 +310,19 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) * we need to check ogs_sbi_xact_find_by_id() */ sbi_xact_id = OGS_POINTER_TO_UINT(e->h.sbi.data); - ogs_fatal("xact_id = %d", sbi_xact_id); ogs_assert(sbi_xact_id >= OGS_MIN_POOL_ID && sbi_xact_id <= OGS_MAX_POOL_ID); sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */ diff --git a/src/sepp/context.c b/src/sepp/context.c index 90f334dceb..f76ead345d 100644 --- a/src/sepp/context.c +++ b/src/sepp/context.c @@ -538,11 +538,11 @@ sepp_node_t *sepp_node_find_by_plmn_id(uint16_t mcc, uint16_t mnc) return NULL; } -sepp_assoc_t *sepp_assoc_add(ogs_sbi_stream_t *stream) +sepp_assoc_t *sepp_assoc_add(ogs_pool_id_t stream_id) { sepp_assoc_t *assoc = NULL; - ogs_assert(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); ogs_pool_alloc(&sepp_assoc_pool, &assoc); if (!assoc) { @@ -552,7 +552,7 @@ sepp_assoc_t *sepp_assoc_add(ogs_sbi_stream_t *stream) } memset(assoc, 0, sizeof *assoc); - assoc->stream = stream; + assoc->stream_id = stream_id; ogs_list_add(&self.assoc_list, assoc); diff --git a/src/sepp/context.h b/src/sepp/context.h index 89e47d217f..81cc45d327 100644 --- a/src/sepp/context.h +++ b/src/sepp/context.h @@ -82,7 +82,7 @@ typedef struct sepp_assoc_s sepp_assoc_t; typedef struct sepp_assoc_s { ogs_lnode_t lnode; - ogs_sbi_stream_t *stream; + ogs_pool_id_t stream_id; ogs_sbi_client_t *client; ogs_sbi_client_t *nrf_client; @@ -106,7 +106,7 @@ void sepp_node_remove_all(void); sepp_node_t *sepp_node_find_by_receiver(char *receiver); sepp_node_t *sepp_node_find_by_plmn_id(uint16_t mcc, uint16_t mnc); -sepp_assoc_t *sepp_assoc_add(ogs_sbi_stream_t *stream); +sepp_assoc_t *sepp_assoc_add(ogs_pool_id_t stream_id); void sepp_assoc_remove(sepp_assoc_t *assoc); void sepp_assoc_remove_all(void); diff --git a/src/sepp/handshake-sm.c b/src/sepp/handshake-sm.c index 0ff9d7a0e2..99cab8858e 100644 --- a/src/sepp/handshake-sm.c +++ b/src/sepp/handshake-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -87,6 +87,7 @@ void sepp_handshake_state_will_establish(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -118,8 +119,16 @@ void sepp_handshake_state_will_establish(ogs_fsm_t *s, sepp_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE) @@ -282,6 +291,7 @@ void sepp_handshake_state_established(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -304,8 +314,16 @@ void sepp_handshake_state_established(ogs_fsm_t *s, sepp_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE) @@ -420,6 +438,7 @@ void sepp_handshake_state_terminated(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -447,8 +466,16 @@ void sepp_handshake_state_terminated(ogs_fsm_t *s, sepp_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_N32C_HANDSHAKE) diff --git a/src/sepp/sbi-path.c b/src/sepp/sbi-path.c index 78b68ec682..62a5e4c47e 100644 --- a/src/sepp/sbi-path.c +++ b/src/sepp/sbi-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2023-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -158,6 +158,7 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_hash_index_t *hi; ogs_sbi_client_t *client = NULL, *scp_client = NULL; ogs_sbi_stream_t *stream = data; + ogs_pool_id_t stream_id = 0; ogs_sbi_server_t *server = NULL; ogs_sbi_request_t sepp_request; @@ -177,7 +178,17 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_assert(request); ogs_assert(request->h.uri); - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } + server = ogs_sbi_server_from_stream(stream); ogs_assert(server); @@ -207,7 +218,7 @@ static int request_handler(ogs_sbi_request_t *request, void *data) sepp_node_t *sepp_node = NULL; bool do_not_remove_custom_header; - assoc = sepp_assoc_add(stream); + assoc = sepp_assoc_add(stream_id); if (!assoc) { ogs_error("sepp_assoc_add() failed"); return OGS_ERROR; @@ -408,10 +419,13 @@ static int response_handler( { sepp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_assert(assoc); - stream = assoc->stream; - ogs_assert(stream); + + stream_id = assoc->stream_id; + ogs_assert(stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(stream_id); if (status != OGS_OK) { @@ -419,21 +433,30 @@ static int response_handler( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "response_handler() failed [%d]", status); + sepp_assoc_remove(assoc); + + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, "response_handler() failed", NULL, NULL)); - sepp_assoc_remove(assoc); - return OGS_ERROR; } ogs_assert(response); - ogs_expect(true == ogs_sbi_server_send_response(stream, response)); sepp_assoc_remove(assoc); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + return OGS_ERROR; + } + ogs_expect(true == ogs_sbi_server_send_response(stream, response)); + return OGS_OK; } diff --git a/src/sepp/sepp-sm.c b/src/sepp/sepp-sm.c index 58b484d80f..5fc12be438 100644 --- a/src/sepp/sepp-sm.c +++ b/src/sepp/sepp-sm.c @@ -42,6 +42,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_server_t *server = NULL; @@ -64,8 +65,17 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + server = ogs_sbi_server_from_stream(stream); ogs_assert(server); diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 107b6cc37a..162f6f5e2c 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -1,6 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> - + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -169,6 +168,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -249,8 +249,16 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -289,11 +297,19 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); smf_ue = sess->smf_ue; ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST: rv = gsm_handle_pdu_session_establishment_request(sess, stream, @@ -447,6 +463,7 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; int state = 0; @@ -474,8 +491,15 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(sbi_message->h.resource.component[1]) CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) @@ -735,6 +759,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; ogs_gtp1_message_t *gtp1_message = NULL; @@ -874,8 +899,16 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -918,7 +951,10 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) - stream = e->h.sbi.data; + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + if (stream_id >= OGS_MIN_POOL_ID && stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(stream_id); + state = e->h.sbi.state; SWITCH(sbi_message->h.resource.component[0]) @@ -1062,11 +1098,19 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); smf_ue = sess->smf_ue; ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST: rv = gsm_handle_pdu_session_modification_request(sess, stream, @@ -1128,14 +1172,22 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - stream = e->h.sbi.data; - ogs_assert(stream); smf_ue = sess->smf_ue; ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + switch (e->ngap.type) { case OpenAPI_n2_sm_info_type_PDU_RES_SETUP_RSP: rv = ngap_handle_pdu_session_resource_setup_response_transfer( @@ -1263,6 +1315,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; ogs_pfcp_xact_t *pfcp_xact = NULL; @@ -1289,8 +1342,15 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) smf_epc_pfcp_send_session_deletion_request(sess, e->gtp_xact)); } else { /* 5GC */ - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } ogs_assert(OGS_OK == smf_5gc_pfcp_send_session_deletion_request( @@ -1334,7 +1394,11 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) } else { int trigger; - stream = pfcp_xact->assoc_stream; + if (pfcp_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + pfcp_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id( + pfcp_xact->assoc_stream_id); + trigger = pfcp_xact->delete_trigger; ogs_assert(trigger); @@ -1429,8 +1493,15 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) ogs_pkbuf_t *n1smbuf = NULL; - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } ogs_error("[%s:%d] state [%d] res_status [%d]", smf_ue->supi, sess->psi, @@ -1586,6 +1657,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -1605,8 +1677,16 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) @@ -1669,8 +1749,15 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL) ogs_pkbuf_t *n1smbuf = NULL; - stream = e->h.sbi.data; - ogs_assert(stream); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } ogs_error("[%s:%d] state [%d] res_status [%d]", smf_ue->supi, sess->psi, @@ -1692,14 +1779,22 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - stream = e->h.sbi.data; - ogs_assert(stream); smf_ue = sess->smf_ue; ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + switch (e->ngap.type) { case OpenAPI_n2_sm_info_type_PDU_RES_SETUP_RSP: /* @@ -1766,11 +1861,19 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - stream = e->h.sbi.data; - ogs_assert(stream); smf_ue = sess->smf_ue; ogs_assert(smf_ue); + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } + switch (nas_message->gsm.h.message_type) { case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE: ogs_assert(true == ogs_sbi_send_http_status_no_content(stream)); @@ -1925,6 +2028,7 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -1945,8 +2049,16 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(sbi_message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION) diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index ec1a63f9b2..8d7f52b7e3 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -258,7 +258,9 @@ void smf_5gc_n4_handle_session_modification_response( ogs_assert(flags); /* 'stream' could be NULL in smf_qos_flow_binding() */ - stream = xact->assoc_stream; + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); if (flags & OGS_PFCP_MODIFY_SESSION) { /* If smf_5gc_pfcp_send_all_pdr_modification_request() is called */ diff --git a/src/smf/nas-path.c b/src/smf/nas-path.c index 615e183e4c..8705d60818 100644 --- a/src/smf/nas-path.c +++ b/src/smf/nas-path.c @@ -30,9 +30,17 @@ void nas_5gs_send_to_gsm( e = smf_event_new(SMF_EVT_5GSM_MESSAGE); ogs_assert(e); + e->sess = sess; - e->h.sbi.data = stream; e->pkbuf = pkbuf; + + if (stream) { + ogs_pool_id_t stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(stream_id);; + } + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); diff --git a/src/smf/ngap-path.c b/src/smf/ngap-path.c index 3240a6b482..ef5e0752bd 100644 --- a/src/smf/ngap-path.c +++ b/src/smf/ngap-path.c @@ -31,9 +31,16 @@ void ngap_send_to_n2sm(smf_sess_t *sess, e = smf_event_new(SMF_EVT_NGAP_MESSAGE); ogs_assert(e); e->sess = sess; - e->h.sbi.data = stream; e->pkbuf = pkbuf; e->ngap.type = type; + + if (stream) { + ogs_pool_id_t stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + e->h.sbi.data = OGS_UINT_TO_POINTER(stream_id);; + } + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 168eeb963d..cb57ef82f5 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -230,7 +230,10 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) smf_ue = sess->smf_ue; ogs_assert(smf_ue); - stream = xact->assoc_stream; + if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); + type = xact->seq[0].type; switch (type) { @@ -486,7 +489,12 @@ int smf_5gc_pfcp_send_all_pdr_modification_request( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -516,7 +524,12 @@ int smf_5gc_pfcp_send_qos_flow_list_modification_request( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -544,7 +557,12 @@ int smf_5gc_pfcp_send_session_deletion_request( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } + xact->delete_trigger = trigger; xact->local_seid = sess->smf_n4_seid; diff --git a/src/smf/sbi-path.c b/src/smf/sbi-path.c index 7edcef793e..17a44c5e8e 100644 --- a/src/smf/sbi-path.c +++ b/src/smf/sbi-path.c @@ -211,7 +211,12 @@ int smf_sbi_discover_and_send( } xact->state = state; - xact->assoc_stream = stream; + + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index ef4c679a46..b93f83d39b 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -70,6 +70,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_message_t *pfcp_message = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -449,8 +450,16 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_EVENT_SBI_SERVER: sbi_request = e->h.sbi.request; ogs_assert(sbi_request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&sbi_message, sbi_request); if (rv != OGS_OK) { @@ -772,7 +781,8 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -809,14 +819,18 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sess = (smf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); + e->h.sbi.state = sbi_xact->state; ogs_sbi_xact_remove(sbi_xact); @@ -848,14 +862,18 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sess = (smf_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); + state = sbi_xact->state; ogs_assert(state); @@ -1008,11 +1026,14 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */ @@ -1036,8 +1057,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: sess = e->sess; ogs_assert(sess); - stream = e->h.sbi.data; - ogs_assert(stream); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -1064,8 +1083,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_NGAP_MESSAGE: sess = e->sess; ogs_assert(sess); - stream = e->h.sbi.data; - ogs_assert(stream); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); diff --git a/src/udm/sbi-path.c b/src/udm/sbi-path.c index 022b4064a1..fa97e72262 100644 --- a/src/udm/sbi-path.c +++ b/src/udm/sbi-path.c @@ -119,7 +119,11 @@ static int udm_sbi_discover_and_send( return OGS_ERROR; } - xact->assoc_stream = stream; + if (stream) { + xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + } r = ogs_sbi_discover_and_send(xact); if (r != OGS_OK) { diff --git a/src/udm/sess-sm.c b/src/udm/sess-sm.c index a6ddc33ec4..5327d5452a 100644 --- a/src/udm/sess-sm.c +++ b/src/udm/sess-sm.c @@ -40,6 +40,7 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -62,8 +63,16 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) @@ -112,8 +121,16 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) case OGS_EVENT_SBI_CLIENT: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index 36ee9879f8..1d6431510f 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -40,6 +40,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -66,8 +67,16 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -346,7 +355,8 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } @@ -385,14 +395,19 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed [%d]", + sbi_xact_id); break; } sess = (udm_sess_t *)sbi_xact->sbi_object; ogs_assert(sess); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -428,14 +443,19 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) if (!sbi_xact) { /* CLIENT_WAIT timer could remove SBI transaction * before receiving SBI message */ - ogs_error("SBI transaction has already been removed"); + ogs_error( + "SBI transaction has already been removed [%d]", + sbi_xact_id); break; } udm_ue = (udm_ue_t *)sbi_xact->sbi_object; ogs_assert(udm_ue); - e->h.sbi.data = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + e->h.sbi.data = + OGS_UINT_TO_POINTER(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); @@ -554,16 +574,24 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) sbi_xact = ogs_sbi_xact_find_by_id(sbi_xact_id); if (!sbi_xact) { - ogs_error("SBI transaction has already been removed"); + ogs_error("SBI transaction has already been removed [%d]", + sbi_xact_id); break; } - stream = sbi_xact->assoc_stream; - ogs_assert(stream); + ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); ogs_sbi_xact_remove(sbi_xact); ogs_error("Cannot receive SBI message"); + + if (!stream) { + ogs_error("STREAM has alreadt been removed [%d]", + sbi_xact->assoc_stream_id); + break; + } ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, diff --git a/src/udm/ue-sm.c b/src/udm/ue-sm.c index cf4164af92..fa5247c45a 100644 --- a/src/udm/ue-sm.c +++ b/src/udm/ue-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -38,6 +38,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_ue_t *udm_ue = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_message_t *message = NULL; int r; @@ -59,8 +60,16 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) case OGS_EVENT_SBI_SERVER: message = e->h.sbi.message; ogs_assert(message); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDM_UEAU) @@ -266,8 +275,16 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_ue = e->udm_ue; ogs_assert(udm_ue); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } SWITCH(message->h.service.name) CASE(OGS_SBI_SERVICE_NAME_NUDR_DR) diff --git a/src/udr/udr-sm.c b/src/udr/udr-sm.c index 3d8c888d67..030fb53a35 100644 --- a/src/udr/udr-sm.c +++ b/src/udr/udr-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -41,6 +41,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -62,8 +63,16 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { diff --git a/tests/af/af-sm.c b/tests/af/af-sm.c index b1158388ff..49e216c9e3 100644 --- a/tests/af/af-sm.c +++ b/tests/af/af-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -45,6 +45,7 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) af_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; + ogs_pool_id_t stream_id = 0; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -68,8 +69,16 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) case OGS_EVENT_SBI_SERVER: request = e->h.sbi.request; ogs_assert(request); - stream = e->h.sbi.data; - ogs_assert(stream); + + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + if (!stream) { + ogs_error("STREAM has already been removed [%d]", stream_id); + break; + } rv = ogs_sbi_parse_request(&message, request); if (rv != OGS_OK) { @@ -501,7 +510,9 @@ void af_state_operational(ogs_fsm_t *s, af_event_t *e) break; } - stream = sbi_xact->assoc_stream; + if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && + sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) + stream = ogs_sbi_stream_find_by_id(sbi_xact->assoc_stream_id); /* Here, we should not use ogs_assert(stream) * since 'namf-comm' service has no an associated stream. */ From c1110573d6df5dce7684f5c276a64de30e57492c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 12 Jun 2024 18:15:17 +0900 Subject: [PATCH 135/323] [POOL] refactor memory in GTP/PFCP xact (#3196) Removed ogs_pool_cycle() from GTP/PFCP transacion and changed it to find by hash id. --- lib/core/ogs-timer.c | 21 --------------------- lib/gtp/xact.c | 15 ++++++--------- lib/gtp/xact.h | 4 +++- lib/pfcp/context.c | 5 ----- lib/pfcp/context.h | 1 - src/mme/mme-context.h | 2 +- src/mme/mme-gtp-path.c | 33 +++++++++++++++++++++------------ src/mme/mme-s11-handler.c | 9 ++++++--- 8 files changed, 37 insertions(+), 53 deletions(-) diff --git a/lib/core/ogs-timer.c b/lib/core/ogs-timer.c index c9dfc47e47..0c45ab8513 100644 --- a/lib/core/ogs-timer.c +++ b/lib/core/ogs-timer.c @@ -73,12 +73,6 @@ void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager) ogs_free(manager); } -static ogs_timer_t *ogs_timer_cycle(ogs_timer_mgr_t *manager, ogs_timer_t *timer) -{ - ogs_assert(manager); - return ogs_pool_cycle(&manager->pool, timer); -} - ogs_timer_t *ogs_timer_add( ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data) { @@ -106,11 +100,6 @@ void ogs_timer_delete_debug(ogs_timer_t *timer, const char *file_line) ogs_assert(timer); manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_delete() failed in %s", file_line); - ogs_assert_if_reached(); - } ogs_timer_stop(timer); @@ -126,11 +115,6 @@ void ogs_timer_start_debug( manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_start() failed in %s", file_line); - ogs_assert_if_reached(); - } if (timer->running == true) ogs_rbtree_delete(&manager->tree, timer); @@ -145,11 +129,6 @@ void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line) ogs_assert(timer); manager = timer->manager; ogs_assert(manager); - timer = ogs_timer_cycle(manager, timer); - if (!timer) { - ogs_fatal("ogs_timer_stop() failed in %s", file_line); - ogs_assert_if_reached(); - } if (timer->running == false) return; diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index 97899ebcbc..5517ad435a 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -75,9 +75,8 @@ ogs_gtp_xact_t *ogs_gtp1_xact_local_create(ogs_gtp_node_t *gnode, ogs_assert(gnode); ogs_assert(hdesc); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = 1; @@ -131,9 +130,8 @@ ogs_gtp_xact_t *ogs_gtp_xact_local_create(ogs_gtp_node_t *gnode, ogs_assert(gnode); ogs_assert(hdesc); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = 2; @@ -184,9 +182,8 @@ static ogs_gtp_xact_t *ogs_gtp_xact_remote_create(ogs_gtp_node_t *gnode, uint8_t ogs_assert(gnode); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->gtp_version = gtp_version; @@ -216,9 +213,9 @@ static ogs_gtp_xact_t *ogs_gtp_xact_remote_create(ogs_gtp_node_t *gnode, uint8_t return xact; } -ogs_gtp_xact_t *ogs_gtp_xact_cycle(ogs_gtp_xact_t *xact) +ogs_gtp_xact_t *ogs_gtp_xact_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pool, xact); + return ogs_pool_find_by_id(&pool, id); } void ogs_gtp_xact_delete_all(ogs_gtp_node_t *gnode) @@ -1183,7 +1180,7 @@ static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact) ogs_list_remove(xact->org == OGS_GTP_LOCAL_ORIGINATOR ? &xact->gnode->local_list : &xact->gnode->remote_list, xact); - ogs_pool_free(&pool, xact); + ogs_pool_id_free(&pool, xact); return OGS_OK; } diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index 4d948e7a5a..ef001d1bb5 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -59,6 +59,8 @@ extern "C" { typedef struct ogs_gtp_xact_s { ogs_lnode_t node; /**< A node of list */ + ogs_pool_id_t id; + /* * Issues #3240 * @@ -159,7 +161,7 @@ ogs_gtp_xact_t *ogs_gtp_xact_local_create(ogs_gtp_node_t *gnode, ogs_gtp2_header_t *hdesc, ogs_pkbuf_t *pkbuf, void (*cb)(ogs_gtp_xact_t *xact, void *data), void *data); -ogs_gtp_xact_t *ogs_gtp_xact_cycle(ogs_gtp_xact_t *xact); +ogs_gtp_xact_t *ogs_gtp_xact_find_by_id(ogs_pool_id_t id); void ogs_gtp_xact_delete_all(ogs_gtp_node_t *gnode); int ogs_gtp1_xact_update_tx(ogs_gtp_xact_t *xact, diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 810939e687..bbc58b001a 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -873,11 +873,6 @@ ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list) return node; } -ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node) -{ - return ogs_pool_cycle(&ogs_pfcp_node_pool, node); -} - void ogs_pfcp_node_free(ogs_pfcp_node_t *node) { ogs_assert(node); diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index aea2e64af7..956a701aa4 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -393,7 +393,6 @@ ogs_pfcp_context_t *ogs_pfcp_self(void); int ogs_pfcp_context_parse_config(const char *local, const char *remote); ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list); -ogs_pfcp_node_t *ogs_pfcp_node_cycle(ogs_pfcp_node_t *node); void ogs_pfcp_node_free(ogs_pfcp_node_t *node); ogs_pfcp_node_t *ogs_pfcp_node_add( diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index aab5b3793a..aaed1f40bd 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -889,7 +889,7 @@ typedef struct mme_bearer_s { * as a list so that we can manage multiple of them. */ struct { - ogs_gtp_xact_t *xact; + ogs_pool_id_t xact_id; } create, delete, notify; struct { ogs_list_t xact_list; diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index aaf0a423ec..345b8e977c 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -390,15 +390,18 @@ int mme_gtp_send_create_bearer_response( ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); + ogs_assert(bearer->create.xact_id >= OGS_MIN_POOL_ID && + bearer->create.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->create.xact_id); + if (!xact) { + ogs_error("GTP transaction(CREATE) has already been removed"); + return OGS_OK; + } + mme_ue = bearer->mme_ue; ogs_assert(mme_ue); sgw_ue = mme_ue->sgw_ue; ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->create.xact); - if (!xact) { - ogs_warn("GTP transaction(CREATE) has already been removed"); - return OGS_OK; - } memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE; @@ -500,15 +503,18 @@ int mme_gtp_send_delete_bearer_response( ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); + ogs_assert(bearer->delete.xact_id >= OGS_MIN_POOL_ID && + bearer->delete.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->delete.xact_id); + if (!xact) { + ogs_error("GTP transaction(DELETE) has already been removed"); + return OGS_OK; + } + mme_ue = bearer->mme_ue; ogs_assert(mme_ue); sgw_ue = mme_ue->sgw_ue; ogs_assert(sgw_ue); - xact = ogs_gtp_xact_cycle(bearer->delete.xact); - if (!xact) { - ogs_warn("GTP transaction(DELETE) has already been removed"); - return OGS_OK; - } memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE; @@ -631,11 +637,14 @@ int mme_gtp_send_downlink_data_notification_ack( ogs_pkbuf_t *s11buf = NULL; ogs_assert(bearer); - xact = ogs_gtp_xact_cycle(bearer->notify.xact); + ogs_assert(bearer->notify.xact_id >= OGS_MIN_POOL_ID && + bearer->notify.xact_id <= OGS_MAX_POOL_ID); + xact = ogs_gtp_xact_find_by_id(bearer->notify.xact_id); if (!xact) { - ogs_warn("GTP transaction(NOTIFY) has already been removed"); + ogs_error("GTP transaction(NOTIFY) has already been removed"); return OGS_OK; } + mme_ue = bearer->mme_ue; ogs_assert(mme_ue); sgw_ue = mme_ue->sgw_ue; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 7dadfcfe66..877903537f 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1028,7 +1028,8 @@ void mme_s11_handle_create_bearer_request( * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->create.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->create.xact_id = xact->id; /* Before Activate DEDICATED bearer, check DEFAULT bearer status */ default_bearer = mme_default_bearer_in_sess(sess); @@ -1329,7 +1330,8 @@ void mme_s11_handle_delete_bearer_request( * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->delete.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->delete.xact_id = xact->id; if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, @@ -1577,7 +1579,8 @@ void mme_s11_handle_downlink_data_notification( * If GTP-xact Holding timer is expired, * OLD bearer->xact memory will be automatically removed. */ - bearer->notify.xact = xact; + ogs_assert(xact->id >= OGS_MIN_POOL_ID && xact->id <= OGS_MAX_POOL_ID); + bearer->notify.xact_id = xact->id; if (noti->cause.presence) { ogs_gtp2_cause_t *cause = noti->cause.data; From 253de8ee25ef021ff14b487b7d46d8b7506b9201 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 17 Jun 2024 17:21:08 +0900 Subject: [PATCH 136/323] [POOL] refactor memory pool in AMF (#3196) Removed ogs_pool_cycle() from AMF memory pool and changed it to find by hash id. --- lib/core/ogs-pool.h | 1 + lib/sbi/context.c | 2 + lib/sbi/context.h | 2 + src/amf/amf-sm.c | 110 +++++++++++-------- src/amf/context.c | 226 +++++++++++++++++++++++----------------- src/amf/context.h | 96 ++++++++++------- src/amf/event.h | 8 +- src/amf/gmm-build.c | 2 +- src/amf/gmm-handler.c | 14 +-- src/amf/gmm-sm.c | 82 ++++++++------- src/amf/namf-handler.c | 13 ++- src/amf/nas-path.c | 155 ++++++++++++++------------- src/amf/ngap-build.c | 40 +++---- src/amf/ngap-handler.c | 60 ++++++----- src/amf/ngap-path.c | 120 ++++++++++----------- src/amf/ngap-sm.c | 6 +- src/amf/nnrf-handler.c | 6 +- src/amf/nnssf-handler.c | 7 +- src/amf/npcf-build.c | 2 +- src/amf/nsmf-build.c | 15 ++- src/amf/nsmf-handler.c | 44 ++++---- src/amf/nudm-handler.c | 4 +- src/amf/sbi-path.c | 46 ++++---- src/amf/timer.c | 14 +-- src/ausf/ausf-sm.c | 4 +- src/ausf/sbi-path.c | 2 +- src/ausf/ue-sm.c | 2 +- src/bsf/bsf-sm.c | 4 +- src/bsf/sbi-path.c | 2 +- src/nrf/nf-sm.c | 4 +- src/nrf/nrf-sm.c | 2 +- src/nssf/nssf-sm.c | 2 +- src/pcf/pcf-sm.c | 4 +- src/pcf/sbi-path.c | 5 +- src/scp/sbi-path.c | 8 +- src/scp/scp-sm.c | 4 +- src/sepp/handshake-sm.c | 6 +- src/sepp/sbi-path.c | 4 +- src/sepp/sepp-sm.c | 2 +- src/smf/gsm-sm.c | 12 +-- src/smf/sbi-path.c | 4 +- src/smf/smf-sm.c | 4 +- src/udm/sbi-path.c | 2 +- src/udm/sess-sm.c | 2 +- src/udm/udm-sm.c | 4 +- src/udm/ue-sm.c | 2 +- src/udr/udr-sm.c | 2 +- tests/af/sbi-path.c | 2 +- 48 files changed, 625 insertions(+), 539 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index e8a696d9c9..b7bebeb826 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -28,6 +28,7 @@ extern "C" { #endif +#define OGS_INVALID_POOL_ID 0 #define OGS_MIN_POOL_ID 1 #define OGS_MAX_POOL_ID 0x7fffffff diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 337c70e203..8d9a7ea12e 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -2257,6 +2257,7 @@ void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object) } ogs_sbi_xact_t *ogs_sbi_xact_add( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -2272,6 +2273,7 @@ ogs_sbi_xact_t *ogs_sbi_xact_add( return NULL; } + xact->sbi_object_id = sbi_object_id; xact->sbi_object = sbi_object; xact->service_type = service_type; xact->requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 1520ce0b3e..12b3e128f4 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -231,6 +231,7 @@ typedef struct ogs_sbi_xact_s { char *target_apiroot; ogs_sbi_object_t *sbi_object; + ogs_pool_id_t sbi_object_id; } ogs_sbi_xact_t; typedef struct ogs_sbi_nf_service_s { @@ -542,6 +543,7 @@ bool ogs_sbi_discovery_option_target_plmn_list_is_matched( void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object); ogs_sbi_xact_t *ogs_sbi_xact_add( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 8ed983a9ac..16612f329e 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -64,11 +64,12 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) amf_sess_t *sess = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; int state = AMF_CREATE_SM_CONTEXT_NO_STATE; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -430,12 +431,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) state = sbi_xact->state; - amf_ue = (amf_ue_t *)sbi_xact->sbi_object; - ogs_assert(amf_ue); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); ogs_sbi_xact_remove(sbi_xact); - amf_ue = amf_ue_cycle(amf_ue); + amf_ue = amf_ue_find_by_id(sbi_object_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -443,7 +445,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->h.sbi.message = &sbi_message;; e->h.sbi.state = state; @@ -466,12 +468,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) state = sbi_xact->state; - sess = (amf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); ogs_sbi_xact_remove(sbi_xact); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { /* * 1. If AMF-UE context is duplicated in Identity-Response, @@ -509,15 +512,16 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; } - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + break; + } ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; - e->sess = sess; + e->amf_ue_id = amf_ue->id; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message;; SWITCH(sbi_message.h.resource.component[2]) @@ -582,28 +586,30 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; } - sess = (amf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); state = sbi_xact->state; ogs_sbi_xact_remove(sbi_xact); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + break; + } ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; - e->sess = sess; + e->amf_ue_id = amf_ue->id; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message;; e->h.sbi.state = state; @@ -709,6 +715,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) sbi_object = sbi_xact->sbi_object; ogs_assert(sbi_object); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + service_type = sbi_xact->service_type; ogs_sbi_xact_remove(sbi_xact); @@ -718,9 +728,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) switch(sbi_object->type) { case OGS_SBI_OBJ_UE_TYPE: - amf_ue = (amf_ue_t *)sbi_object; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); + amf_ue = amf_ue_find_by_id(sbi_object_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -734,15 +742,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; case OGS_SBI_OBJ_SESS_TYPE: - sess = (amf_sess_t *)sbi_object; - ogs_assert(sess); - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -751,13 +757,15 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%d:%d] Cannot receive SBI message", sess->psi, sess->pti); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(sess->ran_ue, + r = ngap_send_error_indication2( + ran_ue_find_by_id(sess->ran_ue_id), NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK); @@ -791,7 +799,11 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) gnb = amf_gnb_find_by_addr(addr); if (!gnb) { gnb = amf_gnb_add(sock, addr); - ogs_assert(gnb); + if (!gnb) { + ogs_error("amf_gnb_add() failed"); + ogs_sock_destroy(sock); + ogs_free(addr); + } } else { ogs_warn("gNB context duplicated with IP-address [%s]!!!", OGS_ADDR(addr, buf)); @@ -813,7 +825,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) gnb = amf_gnb_find_by_addr(addr); if (!gnb) { gnb = amf_gnb_add(sock, addr); - ogs_assert(gnb); + if (!gnb) { + ogs_error("amf_gnb_add() failed"); + ogs_free(addr); + } } else { ogs_free(addr); } @@ -864,7 +879,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) rc = ogs_ngap_decode(&ngap_message, pkbuf); if (rc == OGS_OK) { - e->gnb = gnb; + e->gnb_id = gnb->id; e->ngap.message = &ngap_message; ogs_fsm_dispatch(&gnb->sm, e); } else { @@ -881,13 +896,14 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; case AMF_EVENT_NGAP_TIMER: - ran_ue = e->ran_ue; - ogs_assert(ran_ue); + ran_ue = ran_ue_find_by_id(e->ran_ue_id); + if (!ran_ue) { + ogs_error("NG Context has already been removed"); + break; + } switch (e->h.timer_id) { case AMF_TIMER_NG_DELAYED_SEND: - gnb = e->gnb; - ogs_assert(gnb); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -911,18 +927,22 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; case AMF_EVENT_5GMM_MESSAGE: - ran_ue = e->ran_ue; - ogs_assert(ran_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); + ran_ue = ran_ue_find_by_id(e->ran_ue_id); + if (!ran_ue) { + ogs_error("NG Context has already been removed"); + break; + } + if (ogs_nas_5gmm_decode(&nas_message, pkbuf) != OGS_OK) { ogs_error("ogs_nas_5gmm_decode() failed"); ogs_pkbuf_free(pkbuf); break; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { amf_ue = amf_ue_find_by_message(&nas_message); if (!amf_ue) { @@ -1017,7 +1037,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_assert(amf_ue); ogs_assert(OGS_FSM_STATE(&amf_ue->sm)); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->nas.message = &nas_message; ogs_fsm_dispatch(&amf_ue->sm, e); @@ -1026,7 +1046,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; case AMF_EVENT_5GMM_TIMER: - amf_ue = amf_ue_cycle(e->amf_ue); + amf_ue = amf_ue_find_by_id(e->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; diff --git a/src/amf/context.c b/src/amf/context.c index affa5c68a0..627cd4aaff 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1201,9 +1201,11 @@ amf_gnb_t *amf_gnb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) ogs_assert(sock); ogs_assert(addr); - ogs_pool_alloc(&amf_gnb_pool, &gnb); - ogs_assert(gnb); - memset(gnb, 0, sizeof *gnb); + ogs_pool_id_calloc(&amf_gnb_pool, &gnb); + if (!gnb) { + ogs_error("ogs_pool_id_callod() failed"); + return NULL; + } /* Defaut RAT-Type */ gnb->rat_type = OpenAPI_rat_type_NR; @@ -1227,7 +1229,7 @@ amf_gnb_t *amf_gnb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) gnb->sctp.addr, sizeof(ogs_sockaddr_t), gnb); memset(&e, 0, sizeof(e)); - e.gnb = gnb; + e.gnb_id = gnb->id; ogs_fsm_init(&gnb->sm, ngap_state_initial, ngap_state_final, &e); ogs_list_add(&self.gnb_list, gnb); @@ -1249,7 +1251,7 @@ void amf_gnb_remove(amf_gnb_t *gnb) ogs_list_remove(&self.gnb_list, gnb); memset(&e, 0, sizeof(e)); - e.gnb = gnb; + e.gnb_id = gnb->id; ogs_fsm_fini(&gnb->sm, &e); ogs_hash_set(self.gnb_addr_hash, @@ -1258,7 +1260,7 @@ void amf_gnb_remove(amf_gnb_t *gnb) ogs_sctp_flush_and_destroy(&gnb->sctp); - ogs_pool_free(&amf_gnb_pool, gnb); + ogs_pool_id_free(&amf_gnb_pool, gnb); amf_metrics_inst_global_dec(AMF_METR_GLOB_GAUGE_GNB); ogs_info("[Removed] Number of gNBs is now %d", ogs_list_count(&self.gnb_list)); @@ -1313,9 +1315,9 @@ int amf_gnb_sock_type(ogs_sock_t *sock) return SOCK_STREAM; } -amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb) +amf_gnb_t *amf_gnb_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_gnb_pool, gnb); + return ogs_pool_find_by_id(&amf_gnb_pool, id); } /** ran_ue_context handling function */ @@ -1325,19 +1327,18 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) ogs_assert(gnb); - ogs_pool_alloc(&ran_ue_pool, &ran_ue); + ogs_pool_id_calloc(&ran_ue_pool, &ran_ue); if (ran_ue == NULL) { ogs_error("Could not allocate ran_ue context from pool"); return NULL; } - memset(ran_ue, 0, sizeof *ran_ue); - ran_ue->t_ng_holding = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue); + ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, + OGS_UINT_TO_POINTER(ran_ue->id)); if (!ran_ue->t_ng_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&ran_ue_pool, ran_ue); + ogs_pool_id_free(&ran_ue_pool, ran_ue); return NULL; } @@ -1357,7 +1358,7 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) ran_ue->gnb_ostream_id = OGS_NEXT_ID(gnb->ostream_id, 1, gnb->max_num_of_ostreams-1); - ran_ue->gnb = gnb; + ran_ue->gnb_id = gnb->id; ogs_list_add(&gnb->ran_ue_list, ran_ue); @@ -1368,33 +1369,40 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) void ran_ue_remove(ran_ue_t *ran_ue) { + amf_gnb_t *gnb = NULL; ogs_assert(ran_ue); - ogs_assert(ran_ue->gnb); - ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + ogs_assert(gnb); + + ogs_list_remove(&gnb->ran_ue_list, ran_ue); ogs_assert(ran_ue->t_ng_holding); ogs_timer_delete(ran_ue->t_ng_holding); - ogs_pool_free(&ran_ue_pool, ran_ue); + ogs_pool_id_free(&ran_ue_pool, ran_ue); stats_remove_ran_ue(); } void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb) { + amf_gnb_t *gnb = NULL; + ogs_assert(ran_ue); - ogs_assert(ran_ue->gnb); ogs_assert(new_gnb); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + ogs_assert(gnb); + /* Remove from the old gnb */ - ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue); + ogs_list_remove(&gnb->ran_ue_list, ran_ue); /* Add to the new gnb */ ogs_list_add(&new_gnb->ran_ue_list, ran_ue); /* Switch to gnb */ - ran_ue->gnb = new_gnb; + ran_ue->gnb_id = new_gnb->id; } ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( @@ -1420,9 +1428,9 @@ ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id) return ran_ue_find(amf_ue_ngap_id); } -ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue) +ran_ue_t *ran_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&ran_ue_pool, ran_ue); + return ogs_pool_find_by_id(&ran_ue_pool, id); } void amf_ue_new_guti(amf_ue_t *amf_ue) @@ -1520,39 +1528,44 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue) amf_ue_t *amf_ue = NULL; ogs_assert(ran_ue); - gnb = ran_ue->gnb; - ogs_assert(gnb); - ogs_pool_alloc(&amf_ue_pool, &amf_ue); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("[%d] gNB has already been removed", ran_ue->gnb_id); + return NULL; + } + + ogs_pool_id_calloc(&amf_ue_pool, &amf_ue); if (amf_ue == NULL) { ogs_error("Could not allocate amf_ue context from pool"); return NULL; } - memset(amf_ue, 0, sizeof *amf_ue); - /* Add All Timers */ amf_ue->t3513.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3513_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3513.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3513.pkbuf = NULL; amf_ue->t3522.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3522_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3522.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3522.pkbuf = NULL; amf_ue->t3550.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3550_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3550.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3550.pkbuf = NULL; @@ -1560,39 +1573,43 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue) ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue); if (!amf_ue->t3555.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3555.pkbuf = NULL; amf_ue->t3560.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3560_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3560.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3560.pkbuf = NULL; amf_ue->t3570.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_t3570_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->t3570.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->t3570.pkbuf = NULL; amf_ue->mobile_reachable.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_mobile_reachable_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_mobile_reachable_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->mobile_reachable.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->mobile_reachable.pkbuf = NULL; amf_ue->implicit_deregistration.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_implicit_deregistration_expire, amf_ue); + ogs_app()->timer_mgr, amf_timer_implicit_deregistration_expire, + OGS_UINT_TO_POINTER(amf_ue->id)); if (!amf_ue->implicit_deregistration.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); return NULL; } amf_ue->implicit_deregistration.pkbuf = NULL; @@ -1713,7 +1730,7 @@ void amf_ue_remove(amf_ue_t *amf_ue) amf_ue_deassociate(amf_ue); - ogs_pool_free(&amf_ue_pool, amf_ue); + ogs_pool_id_free(&amf_ue_pool, amf_ue); ogs_info("[Removed] Number of AMF-UEs is now %d", ogs_list_count(&self.amf_ue_list)); @@ -1724,7 +1741,7 @@ void amf_ue_remove_all(void) amf_ue_t *amf_ue = NULL, *next = NULL;; ogs_list_for_each_safe(&self.amf_ue_list, next, amf_ue) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (ran_ue) ran_ue_remove(ran_ue); @@ -1739,7 +1756,7 @@ void amf_ue_fsm_init(amf_ue_t *amf_ue) ogs_assert(amf_ue); memset(&e, 0, sizeof(e)); - e.amf_ue = amf_ue; + e.amf_ue_id = amf_ue->id; ogs_fsm_init(&amf_ue->sm, gmm_state_initial, gmm_state_final, &e); } @@ -1750,7 +1767,7 @@ void amf_ue_fsm_fini(amf_ue_t *amf_ue) ogs_assert(amf_ue); memset(&e, 0, sizeof(e)); - e.amf_ue = amf_ue; + e.amf_ue_id = amf_ue->id; ogs_fsm_fini(&amf_ue->sm, &e); } @@ -2075,13 +2092,20 @@ void amf_ue_set_suci(amf_ue_t *amf_ue, ogs_pool_index(&amf_ue_pool, old_amf_ue)) { ogs_warn("[%s] OLD UE Context Release", suci); if (CM_CONNECTED(old_amf_ue)) { + ran_ue_t *ran_ue = ran_ue_find_by_id(old_amf_ue->ran_ue_id); /* Implcit NG release */ ogs_warn("[%s] Implicit NG release", suci); - ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", - old_amf_ue->suci, - (long long)old_amf_ue->ran_ue->ran_ue_ngap_id, - (long long)old_amf_ue->ran_ue->amf_ue_ngap_id); - ran_ue_remove(old_amf_ue->ran_ue); + if (ran_ue) { + ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] " + "AMF_UE_NGAP_ID[%lld]", + old_amf_ue->suci, + (long long)ran_ue->ran_ue_ngap_id, + (long long)ran_ue->amf_ue_ngap_id); + ran_ue_remove(ran_ue); + } else { + ogs_error("[%s] RAN-NG Context has already been removed", + suci); + } } /* @@ -2099,7 +2123,7 @@ void amf_ue_set_suci(amf_ue_t *amf_ue, /* Phase-1 : Change AMF-UE Context in Session Context */ ogs_list_for_each(&old_amf_ue->sess_list, old_sess) - old_sess->amf_ue = amf_ue; + old_sess->amf_ue_id = amf_ue->id; /* Phase-2 : Move Session Context from OLD to NEW AMF-UE Context */ memcpy(&amf_ue->sess_list, @@ -2138,10 +2162,17 @@ OpenAPI_rat_type_e amf_ue_rat_type(amf_ue_t *amf_ue) amf_gnb_t *gnb = NULL; ran_ue_t *ran_ue = NULL; - ran_ue = amf_ue->ran_ue; - ogs_assert(ran_ue); - gnb = ran_ue->gnb; - ogs_assert(gnb); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->suci); + return OpenAPI_rat_type_NULL; + } + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("[%d] gNB has already been removed", ran_ue->gnb_id); + return OpenAPI_rat_type_NULL; + } return gnb->rat_type; } @@ -2151,35 +2182,31 @@ void amf_ue_associate_ran_ue(amf_ue_t *amf_ue, ran_ue_t *ran_ue) ogs_assert(amf_ue); ogs_assert(ran_ue); - amf_ue->ran_ue = ran_ue; - ran_ue->amf_ue = amf_ue; + amf_ue->ran_ue_id = ran_ue->id; + ran_ue->amf_ue_id = amf_ue->id; } void ran_ue_deassociate(ran_ue_t *ran_ue) { ogs_assert(ran_ue); - ran_ue->amf_ue = NULL; + ran_ue->amf_ue_id = OGS_INVALID_POOL_ID; } void amf_ue_deassociate(amf_ue_t *amf_ue) { ogs_assert(amf_ue); - amf_ue->ran_ue = NULL; + amf_ue->ran_ue_id = OGS_INVALID_POOL_ID; } void source_ue_associate_target_ue( ran_ue_t *source_ue, ran_ue_t *target_ue) { - amf_ue_t *amf_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - amf_ue = source_ue->amf_ue; - ogs_assert(amf_ue); - target_ue->amf_ue = amf_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->amf_ue_id = source_ue->amf_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void source_ue_deassociate_target_ue(ran_ue_t *ran_ue) @@ -2188,22 +2215,28 @@ void source_ue_deassociate_target_ue(ran_ue_t *ran_ue) ran_ue_t *target_ue = NULL; ogs_assert(ran_ue); - if (ran_ue->target_ue) { + if (ran_ue->target_ue_id >= OGS_MIN_POOL_ID && + ran_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = ran_ue; - target_ue = ran_ue->target_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (ran_ue->source_ue) { + target_ue = ran_ue_find_by_id(ran_ue->target_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (ran_ue->source_ue_id >= OGS_MIN_POOL_ID && + ran_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = ran_ue; - source_ue = ran_ue->source_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + source_ue = ran_ue_find_by_id(ran_ue->source_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -2214,13 +2247,12 @@ amf_sess_t *amf_sess_add(amf_ue_t *amf_ue, uint8_t psi) ogs_assert(amf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&amf_sess_pool, &sess); + ogs_pool_id_calloc(&amf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE; - sess->amf_ue = amf_ue; + sess->amf_ue_id = amf_ue->id; sess->psi = psi; sess->s_nssai.sst = 0; @@ -2237,10 +2269,15 @@ amf_sess_t *amf_sess_add(amf_ue_t *amf_ue, uint8_t psi) void amf_sess_remove(amf_sess_t *sess) { + amf_ue_t *amf_ue = NULL; + ogs_assert(sess); - ogs_assert(sess->amf_ue); - ogs_list_remove(&sess->amf_ue->sess_list, sess); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (amf_ue) + ogs_list_remove(&amf_ue->sess_list, sess); + else + ogs_error("UE(amf-ue) context has already been removed"); /* Free SBI object memory */ if (ogs_list_count(&sess->sbi.xact_list)) @@ -2277,7 +2314,7 @@ void amf_sess_remove(amf_sess_t *sess) if (sess->nssf.nrf.client) ogs_sbi_client_remove(sess->nssf.nrf.client); - ogs_pool_free(&amf_sess_pool, sess); + ogs_pool_id_free(&amf_sess_pool, sess); stats_remove_amf_session(); } @@ -2302,14 +2339,14 @@ amf_sess_t *amf_sess_find_by_psi(amf_ue_t *amf_ue, uint8_t psi) return NULL; } -amf_ue_t *amf_ue_cycle(amf_ue_t *amf_ue) +amf_ue_t *amf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_ue_pool, amf_ue); + return ogs_pool_find_by_id(&amf_ue_pool, id); } -amf_sess_t *amf_sess_cycle(amf_sess_t *sess) +amf_sess_t *amf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&amf_sess_pool, sess); + return ogs_pool_find_by_id(&amf_sess_pool, id); } void amf_sbi_select_nf( @@ -2748,15 +2785,16 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue) ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->supi); return false; } - gnb = amf_gnb_cycle(ran_ue->gnb); + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); if (!gnb) { - ogs_error("gNB has already been removed"); + ogs_error("[%d] gNB has already been removed", ran_ue->gnb_id); return false; } diff --git a/src/amf/context.h b/src/amf/context.h index b61fce88bf..0fe8e6b22d 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -127,6 +127,8 @@ typedef struct amf_context_s { typedef struct amf_gnb_s { ogs_lnode_t lnode; + ogs_pool_id_t id; + ogs_fsm_t sm; /* A state machine */ uint32_t gnb_id; /* gNB_ID received from gNB */ @@ -162,6 +164,7 @@ typedef struct amf_gnb_s { struct ran_ue_s { ogs_lnode_t lnode; uint32_t index; + ogs_pool_id_t id; /* UE identity */ #define INVALID_UE_NGAP_ID 0xffffffffffffffffULL /* Initial value of ran_ue_ngap_id */ @@ -176,13 +179,14 @@ struct ran_ue_s { #define CONTEXT_SETUP_ESTABLISHED(__aMF) \ CM_CONNECTED(__aMF) && \ - ((__aMF)->ran_ue->initial_context_setup_response_received == true) + (ran_ue_find_by_id((__aMF)->ran_ue_id)-> \ + initial_context_setup_response_received == true) bool initial_context_setup_response_received; bool ue_ambr_sent; /* Handover Info */ - ran_ue_t *source_ue; - ran_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* Use amf_ue->nr_tai, amf_ue->nr_cgi. * Do not access ran_ue->saved.tai ran_ue->saved.nr_cgi. @@ -214,12 +218,14 @@ struct ran_ue_s { } psimask; /* Related Context */ - amf_gnb_t *gnb; - amf_ue_t *amf_ue; + ogs_pool_id_t gnb_id; + ogs_pool_id_t amf_ue_id; }; struct amf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; + ogs_fsm_t sm; struct { @@ -417,53 +423,67 @@ struct amf_ue_s { uint64_t am_policy_control_features; /* SBI Features */ #define CM_CONNECTED(__aMF) \ - ((__aMF) && ((__aMF)->ran_ue != NULL) && ran_ue_cycle((__aMF)->ran_ue)) + ((__aMF) && \ + ((__aMF)->ran_ue_id >= OGS_MIN_POOL_ID) && \ + ((__aMF)->ran_ue_id <= OGS_MAX_POOL_ID) && \ + (ran_ue_find_by_id((__aMF)->ran_ue_id))) #define CM_IDLE(__aMF) \ ((__aMF) && \ - (((__aMF)->ran_ue == NULL) || (ran_ue_cycle((__aMF)->ran_ue) == NULL))) + (((__aMF)->ran_ue_id < OGS_MIN_POOL_ID) || \ + ((__aMF)->ran_ue_id > OGS_MAX_POOL_ID) || \ + (ran_ue_find_by_id((__aMF)->ran_ue_id) == NULL))) /* NG UE context */ - ran_ue_t *ran_ue; + ogs_pool_id_t ran_ue_id; #define HOLDING_NG_CONTEXT(__aMF) \ do { \ - ran_ue_deassociate((__aMF)->ran_ue); \ + ran_ue_t *ran_ue_holding = NULL; \ + \ + (__aMF)->ran_ue_holding_id = OGS_INVALID_POOL_ID; \ \ - (__aMF)->ran_ue_holding = ran_ue_cycle((__aMF)->ran_ue); \ - if ((__aMF)->ran_ue_holding) { \ + ran_ue_holding = ran_ue_find_by_id((__aMF)->ran_ue_id); \ + if (ran_ue_holding) { \ + ran_ue_deassociate(ran_ue_holding); \ + \ ogs_warn("[%s] Holding NG Context", (__aMF)->suci); \ ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \ (__aMF)->suci, \ - (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ - (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ + (long long)ran_ue_holding->ran_ue_ngap_id, \ + (long long)ran_ue_holding->amf_ue_ngap_id); \ \ - (__aMF)->ran_ue_holding->ue_ctx_rel_action = \ + ran_ue_holding->ue_ctx_rel_action = \ NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE; \ - ogs_timer_start((__aMF)->ran_ue_holding->t_ng_holding, \ + ogs_timer_start(ran_ue_holding->t_ng_holding, \ amf_timer_cfg(AMF_TIMER_NG_HOLDING)->duration); \ + \ + (__aMF)->ran_ue_holding_id = (__aMF)->ran_ue_id; \ } else \ ogs_error("[%s] NG Context has already been removed", \ (__aMF)->suci); \ } while(0) #define CLEAR_NG_CONTEXT(__aMF) \ do { \ - if (ran_ue_cycle((__aMF)->ran_ue_holding)) { \ + ran_ue_t *ran_ue_holding = NULL; \ + \ + ran_ue_holding = ran_ue_find_by_id((__aMF)->ran_ue_holding_id); \ + if (ran_ue_holding) { \ int r; \ ogs_warn("[%s] Clear NG Context", (__aMF)->suci); \ ogs_warn("[%s] RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", \ (__aMF)->suci, \ - (long long)(__aMF)->ran_ue_holding->ran_ue_ngap_id, \ - (long long)(__aMF)->ran_ue_holding->amf_ue_ngap_id); \ + (long long)ran_ue_holding->ran_ue_ngap_id, \ + (long long)ran_ue_holding->amf_ue_ngap_id); \ \ r = ngap_send_ran_ue_context_release_command( \ - (__aMF)->ran_ue_holding, \ + ran_ue_holding, \ NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, \ NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0); \ ogs_expect(r == OGS_OK); \ ogs_assert(r != OGS_ERROR); \ } \ - (__aMF)->ran_ue_holding = NULL; \ + (__aMF)->ran_ue_holding_id = OGS_INVALID_POOL_ID; \ } while(0) - ran_ue_t *ran_ue_holding; + ogs_pool_id_t ran_ue_holding_id; #define CLEAR_AMF_UE_ALL_TIMERS(__aMF) \ do { \ @@ -562,6 +582,7 @@ struct amf_ue_s { typedef struct amf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; uint8_t psi; /* PDU Session Identity */ uint8_t pti; /* Procedure Trasaction Identity */ @@ -656,10 +677,12 @@ typedef struct amf_sess_s { #define AMF_SESS_STORE_N2_TRANSFER(__sESS, __n2Type, __n2Buf) \ do { \ ogs_assert(__sESS); \ - ogs_assert((__sESS)->amf_ue); \ if ((__sESS)->transfer.__n2Type) { \ - ogs_warn("[%s:%d] N2 transfer message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + amf_ue_t *amf_ue = amf_ue_find_by_id((__sESS)->amf_ue_id); \ + if (amf_ue) \ + ogs_warn("[%s:%d] " \ + "N2 transfer message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->transfer.__n2Type); \ } \ (__sESS)->transfer.__n2Type = __n2Buf; \ @@ -733,18 +756,21 @@ typedef struct amf_sess_s { #define AMF_SESS_STORE_5GSM_MESSAGE(__sESS, __tYPE, __n1Buf, __n2Buf) \ do { \ + amf_ue_t *amf_ue = NULL; \ ogs_assert(__sESS); \ - ogs_assert((__sESS)->amf_ue); \ + amf_ue = amf_ue_find_by_id((__sESS)->amf_ue_id); \ if ((__sESS)->gsm_message.n1buf) { \ - ogs_warn("[%s:%d] N1 message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + if (amf_ue) \ + ogs_warn("[%s:%d] N1 message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->gsm_message.n1buf); \ } \ (__sESS)->gsm_message.n1buf = __n1Buf; \ \ if ((__sESS)->gsm_message.n2buf) { \ - ogs_warn("[%s:%d] N2 message duplicated. Overwritten", \ - ((__sESS)->amf_ue)->supi, (__sESS)->psi); \ + if (amf_ue) \ + ogs_warn("[%s:%d] N2 message duplicated. Overwritten", \ + amf_ue->supi, (__sESS)->psi); \ ogs_pkbuf_free((__sESS)->gsm_message.n2buf); \ } \ (__sESS)->gsm_message.n2buf = __n2Buf; \ @@ -789,8 +815,8 @@ typedef struct amf_sess_s { ogs_list_t bearer_list; /* Related Context */ - amf_ue_t *amf_ue; - ran_ue_t *ran_ue; + ogs_pool_id_t amf_ue_id; + ogs_pool_id_t ran_ue_id; ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; @@ -812,7 +838,7 @@ amf_gnb_t *amf_gnb_find_by_addr(ogs_sockaddr_t *addr); amf_gnb_t *amf_gnb_find_by_gnb_id(uint32_t gnb_id); int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id); int amf_gnb_sock_type(ogs_sock_t *sock); -amf_gnb_t *amf_gnb_cycle(amf_gnb_t *gnb); +amf_gnb_t *amf_gnb_find_by_id(ogs_pool_id_t id); ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); void ran_ue_remove(ran_ue_t *ran_ue); @@ -821,7 +847,7 @@ ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( amf_gnb_t *gnb, uint64_t ran_ue_ngap_id); ran_ue_t *ran_ue_find(uint32_t index); ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id); -ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue); +ran_ue_t *ran_ue_find_by_id(ogs_pool_id_t id); void amf_ue_new_guti(amf_ue_t *amf_ue); void amf_ue_confirm_guti(amf_ue_t *amf_ue); @@ -924,8 +950,8 @@ void amf_sess_remove_all(amf_ue_t *amf_ue); amf_sess_t *amf_sess_find_by_psi(amf_ue_t *amf_ue, uint8_t psi); amf_sess_t *amf_sess_find_by_dnn(amf_ue_t *amf_ue, char *dnn); -amf_ue_t *amf_ue_cycle(amf_ue_t *amf_ue); -amf_sess_t *amf_sess_cycle(amf_sess_t *sess); +amf_ue_t *amf_ue_find_by_id(ogs_pool_id_t id); +amf_sess_t *amf_sess_find_by_id(ogs_pool_id_t id); void amf_sbi_select_nf( ogs_sbi_object_t *sbi_object, diff --git a/src/amf/event.h b/src/amf/event.h index 0a53b467df..ca46d45631 100644 --- a/src/amf/event.h +++ b/src/amf/event.h @@ -74,10 +74,10 @@ typedef struct amf_event_s { ogs_nas_5gs_message_t *message; } nas; - amf_gnb_t *gnb; - ran_ue_t *ran_ue; - amf_ue_t *amf_ue; - amf_sess_t *sess; + ogs_pool_id_t gnb_id; + ogs_pool_id_t ran_ue_id; + ogs_pool_id_t amf_ue_id; + ogs_pool_id_t sess_id; amf_bearer_t *bearer; ogs_timer_t *timer; diff --git a/src/amf/gmm-build.c b/src/amf/gmm-build.c index 6ce07d194c..83643679a0 100644 --- a/src/amf/gmm-build.c +++ b/src/amf/gmm-build.c @@ -636,7 +636,7 @@ ogs_pkbuf_t *gmm_build_dl_nas_transport(amf_sess_t *sess, ogs_nas_gprs_timer_3_t *back_off_timer_value = NULL; ogs_assert(sess); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); ogs_assert(payload_container_type); ogs_assert(payload_container); diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index d8a734c615..05a07ab7e3 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -50,7 +50,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, ogs_nas_ue_security_capability_t *ue_security_capability = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(registration_request); @@ -632,7 +632,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_key_set_identifier_t *ngksi = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ngksi = &service_request->ngksi; @@ -850,7 +850,7 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue, ogs_nas_de_registration_type_t *de_registration_type = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(deregistration_request); @@ -974,7 +974,7 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, ogs_assert(identity_response); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(identity_response); @@ -1040,7 +1040,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL; ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_assert(security_mode_complete); @@ -1139,8 +1139,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_dnn_t *dnn = NULL; ogs_nas_5gsm_header_t *gsm_header = NULL; - ogs_assert(amf_ue_cycle(amf_ue)); - ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(ul_nas_transport); payload_container_type = &ul_nas_transport->payload_container_type; diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 3832d44a7e..c1ef620690 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -74,12 +74,12 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -575,7 +575,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && @@ -630,12 +630,12 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1142,7 +1142,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) if (amf_ue->explict_de_registered.n1_done == true) { r = ngap_send_ran_ue_context_release_command( - amf_ue->ran_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_misc, NGAP_CauseMisc_om_intervention, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); @@ -1194,12 +1194,12 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_assert(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1208,7 +1208,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -1618,12 +1618,12 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -1636,7 +1636,7 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -1908,7 +1908,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); switch (e->h.id) { @@ -1924,7 +1924,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -2068,7 +2068,8 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) if (amf_ue->t3560.retry_count >= amf_timer_cfg(AMF_TIMER_T3560)->max_count) { ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi); - r = nas_5gs_send_gmm_reject(amf_ue->ran_ue, amf_ue, + r = nas_5gs_send_gmm_reject( + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2112,12 +2113,12 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2143,7 +2144,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2188,7 +2189,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2275,7 +2276,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; @@ -2459,12 +2460,12 @@ void gmm_state_ue_context_will_remove(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2497,12 +2498,12 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - if (e->sess) { - sess = e->sess; - amf_ue = sess->amf_ue; + sess = amf_sess_find_by_id(e->sess_id); + if (sess) { + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); } else { - amf_ue = e->amf_ue; + amf_ue = amf_ue_find_by_id(e->amf_ue_id); ogs_assert(amf_ue); } @@ -2516,7 +2517,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2534,7 +2536,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); h.type = e->nas.type; diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index 3c66a30dc8..07174dd647 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -177,7 +177,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer( * 4.3.2 PDU Session Establishment * ***********************************/ - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (ran_ue) { if (sess->pdu_session_establishment_accept) { ogs_pkbuf_free(sess->pdu_session_establishment_accept); @@ -480,7 +480,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer( ogs_error("[%d:%d] PDU session establishment reject", sess->psi, sess->pti); - r = nas_5gs_send_gsm_reject(sess->ran_ue, sess, + r = nas_5gs_send_gsm_reject( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1003,7 +1004,7 @@ int amf_namf_callback_handle_sdm_data_change_notify( } if (amf_ue) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("NG context has already been removed"); /* ran_ue is required for amf_ue_is_rat_restricted() */ @@ -1092,6 +1093,7 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_sbi_response_t *response = NULL; ogs_sbi_message_t sendmsg; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; OpenAPI_ambr_t *UeAmbr = NULL; OpenAPI_list_t *MmContextList = NULL; @@ -1246,8 +1248,9 @@ int amf_namf_comm_handle_ue_context_transfer_request( * Context TRANSFERRED !!! * So, we removed UE context. */ - if (amf_ue->ran_ue) - ran_ue_remove(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (ran_ue) + ran_ue_remove(ran_ue); amf_ue_remove(amf_ue); return OGS_OK; diff --git a/src/amf/nas-path.c b/src/amf/nas-path.c index 7ddb346662..d58064318c 100644 --- a/src/amf/nas-path.c +++ b/src/amf/nas-path.c @@ -25,16 +25,22 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) { int rv; + ran_ue_t *ran_ue = NULL; ogs_assert(pkbuf); - amf_ue = amf_ue_cycle(amf_ue); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = ngap_send_to_ran_ue(amf_ue->ran_ue, pkbuf); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->suci); + return OGS_NOTFOUND; + } + + rv = ngap_send_to_ran_ue(ran_ue, pkbuf); ogs_expect(rv == OGS_OK); return rv; @@ -46,7 +52,7 @@ int nas_5gs_send_to_downlink_nas_transport( int rv; ogs_pkbuf_t *ngapbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(ran_ue); ogs_assert(pkbuf); ngapbuf = ngap_build_downlink_nas_transport(ran_ue, pkbuf, false, false); @@ -71,14 +77,14 @@ int nas_5gs_send_registration_accept(amf_ue_t *amf_ue) ogs_pkbuf_t *ngapbuf = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -177,8 +183,8 @@ int nas_5gs_send_registration_reject( int rv; ogs_pkbuf_t *gmmbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); - ogs_assert(amf_ue_cycle(amf_ue)); + ogs_assert(ran_ue); + ogs_assert(amf_ue); switch (amf_ue->nas.registration.value) { case OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL: @@ -225,14 +231,14 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue) ogs_pkbuf_t *gmmbuf = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -289,7 +295,7 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue) rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); } } @@ -303,8 +309,8 @@ int nas_5gs_send_service_reject( int rv; ogs_pkbuf_t *gmmbuf = NULL; - ogs_assert(ran_ue_cycle(ran_ue)); - ogs_assert(amf_ue_cycle(amf_ue)); + ogs_assert(ran_ue); + ogs_assert(amf_ue); ogs_debug("[%s] Service reject", amf_ue->supi); @@ -327,14 +333,14 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue) ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -349,7 +355,7 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); if (rv != OGS_OK) { ogs_error("nas_5gs_send_to_downlink_nas_transport() failed"); return rv; @@ -374,14 +380,14 @@ int nas_5gs_send_de_registration_request( ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -407,7 +413,7 @@ int nas_5gs_send_de_registration_request( ogs_timer_start(amf_ue->t3522.timer, amf_timer_cfg(AMF_TIMER_T3522)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -416,15 +422,17 @@ int nas_5gs_send_de_registration_request( int nas_5gs_send_identity_request(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -449,7 +457,7 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3570.timer, amf_timer_cfg(AMF_TIMER_T3570)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -458,15 +466,17 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue) int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -493,7 +503,7 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REQ); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -502,15 +512,17 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -524,7 +536,7 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REJECT); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -533,15 +545,17 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -566,7 +580,7 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3560.timer, amf_timer_cfg(AMF_TIMER_T3560)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -576,15 +590,17 @@ int nas_5gs_send_configuration_update_command( amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -627,7 +643,7 @@ int nas_5gs_send_configuration_update_command( amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_MM_CONF_UPDATE); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -645,16 +661,16 @@ int nas_send_pdu_session_setup_request(amf_sess_t *sess, ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -709,16 +725,16 @@ int nas_send_pdu_session_modification_command(amf_sess_t *sess, ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("[%s] NG context has already been removed", amf_ue->supi); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -770,16 +786,16 @@ int nas_send_pdu_session_release_command(amf_sess_t *sess, ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { - ogs_warn("NG context has already been removed"); + ogs_error("[%s] NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -862,15 +878,17 @@ int nas_send_pdu_session_release_command(amf_sess_t *sess, int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause) { int rv; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -882,7 +900,7 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -893,13 +911,11 @@ int nas_5gs_send_gmm_reject( { int rv; - amf_ue = amf_ue_cycle(amf_ue); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -950,11 +966,17 @@ static ogs_nas_5gmm_cause_t gmm_cause_from_sbi(int status) int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status) { int rv; + ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); - rv = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, gmm_cause_from_sbi(status)); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); + return OGS_NOTFOUND; + } + + rv = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause_from_sbi(status)); ogs_expect(rv == OGS_OK); return rv; @@ -969,20 +991,17 @@ int nas_5gs_send_dl_nas_transport(ran_ue_t *ran_ue, amf_sess_t *sess, ogs_pkbuf_t *gmmbuf = NULL; amf_ue_t *amf_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -1025,19 +1044,18 @@ int nas_5gs_send_gsm_reject(ran_ue_t *ran_ue, amf_sess_t *sess, amf_ue_t *amf_ue = NULL; ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -1061,20 +1079,17 @@ int nas_5gs_send_back_gsm_message( ogs_pkbuf_t *pbuf = NULL; amf_ue_t *amf_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; diff --git a/src/amf/ngap-build.c b/src/amf/ngap-build.c index 85872faa70..d84b3b8978 100644 --- a/src/amf/ngap-build.c +++ b/src/amf/ngap-build.c @@ -313,9 +313,8 @@ ogs_pkbuf_t *ngap_build_downlink_nas_transport( NGAP_AllowedNSSAI_t *AllowedNSSAI = NULL; ogs_assert(gmmbuf); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); - amf_ue = amf_ue_cycle(ran_ue->amf_ue); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("DownlinkNASTransport"); @@ -470,9 +469,8 @@ ogs_pkbuf_t *ngap_ue_build_initial_context_setup_request( NGAP_MaskedIMEISV_t *MaskedIMEISV = NULL; NGAP_NAS_PDU_t *NAS_PDU = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("InitialContextSetupRequest(UE)"); @@ -781,9 +779,8 @@ ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue) NGAP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; NGAP_SecurityKey_t *SecurityKey = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("UEContextModificationRequest(UE)"); @@ -932,9 +929,8 @@ ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request( NGAP_MaskedIMEISV_t *MaskedIMEISV = NULL; ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("InitialContextSetupRequest(Session)"); @@ -1222,7 +1218,6 @@ ogs_pkbuf_t *ngap_build_ue_context_release_command( NGAP_UE_NGAP_IDs_t *UE_NGAP_IDs = NULL; NGAP_Cause_t *Cause = NULL; - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("UEContextReleaseCommand"); @@ -1298,9 +1293,8 @@ ogs_pkbuf_t *ngap_ue_build_pdu_session_resource_setup_request( NGAP_PDUSessionResourceSetupListSUReq_t *PDUSessionList = NULL; NGAP_PDUSessionResourceSetupItemSUReq_t *PDUSessionItem = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceSetupRequest(UE)"); @@ -1466,9 +1460,8 @@ ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request( ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceSetupRequest(Session)"); @@ -1609,9 +1602,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_modify_request( ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceModifyRequest"); @@ -1709,9 +1702,9 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command( ogs_assert(n2smbuf); ogs_assert(sess); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceReleaseCommand"); @@ -1815,7 +1808,6 @@ ogs_pkbuf_t *ngap_build_paging(amf_ue_t *amf_ue) NGAP_TAIListForPagingItem_t *TAIItem = NULL; NGAP_TAI_t *tAI = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); ogs_debug("Paging"); @@ -1942,9 +1934,8 @@ ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue) NGAP_PDUSessionResourceSwitchedList_t *PDUSessionResourceSwitchedList; NGAP_AllowedNSSAI_t *AllowedNSSAI = NULL; - amf_ue = amf_ue_cycle(amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); ogs_assert(ran_ue); ogs_debug("PathSwitchAcknowledge"); @@ -2110,9 +2101,8 @@ ogs_pkbuf_t *ngap_build_handover_request(ran_ue_t *target_ue) *SourceToTarget_TransparentContainer = NULL; NGAP_GUAMI_t *GUAMI = NULL; - target_ue = ran_ue_cycle(target_ue); ogs_assert(target_ue); - amf_ue = amf_ue_cycle(target_ue->amf_ue); + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("HandoverRequest"); @@ -2410,7 +2400,6 @@ ogs_pkbuf_t *ngap_build_handover_preparation_failure( NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_Cause_t *Cause = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); ogs_assert(cause); @@ -2495,9 +2484,8 @@ ogs_pkbuf_t *ngap_build_handover_command(ran_ue_t *source_ue) NGAP_TargetToSource_TransparentContainer_t *TargetToSource_TransparentContainer = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); - amf_ue = amf_ue_cycle(source_ue->amf_ue); + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); ogs_assert(amf_ue); ogs_debug("HandoverCommand"); @@ -2614,7 +2602,6 @@ ogs_pkbuf_t *ngap_build_handover_cancel_ack(ran_ue_t *source_ue) NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; - source_ue = ran_ue_cycle(source_ue); ogs_assert(source_ue); ogs_debug("HandoverCancelAcknowledge"); @@ -2680,7 +2667,6 @@ ogs_pkbuf_t *ngap_build_downlink_ran_status_transfer( NGAP_RANStatusTransfer_TransparentContainer_t *RANStatusTransfer_TransparentContainer = NULL; - target_ue = ran_ue_cycle(target_ue); ogs_assert(target_ue); ogs_assert(transfer); diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index c386334bb4..5617d914ad 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -696,7 +696,7 @@ void ngap_handle_uplink_nas_transport( return; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -783,6 +783,7 @@ void ngap_handle_ue_radio_capability_info_indication( int i, r; ran_ue_t *ran_ue = NULL; + amf_ue_t *amf_ue = NULL; uint64_t amf_ue_ngap_id; NGAP_InitiatingMessage_t *initiatingMessage = NULL; @@ -872,9 +873,9 @@ void ngap_handle_ue_radio_capability_info_indication( return; } - if (ran_ue->amf_ue) - OGS_ASN_STORE_DATA(&ran_ue->amf_ue->ueRadioCapability, - UERadioCapability); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); + if (amf_ue) + OGS_ASN_STORE_DATA(&amf_ue->ueRadioCapability, UERadioCapability); } void ngap_handle_initial_context_setup_response( @@ -969,7 +970,7 @@ void ngap_handle_initial_context_setup_response( ran_ue->initial_context_setup_response_received = true; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -1268,7 +1269,7 @@ void ngap_handle_initial_context_setup_failure( * may in principle be adopted. The RAN should ensure * that no hanging resources remain at the RAN. */ - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (amf_ue) { /* * if T3550 is running, Registration complete will be sent. @@ -1569,7 +1570,7 @@ void ngap_handle_ue_context_release_request( break; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -1720,12 +1721,7 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue) ogs_assert(ran_ue); - if (ran_ue_cycle(ran_ue) == NULL) { - ogs_error("NG context has already been removed"); - return; - } - - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); ogs_info("UE Context Release [Action:%d]", ran_ue->ue_ctx_rel_action); ogs_info(" RAN_UE_NGAP_ID[%lld] AMF_UE_NGAP_ID[%lld]", @@ -1821,12 +1817,14 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue) ogs_error("No UE(amf-ue) context"); return; } - if (!amf_ue->ran_ue) { + + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + if (!ran_ue) { ogs_error("No NG context"); return; } - r = ngap_send_handover_cancel_ack(amf_ue->ran_ue); + r = ngap_send_handover_cancel_ack(ran_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); break; @@ -1945,7 +1943,7 @@ void ngap_handle_pdu_session_resource_setup_response( (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -2267,7 +2265,7 @@ void ngap_handle_pdu_session_resource_modify_response( (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -2454,7 +2452,7 @@ void ngap_handle_pdu_session_resource_release_response( (long long)ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -2802,7 +2800,7 @@ void ngap_handle_path_switch_request( return; } - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3133,7 +3131,7 @@ void ngap_handle_handover_required( (long long)source_ue->ran_ue_ngap_id, (long long)source_ue->amf_ue_ngap_id); - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3251,7 +3249,7 @@ void ngap_handle_handover_required( return; } - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { /* * Issue #3014 @@ -3521,7 +3519,7 @@ void ngap_handle_handover_request_ack( target_ue->ran_ue_ngap_id = *RAN_UE_NGAP_ID; - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3533,7 +3531,7 @@ void ngap_handle_handover_request_ack( ogs_assert(r != OGS_ERROR); return; } - amf_ue = target_ue->amf_ue; + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3728,7 +3726,7 @@ void ngap_handle_handover_failure( return; } - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3853,7 +3851,7 @@ void ngap_handle_handover_cancel( return; } - target_ue = source_ue->target_ue; + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("Cannot find Source-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -3865,7 +3863,7 @@ void ngap_handle_handover_cancel( ogs_assert(r != OGS_ERROR); return; } - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -4005,7 +4003,7 @@ void ngap_handle_uplink_ran_status_transfer( return; } - target_ue = source_ue->target_ue; + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("Cannot find Source-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -4017,7 +4015,7 @@ void ngap_handle_uplink_ran_status_transfer( ogs_assert(r != OGS_ERROR); return; } - amf_ue = source_ue->amf_ue; + amf_ue = amf_ue_find_by_id(source_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -4127,7 +4125,7 @@ void ngap_handle_handover_notification( return; } - source_ue = target_ue->source_ue; + source_ue = ran_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("Cannot find Source-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -4139,7 +4137,7 @@ void ngap_handle_handover_notification( ogs_assert(r != OGS_ERROR); return; } - amf_ue = target_ue->amf_ue; + amf_ue = amf_ue_find_by_id(target_ue->amf_ue_id); if (!amf_ue) { ogs_error("Cannot find AMF-UE Context [%lld]", (long long)amf_ue_ngap_id); @@ -4663,7 +4661,7 @@ void ngap_handle_ng_reset( /* RAN_UE Context where PartOfNG_interface was requested */ ran_ue->part_of_ng_reset_requested = true; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); /* * Issues #1928 * diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index 0c3488d247..64ad9a7d27 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -51,12 +51,7 @@ int ngap_send_to_gnb(amf_gnb_t *gnb, ogs_pkbuf_t *pkbuf, uint16_t stream_no) char buf[OGS_ADDRSTRLEN]; ogs_assert(pkbuf); - - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ogs_assert(gnb->sctp.sock); if (gnb->sctp.sock->fd == INVALID_SOCKET) { @@ -83,15 +78,24 @@ int ngap_send_to_gnb(amf_gnb_t *gnb, ogs_pkbuf_t *pkbuf, uint16_t stream_no) int ngap_send_to_ran_ue(ran_ue_t *ran_ue, ogs_pkbuf_t *pkbuf) { int rv; + amf_gnb_t *gnb = NULL; + ogs_assert(pkbuf); - if (!ran_ue_cycle(ran_ue)) { + if (!ran_ue) { ogs_error("NG context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = ngap_send_to_gnb(ran_ue->gnb, pkbuf, ran_ue->gnb_ostream_id); + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("[%d] gNB has already been removed", ran_ue->gnb_id); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = ngap_send_to_gnb(gnb, pkbuf, ran_ue->gnb_ostream_id); ogs_expect(rv == OGS_OK); return rv; @@ -112,8 +116,7 @@ int ngap_delayed_send_to_ran_ue( ogs_app()->timer_mgr, amf_timer_ng_delayed_send, e); ogs_assert(e->timer); e->pkbuf = pkbuf; - e->ran_ue = ran_ue; - e->gnb = ran_ue->gnb; + e->ran_ue_id = ran_ue->id; ogs_timer_start(e->timer, duration); @@ -136,7 +139,7 @@ int ngap_send_to_5gsm(amf_ue_t *amf_ue, ogs_pkbuf_t *esmbuf) e = amf_event_new(AMF_EVENT_5GSM_MESSAGE); ogs_assert(e); - e->amf_ue = amf_ue; + e->amf_ue_id = amf_ue->id; e->pkbuf = esmbuf; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -153,6 +156,8 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, { int rv; + amf_ue_t *amf_ue = NULL; + ogs_nas_5gs_security_header_t *sh = NULL; ogs_nas_security_header_type_t security_header_type; @@ -163,6 +168,8 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, ogs_assert(ran_ue); ogs_assert(nasPdu); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); + /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. * When calculating AES_CMAC, we need to use the headroom of the packet. */ nasbuf = ogs_pkbuf_alloc(NULL, OGS_NAS_HEADROOM+nasPdu->size); @@ -204,8 +211,8 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, return OGS_ERROR; } - if (ran_ue->amf_ue) { - if (nas_5gs_security_decode(ran_ue->amf_ue, + if (amf_ue) { + if (nas_5gs_security_decode(amf_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); ran_ue_remove(ran_ue); @@ -249,7 +256,7 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, ogs_pkbuf_free(nasbuf); return OGS_ERROR; } - e->ran_ue = ran_ue; + e->ran_ue_id = ran_ue->id; e->ngap.code = procedureCode; e->nas.type = security_header_type.type; e->pkbuf = nasbuf; @@ -262,7 +269,6 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, return rv; } else if (h->extended_protocol_discriminator == OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM) { - amf_ue_t *amf_ue = ran_ue->amf_ue; if (!amf_ue) { ogs_error("No UE Context"); ogs_pkbuf_free(nasbuf); @@ -288,12 +294,9 @@ int ngap_send_ng_setup_response(amf_gnb_t *gnb) int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("NG-Setup response"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("NG-Setup response"); ngap_buffer = ngap_build_ng_setup_response(); if (!ngap_buffer) { @@ -313,12 +316,9 @@ int ngap_send_ng_setup_failure( int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("NG-Setup failure"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("NG-Setup failure"); ngap_buffer = ngap_build_ng_setup_failure( group, cause, NGAP_TimeToWait_v10s); @@ -338,12 +338,9 @@ int ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb) int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("RANConfigurationUpdateAcknowledge"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("RANConfigurationUpdateAcknowledge"); ngap_buffer = ngap_build_ran_configuration_update_ack(); if (!ngap_buffer) { @@ -363,12 +360,9 @@ int ngap_send_ran_configuration_update_failure( int rv; ogs_pkbuf_t *ngap_buffer; - ogs_debug("RANConfigurationUpdateFailure"); + ogs_assert(gnb); - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("RANConfigurationUpdateFailure"); ngap_buffer = ngap_build_ran_configuration_update_failure( group, cause, NGAP_TimeToWait_v10s); @@ -390,7 +384,7 @@ int ngap_send_ran_ue_context_release_command( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(ran_ue)) { + if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -427,13 +421,14 @@ int ngap_send_amf_ue_context_release_command( { int rv; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } rv = ngap_send_ran_ue_context_release_command( - amf_ue->ran_ue, group, cause, action, duration); + ran_ue_find_by_id(amf_ue->ran_ue_id), + group, cause, action, duration); ogs_expect(rv == OGS_OK); ogs_debug(" SUPI[%s]", amf_ue->supi); @@ -449,7 +444,7 @@ int ngap_send_paging(amf_ue_t *amf_ue) ogs_debug("NG-Paging"); - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -503,10 +498,7 @@ int ngap_send_downlink_ran_configuration_transfer( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(target_gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(target_gnb); ogs_assert(transfer); ngapbuf = ngap_build_downlink_ran_configuration_transfer(transfer); @@ -529,20 +521,18 @@ int ngap_send_path_switch_ack(amf_sess_t *sess) ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_NOTFOUND; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; @@ -567,18 +557,18 @@ int ngap_send_handover_request(amf_ue_t *amf_ue) ran_ue_t *source_ue = NULL, *target_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - source_ue = ran_ue_cycle(amf_ue->ran_ue); + source_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; @@ -602,7 +592,7 @@ int ngap_send_handover_preparation_failure( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -628,12 +618,12 @@ int ngap_send_handover_command(amf_ue_t *amf_ue) ran_ue_t *source_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - source_ue = ran_ue_cycle(amf_ue->ran_ue); + source_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; @@ -656,7 +646,7 @@ int ngap_send_handover_cancel_ack(ran_ue_t *source_ue) int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -680,7 +670,7 @@ int ngap_send_downlink_ran_status_transfer( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!ran_ue_cycle(target_ue)) { + if (!target_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } @@ -707,10 +697,7 @@ int ngap_send_error_indication( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ngapbuf = ogs_ngap_build_error_indication( ran_ue_ngap_id, amf_ue_ngap_id, group, cause); @@ -729,15 +716,21 @@ int ngap_send_error_indication2( ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause) { int rv; + amf_gnb_t *gnb = NULL; - ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; } + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); + if (!gnb) { + ogs_error("[%d] gNB has already been removed", ran_ue->gnb_id); + return OGS_NOTFOUND; + } + rv = ngap_send_error_indication( - ran_ue->gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, + gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, group, cause); ogs_expect(rv == OGS_OK); @@ -751,10 +744,7 @@ int ngap_send_ng_reset_ack( int rv; ogs_pkbuf_t *ngapbuf = NULL; - if (!amf_gnb_cycle(gnb)) { - ogs_error("gNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(gnb); ngapbuf = ogs_ngap_build_ng_reset_ack(partOfNG_Interface); if (!ngapbuf) { diff --git a/src/amf/ngap-sm.c b/src/amf/ngap-sm.c index cf36e6c54b..7a1c84dda4 100644 --- a/src/amf/ngap-sm.c +++ b/src/amf/ngap-sm.c @@ -54,7 +54,7 @@ void ngap_state_operational(ogs_fsm_t *s, amf_event_t *e) amf_sm_debug(e); - gnb = e->gnb; + gnb = amf_gnb_find_by_id(e->gnb_id); ogs_assert(gnb); switch (e->h.id) { @@ -191,10 +191,10 @@ void ngap_state_operational(ogs_fsm_t *s, amf_event_t *e) case AMF_EVENT_NGAP_TIMER: switch (e->h.timer_id) { case AMF_TIMER_NG_DELAYED_SEND: - ogs_assert(e->ran_ue); ogs_assert(e->pkbuf); - r = ngap_send_to_ran_ue(e->ran_ue, e->pkbuf); + r = ngap_send_to_ran_ue( + ran_ue_find_by_id(e->ran_ue_id), e->pkbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/amf/nnrf-handler.c b/src/amf/nnrf-handler.c index 0666775f88..fbb2d2d135 100644 --- a/src/amf/nnrf-handler.c +++ b/src/amf/nnrf-handler.c @@ -84,13 +84,15 @@ void amf_nnrf_handle_nf_discover( ogs_error("[%d:%d] (NF discover) No [%s]", sess->psi, sess->pti, ogs_sbi_service_type_to_name(service_type)); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(sess->ran_ue, + r = ngap_send_error_indication2( + ran_ue_find_by_id(sess->ran_ue_id), NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK); diff --git a/src/amf/nnssf-handler.c b/src/amf/nnssf-handler.c index f13a1b8170..6f2cc77043 100644 --- a/src/amf/nnssf-handler.c +++ b/src/amf/nnssf-handler.c @@ -42,21 +42,20 @@ int amf_nnssf_nsselection_handle_get( ogs_assert(recvmsg); ogs_assert(!SESSION_CONTEXT_IN_SMF(sess)); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { - ogs_error("NG context has already been removed"); + ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->supi); return OGS_ERROR; } diff --git a/src/amf/npcf-build.c b/src/amf/npcf-build.c index 616771cec2..366828f8db 100644 --- a/src/amf/npcf-build.c +++ b/src/amf/npcf-build.c @@ -38,7 +38,7 @@ ogs_sbi_request_t *amf_npcf_am_policy_control_build_create( ogs_assert(amf_ue); ogs_assert(amf_ue->supi); - ogs_assert(ran_ue_cycle(amf_ue->ran_ue)); + ogs_assert(ran_ue_find_by_id(amf_ue->ran_ue_id)); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 3612414d39..1b0f6716ac 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -39,10 +39,10 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; ogs_assert(sess); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); ogs_assert(amf_ue->nas.access_type); - ogs_assert(ran_ue_cycle(amf_ue->ran_ue)); + ogs_assert(ran_ue_find_by_id(amf_ue->ran_ue_id)); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; @@ -274,7 +274,7 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_update_sm_context( ogs_assert(param); ogs_assert(sess); ogs_assert(sess->sm_context.resource_uri); - amf_ue = sess->amf_ue; + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); @@ -407,8 +407,6 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_release_sm_context( ogs_assert(sess); ogs_assert(sess->sm_context.resource_uri); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; @@ -432,6 +430,13 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_release_sm_context( } memset(&ueLocation, 0, sizeof(ueLocation)); + + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + goto end; + } + ueLocation.nr_location = ogs_sbi_build_nr_location( &amf_ue->nr_tai, &amf_ue->nr_cgi); if (!ueLocation.nr_location) { diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index c4ea1e5af7..17ea59675b 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -33,20 +33,19 @@ int amf_nsmf_pdusession_handle_create_sm_context( ran_ue_t *ran_ue = NULL; ogs_assert(recvmsg); - ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->supi); return OGS_ERROR; @@ -255,20 +254,19 @@ int amf_nsmf_pdusession_handle_update_sm_context( ran_ue_t *ran_ue = NULL; ogs_assert(recvmsg); - ogs_assert(sess); - sess = amf_sess_cycle(sess); + if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT || recvmsg->res_status == OGS_SBI_HTTP_STATUS_OK) { @@ -711,9 +709,9 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { ran_ue_t *source_ue = NULL, *target_ue = NULL; - source_ue = sess->ran_ue; + source_ue = ran_ue_find_by_id(sess->ran_ue_id); ogs_assert(source_ue); - target_ue = ran_ue_cycle(source_ue->target_ue); + target_ue = ran_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { r = ngap_send_ran_ue_context_release_command( target_ue, @@ -783,7 +781,9 @@ int amf_nsmf_pdusession_handle_update_sm_context( amf_ue_deassociate(amf_ue); if (ran_ue) { - amf_gnb_t *gnb = ran_ue->gnb; + amf_gnb_t *gnb = NULL; + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); ogs_assert(gnb); ogs_debug(" SUPI[%s]", amf_ue->supi); @@ -839,7 +839,9 @@ int amf_nsmf_pdusession_handle_update_sm_context( amf_ue_deassociate(amf_ue); if (ran_ue) { - amf_gnb_t *gnb = ran_ue->gnb; + amf_gnb_t *gnb = NULL; + + gnb = amf_gnb_find_by_id(ran_ue->gnb_id); ogs_assert(gnb); ogs_debug(" SUPI[%s]", amf_ue->supi); @@ -936,8 +938,16 @@ int amf_nsmf_pdusession_handle_update_sm_context( ogs_pkbuf_t *n2smbuf = NULL; #endif - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); + if (!amf_ue) { + ogs_error("[%d:%d] UE context has already been removed [%d]", + sess->psi, sess->pti, recvmsg->res_status); + r = ngap_send_error_indication2(ran_ue, + NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return OGS_ERROR; + } SmContextUpdateError = recvmsg->SmContextUpdateError; if (!SmContextUpdateError) { @@ -1072,20 +1082,18 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; - ogs_assert(sess); - sess = amf_sess_cycle(sess); if (!sess) { ogs_error("Session has already been removed"); return OGS_ERROR; } - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); /* * To check if Reactivation Request has been used. diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index 2eb3e109d0..a42e227932 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -144,7 +144,7 @@ int amf_nudm_sdm_handle_provisioned( if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -154,7 +154,7 @@ int amf_nudm_sdm_handle_provisioned( if (amf_ue_is_rat_restricted(amf_ue)) { ogs_error("Registration rejected due to RAT restrictions"); r = nas_5gs_send_gmm_reject( - amf_ue->ran_ue, amf_ue, + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index ee3c6cb498..dbe6f00a03 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -127,7 +127,7 @@ int amf_ue_sbi_discover_and_send( } xact = ogs_sbi_xact_add( - &amf_ue->sbi, service_type, discovery_option, + amf_ue->id, &amf_ue->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, amf_ue, data); if (!xact) { ogs_error("amf_ue_sbi_discover_and_send() failed"); @@ -169,21 +169,18 @@ int amf_sess_sbi_discover_and_send( ogs_assert(build); if (ran_ue) { - sess->ran_ue = ran_ue_cycle(ran_ue); - if (!sess->ran_ue) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } + sess->ran_ue_id = ran_ue->id; } else - sess->ran_ue = NULL; + sess->ran_ue_id = OGS_INVALID_POOL_ID; xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + sess->id, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("amf_sess_sbi_discover_and_send() failed"); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, - OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; @@ -195,8 +192,9 @@ int amf_sess_sbi_discover_and_send( if (rv != OGS_OK) { ogs_error("amf_sess_sbi_discover_and_send() failed"); ogs_sbi_xact_remove(xact); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, - OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); + r = nas_5gs_send_back_gsm_message( + ran_ue_find_by_id(sess->ran_ue_id), sess, + OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return rv; @@ -211,7 +209,7 @@ static int client_discover_cb( ogs_sbi_message_t message; ogs_sbi_xact_t *xact = NULL; - ogs_pool_id_t xact_id = 0; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -230,16 +228,13 @@ static int client_discover_cb( return OGS_ERROR; } - sess = (amf_sess_t *)xact->sbi_object; - ogs_assert(sess); - service_type = xact->service_type; ogs_assert(service_type); requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); discovery_option = xact->discovery_option; - sess = amf_sess_cycle(sess); + sess = amf_sess_find_by_id(xact->sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); ogs_sbi_xact_remove(xact); @@ -249,7 +244,7 @@ static int client_discover_cb( } ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE); - amf_ue = amf_ue_cycle(sess->amf_ue); + amf_ue = amf_ue_find_by_id(sess->amf_ue_id); if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); ogs_sbi_xact_remove(xact); @@ -257,7 +252,7 @@ static int client_discover_cb( ogs_sbi_response_free(response); return OGS_ERROR; } - ran_ue = ran_ue_cycle(sess->ran_ue); + ran_ue = ran_ue_find_by_id(sess->ran_ue_id); if (!ran_ue) { ogs_error("[%s] NG context has already been removed", amf_ue->supi); ogs_sbi_xact_remove(xact); @@ -368,16 +363,13 @@ int amf_sess_sbi_discover_by_nsi( ogs_sbi_service_type_to_name(service_type)); if (ran_ue) { - sess->ran_ue = ran_ue_cycle(ran_ue); - if (!sess->ran_ue) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } + sess->ran_ue_id = ran_ue->id; } else - sess->ran_ue = NULL; + sess->ran_ue_id = OGS_INVALID_POOL_ID; xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, NULL, NULL, NULL); + sess->id, &sess->sbi, + service_type, discovery_option, NULL, NULL, NULL); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); return OGS_ERROR; @@ -459,7 +451,7 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) { int old_xact_count = 0, new_xact_count = 0; - amf_ue = amf_ue_cycle(ran_ue->amf_ue); + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); if (amf_ue) { old_xact_count = amf_sess_xact_count(amf_ue); diff --git a/src/amf/timer.c b/src/amf/timer.c index 1908511ad5..fc29e7a178 100644 --- a/src/amf/timer.c +++ b/src/amf/timer.c @@ -49,9 +49,6 @@ static amf_timer_cfg_t g_amf_timer_cfg[MAX_NUM_OF_AMF_TIMER] = { { .have = true, .duration = ogs_time_from_sec(30) }, }; -static void gmm_timer_event_send( - amf_timer_e timer_id, amf_ue_t *amf_ue); - amf_timer_cfg_t *amf_timer_cfg(amf_timer_e id) { ogs_assert(id < MAX_NUM_OF_AMF_TIMER); @@ -124,16 +121,17 @@ void amf_timer_ng_delayed_send(void *data) } static void gmm_timer_event_send( - amf_timer_e timer_id, amf_ue_t *amf_ue) + amf_timer_e timer_id, void *data) { int rv; amf_event_t *e = NULL; - ogs_assert(amf_ue); + + ogs_assert(data); e = amf_event_new(AMF_EVENT_5GMM_TIMER); ogs_assert(e); e->h.timer_id = timer_id; - e->amf_ue = amf_ue; + e->amf_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -172,16 +170,14 @@ void amf_timer_ng_holding_timer_expire(void *data) { int rv; amf_event_t *e = NULL; - ran_ue_t *ran_ue = NULL; ogs_assert(data); - ran_ue = data; e = amf_event_new(AMF_EVENT_NGAP_TIMER); ogs_assert(e); e->h.timer_id = AMF_TIMER_NG_HOLDING; - e->ran_ue = ran_ue; + e->ran_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index 87b9fa62e1..40bd029826 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -39,7 +39,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -47,7 +47,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ausf_ue_t *ausf_ue = NULL; diff --git a/src/ausf/sbi-path.c b/src/ausf/sbi-path.c index fee434b4f4..5c5c966cfb 100644 --- a/src/ausf/sbi-path.c +++ b/src/ausf/sbi-path.c @@ -89,7 +89,7 @@ int ausf_sbi_discover_and_send( ogs_assert(build); xact = ogs_sbi_xact_add( - &ausf_ue->sbi, service_type, discovery_option, + 0, &ausf_ue->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, ausf_ue, data); if (!xact) { ogs_error("ausf_sbi_discover_and_send() failed"); diff --git a/src/ausf/ue-sm.c b/src/ausf/ue-sm.c index b67ac4f68d..df204bd8f8 100644 --- a/src/ausf/ue-sm.c +++ b/src/ausf/ue-sm.c @@ -56,7 +56,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ausf_ue_t *ausf_ue = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); diff --git a/src/bsf/bsf-sm.c b/src/bsf/bsf-sm.c index 6f8124e82a..fff9f4ccd5 100644 --- a/src/bsf/bsf-sm.c +++ b/src/bsf/bsf-sm.c @@ -44,7 +44,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) bsf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -52,7 +52,7 @@ void bsf_state_operational(ogs_fsm_t *s, bsf_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; bsf_sm_debug(e); diff --git a/src/bsf/sbi-path.c b/src/bsf/sbi-path.c index 33284baa8b..e2054f1c97 100644 --- a/src/bsf/sbi-path.c +++ b/src/bsf/sbi-path.c @@ -89,7 +89,7 @@ int bsf_sbi_discover_and_send( ogs_assert(build); xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + 0, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("bsf_sbi_discover_and_send() failed"); diff --git a/src/nrf/nf-sm.c b/src/nrf/nf-sm.c index e012ae2911..7ab6ba2e77 100644 --- a/src/nrf/nf-sm.c +++ b/src/nrf/nf-sm.c @@ -85,7 +85,7 @@ void nrf_nf_state_will_register(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -185,7 +185,7 @@ void nrf_nf_state_registered(ogs_fsm_t *s, nrf_event_t *e) ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_sbi_response_t *response = NULL; diff --git a/src/nrf/nrf-sm.c b/src/nrf/nrf-sm.c index beebe48910..1a5258404a 100644 --- a/src/nrf/nrf-sm.c +++ b/src/nrf/nrf-sm.c @@ -40,7 +40,7 @@ void nrf_state_operational(ogs_fsm_t *s, nrf_event_t *e) { int rv; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; diff --git a/src/nssf/nssf-sm.c b/src/nssf/nssf-sm.c index 4e6a97f4f5..47f7b3a3f4 100644 --- a/src/nssf/nssf-sm.c +++ b/src/nssf/nssf-sm.c @@ -43,7 +43,7 @@ void nssf_state_operational(ogs_fsm_t *s, nssf_event_t *e) const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 3b01a6a9ca..25f9e92466 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -39,7 +39,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -49,7 +49,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_object_t *sbi_object = NULL; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index b012dc89a1..cb0c9f361c 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -139,7 +139,7 @@ static int pcf_sbi_discover_and_send( ogs_assert(build); xact = ogs_sbi_xact_add( - sbi_object, service_type, discovery_option, + 0, sbi_object, service_type, discovery_option, build, context, data); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); @@ -194,7 +194,8 @@ int pcf_sess_sbi_discover_only( ogs_assert(sess); ogs_assert(service_type); - xact = ogs_sbi_xact_add(&sess->sbi, service_type, NULL, NULL, NULL, NULL); + xact = ogs_sbi_xact_add( + 0, &sess->sbi, service_type, NULL, NULL, NULL, NULL); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); return OGS_ERROR; diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 86d148271b..a9a43fe32d 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -111,7 +111,7 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_sbi_client_t *client = NULL, *nrf_client = NULL, *next_scp = NULL; ogs_sbi_client_t *sepp_client = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; @@ -631,7 +631,7 @@ static int response_handler( { scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_assert(assoc); @@ -689,7 +689,7 @@ static int nf_discover_handler( scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; @@ -846,7 +846,7 @@ static int sepp_discover_handler( scp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; diff --git a/src/scp/scp-sm.c b/src/scp/scp-sm.c index c77a0b345c..b77950a503 100644 --- a/src/scp/scp-sm.c +++ b/src/scp/scp-sm.c @@ -40,7 +40,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -48,7 +48,7 @@ void scp_state_operational(ogs_fsm_t *s, scp_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; scp_sm_debug(e); diff --git a/src/sepp/handshake-sm.c b/src/sepp/handshake-sm.c index 99cab8858e..2e9af63a03 100644 --- a/src/sepp/handshake-sm.c +++ b/src/sepp/handshake-sm.c @@ -87,7 +87,7 @@ void sepp_handshake_state_will_establish(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -291,7 +291,7 @@ void sepp_handshake_state_established(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); @@ -438,7 +438,7 @@ void sepp_handshake_state_terminated(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); diff --git a/src/sepp/sbi-path.c b/src/sepp/sbi-path.c index 62a5e4c47e..326c342000 100644 --- a/src/sepp/sbi-path.c +++ b/src/sepp/sbi-path.c @@ -158,7 +158,7 @@ static int request_handler(ogs_sbi_request_t *request, void *data) ogs_hash_index_t *hi; ogs_sbi_client_t *client = NULL, *scp_client = NULL; ogs_sbi_stream_t *stream = data; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_server_t *server = NULL; ogs_sbi_request_t sepp_request; @@ -419,7 +419,7 @@ static int response_handler( { sepp_assoc_t *assoc = data; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_assert(assoc); diff --git a/src/sepp/sepp-sm.c b/src/sepp/sepp-sm.c index 5fc12be438..e8d64ff82b 100644 --- a/src/sepp/sepp-sm.c +++ b/src/sepp/sepp-sm.c @@ -42,7 +42,7 @@ void sepp_state_operational(ogs_fsm_t *s, sepp_event_t *e) sepp_node_t *sepp_node = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_server_t *server = NULL; diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 162f6f5e2c..40c2df11c5 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -168,7 +168,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -463,7 +463,7 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; int state = 0; @@ -759,7 +759,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_gtp1_message_t *gtp1_message = NULL; @@ -1315,7 +1315,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_pfcp_xact_t *pfcp_xact = NULL; @@ -1657,7 +1657,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); @@ -2028,7 +2028,7 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); diff --git a/src/smf/sbi-path.c b/src/smf/sbi-path.c index 17a44c5e8e..805853004e 100644 --- a/src/smf/sbi-path.c +++ b/src/smf/sbi-path.c @@ -198,7 +198,7 @@ int smf_sbi_discover_and_send( } xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + 0, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("smf_sbi_discover_and_send() failed"); @@ -256,7 +256,7 @@ void smf_namf_comm_send_n1_n2_message_transfer( discovery_option, sess->serving_nf_id); xact = ogs_sbi_xact_add( - &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + 0, &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, (ogs_sbi_build_f)smf_namf_comm_build_n1_n2_message_transfer, sess, param); if (!xact) { diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index b93f83d39b..c66679fba8 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -70,7 +70,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_message_t *pfcp_message = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *sbi_request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -78,7 +78,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_response_t *sbi_response = NULL; ogs_sbi_message_t sbi_message; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ogs_nas_5gs_message_t nas_message; ogs_pkbuf_t *pkbuf = NULL; diff --git a/src/udm/sbi-path.c b/src/udm/sbi-path.c index fa97e72262..28d606d993 100644 --- a/src/udm/sbi-path.c +++ b/src/udm/sbi-path.c @@ -112,7 +112,7 @@ static int udm_sbi_discover_and_send( ogs_assert(build); xact = ogs_sbi_xact_add( - sbi_object, service_type, discovery_option, + 0, sbi_object, service_type, discovery_option, (ogs_sbi_build_f)build, context, data); if (!xact) { ogs_error("udm_sbi_discover_and_send() failed"); diff --git a/src/udm/sess-sm.c b/src/udm/sess-sm.c index 5327d5452a..7ab70c2edd 100644 --- a/src/udm/sess-sm.c +++ b/src/udm/sess-sm.c @@ -40,7 +40,7 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; ogs_assert(s); diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index 1d6431510f..fe0cd9d52b 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -40,7 +40,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) const char *api_version = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; @@ -48,7 +48,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_sbi_response_t *response = NULL; ogs_sbi_message_t message; ogs_sbi_xact_t *sbi_xact = NULL; - ogs_pool_id_t sbi_xact_id = 0; + ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; udm_ue_t *udm_ue = NULL; udm_sess_t *sess = NULL; diff --git a/src/udm/ue-sm.c b/src/udm/ue-sm.c index fa5247c45a..70bf789836 100644 --- a/src/udm/ue-sm.c +++ b/src/udm/ue-sm.c @@ -38,7 +38,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_ue_t *udm_ue = NULL; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *message = NULL; int r; diff --git a/src/udr/udr-sm.c b/src/udr/udr-sm.c index 030fb53a35..02ce49770e 100644 --- a/src/udr/udr-sm.c +++ b/src/udr/udr-sm.c @@ -41,7 +41,7 @@ void udr_state_operational(ogs_fsm_t *s, udr_event_t *e) int rv; ogs_sbi_stream_t *stream = NULL; - ogs_pool_id_t stream_id = 0; + ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_request_t *request = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; diff --git a/tests/af/sbi-path.c b/tests/af/sbi-path.c index 4059c8a9fa..fcfebe8fba 100644 --- a/tests/af/sbi-path.c +++ b/tests/af/sbi-path.c @@ -74,7 +74,7 @@ void af_sbi_discover_and_send( ogs_assert(build); xact = ogs_sbi_xact_add( - &sess->sbi, service_type, discovery_option, + 0, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("af_sbi_discover_and_send() failed"); From c151e4fbcebdc58dced20e30a911b3519143733f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 22 Jun 2024 16:09:49 +0900 Subject: [PATCH 137/323] [POOL] refactor memory pool in MME (#3196) Removed ogs_pool_cycle() from MME memory pool and changed it to find by hash id. --- src/amf/context.c | 8 +- src/amf/event.h | 1 - src/amf/nsmf-handler.c | 41 +++-- src/mme/emm-handler.c | 32 ++-- src/mme/emm-sm.c | 47 ++--- src/mme/esm-build.c | 20 +-- src/mme/esm-handler.c | 14 +- src/mme/esm-sm.c | 54 +++--- src/mme/mme-context.c | 365 +++++++++++++++++++++----------------- src/mme/mme-context.h | 141 +++++++-------- src/mme/mme-event.h | 11 +- src/mme/mme-fd-path.c | 56 +++--- src/mme/mme-gn-build.c | 13 +- src/mme/mme-gn-handler.c | 14 +- src/mme/mme-gtp-path.c | 83 +++++---- src/mme/mme-path.c | 19 +- src/mme/mme-s11-build.c | 34 ++-- src/mme/mme-s11-handler.c | 176 +++++++++--------- src/mme/mme-s6a-handler.c | 4 - src/mme/mme-sm.c | 75 ++++---- src/mme/mme-timer.c | 37 ++-- src/mme/nas-path.c | 187 +++++++++++-------- src/mme/s1ap-build.c | 37 ++-- src/mme/s1ap-handler.c | 77 ++++---- src/mme/s1ap-path.c | 143 +++++++-------- src/mme/s1ap-sm.c | 2 +- src/mme/sgsap-handler.c | 3 +- 27 files changed, 883 insertions(+), 811 deletions(-) diff --git a/src/amf/context.c b/src/amf/context.c index 627cd4aaff..75ee3a039a 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1203,7 +1203,7 @@ amf_gnb_t *amf_gnb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) ogs_pool_id_calloc(&amf_gnb_pool, &gnb); if (!gnb) { - ogs_error("ogs_pool_id_callod() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } @@ -1370,12 +1370,12 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint64_t ran_ue_ngap_id) void ran_ue_remove(ran_ue_t *ran_ue) { amf_gnb_t *gnb = NULL; + ogs_assert(ran_ue); gnb = amf_gnb_find_by_id(ran_ue->gnb_id); - ogs_assert(gnb); - ogs_list_remove(&gnb->ran_ue_list, ran_ue); + if (gnb) ogs_list_remove(&gnb->ran_ue_list, ran_ue); ogs_assert(ran_ue->t_ng_holding); ogs_timer_delete(ran_ue->t_ng_holding); @@ -2104,7 +2104,7 @@ void amf_ue_set_suci(amf_ue_t *amf_ue, ran_ue_remove(ran_ue); } else { ogs_error("[%s] RAN-NG Context has already been removed", - suci); + old_amf_ue->suci); } } diff --git a/src/amf/event.h b/src/amf/event.h index ca46d45631..3300d1b1e2 100644 --- a/src/amf/event.h +++ b/src/amf/event.h @@ -78,7 +78,6 @@ typedef struct amf_event_s { ogs_pool_id_t ran_ue_id; ogs_pool_id_t amf_ue_id; ogs_pool_id_t sess_id; - amf_bearer_t *bearer; ogs_timer_t *timer; } amf_event_t; diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 17ea59675b..da6538c10b 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -784,12 +784,11 @@ int amf_nsmf_pdusession_handle_update_sm_context( amf_gnb_t *gnb = NULL; gnb = amf_gnb_find_by_id(ran_ue->gnb_id); - ogs_assert(gnb); ogs_debug(" SUPI[%s]", amf_ue->supi); ran_ue_remove(ran_ue); - if (ogs_list_count(&gnb->ran_ue_list) == 0) { + if (gnb && ogs_list_count(&gnb->ran_ue_list) == 0) { r = ngap_send_ng_reset_ack(gnb, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -842,32 +841,32 @@ int amf_nsmf_pdusession_handle_update_sm_context( amf_gnb_t *gnb = NULL; gnb = amf_gnb_find_by_id(ran_ue->gnb_id); - ogs_assert(gnb); ogs_debug(" SUPI[%s]", amf_ue->supi); ran_ue_remove(ran_ue); - ogs_list_for_each(&gnb->ran_ue_list, iter) { - if (iter->part_of_ng_reset_requested == true) { - /* The GNB_UE context - * where PartOfNG_interface was requested - * still remains */ - return OGS_OK; + if (gnb) { + ogs_list_for_each(&gnb->ran_ue_list, iter) { + if (iter->part_of_ng_reset_requested == true) { + /* The GNB_UE context + * where PartOfNG_interface was requested + * still remains */ + return OGS_OK; + } } - } - - /* All GNB_UE context - * where PartOfNG_interface was requested - * REMOVED */ - ogs_assert(gnb->ng_reset_ack); - r = ngap_send_to_gnb( - gnb, gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - /* Clear NG-Reset Ack Buffer */ - gnb->ng_reset_ack = NULL; + /* All GNB_UE context + * where PartOfNG_interface was requested + * REMOVED */ + ogs_assert(gnb->ng_reset_ack); + r = ngap_send_to_gnb( + gnb, gnb->ng_reset_ack, NGAP_NON_UE_SIGNALLING); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + /* Clear NG-Reset Ack Buffer */ + gnb->ng_reset_ack = NULL; + } } else { ogs_warn("[%s] RAN-NG Context has already been removed", amf_ue->supi); diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 7620f50562..7fa4ea4ca1 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -55,15 +55,14 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(esm_message_container); if (!esm_message_container->length) { ogs_error("No ESM Message Container"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -143,7 +142,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, /* Send Attach Reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -187,7 +186,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, "but Integrity[0x%x] cannot be bypassed with EIA0", mme_selected_enc_algorithm(mme_ue), mme_selected_int_algorithm(mme_ue)); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -210,7 +209,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -270,7 +269,6 @@ int emm_handle_attach_complete( struct tm gmt, local; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); @@ -358,7 +356,8 @@ int emm_handle_attach_complete( return OGS_ERROR; } - r = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + r = nas_eps_send_to_downlink_nas_transport( + enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -379,7 +378,7 @@ int emm_handle_identity_response( ogs_assert(identity_response); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); mobile_identity = &identity_response->mobile_identity; @@ -391,7 +390,7 @@ int emm_handle_identity_response( ogs_error("mobile_identity length (%d != %d)", (int)sizeof(ogs_nas_mobile_identity_imsi_t), mobile_identity->length); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -404,7 +403,7 @@ int emm_handle_identity_response( emm_cause = emm_cause_from_access_control(mme_ue); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("Rejected by PLMN-ID access control"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -417,7 +416,7 @@ int emm_handle_identity_response( if (mme_ue->imsi_len != OGS_MAX_IMSI_LEN) { ogs_error("Invalid IMSI LEN[%d]", mme_ue->imsi_len); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -595,7 +594,7 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(pkbuf); @@ -656,7 +655,7 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, /* Send TAU reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -750,7 +749,7 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue, enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); /* Set Service Type */ @@ -793,7 +792,7 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue, /* Send TAU reject */ ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -823,7 +822,6 @@ int emm_handle_security_mode_complete(mme_ue_t *mme_ue, ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv; ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (security_mode_complete->presencemask & OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) { diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 8992bbadfd..63e82fdb97 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -72,7 +72,7 @@ void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -123,7 +123,7 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -297,7 +297,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -305,7 +305,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); h.type = e->nas_type; @@ -898,17 +898,22 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } else { S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID; S1AP_ENB_UE_S1AP_ID_t ENB_UE_S1AP_ID; + mme_enb_t *enb = NULL; ogs_warn("No connection of MSC/VLR"); MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id; ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id; - r = s1ap_send_error_indication(enb_ue->enb, - &MME_UE_S1AP_ID, &ENB_UE_S1AP_ID, - S1AP_Cause_PR_transport, - S1AP_CauseTransport_transport_resource_unavailable); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (enb) { + r = s1ap_send_error_indication(enb, + &MME_UE_S1AP_ID, &ENB_UE_S1AP_ID, + S1AP_Cause_PR_transport, + S1AP_CauseTransport_transport_resource_unavailable); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else + ogs_error("eNB has already been removed"); } break; @@ -945,9 +950,8 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -958,7 +962,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); switch (message->emm.h.message_type) { @@ -1146,7 +1150,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1162,7 +1166,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); if (message->emm.h.security_header_type @@ -1327,7 +1331,8 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) "Stop retransmission", mme_ue->imsi_bcd); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject( + enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -1364,7 +1369,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1376,7 +1381,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); @@ -1606,7 +1611,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) mme_timer_cfg(MME_TIMER_T3450)->duration); r = nas_eps_send_to_downlink_nas_transport( - mme_ue->enb_ue, emmbuf); + enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1635,7 +1640,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) ogs_assert(e); mme_sm_debug(e); - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -1650,7 +1655,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); h.type = e->nas_type; diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index fa8d9def06..24de898283 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -33,7 +33,7 @@ ogs_pkbuf_t *esm_build_pdn_connectivity_reject( &message.esm.pdn_connectivity_reject; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_debug("PDN connectivity reject"); @@ -68,9 +68,9 @@ ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer) mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("ESM information request"); @@ -117,7 +117,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( ogs_session_t *session = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); session = sess->session; ogs_assert(session); @@ -269,9 +269,9 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( &activate_dedicated_eps_bearer_context_request->tft; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); linked_bearer = mme_linked_bearer(bearer); ogs_assert(linked_bearer); @@ -333,9 +333,9 @@ ogs_pkbuf_t *esm_build_modify_bearer_context_request( &modify_eps_bearer_context_request->tft; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("Modify bearer context request"); @@ -383,9 +383,9 @@ ogs_pkbuf_t *esm_build_deactivate_bearer_context_request( &message.esm.deactivate_eps_bearer_context_request; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_debug("Deactivate bearer context request"); diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index e97914778d..e829df6287 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -37,11 +37,10 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, uint8_t security_protected_required = 0; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(req); @@ -180,9 +179,8 @@ int esm_handle_information_response(mme_sess_t *sess, mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(rsp); @@ -278,9 +276,9 @@ int esm_handle_bearer_resource_allocation_request( mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); r = nas_eps_send_bearer_resource_allocation_reject( @@ -297,7 +295,7 @@ int esm_handle_bearer_resource_modification_request( mme_ue_t *mme_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); ogs_assert(OGS_OK == diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index f676beee09..382e50cc5e 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -70,6 +70,8 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; + sgw_ue_t *sgw_ue = NULL; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -83,13 +85,12 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -119,9 +120,12 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); if (MME_HAVE_SGW_S1U_PATH(sess)) { + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess, - OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); + mme_gtp_send_delete_session_request(sgw_ue, sess, + OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); ogs_expect(r == OGS_OK); @@ -141,15 +145,19 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) CLEAR_BEARER_TIMER(bearer->t3489); h.type = e->nas_type; + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (h.integrity_protected == 0) { ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + + ogs_assert(enb_ue); + + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -160,13 +168,15 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + + ogs_assert(enb_ue); + + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -268,6 +278,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; + sgw_ue_t *sgw_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -277,11 +288,11 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -313,8 +324,11 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); if (MME_HAVE_SGW_S1U_PATH(sess)) { + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(mme_ue->sgw_ue, sess, + mme_gtp_send_delete_session_request(sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -383,11 +397,11 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); switch (e->id) { @@ -472,7 +486,7 @@ void esm_state_exception(ogs_fsm_t *s, mme_event_t *e) ogs_assert(e); mme_sm_debug(e); - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); switch (e->id) { case OGS_FSM_ENTRY_SIG: diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index a26c7df370..4ebd6683c9 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2617,7 +2617,7 @@ static bool compare_apn_enb_info( ogs_assert(sess); ogs_assert(sess->session); ogs_assert(sess->session->name); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); for (i = 0; i < pgw->num_of_apn; i++) @@ -2795,9 +2795,11 @@ mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) ogs_assert(sock); ogs_assert(addr); - ogs_pool_alloc(&mme_enb_pool, &enb); - ogs_assert(enb); - memset(enb, 0, sizeof *enb); + ogs_pool_id_calloc(&mme_enb_pool, &enb); + if (!enb) { + ogs_error("ogs_pool_id_calloc() failed"); + return NULL; + } enb->sctp.sock = sock; enb->sctp.addr = addr; @@ -2820,7 +2822,7 @@ mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) enb->sctp.addr, sizeof(ogs_sockaddr_t), enb); memset(&e, 0, sizeof(e)); - e.enb = enb; + e.enb_id = enb->id; ogs_fsm_init(&enb->sm, s1ap_state_initial, s1ap_state_final, &e); ogs_list_add(&self.enb_list, enb); @@ -2842,7 +2844,7 @@ int mme_enb_remove(mme_enb_t *enb) ogs_list_remove(&self.enb_list, enb); memset(&e, 0, sizeof(e)); - e.enb = enb; + e.enb_id = enb->id; ogs_fsm_fini(&enb->sm, &e); ogs_hash_set(self.enb_addr_hash, @@ -2858,7 +2860,7 @@ int mme_enb_remove(mme_enb_t *enb) ogs_sctp_flush_and_destroy(&enb->sctp); - ogs_pool_free(&mme_enb_pool, enb); + ogs_pool_id_free(&mme_enb_pool, enb); mme_metrics_inst_global_dec(MME_METR_GLOB_GAUGE_ENB); ogs_info("[Removed] Number of eNBs is now %d", ogs_list_count(&self.enb_list)); @@ -2917,9 +2919,9 @@ int mme_enb_sock_type(ogs_sock_t *sock) return SOCK_STREAM; } -mme_enb_t *mme_enb_cycle(mme_enb_t *enb) +mme_enb_t *mme_enb_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_enb_pool, enb); + return ogs_pool_find_by_id(&mme_enb_pool, id); } /** enb_ue_context handling function */ @@ -2929,19 +2931,18 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) ogs_assert(enb); - ogs_pool_alloc(&enb_ue_pool, &enb_ue); + ogs_pool_id_calloc(&enb_ue_pool, &enb_ue); if (enb_ue == NULL) { ogs_error("Could not allocate enb_ue context from pool"); return NULL; } - memset(enb_ue, 0, sizeof *enb_ue); - enb_ue->t_s1_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue); + ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, + OGS_UINT_TO_POINTER(enb_ue->id)); if (!enb_ue->t_s1_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&enb_ue_pool, enb_ue); + ogs_pool_id_free(&enb_ue_pool, enb_ue); return NULL; } @@ -2961,7 +2962,7 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) enb_ue->enb_ostream_id = OGS_NEXT_ID(enb->ostream_id, 1, enb->max_num_of_ostreams-1); - enb_ue->enb = enb; + enb_ue->enb_id = enb->id; ogs_list_add(&enb->enb_ue_list, enb_ue); @@ -2975,33 +2976,35 @@ void enb_ue_remove(enb_ue_t *enb_ue) mme_enb_t *enb = NULL; ogs_assert(enb_ue); - enb = enb_ue->enb; - ogs_assert(enb); - ogs_list_remove(&enb->enb_ue_list, enb_ue); + enb = mme_enb_find_by_id(enb_ue->enb_id); + + if (enb) ogs_list_remove(&enb->enb_ue_list, enb_ue); ogs_assert(enb_ue->t_s1_holding); ogs_timer_delete(enb_ue->t_s1_holding); - ogs_pool_free(&enb_ue_pool, enb_ue); + ogs_pool_id_free(&enb_ue_pool, enb_ue); stats_remove_enb_ue(); } void enb_ue_switch_to_enb(enb_ue_t *enb_ue, mme_enb_t *new_enb) { + mme_enb_t *enb = NULL; ogs_assert(enb_ue); - ogs_assert(enb_ue->enb); ogs_assert(new_enb); + enb = mme_enb_find_by_id(enb_ue->enb_id); + /* Remove from the old enb */ - ogs_list_remove(&enb_ue->enb->enb_ue_list, enb_ue); + ogs_list_remove(&enb->enb_ue_list, enb_ue); /* Add to the new enb */ ogs_list_add(&new_enb->enb_ue_list, enb_ue); /* Switch to enb */ - enb_ue->enb = new_enb; + enb_ue->enb_id = new_enb->id; } enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id( @@ -3027,9 +3030,9 @@ enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id) return enb_ue_find(mme_ue_s1ap_id); } -enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue) +enb_ue_t *enb_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&enb_ue_pool, enb_ue); + return ogs_pool_find_by_id(&enb_ue_pool, id); } /** sgw_ue_context handling function */ @@ -3039,15 +3042,15 @@ sgw_ue_t *sgw_ue_add(mme_sgw_t *sgw) ogs_assert(sgw); - ogs_pool_alloc(&sgw_ue_pool, &sgw_ue); + ogs_pool_id_calloc(&sgw_ue_pool, &sgw_ue); ogs_assert(sgw_ue); - memset(sgw_ue, 0, sizeof *sgw_ue); sgw_ue->t_s11_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, sgw_ue); + ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, + OGS_UINT_TO_POINTER(sgw_ue->id)); if (!sgw_ue->t_s11_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&sgw_ue_pool, sgw_ue); + ogs_pool_id_free(&sgw_ue_pool, sgw_ue); return NULL; } @@ -3071,7 +3074,7 @@ void sgw_ue_remove(sgw_ue_t *sgw_ue) ogs_assert(sgw_ue->t_s11_holding); ogs_timer_delete(sgw_ue->t_s11_holding); - ogs_pool_free(&sgw_ue_pool, sgw_ue); + ogs_pool_id_free(&sgw_ue_pool, sgw_ue); } void sgw_ue_switch_to_sgw(sgw_ue_t *sgw_ue, mme_sgw_t *new_sgw) @@ -3090,9 +3093,9 @@ void sgw_ue_switch_to_sgw(sgw_ue_t *sgw_ue, mme_sgw_t *new_sgw) sgw_ue->sgw = new_sgw; } -sgw_ue_t *sgw_ue_cycle(sgw_ue_t *sgw_ue) +sgw_ue_t *sgw_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgw_ue_pool, sgw_ue); + return ogs_pool_find_by_id(&sgw_ue_pool, id); } sgw_relocation_e sgw_ue_check_if_relocated(mme_ue_t *mme_ue) @@ -3102,9 +3105,9 @@ sgw_relocation_e sgw_ue_check_if_relocated(mme_ue_t *mme_ue) mme_sgw_t *current = NULL, *changed = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); - source_ue = sgw_ue_cycle(mme_ue->sgw_ue); + source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(source_ue); current = source_ue->sgw; @@ -3114,13 +3117,13 @@ sgw_relocation_e sgw_ue_check_if_relocated(mme_ue_t *mme_ue) if (!changed) return SGW_WITHOUT_RELOCATION; /* Check if Old Source UE */ - old_source_ue = sgw_ue_cycle(source_ue->source_ue); + old_source_ue = sgw_ue_find_by_id(source_ue->source_ue_id); if (old_source_ue) { sgw_ue_source_deassociate_target(old_source_ue); sgw_ue_remove(old_source_ue); } - target_ue = sgw_ue_cycle(source_ue->target_ue); + target_ue = sgw_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { ogs_error("SGW-UE source has already been associated with target"); return SGW_HAS_ALREADY_BEEN_RELOCATED; @@ -3254,80 +3257,90 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) char buf[OGS_ADDRSTRLEN]; ogs_assert(enb_ue); - enb = enb_ue->enb; - ogs_assert(enb); - ogs_pool_alloc(&mme_ue_pool, &mme_ue); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (!enb) { + ogs_error("[%d] eNB has already been removed", enb_ue->enb_id); + return NULL; + } + + ogs_pool_id_calloc(&mme_ue_pool, &mme_ue); if (mme_ue == NULL) { ogs_error("Could not allocate mme_ue context from pool"); return NULL; } - memset(mme_ue, 0, sizeof *mme_ue); - /* Add All Timers */ mme_ue->t3413.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3413_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3413.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3413.pkbuf = NULL; mme_ue->t3422.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3422_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3422.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3422.pkbuf = NULL; mme_ue->t3450.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3450_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3450.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3450.pkbuf = NULL; mme_ue->t3460.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3460_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3460.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3460.pkbuf = NULL; mme_ue->t3470.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_t3470_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t3470.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t3470.pkbuf = NULL; mme_ue->t_mobile_reachable.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_mobile_reachable_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_mobile_reachable_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t_mobile_reachable.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t_mobile_reachable.pkbuf = NULL; mme_ue->t_implicit_detach.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_implicit_detach_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_implicit_detach_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!mme_ue->t_implicit_detach.timer) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } mme_ue->t_implicit_detach.pkbuf = NULL; mme_ue->gn.t_gn_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_gn_holding_timer_expire, mme_ue); + ogs_app()->timer_mgr, mme_timer_gn_holding_timer_expire, + OGS_UINT_TO_POINTER(mme_ue->id)); if (! mme_ue->gn.t_gn_holding) { ogs_error("ogs_timer_add() failed"); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } @@ -3384,6 +3397,7 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) void mme_ue_remove(mme_ue_t *mme_ue) { + sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); ogs_list_remove(&self.mme_ue_list, mme_ue); @@ -3395,8 +3409,8 @@ void mme_ue_remove(mme_ue_t *mme_ue) ogs_hash_set(self.mme_gn_teid_hash, &mme_ue->gn.mme_gn_teid, sizeof(mme_ue->gn.mme_gn_teid), NULL); - ogs_assert(mme_ue->sgw_ue); - sgw_ue_remove(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + if (sgw_ue) sgw_ue_remove(sgw_ue); if (mme_ue->imsi_len != 0) ogs_hash_set(mme_self()->imsi_ue_hash, @@ -3443,7 +3457,7 @@ void mme_ue_remove(mme_ue_t *mme_ue) ogs_pool_free(&mme_s11_teid_pool, mme_ue->mme_s11_teid_node); ogs_pool_free(&mme_gn_teid_pool, mme_ue->gn.mme_gn_teid_node); - ogs_pool_free(&mme_ue_pool, mme_ue); + ogs_pool_id_free(&mme_ue_pool, mme_ue); ogs_info("[Removed] Number of MME-UEs is now %d", ogs_list_count(&self.mme_ue_list)); @@ -3454,7 +3468,7 @@ void mme_ue_remove_all(void) mme_ue_t *mme_ue = NULL, *next = NULL;; ogs_list_for_each_safe(&self.mme_ue_list, next, mme_ue) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) enb_ue_remove(enb_ue); @@ -3462,9 +3476,9 @@ void mme_ue_remove_all(void) } } -mme_ue_t *mme_ue_cycle(mme_ue_t *mme_ue) +mme_ue_t *mme_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_ue_pool, mme_ue); + return ogs_pool_find_by_id(&mme_ue_pool, id); } void mme_ue_fsm_init(mme_ue_t *mme_ue) @@ -3474,7 +3488,7 @@ void mme_ue_fsm_init(mme_ue_t *mme_ue) ogs_assert(mme_ue); memset(&e, 0, sizeof(e)); - e.mme_ue = mme_ue; + e.mme_ue_id = mme_ue->id; ogs_fsm_init(&mme_ue->sm, emm_state_initial, emm_state_final, &e); } @@ -3485,7 +3499,7 @@ void mme_ue_fsm_fini(mme_ue_t *mme_ue) ogs_assert(mme_ue); memset(&e, 0, sizeof(e)); - e.mme_ue = mme_ue; + e.mme_ue_id = mme_ue->id; ogs_fsm_fini(&mme_ue->sm, &e); } @@ -3705,6 +3719,7 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) mme_ue_t *old_mme_ue = NULL; mme_sess_t *old_sess = NULL; mme_bearer_t *old_bearer = NULL; + sgw_ue_t *sgw_ue = NULL, *old_sgw_ue = NULL; ogs_assert(mme_ue && imsi_bcd); ogs_cpystrn(mme_ue->imsi_bcd, imsi_bcd, OGS_MAX_IMSI_BCD_LEN+1); @@ -3718,13 +3733,19 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) ogs_pool_index(&mme_ue_pool, old_mme_ue)) { ogs_warn("[%s] OLD UE Context Release", mme_ue->imsi_bcd); if (ECM_CONNECTED(old_mme_ue)) { + enb_ue_t *enb_ue = enb_ue_find_by_id(old_mme_ue->enb_ue_id); /* Implcit S1 release */ ogs_warn("[%s] Implicit S1 release", mme_ue->imsi_bcd); - ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", - old_mme_ue->imsi_bcd, - old_mme_ue->enb_ue->enb_ue_s1ap_id, - old_mme_ue->enb_ue->mme_ue_s1ap_id); - enb_ue_remove(old_mme_ue->enb_ue); + if (enb_ue) { + ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + old_mme_ue->imsi_bcd, + enb_ue->enb_ue_s1ap_id, + enb_ue->mme_ue_s1ap_id); + enb_ue_remove(enb_ue); + } else { + ogs_error("[%s] S1 Context has already been removed", + old_mme_ue->imsi_bcd); + } } /* @@ -3742,14 +3763,14 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) /* Phase-1 : Change MME-UE Context in Session Context */ ogs_list_for_each(&old_mme_ue->sess_list, old_sess) { ogs_list_for_each(&old_sess->bearer_list, old_bearer) { - old_bearer->mme_ue = mme_ue; + old_bearer->mme_ue_id = mme_ue->id; if (old_bearer->ebi_node) ogs_pool_free( &old_mme_ue->ebi_pool, old_bearer->ebi_node); old_bearer->ebi_node = NULL; } - old_sess->mme_ue = mme_ue; + old_sess->mme_ue_id = mme_ue->id; } /* Phase-2 : Move Session Context from OLD to NEW MME-UE Context */ @@ -3760,11 +3781,12 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) memset(&old_mme_ue->sess_list, 0, sizeof(old_mme_ue->sess_list)); /* Phase-4 : Move sgw_ue->sgw_s11_teid */ - ogs_assert(old_mme_ue->sgw_ue); - ogs_assert(mme_ue->sgw_ue); - mme_ue->sgw_ue->sgw_s11_teid = old_mme_ue->sgw_ue->sgw_s11_teid; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); + ogs_assert(sgw_ue); + old_sgw_ue = sgw_ue_find_by_id(old_mme_ue->sgw_ue_id); + ogs_assert(old_sgw_ue); + sgw_ue->sgw_s11_teid = old_sgw_ue->sgw_s11_teid; - MME_UE_CHECK(OGS_LOG_WARN, old_mme_ue); mme_ue_remove(old_mme_ue); } } @@ -3875,7 +3897,7 @@ int mme_ue_xact_count(mme_ue_t *mme_ue, uint8_t org) ogs_assert(org == OGS_GTP_LOCAL_ORIGINATOR || org == OGS_GTP_REMOTE_ORIGINATOR); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); if (!sgw_ue) return 0; gnode = sgw_ue->gnode; @@ -3891,34 +3913,30 @@ void enb_ue_associate_mme_ue(enb_ue_t *enb_ue, mme_ue_t *mme_ue) ogs_assert(mme_ue); ogs_assert(enb_ue); - mme_ue->enb_ue = enb_ue; - enb_ue->mme_ue = mme_ue; + mme_ue->enb_ue_id = enb_ue->id; + enb_ue->mme_ue_id = mme_ue->id; } void enb_ue_deassociate(enb_ue_t *enb_ue) { ogs_assert(enb_ue); - enb_ue->mme_ue = NULL; + enb_ue->mme_ue_id = OGS_INVALID_POOL_ID; } void enb_ue_unlink(mme_ue_t *mme_ue) { ogs_assert(mme_ue); - mme_ue->enb_ue = NULL; + mme_ue->enb_ue_id = OGS_INVALID_POOL_ID; } void enb_ue_source_associate_target(enb_ue_t *source_ue, enb_ue_t *target_ue) { - mme_ue_t *mme_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - mme_ue = source_ue->mme_ue; - ogs_assert(mme_ue); - target_ue->mme_ue = mme_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->mme_ue_id = source_ue->mme_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void enb_ue_source_deassociate_target(enb_ue_t *enb_ue) @@ -3927,22 +3945,28 @@ void enb_ue_source_deassociate_target(enb_ue_t *enb_ue) enb_ue_t *target_ue = NULL; ogs_assert(enb_ue); - if (enb_ue->target_ue) { + if (enb_ue->target_ue_id >= OGS_MIN_POOL_ID && + enb_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = enb_ue; - target_ue = enb_ue->target_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (enb_ue->source_ue) { + target_ue = enb_ue_find_by_id(enb_ue->target_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (enb_ue->source_ue_id >= OGS_MIN_POOL_ID && + enb_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = enb_ue; - source_ue = enb_ue->source_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + source_ue = enb_ue_find_by_id(enb_ue->source_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -3951,34 +3975,30 @@ void sgw_ue_associate_mme_ue(sgw_ue_t *sgw_ue, mme_ue_t *mme_ue) ogs_assert(mme_ue); ogs_assert(sgw_ue); - mme_ue->sgw_ue = sgw_ue; - sgw_ue->mme_ue = mme_ue; + mme_ue->sgw_ue_id = sgw_ue->id; + sgw_ue->mme_ue_id = mme_ue->id; } void sgw_ue_deassociate(sgw_ue_t *sgw_ue) { ogs_assert(sgw_ue); - sgw_ue->mme_ue = NULL; + sgw_ue->mme_ue_id = OGS_INVALID_POOL_ID; } void sgw_ue_unlink(mme_ue_t *mme_ue) { ogs_assert(mme_ue); - mme_ue->sgw_ue = NULL; + mme_ue->sgw_ue_id = OGS_INVALID_POOL_ID; } void sgw_ue_source_associate_target(sgw_ue_t *source_ue, sgw_ue_t *target_ue) { - mme_ue_t *mme_ue = NULL; - ogs_assert(source_ue); ogs_assert(target_ue); - mme_ue = source_ue->mme_ue; - ogs_assert(mme_ue); - target_ue->mme_ue = mme_ue; - target_ue->source_ue = source_ue; - source_ue->target_ue = target_ue; + target_ue->mme_ue_id = source_ue->mme_ue_id; + target_ue->source_ue_id = source_ue->id; + source_ue->target_ue_id = target_ue->id; } void sgw_ue_source_deassociate_target(sgw_ue_t *sgw_ue) @@ -3987,22 +4007,28 @@ void sgw_ue_source_deassociate_target(sgw_ue_t *sgw_ue) sgw_ue_t *target_ue = NULL; ogs_assert(sgw_ue); - if (sgw_ue->target_ue) { + if (sgw_ue->target_ue_id >= OGS_MIN_POOL_ID && + sgw_ue->target_ue_id <= OGS_MAX_POOL_ID) { source_ue = sgw_ue; - target_ue = sgw_ue->target_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; - } else if (sgw_ue->source_ue) { + target_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; + } else if (sgw_ue->source_ue_id >= OGS_MIN_POOL_ID && + sgw_ue->source_ue_id <= OGS_MAX_POOL_ID) { target_ue = sgw_ue; - source_ue = sgw_ue->source_ue; - - ogs_assert(source_ue->target_ue); - ogs_assert(target_ue->source_ue); - source_ue->target_ue = NULL; - target_ue->source_ue = NULL; + source_ue = sgw_ue_find_by_id(sgw_ue->source_ue_id); + + ogs_assert(source_ue->target_ue_id >= OGS_MIN_POOL_ID && + source_ue->target_ue_id <= OGS_MAX_POOL_ID); + ogs_assert(target_ue->source_ue_id >= OGS_MIN_POOL_ID && + target_ue->source_ue_id <= OGS_MAX_POOL_ID); + source_ue->target_ue_id = OGS_INVALID_POOL_ID; + target_ue->source_ue_id = OGS_INVALID_POOL_ID; } } @@ -4014,13 +4040,12 @@ mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, uint8_t pti) ogs_assert(mme_ue); ogs_assert(pti != OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&mme_sess_pool, &sess); + ogs_pool_id_calloc(&mme_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_list_init(&sess->bearer_list); - sess->mme_ue = mme_ue; + sess->mme_ue_id = mme_ue->id; sess->pti = pti; bearer = mme_bearer_add(sess); @@ -4038,7 +4063,7 @@ void mme_sess_remove(mme_sess_t *sess) mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_list_remove(&mme_ue->sess_list, sess); @@ -4050,7 +4075,7 @@ void mme_sess_remove(mme_sess_t *sess) OGS_TLV_CLEAR_DATA(&sess->pgw_pco); OGS_TLV_CLEAR_DATA(&sess->pgw_epco); - ogs_pool_free(&mme_sess_pool, sess); + ogs_pool_id_free(&mme_sess_pool, sess); stats_remove_mme_session(); } @@ -4090,7 +4115,7 @@ mme_sess_t *mme_sess_find_by_ebi(const mme_ue_t *mme_ue, uint8_t ebi) bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); if (bearer) - return bearer->sess; + return mme_sess_find_by_id(bearer->sess_id); return NULL; } @@ -4112,6 +4137,11 @@ mme_sess_t *mme_sess_find_by_apn(const mme_ue_t *mme_ue, const char *apn) return NULL; } +mme_sess_t *mme_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&mme_sess_pool, id); +} + mme_sess_t *mme_sess_first(const mme_ue_t *mme_ue) { return ogs_list_first(&mme_ue->sess_list); @@ -4142,12 +4172,11 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) mme_ue_t *mme_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - ogs_pool_alloc(&mme_bearer_pool, &bearer); + ogs_pool_id_calloc(&mme_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); ogs_list_init(&bearer->update.xact_list); @@ -4159,17 +4188,18 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) ogs_assert(bearer->ebi >= MIN_EPS_BEARER_ID && bearer->ebi <= MAX_EPS_BEARER_ID); - bearer->mme_ue = mme_ue; - bearer->sess = sess; + bearer->mme_ue_id = mme_ue->id; + bearer->sess_id = sess->id; ogs_list_add(&sess->bearer_list, bearer); bearer->t3489.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3489_expire, bearer); + ogs_app()->timer_mgr, mme_timer_t3489_expire, + OGS_UINT_TO_POINTER(bearer->id)); bearer->t3489.pkbuf = NULL; memset(&e, 0, sizeof(e)); - e.bearer = bearer; + e.bearer_id = bearer->id; ogs_fsm_init(&bearer->sm, esm_state_initial, esm_state_final, &e); return bearer; @@ -4178,32 +4208,36 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) void mme_bearer_remove(mme_bearer_t *bearer) { mme_event_t e; + mme_ue_t *mme_ue = NULL; + mme_sess_t *sess = NULL; ogs_gtp_xact_t *xact = NULL, *next_xact = NULL; ogs_assert(bearer); - ogs_assert(bearer->mme_ue); - ogs_assert(bearer->sess); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + ogs_assert(mme_ue); + sess = mme_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); memset(&e, 0, sizeof(e)); - e.bearer = bearer; + e.bearer_id = bearer->id; ogs_fsm_fini(&bearer->sm, &e); CLEAR_BEARER_ALL_TIMERS(bearer); ogs_timer_delete(bearer->t3489.timer); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); OGS_TLV_CLEAR_DATA(&bearer->tft); if (bearer->ebi_node) - ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi_node); + ogs_pool_free(&mme_ue->ebi_pool, bearer->ebi_node); ogs_list_for_each_entry_safe(&bearer->update.xact_list, next_xact, xact, to_update_node) { ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); } - ogs_pool_free(&mme_bearer_pool, bearer); + ogs_pool_id_free(&mme_bearer_pool, bearer); } void mme_bearer_remove_all(mme_sess_t *sess) @@ -4268,10 +4302,14 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( mme_bearer_t *bearer = NULL; mme_sess_t *sess = NULL; + mme_ue_t *sess_mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + pti = message->esm.h.procedure_transaction_identity; ebi = message->esm.h.eps_bearer_identity; @@ -4283,7 +4321,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); if (!bearer) { ogs_error("No Bearer : EBI[%d]", ebi); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4297,7 +4335,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { ogs_error("ESM message type: %d, Both PTI[%d] and EBI[%d] are 0", message->esm.h.message_type, pti, ebi); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4316,7 +4354,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (!bearer) { ogs_error("No Bearer : Linked-EBI[%d]", linked_eps_bearer_identity->eps_bearer_identity); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4367,7 +4405,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( } if (bearer) { - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); sess->pti = pti; @@ -4402,11 +4440,12 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( ogs_debug("[%s:%d:%d:%p]", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("[%s:%p]", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); } if (!sess) { @@ -4417,20 +4456,22 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( ogs_debug("[%s:%d:%d:%p]", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("[%s:%p]", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } else { sess->pti = pti; ogs_debug("[%s:%p]", mme_ue->imsi_bcd, mme_ue); ogs_debug("[%s:%d:%d:%p]", sess->session ? sess->session->name : "Unknown", sess->pti, pti, sess); + + sess_mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_debug("[%s:%p]", - sess->mme_ue ? sess->mme_ue->imsi_bcd : "Unknown", - sess->mme_ue); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + sess_mme_ue ? sess_mme_ue->imsi_bcd : "Unknown", + sess_mme_ue); } } else { @@ -4438,7 +4479,7 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( if (!sess) { ogs_error("No Session : ESM message type[%d], PTI[%d]", message->esm.h.message_type, pti); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -4468,7 +4509,7 @@ mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer) mme_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); return mme_default_bearer_in_sess(sess); @@ -4487,9 +4528,9 @@ mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer) return ogs_list_next(bearer); } -mme_bearer_t *mme_bearer_cycle(mme_bearer_t *bearer) +mme_bearer_t *mme_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&mme_bearer_pool, bearer); + return ogs_pool_find_by_id(&mme_bearer_pool, id); } void mme_session_remove_all(mme_ue_t *mme_ue) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index aaed1f40bd..5736d8e15e 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -146,45 +146,6 @@ typedef struct mme_context_s { /* Generator for unique identification */ uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */ -#define MME_UE_CHECK(level, __mME) \ - do { \ - sgw_ue_t *__sGW = (((mme_ue_t *)__mME)->sgw_ue); \ - mme_sess_t *__sESS = NULL; \ - mme_bearer_t *__bEARER = NULL; \ - \ - ogs_log_message(level, 0, "MME-UE Context Memory[%p:%p]", \ - (__mME), mme_ue_cycle((__mME))); \ - ogs_log_message(level, 0, "SGW-UE Context Memory[%p:%p]", \ - (__sGW), sgw_ue_cycle((__sGW))); \ - ogs_log_message(level, 0, \ - "IMSI [%s] NAS-EPS Type[%d]", \ - (__mME) ? ((mme_ue_t *)__mME)->imsi_bcd : "No MME_UE", \ - (__mME) ? ((mme_ue_t *)__mME)->nas_eps.type : 0); \ - ogs_log_message(level, 0, \ - "MME_S11_TEID[%d] SGW_S11_TEID[%d]", \ - (__mME) ? ((mme_ue_t *)__mME)->mme_s11_teid : 0, \ - (__sGW) ? (__sGW)->sgw_s11_teid : 0); \ - if (!mme_ue_cycle(__mME)) { \ - ogs_log_message(level, 0, \ - "MME-UE Context has already been removed"); \ - break; \ - } \ - ogs_list_for_each(&((mme_ue_t *)__mME)->sess_list, (__sESS)) { \ - ogs_log_message(level, 0, "SESS(%p) [%s:%d]", (__sESS), \ - (__sESS)->session ? (__sESS)->session->name : "Unknown", \ - (__sESS)->pti); \ - ogs_list_for_each(&(__sESS)->bearer_list, (__bEARER)) { \ - ogs_log_message(level, 0, \ - "BEARER(%p) [%d] ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]", \ - (__bEARER), (__bEARER)->ebi, \ - (__bEARER)->enb_s1u_teid, (__bEARER)->sgw_s1u_teid); \ - ogs_assert((__bEARER)->sess == (__sESS)); \ - ogs_assert((__bEARER)->mme_ue == (__mME)); \ - } \ - ogs_assert((__sESS)->mme_ue == (__mME)); \ - } \ - } while(0) - ogs_list_t mme_ue_list; ogs_hash_t *enb_addr_hash; /* hash table for ENB Address */ @@ -273,6 +234,7 @@ typedef struct mme_csmap_s { typedef struct mme_enb_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_fsm_t sm; /* A state machine */ @@ -298,6 +260,7 @@ typedef struct mme_enb_s { struct enb_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint32_t index; /* UE identity */ @@ -309,8 +272,8 @@ struct enb_ue_s { /* Handover Info */ S1AP_HandoverType_t handover_type; - enb_ue_t *source_ue; - enb_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* Use mme_ue->tai, mme_ue->e_cgi. * Do not access enb_ue->saved.tai enb_ue->saved.e_cgi. @@ -339,15 +302,16 @@ struct enb_ue_s { bool part_of_s1_reset_requested; /* Related Context */ - mme_enb_t *enb; - mme_ue_t *mme_ue; + ogs_pool_id_t enb_id; + ogs_pool_id_t mme_ue_id; }; struct sgw_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; - sgw_ue_t *source_ue; - sgw_ue_t *target_ue; + ogs_pool_id_t source_ue_id; + ogs_pool_id_t target_ue_id; /* UE identity */ uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */ @@ -360,11 +324,12 @@ struct sgw_ue_s { mme_sgw_t *sgw; ogs_gtp_node_t *gnode; }; - mme_ue_t *mme_ue; + ogs_pool_id_t mme_ue_id; }; struct mme_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_fsm_t sm; /* A state machine */ struct { @@ -536,50 +501,66 @@ struct mme_ue_s { /* Paging Info */ #define ECM_CONNECTED(__mME) \ - ((__mME) && ((__mME)->enb_ue != NULL) && enb_ue_cycle((__mME)->enb_ue)) + ((__mME) && \ + ((__mME)->enb_ue_id >= OGS_MIN_POOL_ID) && \ + ((__mME)->enb_ue_id <= OGS_MAX_POOL_ID) && \ + (enb_ue_find_by_id((__mME)->enb_ue_id))) #define ECM_IDLE(__mME) \ ((__mME) && \ - (((__mME)->enb_ue == NULL) || (enb_ue_cycle((__mME)->enb_ue) == NULL))) - enb_ue_t *enb_ue; /* S1 UE context */ + (((__mME)->enb_ue_id < OGS_MIN_POOL_ID) || \ + ((__mME)->enb_ue_id > OGS_MAX_POOL_ID) || \ + (enb_ue_find_by_id((__mME)->enb_ue_id) == NULL))) + ogs_pool_id_t enb_ue_id; #define HOLDING_S1_CONTEXT(__mME) \ do { \ - enb_ue_deassociate((__mME)->enb_ue); \ + enb_ue_t *enb_ue_holding = NULL; \ + \ + (__mME)->enb_ue_holding_id = OGS_INVALID_POOL_ID; \ \ - (__mME)->enb_ue_holding = enb_ue_cycle((__mME)->enb_ue); \ - if ((__mME)->enb_ue_holding) { \ + enb_ue_holding = enb_ue_find_by_id((__mME)->enb_ue_id); \ + if (enb_ue_holding) { \ + enb_ue_deassociate(enb_ue_holding); \ + \ ogs_warn("[%s] Holding S1 Context", (__mME)->imsi_bcd); \ ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", \ - (__mME)->imsi_bcd, (__mME)->enb_ue_holding->enb_ue_s1ap_id, \ - (__mME)->enb_ue_holding->mme_ue_s1ap_id); \ + (__mME)->imsi_bcd, \ + enb_ue_holding->enb_ue_s1ap_id, \ + enb_ue_holding->mme_ue_s1ap_id); \ \ - (__mME)->enb_ue_holding->ue_ctx_rel_action = \ + enb_ue_holding->ue_ctx_rel_action = \ S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE; \ - ogs_timer_start((__mME)->enb_ue_holding->t_s1_holding, \ + ogs_timer_start(enb_ue_holding->t_s1_holding, \ mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration); \ + \ + (__mME)->enb_ue_holding_id = (__mME)->enb_ue_id; \ } else \ ogs_error("[%s] S1 Context has already been removed", \ (__mME)->imsi_bcd); \ } while(0) #define CLEAR_S1_CONTEXT(__mME) \ do { \ - if (enb_ue_cycle((__mME)->enb_ue_holding)) { \ + enb_ue_t *enb_ue_holding = NULL; \ + \ + enb_ue_holding = enb_ue_find_by_id((__mME)->enb_ue_holding_id); \ + if (enb_ue_holding) { \ int r; \ ogs_warn("[%s] Clear S1 Context", (__mME)->imsi_bcd); \ ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", \ - (__mME)->imsi_bcd, (__mME)->enb_ue_holding->enb_ue_s1ap_id, \ - (__mME)->enb_ue_holding->mme_ue_s1ap_id); \ + (__mME)->imsi_bcd, \ + enb_ue_holding->enb_ue_s1ap_id, \ + enb_ue_holding->mme_ue_s1ap_id); \ \ r = s1ap_send_ue_context_release_command( \ - (__mME)->enb_ue_holding, \ + enb_ue_holding, \ S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, \ S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); \ ogs_expect(r == OGS_OK); \ ogs_assert(r != OGS_ERROR); \ } \ - (__mME)->enb_ue_holding = NULL; \ + (__mME)->enb_ue_holding_id = OGS_INVALID_POOL_ID; \ } while(0) - enb_ue_t *enb_ue_holding; + ogs_pool_id_t enb_ue_holding_id; struct { #define MME_CLEAR_PAGING_INFO(__mME) \ @@ -596,7 +577,7 @@ struct mme_ue_s { ogs_assert(__tYPE); \ ogs_debug("[%s] Store Paging Info", mme_ue->imsi_bcd); \ (__mME)->paging.type = __tYPE; \ - (__mME)->paging.data = __dATA; \ + (__mME)->paging.data = OGS_UINT_TO_POINTER(__dATA); \ } while(0) #define MME_PAGING_ONGOING(__mME) ((__mME) && ((__mME)->paging.type)) @@ -614,7 +595,7 @@ struct mme_ue_s { } paging; /* SGW UE context */ - sgw_ue_t *sgw_ue; + ogs_pool_id_t sgw_ue_id; /* Save PDN Connectivity Request */ ogs_nas_esm_message_container_t pdn_connectivity_request; @@ -715,19 +696,25 @@ struct mme_ue_s { }; #define SESSION_CONTEXT_IS_AVAILABLE(__mME) \ - ((__mME) && ((__mME)->sgw_ue) && (((__mME)->sgw_ue)->sgw_s11_teid)) + ((__mME) && \ + ((__mME)->sgw_ue_id >= OGS_MIN_POOL_ID) && \ + ((__mME)->sgw_ue_id <= OGS_MAX_POOL_ID) && \ + (sgw_ue_find_by_id((__mME)->sgw_ue_id)) && \ + (sgw_ue_find_by_id((__mME)->sgw_ue_id)->sgw_s11_teid)) #define CLEAR_SESSION_CONTEXT(__mME) \ do { \ + sgw_ue_t *sgw_ue = NULL; \ ogs_assert((__mME)); \ - ((__mME)->sgw_ue)->sgw_s11_teid = 0; \ + sgw_ue = sgw_ue_find_by_id((__mME)->sgw_ue_id); \ + if (sgw_ue) sgw_ue->sgw_s11_teid = 0; \ } while(0) #define MME_SESS_CLEAR(__sESS) \ do { \ mme_ue_t *mme_ue = NULL; \ ogs_assert(__sESS); \ - mme_ue = (__sESS)->mme_ue; \ + mme_ue = mme_ue_find_by_id((__sESS)->mme_ue_id); \ ogs_assert(mme_ue); \ ogs_info("Removed Session: UE IMSI:[%s] APN:[%s]", \ mme_ue->imsi_bcd, \ @@ -743,6 +730,7 @@ struct mme_ue_s { (mme_ue_have_session_release_pending(__mME)) typedef struct mme_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint8_t pti; /* Procedure Trasaction Identity */ @@ -756,7 +744,7 @@ typedef struct mme_sess_s { ogs_list_t bearer_list; /* Related Context */ - mme_ue_t *mme_ue; + ogs_pool_id_t mme_ue_id; ogs_session_t *session; @@ -821,6 +809,8 @@ typedef struct mme_bearer_s { ogs_lnode_t lnode; ogs_lnode_t to_modify_node; + ogs_pool_id_t id; + ogs_fsm_t sm; /* State Machine */ uint8_t *ebi_node; /* Pool-Node for EPS Bearer ID */ @@ -870,8 +860,8 @@ typedef struct mme_bearer_s { } t3489; /* Related Context */ - mme_ue_t *mme_ue; - mme_sess_t *sess; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t sess_id; /* * Issues #3240 @@ -940,7 +930,7 @@ mme_enb_t *mme_enb_find_by_addr(const ogs_sockaddr_t *addr); mme_enb_t *mme_enb_find_by_enb_id(uint32_t enb_id); int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id); int mme_enb_sock_type(ogs_sock_t *sock); -mme_enb_t *mme_enb_cycle(mme_enb_t *enb); +mme_enb_t *mme_enb_find_by_id(ogs_pool_id_t id); enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id); void enb_ue_remove(enb_ue_t *enb_ue); @@ -949,12 +939,12 @@ enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id( const mme_enb_t *enb, uint32_t enb_ue_s1ap_id); enb_ue_t *enb_ue_find(uint32_t index); enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id); -enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue); +enb_ue_t *enb_ue_find_by_id(ogs_pool_id_t id); sgw_ue_t *sgw_ue_add(mme_sgw_t *sgw); void sgw_ue_remove(sgw_ue_t *sgw_ue); void sgw_ue_switch_to_sgw(sgw_ue_t *sgw_ue, mme_sgw_t *new_sgw); -sgw_ue_t *sgw_ue_cycle(sgw_ue_t *sgw_ue); +sgw_ue_t *sgw_ue_find_by_id(ogs_pool_id_t id); typedef enum { SGW_WITHOUT_RELOCATION = 1, @@ -969,7 +959,7 @@ void mme_ue_confirm_guti(mme_ue_t *mme_ue); mme_ue_t *mme_ue_add(enb_ue_t *enb_ue); void mme_ue_remove(mme_ue_t *mme_ue); void mme_ue_remove_all(void); -mme_ue_t *mme_ue_cycle(mme_ue_t *mme_ue); +mme_ue_t *mme_ue_find_by_id(ogs_pool_id_t id); void mme_ue_fsm_init(mme_ue_t *mme_ue); void mme_ue_fsm_fini(mme_ue_t *mme_ue); @@ -1059,6 +1049,7 @@ void mme_sess_remove_all(mme_ue_t *mme_ue); mme_sess_t *mme_sess_find_by_pti(const mme_ue_t *mme_ue, uint8_t pti); mme_sess_t *mme_sess_find_by_ebi(const mme_ue_t *mme_ue, uint8_t ebi); mme_sess_t *mme_sess_find_by_apn(const mme_ue_t *mme_ue, const char *apn); +mme_sess_t *mme_sess_find_by_id(ogs_pool_id_t id); mme_sess_t *mme_sess_first(const mme_ue_t *mme_ue); mme_sess_t *mme_sess_next(mme_sess_t *sess); @@ -1075,7 +1066,7 @@ mme_bearer_t *mme_default_bearer_in_sess(mme_sess_t *sess); mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer); mme_bearer_t *mme_bearer_first(const mme_sess_t *sess); mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer); -mme_bearer_t *mme_bearer_cycle(mme_bearer_t *bearer); +mme_bearer_t *mme_bearer_find_by_id(ogs_pool_id_t id); void mme_session_remove_all(mme_ue_t *mme_ue); ogs_session_t *mme_session_find_by_apn(mme_ue_t *mme_ue, const char *apn); diff --git a/src/mme/mme-event.h b/src/mme/mme-event.h index f7f1af75c5..cf3b18e2cd 100644 --- a/src/mme/mme-event.h +++ b/src/mme/mme-event.h @@ -94,12 +94,11 @@ typedef struct mme_event_s { ogs_diam_s6a_message_t *s6a_message; mme_vlr_t *vlr; - mme_enb_t *enb; - enb_ue_t *enb_ue; - sgw_ue_t *sgw_ue; - mme_ue_t *mme_ue; - mme_sess_t *sess; - mme_bearer_t *bearer; + ogs_pool_id_t enb_id; + ogs_pool_id_t enb_ue_id; + ogs_pool_id_t sgw_ue_id; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t bearer_id; ogs_timer_t *timer; } mme_event_t; diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index 394621a4e2..35fc11197a 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -34,8 +34,8 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, mme_ue_t *mme_ue, uint32_t *subdatamask); struct sess_state { - mme_ue_t *mme_ue; - enb_ue_t *enb_ue; + ogs_pool_id_t mme_ue_id; + ogs_pool_id_t enb_ue_id; struct timespec ts; /* Time of sending the message */ }; @@ -678,12 +678,12 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, uint8_t resync[OGS_AUTS_LEN + OGS_RAND_LEN]; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -697,8 +697,8 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, sess_data = ogs_calloc(1, sizeof (*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req); @@ -870,9 +870,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) return; } - mme_ue = sess_data->mme_ue; + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); ogs_assert(enb_ue); /* Set Authentication-Information Command */ @@ -1033,8 +1033,8 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1102,12 +1102,12 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) struct session *session = NULL; ogs_nas_plmn_id_t nas_plmn_id; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1117,8 +1117,8 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_ulr, MSGFL_ALLOC_ETEID, &req); @@ -1307,9 +1307,9 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) return; } - mme_ue = sess_data->mme_ue; + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); ogs_assert(enb_ue); /* Set Update-Location Command */ @@ -1451,8 +1451,8 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1524,12 +1524,12 @@ void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue) struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1539,8 +1539,8 @@ void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue) /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data); - sess_data->mme_ue = mme_ue; - sess_data->enb_ue = enb_ue; + sess_data->mme_ue_id = mme_ue->id; + sess_data->enb_ue_id = enb_ue->id; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_pur, MSGFL_ALLOC_ETEID, &req); @@ -1664,9 +1664,9 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) return; } - mme_ue = sess_data->mme_ue; + mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); ogs_assert(mme_ue); - enb_ue = sess_data->enb_ue; + enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); ogs_assert(enb_ue); /* Set Purge-UE Command */ @@ -1764,8 +1764,8 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; - e->enb_ue = enb_ue; + e->mme_ue_id = mme_ue->id; + e->enb_ue_id = enb_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -1922,7 +1922,7 @@ static int mme_ogs_diam_s6a_clr_cb( struct msg **msg, struct avp *avp, e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -2213,7 +2213,7 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/mme/mme-gn-build.c b/src/mme/mme-gn-build.c index aa9d8f9513..b5a1729801 100644 --- a/src/mme/mme-gn-build.c +++ b/src/mme/mme-gn-build.c @@ -24,7 +24,11 @@ static int sess_fill_mm_context_decoded(mme_sess_t *sess, ogs_gtp1_mm_context_decoded_t *mmctx_dec) { - mme_ue_t *mme_ue = sess->mme_ue; + mme_ue_t *mme_ue = NULL; + + ogs_assert(sess); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + ogs_assert(mme_ue); *mmctx_dec = (ogs_gtp1_mm_context_decoded_t) { .gupii = 1, /* Integrity Protection not required */ .ugipai = 1, /* Ignore "Used GPRS integrity protection algorithm" field" */ @@ -55,8 +59,13 @@ static int sess_fill_mm_context_decoded(mme_sess_t *sess, ogs_gtp1_mm_context_de static void build_qos_profile_from_session(ogs_gtp1_qos_profile_decoded_t *qos_pdec, const mme_sess_t *sess, const mme_bearer_t *bearer) { - const mme_ue_t *mme_ue = sess->mme_ue; + mme_ue_t *mme_ue = NULL; const ogs_session_t *session = sess->session; + + ogs_assert(sess); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + ogs_assert(mme_ue); + /* FIXME: Initialize with defaults: */ memset(qos_pdec, 0, sizeof(*qos_pdec)); diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index 4092f73a7d..188ac6c41e 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -302,6 +302,7 @@ int mme_gn_handle_sgsn_context_response( char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; ogs_gtp1_mm_context_decoded_t gtp1_mm_ctx; ogs_gtp1_pdp_context_decoded_t gtp1_pdp_ctx; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; uint8_t ret_cause = OGS_GTP1_CAUSE_REQUEST_ACCEPTED; @@ -318,6 +319,8 @@ int mme_gn_handle_sgsn_context_response( return OGS_GTP1_CAUSE_IMSI_IMEI_NOT_KNOWN; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + switch (resp->cause.u8) { case OGS_GTP1_CAUSE_REQUEST_ACCEPTED: break; /* Handle below */ @@ -338,7 +341,7 @@ int mme_gn_handle_sgsn_context_response( if (resp->cause.u8 != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { ogs_error("[Gn] Rx SGSN Context Response cause:%u", resp->cause.u8); - rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } @@ -428,7 +431,7 @@ int mme_gn_handle_sgsn_context_response( nack_and_reject: rv = mme_gtp1_send_sgsn_context_ack(mme_ue, gtp1_cause, xact); ogs_info("[%s] TAU Reject [OGS_NAS_EMM_CAUSE:%d]", mme_ue->imsi_bcd, emm_cause); - rv = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, emm_cause); + rv = nas_eps_send_tau_reject(enb_ue, mme_ue, emm_cause); return OGS_GTP1_CAUSE_SYSTEM_FAILURE; } @@ -437,6 +440,7 @@ void mme_gn_handle_sgsn_context_acknowledge( ogs_gtp_xact_t *xact, mme_ue_t *mme_ue, ogs_gtp1_sgsn_context_acknowledge_t *req) { int rv; + enb_ue_t *enb_ue = NULL; ogs_debug("[Gn] Rx SGSN Context Acknowledge"); @@ -451,6 +455,8 @@ void mme_gn_handle_sgsn_context_acknowledge( return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + /* 3GPP TS 23.060 6.9.1.2.2 Step 4), 3GPP TS 23.401 D.3.5 Step 4) * The new SGSN sends an SGSN Context Acknowledge message to the old SGSN. The old MME (which is the old * SGSN from the new SGSN's point of view) marks in its context that the information in the GWs and the HSS are @@ -473,8 +479,8 @@ void mme_gn_handle_sgsn_context_acknowledge( * connection is released by the source eNodeB. The source eNodeB confirms the release of the RRC connection * and of the S1-U connection by sending a S1-U Release Complete message to the source MME." */ - if (mme_ue->enb_ue) { - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + if (enb_ue) { + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(rv == OGS_OK); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 345b8e977c..b670949229 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -115,22 +115,22 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) case OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE: case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: - mme_ue = data; + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(data)); ogs_assert(mme_ue); break; case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: - sess = data; + sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(data)); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: - bearer = data; + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; default: @@ -154,7 +154,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) */ CLEAR_SESSION_CONTEXT(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -244,13 +244,13 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - sgw_ue = sgw_ue_cycle(sgw_ue->target_ue); + sgw_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); ogs_assert(sgw_ue); } @@ -264,7 +264,9 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, sess); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -290,7 +292,7 @@ int mme_gtp_send_modify_bearer_request( ogs_pkbuf_t *pkbuf = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -303,7 +305,9 @@ int mme_gtp_send_modify_bearer_request( return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -328,7 +332,7 @@ int mme_gtp_send_delete_session_request( ogs_assert(action); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); ogs_assert(sgw_ue); @@ -342,7 +346,9 @@ int mme_gtp_send_delete_session_request( return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, s11buf, timeout, sess); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, s11buf, timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -363,11 +369,10 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_assert(action); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_for_each_safe(&mme_ue->sess_list, next_sess, sess) { if (MME_HAVE_SGW_S1U_PATH(sess)) { mme_gtp_send_delete_session_request(sgw_ue, sess, action); @@ -398,9 +403,9 @@ int mme_gtp_send_create_bearer_response( return OGS_OK; } - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -438,9 +443,9 @@ int mme_gtp_send_update_bearer_response( ogs_pkbuf_t *pkbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /* @@ -511,9 +516,9 @@ int mme_gtp_send_delete_bearer_response( return OGS_OK; } - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -548,7 +553,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) ogs_assert(action); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -561,7 +566,9 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -581,7 +588,7 @@ void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action) enb_ue_t *enb_ue = NULL, *next = NULL; ogs_list_for_each_safe(&enb->enb_ue_list, next, enb_ue) { - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_LO_CONNREFUSED) { @@ -645,9 +652,9 @@ int mme_gtp_send_downlink_data_notification_ack( return OGS_OK; } - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /* Build Downlink data notification ack */ @@ -683,7 +690,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( sgw_ue_t *sgw_ue = NULL; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -698,7 +705,9 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -722,7 +731,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( ogs_assert(action); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -736,7 +745,9 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( } ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM); - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, mme_ue); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(mme_ue->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -762,9 +773,9 @@ int mme_gtp_send_bearer_resource_command( sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -777,7 +788,9 @@ int mme_gtp_send_bearer_resource_command( return OGS_ERROR; } - xact = ogs_gtp_xact_local_create(sgw_ue->gnode, &h, pkbuf, timeout, bearer); + xact = ogs_gtp_xact_local_create( + sgw_ue->gnode, &h, pkbuf, timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index ee9e2bc127..4b8602bbe4 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -76,14 +76,13 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { - MME_UE_CHECK(OGS_LOG_WARN, mme_ue); mme_ue_remove(mme_ue); } } @@ -129,7 +128,7 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue) if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -148,7 +147,7 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) mme_ue_t *mme_ue = NULL; ogs_assert(enb_ue); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd); ogs_assert(OGS_OK == @@ -173,7 +172,8 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) switch (mme_ue->paging.type) { case MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer [%d]", mme_ue->paging.type); goto cleanup; @@ -190,7 +190,8 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) } break; case MME_PAGING_TYPE_CREATE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer [%d]", mme_ue->paging.type); goto cleanup; @@ -207,7 +208,8 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) } break; case MME_PAGING_TYPE_UPDATE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer [%d]", mme_ue->paging.type); goto cleanup; @@ -240,7 +242,8 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) } break; case MME_PAGING_TYPE_DELETE_BEARER: - bearer = mme_bearer_cycle(mme_ue->paging.data); + bearer = mme_bearer_find_by_id( + OGS_POINTER_TO_UINT(mme_ue->paging.data)); if (!bearer) { ogs_error("No Bearer [%d]", mme_ue->paging.type); goto cleanup; diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index faf427f1ee..91f4f1bef5 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -55,13 +55,13 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( session = sess->session; ogs_assert(session); ogs_assert(session->name); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - sgw_ue = sgw_ue_cycle(sgw_ue->target_ue); + sgw_ue = sgw_ue_find_by_id(sgw_ue->target_ue_id); ogs_assert(sgw_ue); } @@ -405,7 +405,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( ogs_debug("Modifty Bearer Request"); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_assert(ogs_list_count(&mme_ue->bearer_to_modify_list)); @@ -448,7 +448,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( memset(&indication, 0, sizeof(ogs_gtp2_indication_t)); ogs_list_for_each_entry( &mme_ue->bearer_to_modify_list, bearer, to_modify_node) { - mme_sess_t *sess = bearer->sess; + mme_sess_t *sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); if (sess->ue_request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER) { @@ -513,9 +513,9 @@ ogs_pkbuf_t *mme_s11_build_delete_session_request( sgw_ue_t *sgw_ue = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); bearer = mme_default_bearer_in_sess(sess); ogs_assert(bearer); @@ -576,9 +576,9 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response( sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Create Bearer Response"); @@ -683,9 +683,9 @@ ogs_pkbuf_t *mme_s11_build_update_bearer_response( sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Update Bearer Response"); @@ -762,9 +762,9 @@ ogs_pkbuf_t *mme_s11_build_delete_bearer_response( sgw_ue_t *sgw_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Delete Bearer Response"); @@ -918,7 +918,7 @@ ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request( int len; ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Create Indirect Data Forwarding Tunnel Request"); @@ -1002,11 +1002,11 @@ ogs_pkbuf_t *mme_s11_build_bearer_resource_command( mme_bearer_t *linked_bearer = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = sess->mme_ue; + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); ogs_debug("Bearer Resource Command"); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 877903537f..f3f5ab225c 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -62,12 +62,16 @@ static uint8_t esm_cause_from_gtp(uint8_t gtp_cause) static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) { char buf[OGS_ADDRSTRLEN]; - mme_bearer_t *bearer = data; + mme_bearer_t *bearer = NULL; uint8_t type; ogs_assert(xact); - bearer = mme_bearer_cycle(bearer); - ogs_assert(bearer); + ogs_assert(data); + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); + if (!bearer) { + ogs_error("No Bearer"); + return; + } type = xact->seq[xact->step-1].type; @@ -182,6 +186,7 @@ void mme_s11_handle_create_session_response( mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; sgw_ue_t *source_ue = NULL, *target_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_session_t *session = NULL; ogs_gtp2_bearer_qos_t bearer_qos; ogs_gtp2_ambr_t *ambr = NULL; @@ -197,11 +202,10 @@ void mme_s11_handle_create_session_response( ********************/ ogs_assert(xact); create_action = xact->create_action; - sess = xact->data; + sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); ogs_assert(sess); - MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); - mme_ue = mme_ue_cycle(sess->mme_ue); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -213,11 +217,12 @@ void mme_s11_handle_create_session_response( ogs_error("MME-UE Context has already been removed"); return; } - source_ue = sgw_ue_cycle(mme_ue->sgw_ue); + source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(source_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { - target_ue = sgw_ue_cycle(source_ue->target_ue); + target_ue = sgw_ue_find_by_id(source_ue->target_ue_id); ogs_assert(target_ue); } else { target_ue = source_ue; @@ -248,7 +253,7 @@ void mme_s11_handle_create_session_response( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -299,7 +304,7 @@ void mme_s11_handle_create_session_response( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -307,7 +312,7 @@ void mme_s11_handle_create_session_response( } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { ogs_error("[%s] TAU reject [Cause:%d]", mme_ue->imsi_bcd, session_cause); - r = nas_eps_send_tau_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -338,7 +343,7 @@ void mme_s11_handle_create_session_response( mme_ue->imsi_bcd, bearer_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -358,7 +363,7 @@ void mme_s11_handle_create_session_response( ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause); if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_error("[%s] Attach reject", mme_ue->imsi_bcd); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); ogs_expect(r == OGS_OK); @@ -525,7 +530,7 @@ void mme_s11_handle_create_session_response( } else if (create_action == OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE) { /* 3GPP TS 23.401 D.3.6 step 13, 14: */ - mme_s6a_send_ulr(mme_ue->enb_ue, mme_ue); + mme_s6a_send_ulr(enb_ue, mme_ue); } else if (create_action == OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT) { r = nas_eps_send_activate_default_bearer_context_request( bearer, create_action); @@ -571,8 +576,7 @@ void mme_s11_handle_modify_bearer_response( ogs_assert(xact); modify_action = xact->modify_action; - MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -584,7 +588,7 @@ void mme_s11_handle_modify_bearer_response( ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -673,6 +677,7 @@ void mme_s11_handle_delete_session_response( sgw_ue_t *source_ue = NULL, *target_ue = NULL; mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(rsp); @@ -684,12 +689,11 @@ void mme_s11_handle_delete_session_response( ogs_assert(xact); action = xact->delete_action; ogs_assert(action); - sess = xact->data; + sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); ogs_assert(sess); ogs_debug("delete_session_response - xact:%p, sess:%p", xact, sess); - MME_UE_CHECK(OGS_LOG_DEBUG, sess->mme_ue); - mme_ue = mme_ue_cycle(sess->mme_ue); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -701,11 +705,11 @@ void mme_s11_handle_delete_session_response( ogs_error("MME-UE Context has already been removed"); return; } - target_ue = sgw_ue_cycle(mme_ue->sgw_ue); + target_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(target_ue); if (action == OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST) { - source_ue = sgw_ue_cycle(target_ue->source_ue); + source_ue = sgw_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) /* InterRAT to 2G/3G (SGSN) case: */ source_ue = target_ue; ogs_assert(source_ue); @@ -754,6 +758,8 @@ void mme_s11_handle_delete_session_response( ogs_assert(target_ue); ogs_assert(source_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", mme_ue->mme_s11_teid, source_ue->sgw_s11_teid); @@ -763,7 +769,7 @@ void mme_s11_handle_delete_session_response( * of the detach accept from UE */ } else if (action == OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - mme_s6a_send_air(mme_ue->enb_ue, mme_ue, NULL); + mme_s6a_send_air(enb_ue, mme_ue, NULL); } } else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) { @@ -791,11 +797,9 @@ void mme_s11_handle_delete_session_response( } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { if (ECM_IDLE(mme_ue)) { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); } else { - ogs_assert(mme_ue->enb_ue); - r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -806,17 +810,11 @@ void mme_s11_handle_delete_session_response( } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - enb_ue_t *enb_ue = NULL; - - enb_ue = enb_ue_cycle(mme_ue->enb_ue); - if (enb_ue) { - r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else - ogs_error("ENB-S1 Context has already been removed"); + r = s1ap_send_ue_context_release_command(enb_ue, + S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); } } else if (action == OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST) { @@ -825,7 +823,7 @@ void mme_s11_handle_delete_session_response( &mme_ue->pdn_connectivity_request); if (rv != OGS_OK) { ogs_error("nas_eps_send_emm_to_esm() failed"); - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); @@ -883,7 +881,7 @@ void mme_s11_handle_create_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->linked_eps_bearer_id.presence == 0) { @@ -1041,7 +1039,7 @@ void mme_s11_handle_create_bearer_request( if (OGS_FSM_CHECK(&default_bearer->sm, esm_state_active)) { if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_CREATE_BEARER, bearer); + MME_PAGING_TYPE_CREATE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1085,7 +1083,7 @@ void mme_s11_handle_update_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->bearer_contexts.presence == 0) { @@ -1120,7 +1118,7 @@ void mme_s11_handle_update_bearer_request( ogs_assert(sgw_ue); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", @@ -1156,7 +1154,7 @@ void mme_s11_handle_update_bearer_request( */ xact->cb = gtp_remote_holding_timeout; - xact->data = bearer; + xact->data = OGS_UINT_TO_POINTER(bearer->id); ogs_list_add(&bearer->update.xact_list, &xact->to_update_node); @@ -1193,7 +1191,7 @@ void mme_s11_handle_update_bearer_request( req->bearer_contexts.tft.presence == 1) { if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_UPDATE_BEARER, bearer); + MME_PAGING_TYPE_UPDATE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1250,7 +1248,7 @@ void mme_s11_handle_delete_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (req->linked_eps_bearer_id.presence == 1) { @@ -1310,7 +1308,7 @@ void mme_s11_handle_delete_bearer_request( ogs_assert(sgw_ue); ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", @@ -1335,7 +1333,7 @@ void mme_s11_handle_delete_bearer_request( if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_DELETE_BEARER, bearer); + MME_PAGING_TYPE_DELETE_BEARER, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1372,8 +1370,7 @@ void mme_s11_handle_release_access_bearers_response( action = xact->release_action; ogs_assert(action); - MME_UE_CHECK(OGS_LOG_DEBUG, xact->data); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1385,7 +1382,7 @@ void mme_s11_handle_release_access_bearers_response( ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /*********************** @@ -1423,7 +1420,7 @@ void mme_s11_handle_release_access_bearers_response( } if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) { - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -1451,17 +1448,18 @@ void mme_s11_handle_release_access_bearers_response( * for new UE-associated logical S1-connections over the S1 interface, * the MME shall respond with the RESET ACKNOWLEDGE message. */ - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); enb_ue_unlink(mme_ue); if (enb_ue) { - mme_enb_t *enb = enb_ue->enb; - ogs_assert(enb); + mme_enb_t *enb = NULL; + + enb = mme_enb_find_by_id(enb_ue->enb_id); enb_ue_remove(enb_ue); - if (ogs_list_count(&enb->enb_ue_list) == 0) { + if (enb && ogs_list_count(&enb->enb_ue_list) == 0) { r = s1ap_send_s1_reset_ack(enb, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1473,35 +1471,39 @@ void mme_s11_handle_release_access_bearers_response( } else if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL) { enb_ue_t *iter = NULL; - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); enb_ue_unlink(mme_ue); if (enb_ue) { - mme_enb_t *enb = enb_ue->enb; - ogs_assert(enb); + mme_enb_t *enb = NULL; + + enb = mme_enb_find_by_id(enb_ue->enb_id); enb_ue_remove(enb_ue); - ogs_list_for_each(&enb->enb_ue_list, iter) { - if (iter->part_of_s1_reset_requested == true) { - /* The ENB_UE context - * where PartOfS1_interface was requested - * still remains */ - return; + if (enb) { + ogs_list_for_each(&enb->enb_ue_list, iter) { + if (iter->part_of_s1_reset_requested == true) { + /* The ENB_UE context + * where PartOfS1_interface was requested + * still remains */ + return; + } } - } - /* All ENB_UE context - * where PartOfS1_interface was requested - * REMOVED */ - ogs_assert(enb->s1_reset_ack); - r = s1ap_send_to_enb(enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + /* All ENB_UE context + * where PartOfS1_interface was requested + * REMOVED */ + ogs_assert(enb->s1_reset_ack); + r = s1ap_send_to_enb( + enb, enb->s1_reset_ack, S1AP_NON_UE_SIGNALLING); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); - /* Clear S1-Reset Ack Buffer */ - enb->s1_reset_ack = NULL; + /* Clear S1-Reset Ack Buffer */ + enb->s1_reset_ack = NULL; + } } else { ogs_error("ENB-S1 Context has already been removed"); } @@ -1536,7 +1538,7 @@ void mme_s11_handle_downlink_data_notification( ogs_error("No UE Context"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (noti->eps_bearer_id.presence == 0) { @@ -1604,7 +1606,7 @@ void mme_s11_handle_downlink_data_notification( */ if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer); + MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer->id); r = s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1640,7 +1642,7 @@ void mme_s11_handle_downlink_data_notification( * included in Downlink Data Notification is "Error Indication received * from RNC/eNodeB/S4-SGSN" */ - enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); r = s1ap_send_ue_context_release_command(enb_ue, @@ -1678,7 +1680,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( * Check Transaction ********************/ ogs_assert(xact); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1690,7 +1692,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -1784,7 +1786,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } } - source_ue = enb_ue_cycle(mme_ue->enb_ue); + source_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(source_ue); r = s1ap_send_handover_command(source_ue); @@ -1813,7 +1815,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( ogs_assert(xact); action = xact->delete_indirect_action; ogs_assert(action); - mme_ue = mme_ue_cycle(xact->data); + mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1825,7 +1827,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); /************************ @@ -1893,7 +1895,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) { /* Nothing to do */ } else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) { - r = s1ap_send_handover_cancel_ack(mme_ue->enb_ue); + r = s1ap_send_handover_cancel_ack(enb_ue_find_by_id(mme_ue->enb_ue_id)); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -1920,11 +1922,11 @@ void mme_s11_handle_bearer_resource_failure_indication( * Check Transaction ********************/ ogs_assert(xact); - bearer = xact->data; + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(xact->data)); ogs_assert(ind); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = mme_ue_cycle(sess->mme_ue); + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1936,7 +1938,7 @@ void mme_s11_handle_bearer_resource_failure_indication( ogs_error("MME-UE Context has already been removed"); return; } - sgw_ue = sgw_ue_cycle(mme_ue->sgw_ue); + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); if (!mme_ue_from_teid) diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index ffc9a99586..23ab8d625e 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -153,7 +153,6 @@ uint8_t mme_s6a_handle_pua( if (s6a_message->result_code != ER_DIAMETER_SUCCESS) { ogs_error("Purge UE failed for IMSI[%s] [%d]", mme_ue->imsi_bcd, s6a_message->result_code); - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return OGS_ERROR; } @@ -161,7 +160,6 @@ uint8_t mme_s6a_handle_pua( if (pua_message->pua_flags & OGS_DIAM_S6A_PUA_FLAGS_FREEZE_MTMSI) ogs_debug("Freeze M-TMSI requested but not implemented."); - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); return OGS_OK; @@ -220,7 +218,6 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) clr_message = &s6a_message->clr_message; ogs_assert(clr_message); - mme_ue = mme_ue_cycle(mme_ue); if (!mme_ue) { ogs_warn("UE(mme-ue) context has already been removed"); return; @@ -236,7 +233,6 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) */ if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { ogs_warn("UE has already been de-registered"); - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); mme_ue_remove(mme_ue); return; } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 6962e4266b..e83f896b83 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -111,7 +111,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) enb = mme_enb_find_by_addr(addr); if (!enb) { enb = mme_enb_add(sock, addr); - ogs_assert(enb); + if (!enb) { + ogs_error("mme_enb_add() failed"); + ogs_sock_destroy(sock); + ogs_free(addr); + } } else { ogs_warn("eNB context duplicated with IP-address [%s]!!!", OGS_ADDR(addr, buf)); @@ -136,7 +140,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) enb = mme_enb_find_by_addr(addr); if (!enb) { enb = mme_enb_add(sock, addr); - ogs_assert(enb); + if (!enb) { + ogs_error("amf_enb_add() failed"); + ogs_free(addr); + } } else { ogs_free(addr); } @@ -193,7 +200,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) rc = ogs_s1ap_decode(&s1ap_message, pkbuf); if (rc == OGS_OK) { - e->enb = enb; + e->enb_id = enb->id; e->s1ap_message = &s1ap_message; ogs_fsm_dispatch(&enb->sm, e); } else { @@ -210,13 +217,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_S1AP_TIMER: - enb_ue = e->enb_ue; - ogs_assert(enb_ue); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 Context has already been removed"); + break; + } switch (e->timer_id) { case MME_TIMER_S1_DELAYED_SEND: - enb = e->enb; - ogs_assert(enb); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -239,18 +247,22 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_EMM_MESSAGE: - enb_ue = e->enb_ue; - ogs_assert(enb_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 Context has already been removed"); + break; + } + if (ogs_nas_emm_decode(&nas_message, pkbuf) != OGS_OK) { ogs_error("ogs_nas_emm_decode() failed"); ogs_pkbuf_free(pkbuf); return; } - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { mme_ue = mme_ue_find_by_message(&nas_message); if (!mme_ue) { @@ -266,7 +278,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_assert(ECM_IDLE(mme_ue)); } else { /* Here, if the MME_UE Context is found, @@ -326,14 +337,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) enb_ue ? enb_ue->enb_ue_s1ap_id : 0, enb_ue ? enb_ue->mme_ue_s1ap_id : 0); ogs_fatal("context [%p:%p]", enb_ue, mme_ue); - ogs_fatal("cycle [%p:%p]", - enb_ue_cycle(enb_ue), mme_ue_cycle(mme_ue)); ogs_fatal("IMSI [%s]", mme_ue ? mme_ue->imsi_bcd : "No MME_UE"); ogs_assert_if_reached(); } ogs_assert(OGS_FSM_STATE(&mme_ue->sm)); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->nas_message = &nas_message; ogs_fsm_dispatch(&mme_ue->sm, e); @@ -344,7 +353,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_pkbuf_free(pkbuf); break; case MME_EVENT_EMM_TIMER: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); ogs_assert(OGS_FSM_STATE(&mme_ue->sm)); @@ -352,7 +361,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_ESM_MESSAGE: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); pkbuf = e->pkbuf; @@ -438,24 +447,20 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) */ if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_authentication)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_security_mode)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup)) { } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) { ESM_MESSAGE_CHECK; - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_pkbuf_free(pkbuf); break; } @@ -467,12 +472,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; } - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); default_bearer = mme_default_bearer_in_sess(sess); ogs_assert(default_bearer); - e->bearer = bearer; + e->bearer_id = bearer->id; e->nas_message = &nas_message; ogs_fsm_dispatch(&bearer->sm, e); @@ -508,7 +513,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_ESM_TIMER: - bearer = e->bearer; + bearer = mme_bearer_find_by_id(e->bearer_id); ogs_assert(bearer); ogs_assert(OGS_FSM_STATE(&bearer->sm)); @@ -560,13 +565,13 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) * decide whether to process or * ignore the Authentication-Information-Answer as shown below. */ - mme_ue = mme_ue_cycle(e->mme_ue); + mme_ue = mme_ue_find_by_id(e->mme_ue_id); if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); goto cleanup; } - enb_ue = enb_ue_cycle(e->enb_ue); + enb_ue = enb_ue_find_by_id(e->enb_ue_id); /* * The 'enb_ue' context is not checked * because the status is checked in the sending routine. @@ -616,7 +621,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - mme_ue_cycle(enb_ue->mme_ue) ? + mme_ue_find_by_id(enb_ue->mme_ue_id) ? S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE : S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); @@ -775,10 +780,16 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_S11_TIMER: - sgw_ue = e->sgw_ue; - ogs_assert(sgw_ue); - mme_ue = sgw_ue->mme_ue; - ogs_assert(mme_ue); + sgw_ue = sgw_ue_find_by_id(e->sgw_ue_id); + if (!sgw_ue) { + ogs_error("SGW-UE Context has already been removed"); + break; + } + mme_ue = mme_ue_find_by_id(sgw_ue->mme_ue_id); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed"); + break; + } switch (e->timer_id) { case MME_TIMER_S11_HOLDING: @@ -867,9 +878,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case MME_EVENT_GN_TIMER: - mme_ue = e->mme_ue; + mme_ue = mme_ue_find_by_id(e->mme_ue_id); ogs_assert(mme_ue); - sgw_ue = mme_ue->sgw_ue; + sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); switch (e->timer_id) { diff --git a/src/mme/mme-timer.c b/src/mme/mme-timer.c index 1f196c9162..41141748be 100644 --- a/src/mme/mme-timer.c +++ b/src/mme/mme-timer.c @@ -63,11 +63,6 @@ static mme_timer_cfg_t g_mme_timer_cfg[MAX_NUM_OF_MME_TIMER] = { { .have = true, .duration = ogs_time_from_sec(20) }, }; -static void emm_timer_event_send( - mme_timer_e timer_id, mme_ue_t *mme_ue); -static void esm_timer_event_send( - mme_timer_e timer_id, mme_bearer_t *bearer); - mme_timer_cfg_t *mme_timer_cfg(mme_timer_e id) { ogs_assert(id < MAX_NUM_OF_MME_TIMER); @@ -129,16 +124,16 @@ void mme_timer_s1_delayed_send(void *data) } -static void emm_timer_event_send( - mme_timer_e timer_id, mme_ue_t *mme_ue) +static void emm_timer_event_send(mme_timer_e timer_id, void *data) { int rv; mme_event_t *e = NULL; - ogs_assert(mme_ue); + + ogs_assert(data); e = mme_event_new(MME_EVENT_EMM_TIMER); e->timer_id = timer_id; - e->mme_ue = mme_ue; + e->mme_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -176,20 +171,16 @@ void mme_timer_implicit_detach_expire(void *data) emm_timer_event_send(MME_TIMER_IMPLICIT_DETACH, data); } -static void esm_timer_event_send( - mme_timer_e timer_id, mme_bearer_t *bearer) +static void esm_timer_event_send(mme_timer_e timer_id, void *data) { int rv; mme_event_t *e = NULL; - mme_ue_t *mme_ue = NULL; - ogs_assert(bearer); - mme_ue = bearer->mme_ue; - ogs_assert(bearer); + + ogs_assert(data); e = mme_event_new(MME_EVENT_ESM_TIMER); e->timer_id = timer_id; - e->mme_ue = mme_ue; - e->bearer = bearer; + e->bearer_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -224,15 +215,13 @@ void mme_timer_s1_holding_timer_expire(void *data) { int rv; mme_event_t *e = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(data); - enb_ue = data; e = mme_event_new(MME_EVENT_S1AP_TIMER); e->timer_id = MME_TIMER_S1_HOLDING; - e->enb_ue = enb_ue; + e->enb_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -245,15 +234,13 @@ void mme_timer_s11_holding_timer_expire(void *data) { int rv; mme_event_t *e = NULL; - sgw_ue_t *sgw_ue = NULL; ogs_assert(data); - sgw_ue = data; e = mme_event_new(MME_EVENT_S11_TIMER); e->timer_id = MME_TIMER_S11_HOLDING; - e->sgw_ue = sgw_ue; + e->sgw_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { @@ -266,15 +253,13 @@ void mme_timer_gn_holding_timer_expire(void *data) { int rv; mme_event_t *e = NULL; - mme_ue_t *mme_ue; ogs_assert(data); - mme_ue = data; e = mme_event_new(MME_EVENT_GN_TIMER); e->timer_id = MME_TIMER_GN_HOLDING; - e->mme_ue = mme_ue; + e->mme_ue_id = OGS_POINTER_TO_UINT(data); rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index ed01be0952..31fcee1175 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -29,16 +29,24 @@ int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf) { int rv; + enb_ue_t *enb_ue = NULL; ogs_assert(pkbuf); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = s1ap_send_to_enb_ue(mme_ue->enb_ue, pkbuf); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("S1 context has already been removed"); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = s1ap_send_to_enb_ue(enb_ue, pkbuf); ogs_expect(rv == OGS_OK); return rv; @@ -56,7 +64,7 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue, return OGS_ERROR; } - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -84,7 +92,7 @@ int nas_eps_send_to_downlink_nas_transport( ogs_assert(pkbuf); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; @@ -105,16 +113,18 @@ int nas_eps_send_to_downlink_nas_transport( int nas_eps_send_attach_accept(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -184,12 +194,12 @@ int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue, mme_sess_t *sess = NULL; ogs_pkbuf_t *esmbuf = NULL, *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -221,14 +231,16 @@ int nas_eps_send_attach_reject(enb_ue_t *enb_ue, mme_ue_t *mme_ue, int nas_eps_send_identity_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -254,7 +266,7 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3470.timer, mme_timer_cfg(MME_TIMER_T3470)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -263,14 +275,16 @@ int nas_eps_send_identity_request(mme_ue_t *mme_ue) int nas_eps_send_authentication_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -296,7 +310,7 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -305,14 +319,16 @@ int nas_eps_send_authentication_request(mme_ue_t *mme_ue) int nas_eps_send_security_mode_command(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -338,7 +354,7 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3460.timer, mme_timer_cfg(MME_TIMER_T3460)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -347,14 +363,16 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue) int nas_eps_send_authentication_reject(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -367,7 +385,7 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -376,14 +394,16 @@ int nas_eps_send_authentication_reject(mme_ue_t *mme_ue) int nas_eps_send_detach_request(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -409,7 +429,7 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue) ogs_timer_start(mme_ue->t3422.timer, mme_timer_cfg(MME_TIMER_T3422)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -418,15 +438,16 @@ int nas_eps_send_detach_request(mme_ue_t *mme_ue) int nas_eps_send_detach_accept(mme_ue_t *mme_ue) { int rv; - + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -441,14 +462,14 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); if (rv != OGS_OK) { ogs_error("nas_eps_send_to_downlink_nas_transport() failed"); return rv; } } - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_detach, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(rv == OGS_OK); @@ -460,18 +481,20 @@ int nas_eps_send_pdn_connectivity_reject( mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action) { int rv; - mme_ue_t *mme_ue; + mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; ogs_assert(sess); - mme_ue = sess->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -479,14 +502,14 @@ int nas_eps_send_pdn_connectivity_reject( if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* During the UE-attach process, we'll send Attach-Reject * with pyggybacking PDN-connectivity-Reject */ - rv = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + rv = nas_eps_send_attach_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_ESM_FAILURE, esm_cause); if (rv != OGS_OK) { ogs_error("nas_eps_send_attach_reject() failed"); return rv; } - rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + rv = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(rv == OGS_OK); @@ -498,7 +521,7 @@ int nas_eps_send_pdn_connectivity_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -509,17 +532,19 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer) { int rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -543,7 +568,7 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer) ogs_timer_start(bearer->t3489.timer, mme_timer_cfg(MME_TIMER_T3489)->duration); - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -557,18 +582,20 @@ int nas_eps_send_activate_default_bearer_context_request( ogs_pkbuf_t *esmbuf = NULL; mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -599,16 +626,18 @@ int nas_eps_send_activate_dedicated_bearer_context_request( ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -654,16 +683,18 @@ int nas_eps_send_modify_bearer_context_request( ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -685,7 +716,7 @@ int nas_eps_send_modify_bearer_context_request( rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); } @@ -698,16 +729,18 @@ int nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer) ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; ogs_assert(bearer); - mme_ue = bearer->mme_ue; - if (!mme_ue_cycle(mme_ue)) { + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -736,14 +769,16 @@ int nas_eps_send_bearer_resource_allocation_reject( mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -757,7 +792,7 @@ int nas_eps_send_bearer_resource_allocation_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -767,14 +802,16 @@ int nas_eps_send_bearer_resource_modification_reject( mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *esmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -788,7 +825,7 @@ int nas_eps_send_bearer_resource_modification_reject( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, esmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, esmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -798,14 +835,16 @@ int nas_eps_send_tau_accept( mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -841,7 +880,7 @@ int nas_eps_send_tau_accept( rv = nas_eps_send_to_enb(mme_ue, s1apbuf); ogs_expect(rv == OGS_OK); } else if (procedureCode == S1AP_ProcedureCode_id_downlinkNASTransport) { - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); } else ogs_assert_if_reached(); @@ -855,12 +894,12 @@ int nas_eps_send_tau_reject( int rv; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -886,12 +925,12 @@ int nas_eps_send_service_reject( int rv; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -914,14 +953,16 @@ int nas_eps_send_service_reject( int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -934,7 +975,7 @@ int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue) return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -944,14 +985,16 @@ int nas_eps_send_downlink_nas_transport( mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length) { int rv; + enb_ue_t *enb_ue = NULL; ogs_pkbuf_t *emmbuf = NULL; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -967,7 +1010,7 @@ int nas_eps_send_downlink_nas_transport( return OGS_ERROR; } - rv = nas_eps_send_to_downlink_nas_transport(mme_ue->enb_ue, emmbuf); + rv = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(rv == OGS_OK); return rv; diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 4f21ab8dd6..d163264c05 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -283,7 +283,6 @@ ogs_pkbuf_t *s1ap_build_downlink_nas_transport( S1AP_NAS_PDU_t *NAS_PDU = NULL; ogs_assert(emmbuf); - enb_ue = enb_ue_cycle(enb_ue); ogs_assert(enb_ue); ogs_debug("DownlinkNASTransport"); @@ -427,9 +426,8 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("InitialContextSetupRequest"); @@ -621,7 +619,6 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( } if (!E_RABToBeSetupListCtxtSUReq->list.count) { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); ogs_list_for_each(&mme_ue->sess_list, sess) { ogs_error(" APN[%s]", sess->session ? sess->session->name : "Unknown"); @@ -847,9 +844,8 @@ ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue) enb_ue_t *enb_ue = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("UEContextModificationRequest"); @@ -983,7 +979,6 @@ ogs_pkbuf_t *s1ap_build_ue_context_release_command( S1AP_UE_S1AP_IDs_t *UE_S1AP_IDs = NULL; S1AP_Cause_t *Cause = NULL; - enb_ue = enb_ue_cycle(enb_ue); ogs_assert(enb_ue); if (enb_ue->mme_ue_s1ap_id == 0) { @@ -1069,9 +1064,9 @@ ogs_pkbuf_t *s1ap_build_e_rab_setup_request( ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABSetupRequest"); @@ -1202,9 +1197,9 @@ ogs_pkbuf_t *s1ap_build_e_rab_modify_request( ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABModifyRequest"); @@ -1330,9 +1325,9 @@ ogs_pkbuf_t *s1ap_build_e_rab_release_command( ogs_assert(esmbuf); ogs_assert(bearer); - mme_ue = mme_ue_cycle(bearer->mme_ue); + mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABReleaseCommand"); @@ -1451,9 +1446,8 @@ ogs_pkbuf_t *s1ap_build_e_rab_modification_confirm(mme_ue_t *mme_ue) mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("E-RABModificationConfirm"); @@ -1553,7 +1547,6 @@ ogs_pkbuf_t *s1ap_build_paging( uint64_t ue_imsi_value = 0; int i = 0; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); ogs_debug("Paging"); @@ -1776,9 +1769,8 @@ ogs_pkbuf_t *s1ap_build_path_switch_ack( mme_bearer_t *bearer = NULL; enb_ue_t *enb_ue = NULL; - mme_ue = mme_ue_cycle(mme_ue); ogs_assert(mme_ue); - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_debug("PathSwitchAcknowledge"); @@ -1973,9 +1965,8 @@ ogs_pkbuf_t *s1ap_build_handover_command(enb_ue_t *source_ue) mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); - mme_ue = mme_ue_cycle(source_ue->mme_ue); + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); ogs_assert(mme_ue); ogs_debug("HandoverCommand"); @@ -2132,7 +2123,6 @@ ogs_pkbuf_t *s1ap_build_handover_preparation_failure( S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; S1AP_Cause_t *Cause = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); ogs_assert(group); @@ -2225,9 +2215,8 @@ ogs_pkbuf_t *s1ap_build_handover_request( ogs_assert(cause); ogs_assert(source_totarget_transparentContainer); - target_ue = enb_ue_cycle(target_ue); ogs_assert(target_ue); - mme_ue = mme_ue_cycle(target_ue->mme_ue); + mme_ue = mme_ue_find_by_id(target_ue->mme_ue_id); ogs_assert(mme_ue); ogs_debug("HandoverRequest"); @@ -2460,7 +2449,6 @@ ogs_pkbuf_t *s1ap_build_handover_cancel_ack(enb_ue_t *source_ue) S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL; S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; - source_ue = enb_ue_cycle(source_ue); ogs_assert(source_ue); ogs_debug("HandoverCancelAcknowledge"); @@ -2524,7 +2512,6 @@ ogs_pkbuf_t *s1ap_build_mme_status_transfer( S1AP_ENB_StatusTransfer_TransparentContainer_t *ENB_StatusTransfer_TransparentContainer = NULL; - target_ue = enb_ue_cycle(target_ue); ogs_assert(target_ue); ogs_assert(enb_statustransfer_transparentContainer); diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 116a6e7961..d6c37554c6 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -505,7 +505,6 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) ogs_info("Unknown UE by S_TMSI[G:%d,C:%d,M_TMSI:0x%x]", nas_guti.mme_gid, nas_guti.mme_code, nas_guti.m_tmsi); } else { - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_info(" S_TMSI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]", mme_ue->current.guti.mme_gid, mme_ue->current.guti.mme_code, @@ -542,16 +541,15 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) } } } else { + mme_ue_t *mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); ogs_error("Known UE ENB_UE_S1AP_ID[%d] [%p:%p]", - (int)*ENB_UE_S1AP_ID, enb_ue, enb_ue->mme_ue); - if (enb_ue->mme_ue) { - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); + (int)*ENB_UE_S1AP_ID, enb_ue, mme_ue); + if (mme_ue) { ogs_error(" S_TMSI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]", - enb_ue->mme_ue->current.guti.mme_gid, - enb_ue->mme_ue->current.guti.mme_code, - enb_ue->mme_ue->current.guti.m_tmsi, - MME_UE_HAVE_IMSI(enb_ue->mme_ue) - ? enb_ue->mme_ue->imsi_bcd : "Unknown"); + mme_ue->current.guti.mme_gid, + mme_ue->current.guti.mme_code, + mme_ue->current.guti.m_tmsi, + MME_UE_HAVE_IMSI(mme_ue) ? mme_ue->imsi_bcd : "Unknown"); } } @@ -631,6 +629,7 @@ void s1ap_handle_uplink_nas_transport( S1AP_CellIdentity_t *cell_ID = NULL; enb_ue_t *enb_ue = NULL; + mme_ue_t *mme_ue = NULL; ogs_eps_tai_t tai; int served_tai_index = 0; @@ -784,10 +783,8 @@ void s1ap_handle_uplink_nas_transport( enb_ue->saved.tai.tac, enb_ue->saved.e_cgi.cell_id); /* Copy Stream-No/TAI/ECGI from enb_ue */ - if (enb_ue->mme_ue) { - mme_ue_t *mme_ue = enb_ue->mme_ue; - - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + if (mme_ue) { memcpy(&mme_ue->tai, &enb_ue->saved.tai, sizeof(ogs_eps_tai_t)); memcpy(&mme_ue->e_cgi, &enb_ue->saved.e_cgi, sizeof(ogs_e_cgi_t)); mme_ue->ue_location_timestamp = ogs_time_now(); @@ -814,6 +811,7 @@ void s1ap_handle_ue_capability_info_indication( S1AP_UERadioCapability_t *UERadioCapability = NULL; enb_ue_t *enb_ue = NULL; + mme_ue_t *mme_ue = NULL; ogs_assert(enb); ogs_assert(enb->sctp.sock); @@ -889,11 +887,10 @@ void s1ap_handle_ue_capability_info_indication( ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - if (enb_ue->mme_ue) { + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + if (mme_ue) { ogs_assert(UERadioCapability); - MME_UE_CHECK(OGS_LOG_DEBUG, enb_ue->mme_ue); - OGS_ASN_STORE_DATA(&enb_ue->mme_ue->ueRadioCapability, - UERadioCapability); + OGS_ASN_STORE_DATA(&mme_ue->ueRadioCapability, UERadioCapability); } } @@ -989,13 +986,12 @@ void s1ap_handle_initial_context_setup_response( ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); if (E_RABSetupListCtxtSURes) { int uli_presence = 0; @@ -1188,7 +1184,7 @@ void s1ap_handle_initial_context_setup_failure( ogs_debug(" Cause[Group:%d Cause:%d]", Cause->present, (int)Cause->choice.radioNetwork); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { /* @@ -1300,7 +1296,7 @@ void s1ap_handle_ue_context_modification_response( ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1412,7 +1408,7 @@ void s1ap_handle_ue_context_modification_failure( ogs_debug(" Cause[Group:%d Cause:%d]", Cause->present, (int)Cause->choice.radioNetwork); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1522,7 +1518,7 @@ void s1ap_handle_e_rab_setup_response( ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -1857,9 +1853,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) int r; mme_ue_t *mme_ue = NULL; - ogs_assert(enb_ue); - - if (enb_ue_cycle(enb_ue) == NULL) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return; } @@ -1868,7 +1862,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) ogs_info(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - mme_ue = mme_ue_cycle(enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); @@ -1964,7 +1958,6 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); mme_ue_remove(mme_ue); break; case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE: @@ -2008,11 +2001,12 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) ogs_warn(" Packet could be dropped during S1-Handover"); mme_ue_clear_indirect_tunnel(mme_ue); - if (!mme_ue->enb_ue) { + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { ogs_error("No S1 context"); return; } - r = s1ap_send_handover_cancel_ack(mme_ue->enb_ue); + r = s1ap_send_handover_cancel_ack(enb_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -2153,13 +2147,12 @@ void s1ap_handle_e_rab_modification_indication( return; } - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; } - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); ogs_list_init(&mme_ue->bearer_to_modify_list); for (i = 0; i < E_RABToBeModifiedListBearerModInd->list.count; i++) { @@ -2510,7 +2503,7 @@ void s1ap_handle_path_switch_request( return; } - mme_ue = mme_ue_cycle(enb_ue->mme_ue); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -2816,7 +2809,7 @@ static void s1ap_handle_handover_required_intralte(enb_ue_t *source_ue, return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3112,7 +3105,7 @@ void s1ap_handle_handover_request_ack( return; } - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3122,7 +3115,7 @@ void s1ap_handle_handover_request_ack( return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3315,7 +3308,7 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, ogs_s1ap_message_t *message) return; } - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, NULL, @@ -3437,7 +3430,7 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, ogs_s1ap_message_t *message) return; } - target_ue = source_ue->target_ue; + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("No Target UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3565,7 +3558,7 @@ void s1ap_handle_enb_status_transfer( return; } - target_ue = source_ue->target_ue; + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (!target_ue) { ogs_error("No Target UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3711,7 +3704,7 @@ void s1ap_handle_handover_notification( tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - source_ue = target_ue->source_ue; + source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3721,7 +3714,7 @@ void s1ap_handle_handover_notification( return; } - mme_ue = source_ue->mme_ue; + mme_ue = mme_ue_find_by_id(source_ue->mme_ue_id); if (!mme_ue) { ogs_error("No UE(mme-ue) context"); return; @@ -3944,7 +3937,7 @@ void s1ap_handle_s1_reset( /* ENB_UE Context where PartOfS1_interface was requested */ enb_ue->part_of_s1_reset_requested = true; - mme_ue = enb_ue->mme_ue; + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_assert(OGS_OK == mme_gtp_send_release_access_bearers_request(mme_ue, diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index c47bb5e37e..0ddc68c9e1 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -52,12 +52,7 @@ int s1ap_send_to_enb(mme_enb_t *enb, ogs_pkbuf_t *pkbuf, uint16_t stream_no) char buf[OGS_ADDRSTRLEN]; ogs_assert(pkbuf); - - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } + ogs_assert(enb); ogs_assert(enb->sctp.sock); if (enb->sctp.sock->fd == INVALID_SOCKET) { @@ -84,15 +79,24 @@ int s1ap_send_to_enb(mme_enb_t *enb, ogs_pkbuf_t *pkbuf, uint16_t stream_no) int s1ap_send_to_enb_ue(enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf) { int rv; + mme_enb_t *enb = NULL; + ogs_assert(pkbuf); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; } - rv = s1ap_send_to_enb(enb_ue->enb, pkbuf, enb_ue->enb_ostream_id); + enb = mme_enb_find_by_id(enb_ue->enb_id); + if (!enb) { + ogs_error("[%d] eNB has already been removed", enb_ue->enb_id); + ogs_pkbuf_free(pkbuf); + return OGS_NOTFOUND; + } + + rv = s1ap_send_to_enb(enb, pkbuf, enb_ue->enb_ostream_id); ogs_expect(rv == OGS_OK); return rv; @@ -113,8 +117,7 @@ int s1ap_delayed_send_to_enb_ue( ogs_app()->timer_mgr, mme_timer_s1_delayed_send, e); ogs_assert(e->timer); e->pkbuf = pkbuf; - e->enb_ue = enb_ue; - e->enb = enb_ue->enb; + e->enb_ue_id = enb_ue->id; ogs_timer_start(e->timer, duration); @@ -139,7 +142,7 @@ int s1ap_send_to_esm( e = mme_event_new(MME_EVENT_ESM_MESSAGE); ogs_assert(e); - e->mme_ue = mme_ue; + e->mme_ue_id = mme_ue->id; e->pkbuf = esmbuf; e->nas_type = nas_type; e->create_action = create_action; @@ -157,6 +160,9 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu) { int rv; + + mme_ue_t *mme_ue = NULL; + ogs_nas_eps_security_header_t *sh = NULL; ogs_nas_security_header_type_t security_header_type; @@ -167,6 +173,8 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, ogs_assert(enb_ue); ogs_assert(nasPdu); + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); + /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. * When calculating AES_CMAC, we need to use the headroom of the packet. */ nasbuf = ogs_pkbuf_alloc(NULL, OGS_NAS_HEADROOM+nasPdu->size); @@ -211,8 +219,8 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, return OGS_ERROR; } - if (enb_ue->mme_ue) { - if (nas_eps_security_decode(enb_ue->mme_ue, + if (mme_ue) { + if (nas_eps_security_decode(mme_ue, security_header_type, nasbuf) != OGS_OK) { ogs_error("nas_eps_security_decode failed()"); enb_ue_remove(enb_ue); @@ -259,7 +267,7 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, ogs_pkbuf_free(nasbuf); return OGS_ERROR; } - e->enb_ue = enb_ue; + e->enb_ue_id = enb_ue->id; e->s1ap_code = procedureCode; e->nas_type = security_header_type.type; e->pkbuf = nasbuf; @@ -272,7 +280,6 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, return rv; } else if (h->protocol_discriminator == OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM) { - mme_ue_t *mme_ue = enb_ue->mme_ue; if (!mme_ue) { ogs_error("No UE Context"); ogs_pkbuf_free(nasbuf); @@ -299,12 +306,9 @@ int s1ap_send_s1_setup_response(mme_enb_t *enb) int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("S1-Setup response"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("S1-Setup response"); s1ap_buffer = s1ap_build_setup_rsp(); if (!s1ap_buffer) { @@ -324,12 +328,9 @@ int s1ap_send_s1_setup_failure( int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("S1-Setup failure"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("S1-Setup failure"); s1ap_buffer = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s); if (!s1ap_buffer) { @@ -348,12 +349,9 @@ int s1ap_send_enb_configuration_update_ack(mme_enb_t *enb) int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("ENBConfigurationUpdateAcknowledge"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("ENBConfigurationUpdateAcknowledge"); s1ap_buffer = s1ap_build_enb_configuration_update_ack(); if (!s1ap_buffer) { @@ -373,12 +371,9 @@ int s1ap_send_enb_configuration_update_failure( int rv; ogs_pkbuf_t *s1ap_buffer; - ogs_debug("ENBConfigurationUpdateFailure"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("ENBConfigurationUpdateFailure"); s1ap_buffer = s1ap_build_enb_configuration_update_failure( group, cause, S1AP_TimeToWait_v10s); @@ -400,12 +395,12 @@ int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue) ogs_debug("InitialContextSetupRequest"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -429,12 +424,12 @@ int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue) ogs_debug("UEContextModificationRequest"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -460,7 +455,7 @@ int s1ap_send_ue_context_release_command( ogs_debug("UEContextReleaseCommand"); - if (!enb_ue_cycle(enb_ue)) { + if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -498,7 +493,7 @@ int s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain) ogs_debug("S1-Paging"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -550,15 +545,11 @@ int s1ap_send_mme_configuration_transfer( int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_debug("MMEConfigurationTransfer"); - - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } - + ogs_assert(target_enb); ogs_assert(SONConfigurationTransfer); + ogs_debug("MMEConfigurationTransfer"); + s1apbuf = s1ap_build_mme_configuration_transfer(SONConfigurationTransfer); if (!s1apbuf) { ogs_error("s1ap_build_mme_configuration_transfer() failed"); @@ -577,12 +568,9 @@ int s1ap_send_mme_direct_information_transfer( int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_debug("Tx MME Direct Information Transfer"); + ogs_assert(target_enb); - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_debug("Tx MME Direct Information Transfer"); s1apbuf = s1ap_build_direct_information_transfer(buf, buf_len); if (!s1apbuf) { @@ -603,12 +591,12 @@ int s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue) ogs_debug("E-RABModificationConfirm"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -633,12 +621,12 @@ int s1ap_send_path_switch_ack( ogs_debug("PathSwitchAcknowledge"); - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!enb_ue_cycle(mme_ue->enb_ue)) { + if (!enb_ue_find_by_id(mme_ue->enb_ue_id)) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -663,12 +651,12 @@ int s1ap_send_handover_command(enb_ue_t *source_ue) ogs_debug("HandoverCommand"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - if (!mme_ue_cycle(source_ue->mme_ue)) { + if (!mme_ue_find_by_id(source_ue->mme_ue_id)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } @@ -693,7 +681,7 @@ int s1ap_send_handover_preparation_failure( ogs_debug("HandoverPreparationFailure"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -719,7 +707,7 @@ int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue) ogs_debug("HandoverCancelAcknowledge"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -748,24 +736,21 @@ int s1ap_send_handover_request( enb_ue_t *target_ue = NULL; + ogs_assert(target_enb); + ogs_info("HandoverRequest"); - if (!enb_ue_cycle(source_ue)) { + if (!source_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - if (!mme_ue_cycle(source_ue->mme_ue)) { + if (!mme_ue_find_by_id(source_ue->mme_ue_id)) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!mme_enb_cycle(target_enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } - - target_ue = enb_ue_cycle(source_ue->target_ue); + target_ue = enb_ue_find_by_id(source_ue->target_ue_id); if (target_ue) { /* * Issue #3014 @@ -844,7 +829,7 @@ int s1ap_send_mme_status_transfer( ogs_info("MMEStatusTransfer"); - if (!enb_ue_cycle(target_ue)) { + if (!target_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } @@ -871,12 +856,9 @@ int s1ap_send_error_indication( int rv; ogs_pkbuf_t *s1apbuf = NULL; - ogs_info("ErrorIndication"); + ogs_assert(enb); - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_info("ErrorIndication"); s1apbuf = ogs_s1ap_build_error_indication( mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause); @@ -901,18 +883,18 @@ int s1ap_send_error_indication2( S1AP_MME_UE_S1AP_ID_t mme_ue_s1ap_id; S1AP_ENB_UE_S1AP_ID_t enb_ue_s1ap_id; - if (!mme_ue_cycle(mme_ue)) { + if (!mme_ue) { ogs_error("UE(mme-ue) context has already been removed"); return OGS_NOTFOUND; } - enb_ue = enb_ue_cycle(mme_ue->enb_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (!enb_ue) { ogs_error("S1 context has already been removed"); return OGS_NOTFOUND; } - enb = mme_enb_cycle(enb_ue->enb); + enb = mme_enb_find_by_id(enb_ue->enb_id); if (!enb) { ogs_error("eNB has already been removed"); return OGS_NOTFOUND; @@ -935,10 +917,7 @@ int s1ap_send_s1_reset_ack( int rv; ogs_pkbuf_t *s1apbuf = NULL; - if (!mme_enb_cycle(enb)) { - ogs_error("eNB has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(enb); ogs_info("S1-Reset Acknowledge"); s1apbuf = ogs_s1ap_build_s1_reset_ack(partOfS1_Interface); diff --git a/src/mme/s1ap-sm.c b/src/mme/s1ap-sm.c index 9314316319..c511ad5e93 100644 --- a/src/mme/s1ap-sm.c +++ b/src/mme/s1ap-sm.c @@ -59,7 +59,7 @@ void s1ap_state_operational(ogs_fsm_t *s, mme_event_t *e) mme_sm_debug(e); - enb = e->enb; + enb = mme_enb_find_by_id(e->enb_id); ogs_assert(enb); switch (e->id) { diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index 023cd5f114..d9b93b88c2 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -124,7 +124,8 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) return; error: - r = nas_eps_send_attach_reject(mme_ue->enb_ue, mme_ue, + r = nas_eps_send_attach_reject( + enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); From ab8e46a03d55b26af77612aed345789b24f9e245 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 29 Jun 2024 18:08:28 +0900 Subject: [PATCH 138/323] [POOL] refactor SMF/UPF/SGW-C/SGW-U (#3196) Removed ogs_pool_cycle() from SMF/UPF/SGW-C/SGW-U memory pool and changed it to find by hash id. --- lib/gtp/xact.c | 22 ++-- lib/gtp/xact.h | 2 +- lib/pfcp/xact.c | 13 ++- lib/pfcp/xact.h | 5 +- src/mme/mme-gtp-path.c | 17 ++- src/mme/mme-s11-handler.c | 16 +-- src/sgwc/context.c | 84 ++++++++------ src/sgwc/context.h | 18 ++- src/sgwc/event.h | 4 +- src/sgwc/gtp-path.c | 29 +++-- src/sgwc/pfcp-path.c | 54 ++++++--- src/sgwc/pfcp-path.h | 8 +- src/sgwc/pfcp-sm.c | 6 +- src/sgwc/s11-build.c | 4 +- src/sgwc/s11-handler.c | 217 ++++++++++++++++++++++++++---------- src/sgwc/s5c-handler.c | 67 ++++++----- src/sgwc/sgwc-sm.c | 2 +- src/sgwc/sxa-handler.c | 137 +++++++++++++---------- src/sgwu/context.c | 10 +- src/sgwu/context.h | 2 + src/sgwu/event.h | 2 +- src/sgwu/pfcp-path.c | 15 ++- src/sgwu/pfcp-sm.c | 4 +- src/sgwu/sgwu-sm.c | 2 +- src/smf/binding.c | 41 ++++--- src/smf/context.c | 103 +++++++++-------- src/smf/context.h | 25 +++-- src/smf/event.h | 6 +- src/smf/fd-path.h | 4 +- src/smf/gn-handler.c | 8 +- src/smf/gsm-handler.c | 8 +- src/smf/gsm-sm.c | 229 +++++++++++++++++++++----------------- src/smf/gtp-path.c | 42 ++++--- src/smf/gx-path.c | 24 ++-- src/smf/gy-handler.c | 2 +- src/smf/gy-path.c | 44 ++++---- src/smf/n4-build.c | 2 +- src/smf/n4-handler.c | 43 ++++--- src/smf/namf-build.c | 2 +- src/smf/namf-handler.c | 2 +- src/smf/nas-path.c | 2 +- src/smf/ngap-handler.c | 12 +- src/smf/ngap-path.c | 2 +- src/smf/npcf-build.c | 4 +- src/smf/npcf-handler.c | 6 +- src/smf/nsmf-handler.c | 6 +- src/smf/nudm-build.c | 6 +- src/smf/nudm-handler.c | 2 +- src/smf/pfcp-path.c | 96 +++++++++++----- src/smf/pfcp-path.h | 8 +- src/smf/pfcp-sm.c | 22 ++-- src/smf/s5c-build.c | 8 +- src/smf/s5c-handler.c | 86 +++++++++----- src/smf/s6b-path.c | 21 ++-- src/smf/sbi-path.c | 9 +- src/smf/smf-sm.c | 57 +++++----- src/upf/context.c | 10 +- src/upf/context.h | 2 + src/upf/event.h | 2 +- src/upf/pfcp-path.c | 15 ++- src/upf/pfcp-sm.c | 4 +- src/upf/upf-sm.c | 2 +- 62 files changed, 1044 insertions(+), 663 deletions(-) diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index 5517ad435a..f3adbc1f04 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -1131,11 +1131,11 @@ void ogs_gtp_xact_associate(ogs_gtp_xact_t *xact1, ogs_gtp_xact_t *xact2) ogs_assert(xact1); ogs_assert(xact2); - ogs_assert(xact1->assoc_xact == NULL); - ogs_assert(xact2->assoc_xact == NULL); + ogs_assert(xact1->assoc_xact_id == OGS_INVALID_POOL_ID); + ogs_assert(xact2->assoc_xact_id == OGS_INVALID_POOL_ID); - xact1->assoc_xact = xact2; - xact2->assoc_xact = xact1; + xact1->assoc_xact_id = xact2->id; + xact2->assoc_xact_id = xact1->id; } void ogs_gtp_xact_deassociate(ogs_gtp_xact_t *xact1, ogs_gtp_xact_t *xact2) @@ -1143,16 +1143,17 @@ void ogs_gtp_xact_deassociate(ogs_gtp_xact_t *xact1, ogs_gtp_xact_t *xact2) ogs_assert(xact1); ogs_assert(xact2); - ogs_assert(xact1->assoc_xact != NULL); - ogs_assert(xact2->assoc_xact != NULL); + ogs_assert(xact1->assoc_xact_id != OGS_INVALID_POOL_ID); + ogs_assert(xact2->assoc_xact_id != OGS_INVALID_POOL_ID); - xact1->assoc_xact = NULL; - xact2->assoc_xact = NULL; + xact1->assoc_xact_id = OGS_INVALID_POOL_ID; + xact2->assoc_xact_id = OGS_INVALID_POOL_ID; } static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact) { char buf[OGS_ADDRSTRLEN]; + ogs_gtp_xact_t *assoc_xact = NULL; ogs_assert(xact); ogs_assert(xact->gnode); @@ -1175,8 +1176,9 @@ static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact) if (xact->tm_holding) ogs_timer_delete(xact->tm_holding); - if (xact->assoc_xact) - ogs_gtp_xact_deassociate(xact, xact->assoc_xact); + assoc_xact = ogs_gtp_xact_find_by_id(xact->assoc_xact_id); + if (assoc_xact) + ogs_gtp_xact_deassociate(xact, assoc_xact); ogs_list_remove(xact->org == OGS_GTP_LOCAL_ORIGINATOR ? &xact->gnode->local_list : &xact->gnode->remote_list, xact); diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index ef001d1bb5..a04cd4884e 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -112,7 +112,7 @@ typedef struct ogs_gtp_xact_s { uint32_t local_teid; /**< Local TEID, expected in reply from peer */ - void *assoc_xact; /**< Associated GTP transaction */ + ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ void *pfcp_xact; /**< Associated PFCP transaction */ #define OGS_GTP_MODIFY_TFT_UPDATE ((uint64_t)1<<0) diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index dc0c1ef2cc..78a900e35b 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -75,9 +75,8 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, ogs_assert(node); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->org = OGS_PFCP_LOCAL_ORIGINATOR; @@ -124,9 +123,8 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( ogs_assert(node); - ogs_pool_alloc(&pool, &xact); + ogs_pool_id_calloc(&pool, &xact); ogs_assert(xact); - memset(xact, 0, sizeof *xact); xact->index = ogs_pool_index(&pool, xact); xact->org = OGS_PFCP_REMOTE_ORIGINATOR; @@ -171,6 +169,11 @@ void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node) ogs_pfcp_xact_delete(xact); } +ogs_pfcp_xact_t *ogs_pfcp_xact_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&pool, id); +} + int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf) { @@ -802,7 +805,7 @@ int ogs_pfcp_xact_delete(ogs_pfcp_xact_t *xact) ogs_list_remove(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? &xact->node->local_list : &xact->node->remote_list, xact); - ogs_pool_free(&pool, xact); + ogs_pool_id_free(&pool, xact); return OGS_OK; } diff --git a/lib/pfcp/xact.h b/lib/pfcp/xact.h index b21f058dff..a10d1b5b64 100644 --- a/lib/pfcp/xact.h +++ b/lib/pfcp/xact.h @@ -35,6 +35,8 @@ typedef struct ogs_pfcp_xact_s { ogs_lnode_t lnode; /**< A node of list */ ogs_lnode_t tmpnode; /**< A node of temp-list */ + ogs_pool_id_t id; + ogs_pool_id_t index; #define OGS_PFCP_LOCAL_ORIGINATOR 0 @@ -68,7 +70,7 @@ typedef struct ogs_pfcp_xact_s { uint64_t local_seid; /**< Local SEID, expected in reply from peer */ - void *assoc_xact; /**< Associated GTP transaction */ + ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ ogs_pkbuf_t *gtpbuf; /**< GTP packet buffer */ uint8_t gtp_pti; /**< GTP Procedure transaction identity */ @@ -134,6 +136,7 @@ void ogs_pfcp_xact_final(void); ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, void (*cb)(ogs_pfcp_xact_t *xact, void *data), void *data); void ogs_pfcp_xact_delete_all(ogs_pfcp_node_t *node); +ogs_pfcp_xact_t *ogs_pfcp_xact_find_by_id(ogs_pool_id_t id); int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index b670949229..ef44b85f11 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -102,9 +102,12 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) { int r; mme_ue_t *mme_ue = NULL; + ogs_pool_id_t mme_ue_id = OGS_INVALID_POOL_ID; enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; mme_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type = 0; ogs_assert(xact); @@ -115,18 +118,26 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) case OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE: case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: - mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(data)); + mme_ue_id = OGS_POINTER_TO_UINT(data); + ogs_assert(mme_ue_id >= OGS_MIN_POOL_ID && + mme_ue_id <= OGS_MAX_POOL_ID); + mme_ue = mme_ue_find_by_id(mme_ue_id); ogs_assert(mme_ue); break; case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: - sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(data)); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + sess = mme_sess_find_by_id(sess_id); ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: - bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + bearer = mme_bearer_find_by_id(bearer_id); ogs_assert(bearer); sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index f3f5ab225c..0c335fd24c 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -66,16 +66,9 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) uint8_t type; ogs_assert(xact); - ogs_assert(data); - bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); - if (!bearer) { - ogs_error("No Bearer"); - return; - } - type = xact->seq[xact->step-1].type; - ogs_warn("[%d] %s HOLDING TIMEOUT " + ogs_error("[%d] %s HOLDING TIMEOUT " "for step %d type %d peer [%s]:%d", xact->xid, xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", @@ -83,6 +76,13 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) OGS_ADDR(&xact->gnode->addr, buf), OGS_PORT(&xact->gnode->addr)); + ogs_assert(data); + bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(data)); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + /* * Issues #3240 * diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 39b68ca07b..9ab44cd88d 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -212,9 +212,8 @@ sgwc_ue_t *sgwc_ue_add(uint8_t *imsi, int imsi_len) ogs_assert(imsi); ogs_assert(imsi_len); - ogs_pool_alloc(&sgwc_ue_pool, &sgwc_ue); + ogs_pool_id_calloc(&sgwc_ue_pool, &sgwc_ue); ogs_assert(sgwc_ue); - memset(sgwc_ue, 0, sizeof *sgwc_ue); /* Set SGW-S11-TEID */ ogs_pool_alloc(&sgwc_s11_teid_pool, &sgwc_ue->sgw_s11_teid_node); @@ -255,7 +254,7 @@ int sgwc_ue_remove(sgwc_ue_t *sgwc_ue) sgwc_sess_remove_all(sgwc_ue); ogs_pool_free(&sgwc_s11_teid_pool, sgwc_ue->sgw_s11_teid_node); - ogs_pool_free(&sgwc_ue_pool, sgwc_ue); + ogs_pool_id_free(&sgwc_ue_pool, sgwc_ue); ogs_info("[Removed] Number of SGWC-UEs is now %d", ogs_list_count(&self.sgw_ue_list)); @@ -295,19 +294,23 @@ sgwc_ue_t *sgwc_ue_find_by_teid(uint32_t teid) return ogs_hash_get(self.sgw_s11_teid_hash, &teid, sizeof(teid)); } +sgwc_ue_t *sgwc_ue_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwc_ue_pool, id); +} + sgwc_sess_t *sgwc_sess_add(sgwc_ue_t *sgwc_ue, char *apn) { sgwc_sess_t *sess = NULL; ogs_assert(sgwc_ue); - ogs_pool_alloc(&sgwc_sess_pool, &sess); + ogs_pool_id_calloc(&sgwc_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session[%lld] reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -328,7 +331,7 @@ sgwc_sess_t *sgwc_sess_add(sgwc_ue_t *sgwc_ue, char *apn) sess->session.name = ogs_strdup(apn); ogs_assert(sess->session.name); - sess->sgwc_ue = sgwc_ue; + sess->sgwc_ue_id = sgwc_ue->id; ogs_list_add(&sgwc_ue->sess_list, sess); @@ -344,7 +347,7 @@ static bool compare_ue_info(ogs_pfcp_node_t *node, sgwc_sess_t *sess) ogs_assert(node); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(sess->session.name); @@ -430,7 +433,7 @@ int sgwc_sess_remove(sgwc_sess_t *sess) sgwc_ue_t *sgwc_ue = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_list_remove(&sgwc_ue->sess_list, sess); @@ -449,7 +452,7 @@ int sgwc_sess_remove(sgwc_sess_t *sess) ogs_free(sess->session.name); ogs_pool_free(&sgwc_sxa_seid_pool, sess->sgwc_sxa_seid_node); - ogs_pool_free(&sgwc_sess_pool, sess); + ogs_pool_id_free(&sgwc_sess_pool, sess); stats_remove_sgwc_session(); @@ -497,14 +500,14 @@ sgwc_sess_t *sgwc_sess_find_by_ebi(sgwc_ue_t *sgwc_ue, uint8_t ebi) bearer = sgwc_bearer_find_by_ue_ebi(sgwc_ue, ebi); if (bearer) - return bearer->sess; + return sgwc_sess_find_by_id(bearer->sess_id); return NULL; } -sgwc_sess_t *sgwc_sess_cycle(sgwc_sess_t *sess) +sgwc_sess_t *sgwc_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgwc_sess_pool, sess); + return ogs_pool_find_by_id(&sgwc_sess_pool, id); } int sgwc_sess_pfcp_xact_count( @@ -518,14 +521,24 @@ int sgwc_sess_pfcp_xact_count( ogs_list_for_each(&sgwc_ue->sess_list, sess) { ogs_pfcp_node_t *pfcp_node = sess->pfcp_node; ogs_pfcp_xact_t *pfcp_xact = NULL; + ogs_assert(pfcp_node); ogs_list_for_each(&pfcp_node->local_list, pfcp_xact) { - if (sess != pfcp_xact->data) - continue; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; + if (pfcp_type && pfcp_type != pfcp_xact->seq[0].type) continue; + if (!(pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION)) + continue; if (modify_flags && modify_flags != pfcp_xact->modify_flags) continue; + + sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + if (sess->id != sess_id) + continue; + xact_count++; } } @@ -540,15 +553,14 @@ sgwc_bearer_t *sgwc_bearer_add(sgwc_sess_t *sess) sgwc_ue_t *sgwc_ue = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - ogs_pool_alloc(&sgwc_bearer_pool, &bearer); + ogs_pool_id_calloc(&sgwc_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); - bearer->sgwc_ue = sgwc_ue; - bearer->sess = sess; + bearer->sgwc_ue_id = sgwc_ue->id; + bearer->sess_id = sess->id; /* Downlink */ tunnel = sgwc_tunnel_add(bearer, OGS_GTP2_F_TEID_S5_S8_SGW_GTP_U); @@ -565,14 +577,17 @@ sgwc_bearer_t *sgwc_bearer_add(sgwc_sess_t *sess) int sgwc_bearer_remove(sgwc_bearer_t *bearer) { + sgwc_sess_t *sess = NULL; + ogs_assert(bearer); - ogs_assert(bearer->sess); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); sgwc_tunnel_remove_all(bearer); - ogs_pool_free(&sgwc_bearer_pool, bearer); + ogs_pool_id_free(&sgwc_bearer_pool, bearer); return OGS_OK; } @@ -618,9 +633,9 @@ sgwc_bearer_t *sgwc_default_bearer_in_sess(sgwc_sess_t *sess) return ogs_list_first(&sess->bearer_list); } -sgwc_bearer_t *sgwc_bearer_cycle(sgwc_bearer_t *bearer) +sgwc_bearer_t *sgwc_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&sgwc_bearer_pool, bearer); + return ogs_pool_find_by_id(&sgwc_bearer_pool, id); } sgwc_tunnel_t *sgwc_tunnel_add( @@ -636,7 +651,7 @@ sgwc_tunnel_t *sgwc_tunnel_add( uint8_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); switch (interface_type) { @@ -663,9 +678,8 @@ sgwc_tunnel_t *sgwc_tunnel_add( ogs_assert_if_reached(); } - ogs_pool_alloc(&sgwc_tunnel_pool, &tunnel); + ogs_pool_id_calloc(&sgwc_tunnel_pool, &tunnel); ogs_assert(tunnel); - memset(tunnel, 0, sizeof *tunnel); tunnel->interface_type = interface_type; @@ -751,7 +765,7 @@ sgwc_tunnel_t *sgwc_tunnel_add( tunnel->pdr = pdr; tunnel->far = far; - tunnel->bearer = bearer; + tunnel->bearer_id = bearer->id; ogs_list_add(&bearer->tunnel_list, tunnel); @@ -760,10 +774,13 @@ sgwc_tunnel_t *sgwc_tunnel_add( int sgwc_tunnel_remove(sgwc_tunnel_t *tunnel) { + sgwc_bearer_t *bearer = NULL; + ogs_assert(tunnel); - ogs_assert(tunnel->bearer); + bearer = sgwc_bearer_find_by_id(tunnel->bearer_id); + ogs_assert(bearer); - ogs_list_remove(&tunnel->bearer->tunnel_list, tunnel); + ogs_list_remove(&bearer->tunnel_list, tunnel); ogs_pfcp_pdr_remove(tunnel->pdr); ogs_pfcp_far_remove(tunnel->far); @@ -773,7 +790,7 @@ int sgwc_tunnel_remove(sgwc_tunnel_t *tunnel) if (tunnel->local_addr6) ogs_freeaddrinfo(tunnel->local_addr6); - ogs_pool_free(&sgwc_tunnel_pool, tunnel); + ogs_pool_id_free(&sgwc_tunnel_pool, tunnel); return OGS_OK; } @@ -863,6 +880,11 @@ sgwc_tunnel_t *sgwc_tunnel_find_by_far_id( return NULL; } +sgwc_tunnel_t *sgwc_tunnel_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwc_tunnel_pool, id); +} + sgwc_tunnel_t *sgwc_dl_tunnel_in_bearer(sgwc_bearer_t *bearer) { ogs_assert(bearer); diff --git a/src/sgwc/context.h b/src/sgwc/context.h index eca5e72d88..0831159d5e 100644 --- a/src/sgwc/context.h +++ b/src/sgwc/context.h @@ -51,6 +51,7 @@ typedef struct sgwc_context_s { typedef struct sgwc_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *sgw_s11_teid_node; /* A node of SGW-S11-TEID */ uint32_t sgw_s11_teid; /* SGW-S11-TEID is derived from NODE */ @@ -74,6 +75,7 @@ typedef struct sgwc_ue_s { #define SGWC_SESS(pfcp_sess) ogs_container_of(pfcp_sess, sgwc_sess_t, pfcp) typedef struct sgwc_sess_s { ogs_lnode_t lnode; /* A node of list_t */ + ogs_pool_id_t id; ogs_pool_id_t *sgwc_sxa_seid_node; /* A node of SGWC-SXA-SEID */ ogs_pfcp_sess_t pfcp; /* PFCP session context */ @@ -93,22 +95,24 @@ typedef struct sgwc_sess_s { ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - sgwc_ue_t *sgwc_ue; + ogs_pool_id_t sgwc_ue_id; } sgwc_sess_t; typedef struct sgwc_bearer_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_lnode_t to_modify_node; uint8_t ebi; ogs_list_t tunnel_list; - sgwc_sess_t *sess; - sgwc_ue_t *sgwc_ue; + ogs_pool_id_t sess_id; + ogs_pool_id_t sgwc_ue_id; } sgwc_bearer_t; typedef struct sgwc_tunnel_s { ogs_lnode_t lnode; + ogs_pool_id_t id; uint8_t interface_type; @@ -123,7 +127,7 @@ typedef struct sgwc_tunnel_s { ogs_ip_t remote_ip; /* Related Context */ - sgwc_bearer_t *bearer; + ogs_pool_id_t bearer_id; ogs_gtp_node_t *gnode; } sgwc_tunnel_t; @@ -141,6 +145,7 @@ sgwc_ue_t *sgwc_ue_find_by_teid(uint32_t teid); sgwc_ue_t *sgwc_ue_add(uint8_t *imsi, int imsi_len); int sgwc_ue_remove(sgwc_ue_t *sgwc_ue); void sgwc_ue_remove_all(void); +sgwc_ue_t *sgwc_ue_find_by_id(ogs_pool_id_t id); sgwc_sess_t *sgwc_sess_add(sgwc_ue_t *sgwc_ue, char *apn); @@ -154,7 +159,7 @@ sgwc_sess_t *sgwc_sess_find_by_seid(uint64_t seid); sgwc_sess_t *sgwc_sess_find_by_apn(sgwc_ue_t *sgwc_ue, char *apn); sgwc_sess_t *sgwc_sess_find_by_ebi(sgwc_ue_t *sgwc_ue, uint8_t ebi); -sgwc_sess_t *sgwc_sess_cycle(sgwc_sess_t *sess); +sgwc_sess_t *sgwc_sess_find_by_id(ogs_pool_id_t id); #define SGWC_SESSION_SYNC_DONE(__sGWC, __tYPE, __fLAGS) \ (sgwc_sess_pfcp_xact_count(__sGWC, __tYPE, __fLAGS) == 0) @@ -169,7 +174,7 @@ sgwc_bearer_t *sgwc_bearer_find_by_sess_ebi( sgwc_bearer_t *sgwc_bearer_find_by_ue_ebi( sgwc_ue_t *sgwc_ue, uint8_t ebi); sgwc_bearer_t *sgwc_default_bearer_in_sess(sgwc_sess_t *sess); -sgwc_bearer_t *sgwc_bearer_cycle(sgwc_bearer_t *bearer); +sgwc_bearer_t *sgwc_bearer_find_by_id(ogs_pool_id_t id); sgwc_tunnel_t *sgwc_tunnel_add( sgwc_bearer_t *bearer, uint8_t interface_type); @@ -184,6 +189,7 @@ sgwc_tunnel_t *sgwc_tunnel_find_by_far_id( sgwc_sess_t *sess, ogs_pfcp_far_id_t far_id); sgwc_tunnel_t *sgwc_dl_tunnel_in_bearer(sgwc_bearer_t *bearer); sgwc_tunnel_t *sgwc_ul_tunnel_in_bearer(sgwc_bearer_t *bearer); +sgwc_tunnel_t *sgwc_tunnel_find_by_id(ogs_pool_id_t id); #ifdef __cplusplus } diff --git a/src/sgwc/event.h b/src/sgwc/event.h index f146f66e7f..dc2d7504d3 100644 --- a/src/sgwc/event.h +++ b/src/sgwc/event.h @@ -57,10 +57,8 @@ typedef struct sgwc_event_s { ogs_gtp2_message_t *gtp_message; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; - - sgwc_bearer_t *bearer; } sgwc_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(sgwc_event_t)); diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index 8e850e7c93..eeddadf1a7 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -144,19 +144,29 @@ void sgwc_gtp_close(void) static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { sgwc_bearer_t *bearer = data; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq[0].type; - switch (type) { case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE: ogs_warn("[%s] No Downlink Data Notification ACK", sgwc_ue->imsi_bcd); @@ -178,7 +188,7 @@ int sgwc_gtp_send_create_session_response( ogs_pkbuf_t *pkbuf = NULL; ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(xact); @@ -219,9 +229,9 @@ int sgwc_gtp_send_downlink_data_notification( ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = bearer->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_assert(sgwc_ue->gnode); @@ -240,7 +250,8 @@ int sgwc_gtp_send_downlink_data_notification( } gtp_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!gtp_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index fa5c9f5057..0c7a8caba5 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -170,11 +170,23 @@ void sgwc_pfcp_close(void) static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -193,11 +205,23 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) static void bearer_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: ogs_error("No PFCP session modification response"); @@ -243,7 +267,7 @@ int sgwc_pfcp_send_bearer_to_modify_list( } int sgwc_pfcp_send_session_establishment_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { int rv; @@ -253,13 +277,14 @@ int sgwc_pfcp_send_session_establishment_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); if (!xact->gtpbuf) { @@ -323,7 +348,7 @@ int sgwc_pfcp_send_session_establishment_request( } int sgwc_pfcp_send_session_modification_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { ogs_pfcp_xact_t *xact = NULL; @@ -331,13 +356,14 @@ int sgwc_pfcp_send_session_modification_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); @@ -355,7 +381,7 @@ int sgwc_pfcp_send_session_modification_request( } int sgwc_pfcp_send_bearer_modification_request( - sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact, + sgwc_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags) { int rv; @@ -365,16 +391,17 @@ int sgwc_pfcp_send_bearer_modification_request( sgwc_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, bearer_timeout, bearer); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, bearer_timeout, OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->modify_flags = flags; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); @@ -410,7 +437,7 @@ int sgwc_pfcp_send_bearer_modification_request( } int sgwc_pfcp_send_session_deletion_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf) + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf) { int rv; ogs_pkbuf_t *sxabuf = NULL; @@ -419,13 +446,14 @@ int sgwc_pfcp_send_session_deletion_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; if (gtpbuf) { xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); if (!xact->gtpbuf) { diff --git a/src/sgwc/pfcp-path.h b/src/sgwc/pfcp-path.h index ae3314da2e..cac462153c 100644 --- a/src/sgwc/pfcp-path.h +++ b/src/sgwc/pfcp-path.h @@ -33,18 +33,18 @@ int sgwc_pfcp_send_bearer_to_modify_list( sgwc_sess_t *sess, ogs_pfcp_xact_t *xact); int sgwc_pfcp_send_session_establishment_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_session_modification_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_bearer_modification_request( - sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact, + sgwc_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags); int sgwc_pfcp_send_session_deletion_request( - sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf); + sgwc_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf); int sgwc_pfcp_send_session_report_response( ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause); diff --git a/src/sgwc/pfcp-sm.c b/src/sgwc/pfcp-sm.c index 946d1f9a79..c23f77cd66 100644 --- a/src/sgwc/pfcp-sm.c +++ b/src/sgwc/pfcp-sm.c @@ -121,7 +121,7 @@ void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) case SGWC_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -203,7 +203,7 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) case SGWC_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) { @@ -400,7 +400,7 @@ static void pfcp_restoration(ogs_pfcp_node_t *node) sgwc_ue->imsi_bcd, sess->session.name); ogs_assert(OGS_OK == sgwc_pfcp_send_session_establishment_request( - sess, NULL, NULL, + sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_CREATE_RESTORATION_INDICATION)); } } diff --git a/src/sgwc/s11-build.c b/src/sgwc/s11-build.c index f16a79b3d2..e4624a116d 100644 --- a/src/sgwc/s11-build.c +++ b/src/sgwc/s11-build.c @@ -44,7 +44,7 @@ ogs_pkbuf_t *sgwc_s11_build_create_session_response( ogs_debug("[SGWC] Create Session Response"); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]", @@ -141,7 +141,7 @@ ogs_pkbuf_t *sgwc_s11_build_downlink_data_notification( sgwc_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); /* Build downlink notification message */ diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index acea0083ea..21ff7dbdfa 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -24,27 +24,33 @@ static void gtp_sess_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_sess_t *sess = data; + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; - ogs_assert(sgwc_ue); - type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); + ogs_assert(sgwc_ue); + switch (type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: ogs_error("[%s] No Delete Session Response", sgwc_ue->imsi_bcd); - if (!sgwc_sess_cycle(sess)) { - ogs_error("[%s] Session has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL)); + sgwc_pfcp_send_session_deletion_request( + sess, OGS_INVALID_POOL_ID, NULL)); break; default: ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", @@ -54,31 +60,53 @@ static void gtp_sess_timeout(ogs_gtp_xact_t *xact, void *data) static void gtp_bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq[0].type; - ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", sgwc_ue->imsi_bcd, type); } static void pfcp_sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -383,7 +411,7 @@ void sgwc_s11_handle_create_session_request( ogs_assert(OGS_OK == sgwc_pfcp_send_session_establishment_request( - sess, s11_xact, gtpbuf, 0)); + sess, s11_xact->id, gtpbuf, 0)); } void sgwc_s11_handle_modify_bearer_request( @@ -465,22 +493,28 @@ void sgwc_s11_handle_modify_bearer_request( break; } - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) { - if (sess == pfcp_xact->data) { - current_xact = pfcp_xact; - break; + if (pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION) { + ogs_pool_id_t sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + if (sess->id == sess_id) { + current_xact = pfcp_xact; + break; + } } } if (!current_xact) { current_xact = ogs_pfcp_xact_local_create( - sess->pfcp_node, pfcp_sess_timeout, sess); + sess->pfcp_node, pfcp_sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); ogs_assert(current_xact); - current_xact->assoc_xact = s11_xact; + current_xact->assoc_xact_id = s11_xact->id; current_xact->modify_flags = OGS_PFCP_MODIFY_SESSION| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE; if (gtpbuf) { @@ -566,8 +600,20 @@ void sgwc_s11_handle_modify_bearer_request( ogs_debug(" ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]", dl_tunnel->remote_teid, dl_tunnel->local_teid); - ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) - sgwc_pfcp_send_bearer_to_modify_list(pfcp_xact->data, pfcp_xact); + ogs_list_for_each_entry(&pfcp_xact_list, pfcp_xact, tmpnode) { + if (pfcp_xact->modify_flags & OGS_PFCP_MODIFY_SESSION) { + sgwc_sess_t *sess = NULL; + + ogs_pool_id_t sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + ogs_assert(sess); + + sgwc_pfcp_send_bearer_to_modify_list(sess, pfcp_xact); + } + } } void sgwc_s11_handle_delete_session_request( @@ -657,7 +703,8 @@ void sgwc_s11_handle_delete_session_request( indication->scope_indication == 1) { ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request( + sess, s11_xact->id, gtpbuf)); } else { message->h.type = OGS_GTP2_DELETE_SESSION_REQUEST_TYPE; @@ -670,7 +717,8 @@ void sgwc_s11_handle_delete_session_request( } s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &message->h, gtpbuf, gtp_sess_timeout, sess); + sess->gnode, &message->h, gtpbuf, gtp_sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -695,6 +743,7 @@ void sgwc_s11_handle_create_bearer_response( sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_tunnel_t *dl_tunnel = NULL, *ul_tunnel = NULL; ogs_pfcp_far_t *far = NULL; @@ -715,17 +764,29 @@ void sgwc_s11_handle_create_bearer_response( * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); - ogs_assert(bearer); - sess = bearer->sess; + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -765,7 +826,7 @@ void sgwc_s11_handle_create_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); @@ -784,7 +845,7 @@ void sgwc_s11_handle_create_bearer_response( ogs_error("GTP Cause [Value:%d]", cause_value); ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); @@ -867,7 +928,7 @@ void sgwc_s11_handle_create_bearer_response( ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_CREATE)); } @@ -882,6 +943,7 @@ void sgwc_s11_handle_update_bearer_response( ogs_gtp_xact_t *s5c_xact = NULL; sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_gtp2_update_bearer_response_t *rsp = NULL; ogs_assert(sgwc_ue); @@ -895,17 +957,29 @@ void sgwc_s11_handle_update_bearer_response( * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); - ogs_assert(bearer); - sess = bearer->sess; + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -1005,6 +1079,7 @@ void sgwc_s11_handle_delete_bearer_response( sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_gtp2_delete_bearer_response_t *rsp = NULL; ogs_assert(sgwc_ue); @@ -1018,17 +1093,29 @@ void sgwc_s11_handle_delete_bearer_response( * Check Transaction ********************/ ogs_assert(s11_xact); - s5c_xact = s11_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(s11_xact->assoc_xact_id); ogs_assert(s5c_xact); - if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) + if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) { /* MME received Bearer Resource Modification Request */ - bearer = s5c_xact->data; - else - bearer = s11_xact->data; + ogs_assert(s5c_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s5c_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); - ogs_assert(bearer); - sess = bearer->sess; + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } else { + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + ogs_assert(bearer); + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -1065,7 +1152,8 @@ void sgwc_s11_handle_delete_bearer_response( } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s5c_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request( + sess, s5c_xact->id, gtpbuf)); } else { /* * << EPS Bearer IDs >> @@ -1117,7 +1205,7 @@ void sgwc_s11_handle_delete_bearer_response( ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE)); + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_REMOVE)); } } @@ -1166,7 +1254,7 @@ void sgwc_s11_handle_release_access_bearers_request( ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE)); } } @@ -1179,6 +1267,7 @@ void sgwc_s11_handle_downlink_data_notification_ack( uint8_t cause_value; sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; ogs_gtp2_downlink_data_notification_acknowledge_t *ack = NULL; @@ -1191,9 +1280,14 @@ void sgwc_s11_handle_downlink_data_notification_ack( * Check Transaction ********************/ ogs_assert(s11_xact); - bearer = s11_xact->data; + ogs_assert(s11_xact->data); + bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); rv = ogs_gtp_xact_commit(s11_xact); @@ -1359,7 +1453,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE)); } } @@ -1405,7 +1499,7 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request( ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE)); } } @@ -1492,7 +1586,7 @@ void sgwc_s11_handle_bearer_resource_command( * Check ALL Context ********************/ ogs_assert(bearer); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_assert(sess->gnode); ogs_assert(sgwc_ue); @@ -1512,7 +1606,8 @@ void sgwc_s11_handle_bearer_resource_command( } s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &message->h, pkbuf, gtp_bearer_timeout, bearer); + sess->gnode, &message->h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index 23f77d9851..92cf4ac5e5 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -24,34 +24,39 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq[0].type; - switch (type) { case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE: ogs_error("[%s] No Update Bearer Response", sgwc_ue->imsi_bcd); break; case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE: ogs_error("[%s] No Delete Bearer Response", sgwc_ue->imsi_bcd); - if (!sgwc_bearer_cycle(bearer)) { - ogs_error("[%s] Bearer has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE)); + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_REMOVE)); break; default: ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", @@ -91,7 +96,7 @@ void sgwc_s5c_handle_create_session_response( * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); rv = ogs_gtp_xact_commit(s5c_xact); @@ -117,7 +122,7 @@ void sgwc_s5c_handle_create_session_response( ogs_error("No Context in TEID [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -280,7 +285,7 @@ void sgwc_s5c_handle_create_session_response( ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( - sess, s11_xact, gtpbuf, + sess, s11_xact->id, gtpbuf, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE)); } @@ -309,7 +314,7 @@ void sgwc_s5c_handle_modify_bearer_response( * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); modify_action = s5c_xact->modify_action; @@ -336,7 +341,7 @@ void sgwc_s5c_handle_modify_bearer_response( ogs_error("No Context in TEID [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -450,7 +455,7 @@ void sgwc_s5c_handle_delete_session_response( * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); rv = ogs_gtp_xact_commit(s5c_xact); @@ -476,7 +481,7 @@ void sgwc_s5c_handle_delete_session_response( ogs_error("No Context in TEID [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -518,7 +523,7 @@ void sgwc_s5c_handle_delete_session_response( * 2. SMF sends Delete Session Response to SGW/MME. */ ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf)); + sgwc_pfcp_send_session_deletion_request(sess, s11_xact->id, gtpbuf)); } void sgwc_s5c_handle_create_bearer_request( @@ -556,7 +561,7 @@ void sgwc_s5c_handle_create_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -637,7 +642,7 @@ void sgwc_s5c_handle_create_bearer_request( ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, s5c_xact, gtpbuf, + bearer, s5c_xact->id, gtpbuf, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_CREATE)); } @@ -673,7 +678,7 @@ void sgwc_s5c_handle_update_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (req->bearer_contexts.presence == 0) { @@ -725,10 +730,11 @@ void sgwc_s5c_handle_update_bearer_request( return; } - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); if (!s11_xact) { s11_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -783,7 +789,7 @@ void sgwc_s5c_handle_delete_bearer_request( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (req->linked_eps_bearer_id.presence == 0 && @@ -866,7 +872,7 @@ void sgwc_s5c_handle_delete_bearer_request( return; } - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); if (!s11_xact) { /* * 1. SMF sends Delete Bearer Request(DEFAULT BEARER) to SGW/MME. @@ -883,7 +889,8 @@ void sgwc_s5c_handle_delete_bearer_request( * 2. MME sends Delete Bearer Response(DEDICATED BEARER) to SGW/SMF. */ s11_xact = ogs_gtp_xact_local_create( - sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, bearer); + sgwc_ue->gnode, &message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -929,7 +936,7 @@ void sgwc_s5c_handle_bearer_resource_failure_indication( * Check Transaction ********************/ ogs_assert(s5c_xact); - s11_xact = s5c_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(s5c_xact->assoc_xact_id); ogs_assert(s11_xact); /************************ @@ -941,7 +948,7 @@ void sgwc_s5c_handle_bearer_resource_failure_indication( ogs_error("No Context in TEID"); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } else { - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } diff --git a/src/sgwc/sgwc-sm.c b/src/sgwc/sgwc-sm.c index e174ccdc8c..1d24945eb4 100644 --- a/src/sgwc/sgwc-sm.c +++ b/src/sgwc/sgwc-sm.c @@ -114,7 +114,7 @@ void sgwc_state_operational(ogs_fsm_t *s, sgwc_event_t *e) } e->pfcp_message = pfcp_message; - e->pfcp_xact = pfcp_xact; + e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp_message = NULL; if (pfcp_xact->gtpbuf) { diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index 14fb667cbc..202dd3458d 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -62,13 +62,25 @@ static uint8_t gtp_cause_from_pfcp(uint8_t pfcp_cause) static void sess_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_sess_t *sess = data; + sgwc_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + type = xact->seq[0].type; + + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); type = xact->seq[0].type; @@ -76,13 +88,9 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data) switch (type) { case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: ogs_error("[%s] No Create Session Response", sgwc_ue->imsi_bcd); - if (!sgwc_sess_cycle(sess)) { - ogs_warn("[%s] Session has already been removed", - sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == - sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL)); + sgwc_pfcp_send_session_deletion_request( + sess, OGS_INVALID_POOL_ID, NULL)); break; default: ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", @@ -92,30 +100,36 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data) static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - sgwc_bearer_t *bearer = data; + sgwc_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_sess_t *sess = NULL; sgwc_ue_t *sgwc_ue = NULL; uint8_t type = 0; ogs_assert(xact); - ogs_assert(bearer); - sess = bearer->sess; + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); - type = xact->seq[0].type; - switch (type) { case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE: ogs_error("[%s] No Create Bearer Response", sgwc_ue->imsi_bcd); - if (!sgwc_bearer_cycle(bearer)) { - ogs_warn("[%s] Bearer has already been removed", sgwc_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, + bearer, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); break; default: @@ -164,7 +178,7 @@ void sgwc_sxa_handle_session_establishment_response( create_session_request = &recv_message->create_session_request; ogs_assert(create_session_request); - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -244,7 +258,7 @@ void sgwc_sxa_handle_session_establishment_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - if (sess) sgwc_ue = sess->sgwc_ue; + if (sess) sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_gtp_send_error_message( s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); @@ -383,7 +397,8 @@ void sgwc_sxa_handle_session_establishment_response( ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &send_message.h, pkbuf, sess_timeout, sess); + sess->gnode, &send_message.h, pkbuf, sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -427,7 +442,8 @@ void sgwc_sxa_handle_session_establishment_response( ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( - sess->gnode, &recv_message->h, pkbuf, sess_timeout, sess); + sess->gnode, &recv_message->h, pkbuf, sess_timeout, + OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -475,31 +491,41 @@ void sgwc_sxa_handle_session_modification_response( if (flags & OGS_PFCP_MODIFY_SESSION) { if (!sess) { + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; + ogs_error("No Context"); - sess = pfcp_xact->data; + sess_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = sgwc_sess_find_by_id(sess_id); ogs_assert(sess); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); } else { - bearer = pfcp_xact->data; + ogs_pool_id_t bearer_id = OGS_POINTER_TO_UINT(pfcp_xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + + bearer = sgwc_bearer_find_by_id(bearer_id); ogs_assert(bearer); if (!sess) { ogs_error("No Context"); - sess = bearer->sess; + sess = sgwc_sess_find_by_id(bearer->sess_id); ogs_assert(sess); cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; } - sgwc_ue = bearer->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); ogs_assert(sgwc_ue); } @@ -578,7 +604,7 @@ void sgwc_sxa_handle_session_modification_response( * } */ if (flags & OGS_PFCP_MODIFY_REMOVE) { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); if (s5c_xact) { ogs_gtp_send_error_message( @@ -588,7 +614,7 @@ void sgwc_sxa_handle_session_modification_response( sgwc_bearer_remove(bearer); } else if (flags & OGS_PFCP_MODIFY_CREATE) { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_gtp_send_error_message( @@ -598,7 +624,7 @@ void sgwc_sxa_handle_session_modification_response( } else if (flags & OGS_PFCP_MODIFY_ACTIVATE) { if (flags & OGS_PFCP_MODIFY_UL_ONLY) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -606,7 +632,7 @@ void sgwc_sxa_handle_session_modification_response( OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value); } else if (flags & OGS_PFCP_MODIFY_DL_ONLY) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -617,7 +643,7 @@ void sgwc_sxa_handle_session_modification_response( ogs_assert_if_reached(); } } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_gtp_send_error_message( @@ -652,7 +678,7 @@ void sgwc_sxa_handle_session_modification_response( */ if (flags & OGS_PFCP_MODIFY_REMOVE) { if (flags & OGS_PFCP_MODIFY_INDIRECT) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -713,7 +739,7 @@ void sgwc_sxa_handle_session_modification_response( } } else { - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_pfcp_xact_commit(pfcp_xact); @@ -746,7 +772,7 @@ void sgwc_sxa_handle_session_modification_response( ogs_gtp2_create_bearer_request_t *gtp_req = NULL; ogs_gtp2_f_teid_t sgw_s1u_teid; - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -780,7 +806,8 @@ void sgwc_sxa_handle_session_modification_response( ogs_assert(sgwc_ue->gnode); ogs_assert(bearer); s11_xact = ogs_gtp_xact_local_create(sgwc_ue->gnode, - &recv_message->h, pkbuf, bearer_timeout, bearer); + &recv_message->h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!s11_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -796,7 +823,7 @@ void sgwc_sxa_handle_session_modification_response( ogs_gtp2_create_bearer_response_t *gtp_rsp = NULL; ogs_gtp2_f_teid_t sgw_s5u_teid, pgw_s5u_teid; - s5c_xact = pfcp_xact->assoc_xact; + s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -854,7 +881,7 @@ void sgwc_sxa_handle_session_modification_response( ogs_expect(rv == OGS_OK); } else if (flags & OGS_PFCP_MODIFY_INDIRECT) { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -987,7 +1014,7 @@ void sgwc_sxa_handle_session_modification_response( } else if (flags & OGS_PFCP_MODIFY_ACTIVATE) { OGS_LIST(bearer_to_modify_list); - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_list_copy(&bearer_to_modify_list, @@ -1094,7 +1121,7 @@ void sgwc_sxa_handle_session_modification_response( ogs_assert(sess->gnode); s5c_xact = ogs_gtp_xact_local_create( sess->gnode, &recv_message->h, pkbuf, - sess_timeout, sess); + sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!s5c_xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -1194,7 +1221,7 @@ void sgwc_sxa_handle_session_modification_response( } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { if (flags & OGS_PFCP_MODIFY_ERROR_INDICATION) { /* It's faked method for receiving `bearer` context */ - bearer = pfcp_xact->assoc_xact; + bearer = sgwc_bearer_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(bearer); ogs_pfcp_xact_commit(pfcp_xact); @@ -1208,7 +1235,7 @@ void sgwc_sxa_handle_session_modification_response( } } else { - s11_xact = pfcp_xact->assoc_xact; + s11_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s11_xact); ogs_pfcp_xact_commit(pfcp_xact); @@ -1293,7 +1320,7 @@ void sgwc_sxa_handle_session_deletion_response( cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } - gtp_xact = pfcp_xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_pfcp_xact_commit(pfcp_xact); @@ -1314,7 +1341,7 @@ void sgwc_sxa_handle_session_deletion_response( * 1. MME sends Delete Session Request to SGW/SMF. * 2. SMF sends Delete Session Response to SGW/MME. */ - if (sess) sgwc_ue = sess->sgwc_ue; + if (sess) sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0; break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: @@ -1347,7 +1374,7 @@ void sgwc_sxa_handle_session_deletion_response( } ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (gtp_xact) { @@ -1377,10 +1404,7 @@ void sgwc_sxa_handle_session_deletion_response( } cleanup: - if (sgwc_sess_cycle(sess)) - sgwc_sess_remove(sess); - else - ogs_error("Session has already been removed"); + sgwc_sess_remove(sess); } void sgwc_sxa_handle_session_report_request( @@ -1426,7 +1450,7 @@ void sgwc_sxa_handle_session_report_request( } ogs_assert(sess); - sgwc_ue = sess->sgwc_ue; + sgwc_ue = sgwc_ue_find_by_id(sess->sgwc_ue_id); ogs_assert(sgwc_ue); if (!sgwc_ue->gnode) { @@ -1476,7 +1500,7 @@ void sgwc_sxa_handle_session_report_request( if (far) { tunnel = sgwc_tunnel_find_by_far_id(sess, far->id); ogs_assert(tunnel); - bearer = tunnel->bearer; + bearer = sgwc_bearer_find_by_id(tunnel->bearer_id); ogs_assert(bearer); if (far->dst_if == OGS_PFCP_INTERFACE_ACCESS) { ogs_warn("[%s] Error Indication from eNB", sgwc_ue->imsi_bcd); @@ -1485,7 +1509,7 @@ void sgwc_sxa_handle_session_report_request( sgwc_pfcp_send_session_modification_request(sess, /* We only use the `assoc_xact` parameter temporarily here * to pass the `bearer` context. */ - (ogs_gtp_xact_t *)bearer, + bearer->id, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE| OGS_PFCP_MODIFY_ERROR_INDICATION)); @@ -1496,13 +1520,14 @@ void sgwc_sxa_handle_session_report_request( sgwc_ue->imsi_bcd); ogs_assert(OGS_OK == sgwc_pfcp_send_session_deletion_request( - sess, NULL, NULL)); + sess, OGS_INVALID_POOL_ID, NULL)); } else { ogs_error("[%s] Error Indication(Dedicated Bearer) " "from SMF", sgwc_ue->imsi_bcd); ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( - bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE)); + bearer, OGS_INVALID_POOL_ID, NULL, + OGS_PFCP_MODIFY_REMOVE)); } } else { ogs_error("Error Indication Ignored for Indirect Tunnel"); diff --git a/src/sgwu/context.c b/src/sgwu/context.c index 43da6a591e..de5f461d0f 100644 --- a/src/sgwu/context.c +++ b/src/sgwu/context.c @@ -141,9 +141,8 @@ sgwu_sess_t *sgwu_sess_add(ogs_pfcp_f_seid_t *cp_f_seid) ogs_assert(cp_f_seid); - ogs_pool_alloc(&sgwu_sess_pool, &sess); + ogs_pool_id_calloc(&sgwu_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -197,7 +196,7 @@ int sgwu_sess_remove(sgwu_sess_t *sess) ogs_pfcp_pool_final(&sess->pfcp); ogs_pool_free(&sgwu_sxa_seid_pool, sess->sgwu_sxa_seid_node); - ogs_pool_free(&sgwu_sess_pool, sess); + ogs_pool_id_free(&sgwu_sess_pool, sess); ogs_info("[Removed] Number of SGWU-sessions is now %d", ogs_list_count(&self.sess_list)); @@ -238,6 +237,11 @@ sgwu_sess_t *sgwu_sess_find_by_sgwu_sxa_seid(uint64_t seid) return ogs_hash_get(self.sgwu_sxa_seid_hash, &seid, sizeof(seid)); } +sgwu_sess_t *sgwu_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&sgwu_sess_pool, id); +} + sgwu_sess_t *sgwu_sess_add_by_message(ogs_pfcp_message_t *message) { sgwu_sess_t *sess = NULL; diff --git a/src/sgwu/context.h b/src/sgwu/context.h index 81928498b0..dc322eb519 100644 --- a/src/sgwu/context.h +++ b/src/sgwu/context.h @@ -47,6 +47,7 @@ typedef struct sgwu_context_s { #define SGWU_SESS(pfcp_sess) ogs_container_of(pfcp_sess, sgwu_sess_t, pfcp) typedef struct sgwu_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *sgwu_sxa_seid_node; /* A node of SGWU-SXA-SEID */ ogs_pfcp_sess_t pfcp; @@ -74,6 +75,7 @@ void sgwu_sess_remove_all(void); sgwu_sess_t *sgwu_sess_find_by_sgwc_sxa_seid(uint64_t seid); sgwu_sess_t *sgwu_sess_find_by_sgwc_sxa_f_seid(ogs_pfcp_f_seid_t *f_seid); sgwu_sess_t *sgwu_sess_find_by_sgwu_sxa_seid(uint64_t seid); +sgwu_sess_t *sgwu_sess_find_by_id(ogs_pool_id_t id); #ifdef __cplusplus } diff --git a/src/sgwu/event.h b/src/sgwu/event.h index c37ccbdad7..12f1d4b29c 100644 --- a/src/sgwu/event.h +++ b/src/sgwu/event.h @@ -52,7 +52,7 @@ typedef struct sgwu_event_s { ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; sgwu_bearer_t *bearer; diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index d9f423bbf7..c3827a6801 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -267,11 +267,23 @@ int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + sgwu_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = sgwu_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: ogs_error("No PFCP session report response"); @@ -297,7 +309,8 @@ int sgwu_pfcp_send_session_report_request( h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; h.seid = sess->sgwc_sxa_f_seid.seid; - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; diff --git a/src/sgwu/pfcp-sm.c b/src/sgwu/pfcp-sm.c index 2cf5512fe9..9696cf4a7b 100644 --- a/src/sgwu/pfcp-sm.c +++ b/src/sgwu/pfcp-sm.c @@ -117,7 +117,7 @@ void sgwu_pfcp_state_will_associate(ogs_fsm_t *s, sgwu_event_t *e) case SGWU_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -199,7 +199,7 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) case SGWU_EVT_SXA_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) diff --git a/src/sgwu/sgwu-sm.c b/src/sgwu/sgwu-sm.c index 695285d0ba..1490707719 100644 --- a/src/sgwu/sgwu-sm.c +++ b/src/sgwu/sgwu-sm.c @@ -82,7 +82,7 @@ void sgwu_state_operational(ogs_fsm_t *s, sgwu_event_t *e) } e->pfcp_message = pfcp_message; - e->pfcp_xact = xact; + e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, sgwu_pfcp_state_exception)) { ogs_error("PFCP state machine exception"); diff --git a/src/smf/binding.c b/src/smf/binding.c index 72ee3e5170..4024dc310e 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -26,29 +26,36 @@ static void gtp_bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - smf_bearer_t *bearer = data; + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; smf_sess_t *sess = NULL; smf_ue_t *smf_ue = NULL; uint8_t type = 0; - ogs_assert(bearer); - sess = bearer->sess; + ogs_assert(xact); + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - type = xact->seq[0].type; - switch (type) { case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE: ogs_error("[%s] No Create Bearer Response", smf_ue->imsi_bcd); - if (!smf_bearer_cycle(bearer)) { - ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd); - break; - } ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); break; @@ -348,7 +355,7 @@ void smf_bearer_binding(smf_sess_t *sess) ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_CREATE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_CREATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } else { @@ -376,7 +383,8 @@ void smf_bearer_binding(smf_sess_t *sess) } xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, gtp_bearer_timeout, bearer); + sess->gnode, &h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return; @@ -413,7 +421,7 @@ void smf_bearer_binding(smf_sess_t *sess) */ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); @@ -435,7 +443,7 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer) ogs_gtp2_tft_t tft; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); h.type = OGS_GTP2_CREATE_BEARER_REQUEST_TYPE; @@ -452,7 +460,8 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer) } xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, gtp_bearer_timeout, bearer); + sess->gnode, &h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; diff --git a/src/smf/context.c b/src/smf/context.c index c758f5fc4b..f255e17240 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1003,13 +1003,12 @@ static smf_ue_t *smf_ue_add(void) { smf_ue_t *smf_ue = NULL; - ogs_pool_alloc(&smf_ue_pool, &smf_ue); + ogs_pool_id_calloc(&smf_ue_pool, &smf_ue); if (!smf_ue) { ogs_error("Maximum number of smf_ue[%lld] reached", (long long)ogs_global_conf()->max.ue); return NULL; } - memset(smf_ue, 0, sizeof *smf_ue); ogs_list_init(&smf_ue->sess_list); @@ -1074,7 +1073,7 @@ void smf_ue_remove(smf_ue_t *smf_ue) ogs_hash_set(self.imsi_hash, smf_ue->imsi, smf_ue->imsi_len, NULL); } - ogs_pool_free(&smf_ue_pool, smf_ue); + ogs_pool_id_free(&smf_ue_pool, smf_ue); smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_UES_ACTIVE); ogs_info("[Removed] Number of SMF-UEs is now %d", @@ -1200,13 +1199,12 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type) ogs_assert(smf_ue); ogs_assert(apn); - ogs_pool_alloc(&smf_sess_pool, &sess); + ogs_pool_id_calloc(&smf_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session[%lld] reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); smf_qfi_pool_init(sess); @@ -1243,10 +1241,10 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type) sess->epc = true; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, smf_gsm_state_initial, smf_gsm_state_final, &e); - sess->smf_ue = smf_ue; + sess->smf_ue_id = smf_ue->id; ogs_list_add(&smf_ue->sess_list, sess); @@ -1412,13 +1410,12 @@ smf_sess_t *smf_sess_add_by_psi(smf_ue_t *smf_ue, uint8_t psi) ogs_assert(smf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&smf_sess_pool, &sess); + ogs_pool_id_calloc(&smf_sess_pool, &sess); if (!sess) { ogs_error("Maximum number of session[%lld] reached", (long long)ogs_app()->pool.sess); return NULL; } - memset(sess, 0, sizeof *sess); /* SBI Features */ OGS_SBI_FEATURES_SET(sess->smpolicycontrol_features, @@ -1461,10 +1458,10 @@ smf_sess_t *smf_sess_add_by_psi(smf_ue_t *smf_ue, uint8_t psi) sess->charging.id = sess->index; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, smf_gsm_state_initial, smf_gsm_state_final, &e); - sess->smf_ue = smf_ue; + sess->smf_ue_id = smf_ue->id; ogs_list_add(&smf_ue->sess_list, sess); @@ -1528,7 +1525,7 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) uint8_t cause_value = OGS_PFCP_CAUSE_REQUEST_ACCEPTED; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { @@ -1675,7 +1672,7 @@ void smf_sess_remove(smf_sess_t *sess) char buf2[OGS_ADDRSTRLEN]; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_info("Removed Session: UE IMSI:[%s] DNN:[%s:%d] IPv4:[%s] IPv6:[%s]", @@ -1687,7 +1684,7 @@ void smf_sess_remove(smf_sess_t *sess) ogs_list_remove(&smf_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); OGS_TLV_CLEAR_DATA(&sess->gtp.ue_pco); @@ -1799,7 +1796,7 @@ void smf_sess_remove(smf_sess_t *sess) stats_remove_smf_session(sess); ogs_pool_free(&smf_n4_seid_pool, sess->smf_n4_seid_node); - ogs_pool_free(&smf_sess_pool, sess); + ogs_pool_id_free(&smf_sess_pool, sess); } void smf_sess_remove_all(smf_ue_t *smf_ue) @@ -1923,9 +1920,8 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ogs_assert(sess); - ogs_pool_alloc(&smf_bearer_pool, &qos_flow); + ogs_pool_id_calloc(&smf_bearer_pool, &qos_flow); ogs_assert(qos_flow); - memset(qos_flow, 0, sizeof *qos_flow); smf_pf_identifier_pool_init(qos_flow); @@ -2022,7 +2018,7 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) qos_flow->qfi = ul_pdr->qfi = qer->qfi = *(qos_flow->qfi_node); - qos_flow->sess = sess; + qos_flow->sess_id = sess->id; ogs_list_add(&sess->bearer_list, qos_flow); smf_metrics_inst_by_5qi_add(&sess->serving_plmn_id, &sess->s_nssai, @@ -2364,9 +2360,8 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ogs_assert(sess); - ogs_pool_alloc(&smf_bearer_pool, &bearer); + ogs_pool_id_calloc(&smf_bearer_pool, &bearer); ogs_assert(bearer); - memset(bearer, 0, sizeof *bearer); smf_pf_identifier_pool_init(bearer); @@ -2435,7 +2430,7 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; - bearer->sess = sess; + bearer->sess_id = sess->id; ogs_list_add(&sess->bearer_list, bearer); @@ -2445,10 +2440,12 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) int smf_bearer_remove(smf_bearer_t *bearer) { + smf_sess_t *sess = NULL; ogs_assert(bearer); - ogs_assert(bearer->sess); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&bearer->sess->bearer_list, bearer); + ogs_list_remove(&sess->bearer_list, bearer); ogs_assert(bearer->dl_pdr); ogs_pfcp_pdr_remove(bearer->dl_pdr); @@ -2477,9 +2474,9 @@ int smf_bearer_remove(smf_bearer_t *bearer) smf_pf_identifier_pool_final(bearer); if (SMF_IS_QOF_FLOW(bearer)) - ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi_node); + ogs_pool_free(&sess->qfi_pool, bearer->qfi_node); - ogs_pool_free(&smf_bearer_pool, bearer); + ogs_pool_id_free(&smf_bearer_pool, bearer); smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_BEARERS_ACTIVE); return OGS_OK; @@ -2614,7 +2611,7 @@ void smf_bearer_qos_update(smf_bearer_t *bearer) ogs_pfcp_qer_t *qer = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); dl_pdr = bearer->dl_pdr; @@ -2644,24 +2641,29 @@ smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess) return ogs_list_first(&sess->bearer_list); } -smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue) +smf_ue_t *smf_ue_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&smf_ue_pool, id); +} + +smf_sess_t *smf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_ue_pool, smf_ue); + return ogs_pool_find_by_id(&smf_sess_pool, id); } -smf_sess_t *smf_sess_cycle(smf_sess_t *sess) +smf_bearer_t *smf_bearer_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_sess_pool, sess); + return ogs_pool_find_by_id(&smf_bearer_pool, id); } -smf_bearer_t *smf_bearer_cycle(smf_bearer_t *bearer) +smf_bearer_t *smf_qos_flow_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_bearer_pool, bearer); + return ogs_pool_find_by_id(&smf_bearer_pool, id); } -smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow) +smf_pf_t *smf_pf_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&smf_bearer_pool, qos_flow); + return ogs_pool_find_by_id(&smf_pf_pool, id); } smf_pf_t *smf_pf_add(smf_bearer_t *bearer) @@ -2670,17 +2672,16 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) smf_pf_t *pf = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - ogs_pool_alloc(&smf_pf_pool, &pf); + ogs_pool_id_calloc(&smf_pf_pool, &pf); ogs_assert(pf); - memset(pf, 0, sizeof *pf); ogs_pool_alloc(&bearer->pf_identifier_pool, &pf->identifier_node); if (!pf->identifier_node) { ogs_error("smf_pf_add: Expectation `pf->identifier_node' failed"); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return NULL; } @@ -2692,7 +2693,7 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) if (!pf->precedence_node) { ogs_error("smf_pf_add: Expectation `pf->precedence_node' failed"); ogs_pool_free(&bearer->pf_identifier_pool, pf->identifier_node); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return NULL; } @@ -2703,7 +2704,7 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) /* Re-use 'pf_precedence_pool' to generate SDF Filter ID */ pf->sdf_filter_id = *(pf->precedence_node); - pf->bearer = bearer; + pf->bearer_id = bearer->id; ogs_list_add(&bearer->pf_list, pf); @@ -2712,21 +2713,26 @@ smf_pf_t *smf_pf_add(smf_bearer_t *bearer) int smf_pf_remove(smf_pf_t *pf) { + smf_sess_t *sess = NULL; + smf_bearer_t *bearer = NULL; + ogs_assert(pf); - ogs_assert(pf->bearer); - ogs_assert(pf->bearer->sess); + bearer = smf_bearer_find_by_id(pf->bearer_id); + ogs_assert(bearer); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - ogs_list_remove(&pf->bearer->pf_list, pf); + ogs_list_remove(&bearer->pf_list, pf); if (pf->flow_description) ogs_free(pf->flow_description); if (pf->identifier_node) - ogs_pool_free(&pf->bearer->pf_identifier_pool, pf->identifier_node); + ogs_pool_free(&bearer->pf_identifier_pool, pf->identifier_node); if (pf->precedence_node) ogs_pool_free( - &pf->bearer->sess->pf_precedence_pool, pf->precedence_node); + &sess->pf_precedence_pool, pf->precedence_node); - ogs_pool_free(&smf_pf_pool, pf); + ogs_pool_id_free(&smf_pf_pool, pf); return OGS_OK; } @@ -2740,12 +2746,13 @@ void smf_pf_remove_all(smf_bearer_t *bearer) smf_pf_remove(pf); } -smf_pf_t *smf_pf_find_by_id(smf_bearer_t *bearer, uint8_t id) +smf_pf_t *smf_pf_find_by_identifier( + smf_bearer_t *bearer, uint8_t identifier) { smf_pf_t *pf = NULL; ogs_list_for_each(&bearer->pf_list, pf) { - if (pf->identifier == id) return pf; + if (pf->identifier == identifier) return pf; } return NULL; diff --git a/src/smf/context.h b/src/smf/context.h index 930e7d6327..81c42953ed 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -112,6 +112,7 @@ typedef struct smf_gtp_node_s { typedef struct smf_ue_s { ogs_lnode_t lnode; + ogs_pool_id_t id; /* SUPI */ char *supi; @@ -138,7 +139,7 @@ typedef struct smf_ue_s { do { \ smf_ue_t *smf_ue = NULL; \ ogs_assert(__sESS); \ - smf_ue = (__sESS)->smf_ue; \ + smf_ue = smf_ue_find_by_id((__sESS)->smf_ue_id); \ ogs_assert(smf_ue); \ smf_metrics_inst_by_slice_add(&(__sESS)->serving_plmn_id, \ &(__sESS)->s_nssai, SMF_METR_GAUGE_SM_SESSIONNBR, -1); \ @@ -155,6 +156,8 @@ typedef struct smf_pf_s { ogs_lnode_t lnode; ogs_lnode_t to_add_node; + ogs_pool_id_t id; + ED3(uint8_t spare:2;, uint8_t direction:2;, uint8_t identifier:4;) @@ -169,11 +172,12 @@ ED3(uint8_t spare:2;, ogs_ipfw_rule_t ipfw_rule; char *flow_description; - smf_bearer_t *bearer; + ogs_pool_id_t bearer_id; } smf_pf_t; typedef struct smf_bearer_s { ogs_lnode_t lnode; /**< A node of list_t */ + ogs_pool_id_t id; ogs_lnode_t to_modify_node; ogs_lnode_t to_delete_node; @@ -212,12 +216,13 @@ typedef struct smf_bearer_s { uint8_t num_of_pf_to_delete; uint8_t pf_to_delete[OGS_MAX_NUM_OF_FLOW_IN_NAS]; - smf_sess_t *sess; + ogs_pool_id_t sess_id; } smf_bearer_t; #define SMF_SESS(pfcp_sess) ogs_container_of(pfcp_sess, smf_sess_t, pfcp) typedef struct smf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; uint32_t index; /* An index of this node */ ogs_pool_id_t *smf_n4_seid_node; /* A node of SMF-N4-SEID */ @@ -464,7 +469,7 @@ typedef struct smf_sess_s { ogs_gtp_node_t *gnode; ogs_pfcp_node_t *pfcp_node; - smf_ue_t *smf_ue; + ogs_pool_id_t smf_ue_id; bool n1_released; bool n2_released; @@ -544,15 +549,17 @@ smf_bearer_t *smf_default_bearer_in_sess(smf_sess_t *sess); void smf_bearer_tft_update(smf_bearer_t *bearer); void smf_bearer_qos_update(smf_bearer_t *bearer); -smf_ue_t *smf_ue_cycle(smf_ue_t *smf_ue); -smf_sess_t *smf_sess_cycle(smf_sess_t *sess); -smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow); -smf_bearer_t *smf_bearer_cycle(smf_bearer_t *bearer); +smf_ue_t *smf_ue_find_by_id(ogs_pool_id_t id); +smf_sess_t *smf_sess_find_by_id(ogs_pool_id_t id); +smf_bearer_t *smf_bearer_find_by_id(ogs_pool_id_t id); +smf_bearer_t *smf_qos_flow_find_by_id(ogs_pool_id_t id); +smf_pf_t *smf_pf_find_by_id(ogs_pool_id_t id); smf_pf_t *smf_pf_add(smf_bearer_t *bearer); int smf_pf_remove(smf_pf_t *pf); void smf_pf_remove_all(smf_bearer_t *bearer); -smf_pf_t *smf_pf_find_by_id(smf_bearer_t *smf_bearer, uint8_t id); +smf_pf_t *smf_pf_find_by_identifier( + smf_bearer_t *bearer, uint8_t identifier); smf_pf_t *smf_pf_find_by_flow( smf_bearer_t *bearer, uint8_t direction, char *flow_description); smf_pf_t *smf_pf_first(smf_bearer_t *bearer); diff --git a/src/smf/event.h b/src/smf/event.h index 258681c6de..1bf1d5a6ed 100644 --- a/src/smf/event.h +++ b/src/smf/event.h @@ -72,10 +72,10 @@ typedef struct smf_event_s { ogs_pkbuf_t *pkbuf; smf_gtp_node_t *gnode; - ogs_gtp_xact_t *gtp_xact; + ogs_pool_id_t gtp_xact_id; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; union { @@ -99,7 +99,7 @@ typedef struct smf_event_s { ogs_nas_5gs_message_t *message; } nas; - smf_sess_t *sess; + ogs_pool_id_t sess_id; } smf_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(smf_event_t)); diff --git a/src/smf/fd-path.h b/src/smf/fd-path.h index 3867e4df4d..773225bf10 100644 --- a/src/smf/fd-path.h +++ b/src/smf/fd-path.h @@ -38,9 +38,9 @@ void smf_gy_final(void); int smf_s6b_init(void); void smf_s6b_final(void); -void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, +void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type); -void smf_gy_send_ccr(smf_sess_t *sess, void *xact, +void smf_gy_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type); void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact); diff --git a/src/smf/gn-handler.c b/src/smf/gn-handler.c index 47a7ca55c3..73001b3470 100644 --- a/src/smf/gn-handler.c +++ b/src/smf/gn-handler.c @@ -118,7 +118,7 @@ uint8_t smf_gn_handle_create_pdp_context_request( if (cause_value != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) return cause_value; - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Store NSAPI */ @@ -383,7 +383,7 @@ void smf_gn_handle_update_pdp_context_request( } ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]", @@ -485,7 +485,7 @@ void smf_gn_handle_update_pdp_context_request( h.teid = sess->sgw_s5c_teid; /* Set bearer so it's accessible later when handling PFCP Session Modification Response */ - xact->data = bearer; + xact->data = OGS_UINT_TO_POINTER(bearer->id); /* Update remote TEID and GTP-U IP address on the UPF. UpdatePDPContextResp * will be sent when UPF answers back this request @@ -509,7 +509,7 @@ void smf_gn_handle_update_pdp_context_request( } } - rv = smf_epc_pfcp_send_all_pdr_modification_request(sess, xact, NULL, + rv = smf_epc_pfcp_send_all_pdr_modification_request(sess, xact->id, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP1_CAUSE_REACTIACTION_REQUESTED); diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 48bd5ce834..621f3e2981 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -212,7 +212,7 @@ int gsm_handle_pdu_session_modification_request( ogs_pkbuf_t *n1smbuf = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(stream); ogs_assert(pdu_session_modification_request); @@ -256,7 +256,7 @@ int gsm_handle_pdu_session_modification_request( for (j = 0; j < qos_rule[i].num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rule[i].pf[j].identifier+1); if (pf) { ogs_assert( @@ -328,7 +328,7 @@ int gsm_handle_pdu_session_modification_request( for (j = 0; j < qos_rule[i].num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rule[i].pf[j].identifier+1); if (!pf) pf = smf_pf_add(qos_flow); @@ -405,7 +405,7 @@ int gsm_handle_pdu_session_modification_request( for (j = 0; j < qos_rule[i].num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_id( + pf = smf_pf_find_by_identifier( qos_flow, qos_rule[i].pf[j].identifier+1); if (pf) { qos_flow->pf_to_delete diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 40c2df11c5..951a5afdbc 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -88,7 +88,7 @@ static void send_gtp_delete_err_msg(const smf_sess_t *sess, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp_cause); } -static bool send_ccr_init_req_gx_gy(smf_sess_t *sess, smf_event_t *e) +static bool send_ccr_init_req_gx_gy(smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact) { int use_gy = smf_use_gy_iface(); @@ -96,28 +96,31 @@ static bool send_ccr_init_req_gx_gy(smf_sess_t *sess, smf_event_t *e) ogs_error("No Gy Diameter Peer"); /* TODO: drop Gx connection here, * possibly move to another "releasing" state! */ - uint8_t gtp_cause = (e->gtp_xact->gtp_version == 1) ? + uint8_t gtp_cause = (gtp_xact->gtp_version == 1) ? OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE : OGS_GTP2_CAUSE_UE_NOT_AUTHORISED_BY_OCS_OR_EXTERNAL_AAA_SERVER; - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); return false; } sess->sm_data.gx_ccr_init_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST); if (use_gy == 1) { /* Gy is available, * set up session for the bearer before accepting it towards the UE */ sess->sm_data.gy_ccr_init_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST); } return true; } -static bool send_ccr_termination_req_gx_gy_s6b(smf_sess_t *sess, smf_event_t *e) +static bool send_ccr_termination_req_gx_gy_s6b( + smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact) { /* TODO: we should take into account here whether "sess" has an active Gy session created, not whether one was supposedly created as per policy */ @@ -127,29 +130,31 @@ static bool send_ccr_termination_req_gx_gy_s6b(smf_sess_t *sess, smf_event_t *e) ogs_error("No Gy Diameter Peer"); /* TODO: drop Gx connection here, * possibly move to another "releasing" state! */ - uint8_t gtp_cause = (e->gtp_xact->gtp_version == 1) ? + uint8_t gtp_cause = (gtp_xact->gtp_version == 1) ? OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE : OGS_GTP2_CAUSE_UE_NOT_AUTHORISED_BY_OCS_OR_EXTERNAL_AAA_SERVER; - send_gtp_delete_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); return false; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { sess->sm_data.s6b_str_in_flight = true; - smf_s6b_send_str(sess, e->gtp_xact, + smf_s6b_send_str(sess, gtp_xact, OGS_DIAM_TERMINATION_CAUSE_DIAMETER_LOGOUT); } sess->sm_data.gx_ccr_term_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); if (use_gy == 1) { /* Gy is available, * set up session for the bearer before accepting it towards the UE */ sess->sm_data.gy_ccr_term_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, - OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); } return true; } @@ -164,6 +169,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_gtp1_message_t *gtp1_message = NULL; ogs_gtp2_message_t *gtp2_message = NULL; uint8_t gtp1_cause, gtp2_cause; + ogs_gtp_xact_t *gtp_xact = NULL; ogs_nas_5gs_message_t *nas_message = NULL; @@ -176,7 +182,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -196,17 +202,18 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GN_MESSAGE: gtp1_message = e->gtp1_message; ogs_assert(gtp1_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp1_message->h.type) { case OGS_GTP1_CREATE_PDP_CONTEXT_REQUEST_TYPE: gtp1_cause = smf_gn_handle_create_pdp_context_request(sess, - e->gtp_xact, + gtp_xact, &e->gtp1_message->create_pdp_context_request); if (gtp1_cause != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { - send_gtp_create_err_msg(sess, e->gtp_xact, gtp1_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp1_cause); return; } - if (send_ccr_init_req_gx_gy(sess, e) == true) + if (send_ccr_init_req_gx_gy(sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); } break; @@ -214,23 +221,24 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_S5C_MESSAGE: gtp2_message = e->gtp2_message; ogs_assert(gtp2_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp2_message->h.type) { case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: gtp2_cause = smf_s5c_handle_create_session_request(sess, - e->gtp_xact, + gtp_xact, &e->gtp2_message->create_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - send_gtp_create_err_msg(sess, e->gtp_xact, gtp2_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp2_cause); return; } switch (sess->gtp_rat_type) { case OGS_GTP2_RAT_TYPE_EUTRAN: - if (send_ccr_init_req_gx_gy(sess, e) == true) + if (send_ccr_init_req_gx_gy(sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); break; case OGS_GTP2_RAT_TYPE_WLAN: - smf_s6b_send_aar(sess, e->gtp_xact); + smf_s6b_send_aar(sess, gtp_xact); sess->sm_data.s6b_aar_in_flight = true; OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_initial); /* Gx/Gy Init Req is done after s6b AAR + AAA */ @@ -297,7 +305,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -355,25 +363,28 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) uint32_t diam_err; bool need_gy_terminate = false; + ogs_gtp_xact_t *gtp_xact = NULL; + ogs_assert(s); ogs_assert(e); smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { case SMF_EVT_S6B_MESSAGE: s6b_message = e->s6b_message; ogs_assert(s6b_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(s6b_message->cmd_code) { case OGS_DIAM_S6B_CMD_AUTHENTICATION_AUTHORIZATION: sess->sm_data.s6b_aar_in_flight = false; sess->sm_data.s6b_aaa_err = s6b_message->result_code; if (s6b_message->result_code == ER_DIAMETER_SUCCESS) { - send_ccr_init_req_gx_gy(sess, e); + send_ccr_init_req_gx_gy(sess, gtp_xact); return; } goto test_can_proceed; @@ -383,14 +394,15 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GX_MESSAGE: gx_message = e->gx_message; ogs_assert(gx_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gx_message->cmd_code) { case OGS_DIAM_GX_CMD_CODE_CREDIT_CONTROL: switch(gx_message->cc_request_type) { case OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_assert(e->gtp_xact); + ogs_assert(gtp_xact); diam_err = smf_gx_handle_cca_initial_request(sess, - gx_message, e->gtp_xact); + gx_message, gtp_xact); sess->sm_data.gx_ccr_init_in_flight = false; sess->sm_data.gx_cca_init_err = diam_err; goto test_can_proceed; @@ -402,14 +414,15 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch(gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_assert(e->gtp_xact); + ogs_assert(gtp_xact); diam_err = smf_gy_handle_cca_initial_request(sess, - gy_message, e->gtp_xact, &need_gy_terminate); + gy_message, gtp_xact, &need_gy_terminate); sess->sm_data.gy_ccr_init_in_flight = false; sess->sm_data.gy_cca_init_err = diam_err; goto test_can_proceed; @@ -435,23 +448,29 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e) if (diam_err == ER_DIAMETER_SUCCESS) { OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_establishment); + ogs_assert(gtp_xact); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_establishment_request( - sess, e->gtp_xact, 0)); + sess, + gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, 0)); } else { /* Tear down Gx/Gy session if its sm_data.*init_err == ER_DIAMETER_SUCCESS */ if (sess->sm_data.gx_cca_init_err == ER_DIAMETER_SUCCESS) { sess->sm_data.gx_ccr_term_in_flight = true; - smf_gx_send_ccr(sess, e->gtp_xact, OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gx_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST); } if (smf_use_gy_iface() == 1 && (sess->sm_data.gy_cca_init_err == ER_DIAMETER_SUCCESS || need_gy_terminate)) { sess->sm_data.gy_ccr_term_in_flight = true; - smf_gy_send_ccr(sess, e->gtp_xact, OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); + smf_gy_send_ccr( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID, + OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST); } uint8_t gtp_cause = gtp_cause_from_diameter( - e->gtp_xact->gtp_version, diam_err, NULL); - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + gtp_xact->gtp_version, diam_err, NULL); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); } } } @@ -473,7 +492,7 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -486,7 +505,7 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -625,7 +644,7 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -633,7 +652,7 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -641,7 +660,8 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e) switch (pfcp_message->h.type) { case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: if (pfcp_xact->epc) { - ogs_gtp_xact_t *gtp_xact = pfcp_xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(gtp_xact); pfcp_cause = smf_epc_n4_handle_session_establishment_response( @@ -651,31 +671,28 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e) /* FIXME: tear down Gy and Gx */ gtp_cause = gtp_cause_from_pfcp( pfcp_cause, gtp_xact->gtp_version); - send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause); + send_gtp_create_err_msg(sess, gtp_xact, gtp_cause); return; } - gtp_xact = pfcp_xact->assoc_xact; - if (gtp_xact) { - switch (gtp_xact->gtp_version) { - case 1: - rv = smf_gtp1_send_create_pdp_context_response( - sess, gtp_xact); - break; - case 2: - rv = smf_gtp2_send_create_session_response( - sess, gtp_xact); - break; - default: - rv = OGS_ERROR; - break; - } - /* If no CreatePDPCtxResp can be sent, - * then tear down the session: */ - if (rv != OGS_OK) { - OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); - return; - } + switch (gtp_xact->gtp_version) { + case 1: + rv = smf_gtp1_send_create_pdp_context_response( + sess, gtp_xact); + break; + case 2: + rv = smf_gtp2_send_create_session_response( + sess, gtp_xact); + break; + default: + rv = OGS_ERROR; + break; + } + /* If no CreatePDPCtxResp can be sent, + * then tear down the session: */ + if (rv != OGS_OK) { + OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); + return; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { @@ -762,6 +779,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pool_id_t stream_id = OGS_INVALID_POOL_ID; ogs_sbi_message_t *sbi_message = NULL; + ogs_gtp_xact_t *gtp_xact = NULL; ogs_gtp1_message_t *gtp1_message = NULL; ogs_gtp2_message_t *gtp2_message = NULL; uint8_t gtp1_cause, gtp2_cause; @@ -775,7 +793,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -788,14 +806,15 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GN_MESSAGE: gtp1_message = e->gtp1_message; ogs_assert(gtp1_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp1_message->h.type) { case OGS_GTP1_DELETE_PDP_CONTEXT_REQUEST_TYPE: gtp1_cause = smf_gn_handle_delete_pdp_context_request(sess, - e->gtp_xact, + gtp_xact, &gtp1_message->delete_pdp_context_request); if (gtp1_cause != OGS_GTP1_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp1_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, + ogs_gtp1_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP1_DELETE_PDP_CONTEXT_RESPONSE_TYPE, gtp1_cause); return; } @@ -806,14 +825,15 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_S5C_MESSAGE: gtp2_message = e->gtp2_message; ogs_assert(gtp2_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gtp2_message->h.type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: gtp2_cause = smf_s5c_handle_delete_session_request( - sess, e->gtp_xact, + sess, gtp_xact, &gtp2_message->delete_session_request); if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid, + ogs_gtp2_send_error_message(gtp_xact, sess->sgw_s5c_teid, OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause); return; } @@ -821,9 +841,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: release = smf_s5c_handle_delete_bearer_response( - sess, e->gtp_xact, &e->gtp2_message->delete_bearer_response); + sess, gtp_xact, &e->gtp2_message->delete_bearer_response); if (release) { - e->gtp_xact = NULL; OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); } break; @@ -834,7 +853,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -881,13 +900,15 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch (gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: - ogs_assert(e->pfcp_xact); - diam_err = smf_gy_handle_cca_update_request(sess, gy_message, e->pfcp_xact); + ogs_assert(pfcp_xact); + diam_err = smf_gy_handle_cca_update_request( + sess, gy_message, pfcp_xact); if (diam_err != ER_DIAMETER_SUCCESS) OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); break; @@ -946,7 +967,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -1098,7 +1119,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -1172,7 +1193,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -1329,7 +1350,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1338,8 +1359,10 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) * we'll use `sess->epc` */ if (sess->epc) { /* EPC */ + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); ogs_assert(OGS_OK == - smf_epc_pfcp_send_session_deletion_request(sess, e->gtp_xact)); + smf_epc_pfcp_send_session_deletion_request( + sess, gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID)); } else { /* 5GC */ stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -1366,7 +1389,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) break; /* ignore */ case SMF_EVT_N4_MESSAGE: - pfcp_xact = e->pfcp_xact; + pfcp_xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(pfcp_xact); pfcp_message = e->pfcp_message; ogs_assert(pfcp_message); @@ -1374,7 +1397,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) switch (pfcp_message->h.type) { case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: if (pfcp_xact->epc) { - gtp_xact = pfcp_xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); pfcp_cause = smf_epc_n4_handle_session_deletion_response( sess, pfcp_xact, @@ -1387,8 +1410,8 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); break; } - e->gtp_xact = gtp_xact; - if (send_ccr_termination_req_gx_gy_s6b(sess, e) == true) + if (send_ccr_termination_req_gx_gy_s6b( + sess, gtp_xact) == true) OGS_FSM_TRAN(s, smf_gsm_state_wait_epc_auth_release); /* else: free session? */ } else { @@ -1486,7 +1509,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -1533,12 +1556,14 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e) ogs_diam_s6b_message_t *s6b_message = NULL; uint32_t diam_err; + ogs_gtp_xact_t *gtp_xact = NULL; + ogs_assert(s); ogs_assert(e); smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1557,13 +1582,14 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GX_MESSAGE: gx_message = e->gx_message; ogs_assert(gx_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gx_message->cmd_code) { case OGS_DIAM_GX_CMD_CODE_CREDIT_CONTROL: switch(gx_message->cc_request_type) { case OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST: diam_err = smf_gx_handle_cca_termination_request(sess, - gx_message, e->gtp_xact); + gx_message, gtp_xact); sess->sm_data.gx_ccr_term_in_flight = false; sess->sm_data.gx_cca_term_err = diam_err; goto test_can_proceed; @@ -1575,13 +1601,14 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_GY_MESSAGE: gy_message = e->gy_message; ogs_assert(gy_message); + gtp_xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: switch(gy_message->cc_request_type) { case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST: diam_err = smf_gy_handle_cca_termination_request(sess, - gy_message, e->gtp_xact); + gy_message, gtp_xact); sess->sm_data.gy_ccr_term_in_flight = false; sess->sm_data.gy_cca_term_err = diam_err; goto test_can_proceed; @@ -1619,26 +1646,26 @@ void smf_gsm_state_wait_epc_auth_release(ogs_fsm_t *s, smf_event_t *e) diam_err = sess->sm_data.s6b_sta_err; /* Initiated by peer request, let's answer: */ - if (e->gtp_xact) { + if (gtp_xact) { if (diam_err == ER_DIAMETER_SUCCESS) { /* * 1. MME sends Delete Session Request to SGW/SMF. * 2. SMF sends Delete Session Response to SGW/MME. */ - switch (e->gtp_xact->gtp_version) { + switch (gtp_xact->gtp_version) { case 1: smf_gtp1_send_delete_pdp_context_response( - sess, e->gtp_xact); + sess, gtp_xact); break; case 2: smf_gtp2_send_delete_session_response( - sess, e->gtp_xact); + sess, gtp_xact); break; } } else { uint8_t gtp_cause = gtp_cause_from_diameter( - e->gtp_xact->gtp_version, diam_err, NULL); - send_gtp_delete_err_msg(sess, e->gtp_xact, gtp_cause); + gtp_xact->gtp_version, diam_err, NULL); + send_gtp_delete_err_msg(sess, gtp_xact, gtp_cause); } } OGS_FSM_TRAN(s, smf_gsm_state_epc_session_will_release); @@ -1665,7 +1692,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1724,7 +1751,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -1779,7 +1806,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -1861,7 +1888,7 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_5GSM_MESSAGE: nas_message = e->nas.message; ogs_assert(nas_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -1918,7 +1945,7 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -1949,7 +1976,7 @@ void smf_gsm_state_5gc_n1_n2_reject(ogs_fsm_t *s, smf_event_t *e) sbi_message = e->h.sbi.message; ogs_assert(sbi_message); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SWITCH(sbi_message->h.service.name) @@ -2036,7 +2063,7 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -2104,7 +2131,7 @@ void smf_gsm_state_epc_session_will_release(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch (e->h.id) { @@ -2131,9 +2158,9 @@ void smf_gsm_state_exception(ogs_fsm_t *s, smf_event_t *e) smf_sm_debug(e); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); switch (e->h.id) { diff --git a/src/smf/gtp-path.c b/src/smf/gtp-path.c index f4738658da..e082d68094 100644 --- a/src/smf/gtp-path.c +++ b/src/smf/gtp-path.c @@ -369,7 +369,7 @@ int smf_gtp1_send_update_pdp_context_request( smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp1_header_t)); @@ -384,7 +384,8 @@ int smf_gtp1_send_update_pdp_context_request( } xact = ogs_gtp1_xact_local_create( - sess->gnode, &h, pkbuf, bearer_timeout, bearer); + sess->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp1_xact_local_create() failed"); return OGS_ERROR; @@ -409,7 +410,7 @@ int smf_gtp1_send_update_pdp_context_response( ogs_assert(bearer); ogs_assert(xact); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp1_header_t)); @@ -546,7 +547,7 @@ int smf_gtp2_send_delete_bearer_request( smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); memset(&h, 0, sizeof(ogs_gtp2_header_t)); @@ -561,7 +562,8 @@ int smf_gtp2_send_delete_bearer_request( } xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, bearer_timeout, bearer); + sess->gnode, &h, pkbuf, bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_gtp_xact_local_create() failed"); return OGS_ERROR; @@ -730,30 +732,36 @@ static void send_router_advertisement(smf_sess_t *sess, uint8_t *ip6_dst) static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) { - smf_bearer_t *bearer = data; + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; smf_sess_t *sess = NULL; smf_ue_t *smf_ue = NULL; uint8_t type = 0; - ogs_assert(bearer); - sess = bearer->sess; + ogs_assert(xact); + type = xact->seq[0].type; + + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - type = xact->seq[0].type; - switch (type) { case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE: ogs_error("[%s] No Delete Bearer Response", smf_ue->imsi_bcd); - if (!smf_bearer_cycle(bearer)) { - ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd); - break; - } - ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); break; diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index b44a1ee6d1..d5d1bdc304 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -29,10 +29,10 @@ struct sess_state { os0_t peer_host; /* Peer Host */ #define NUM_CC_REQUEST_SLOT 4 - smf_sess_t *sess; + ogs_pool_id_t sess_id; struct { uint32_t cc_req_no; - ogs_gtp_xact_t *ptr; + ogs_pool_id_t id; } xact_data[NUM_CC_REQUEST_SLOT]; uint32_t cc_request_type; @@ -88,7 +88,7 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) } /* 3GPP TS 29.212 5.6.2 Credit-Control-Request */ -void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, +void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type) { int ret; @@ -112,7 +112,7 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, ogs_assert(sess); ogs_assert(sess->ipv4 || sess->ipv6); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("[Credit-Control-Request]"); @@ -198,9 +198,9 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact, sess_data->cc_request_type, sess_data->cc_request_number); /* Update session state */ - sess_data->sess = sess; + sess_data->sess_id = sess->id; req_slot = sess_data->cc_request_number % NUM_CC_REQUEST_SLOT; - sess_data->xact_data[req_slot].ptr = xact; + sess_data->xact_data[req_slot].id = xact_id; sess_data->xact_data[req_slot].cc_req_no = sess_data->cc_request_number; /* Set Origin-Host & Origin-Realm */ @@ -718,7 +718,6 @@ static void smf_gx_cca_cb(void *data, struct msg **msg) int new; struct msg *req = NULL; smf_event_t *e = NULL; - ogs_gtp_xact_t *xact = NULL; smf_sess_t *sess = NULL; ogs_diam_gx_message_t *gx_message = NULL; uint32_t req_slot, cc_request_number = 0; @@ -767,8 +766,7 @@ static void smf_gx_cca_cb(void *data, struct msg **msg) ogs_debug(" CC-Request-Number[%d]", cc_request_number); - xact = sess_data->xact_data[req_slot].ptr; - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess_data->xact_data[req_slot].cc_req_no == cc_request_number); ogs_assert(sess); @@ -1039,9 +1037,9 @@ static void smf_gx_cca_cb(void *data, struct msg **msg) e = smf_event_new(SMF_EVT_GX_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gx_message = gx_message; - e->gtp_xact = xact; + e->gtp_xact_id = sess_data->xact_data[req_slot].id; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); @@ -1166,7 +1164,7 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp, } /* Get Session Information */ - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess); ret = fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL); @@ -1283,7 +1281,7 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp, e = smf_event_new(SMF_EVT_GX_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gx_message = gx_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 51c40ab513..55f2dba702 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -257,7 +257,7 @@ uint32_t smf_gy_handle_cca_update_request( if (modify_flags) { modify_flags |= OGS_PFCP_MODIFY_URR|OGS_PFCP_MODIFY_UL_ONLY; rv = smf_epc_pfcp_send_all_pdr_modification_request( - sess, pfcp_xact, NULL, modify_flags, + sess, OGS_INVALID_POOL_ID, NULL, modify_flags, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP1_CAUSE_REACTIACTION_REQUESTED); ogs_assert(rv == OGS_OK); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 52a2a02250..c897af5a1a 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -31,11 +31,11 @@ struct sess_state { #define NUM_CC_REQUEST_SLOT 4 - smf_sess_t *sess; + ogs_pool_id_t sess_id; struct { uint32_t cc_req_no; bool pfcp; - void *ptr; /* INITIAL: ogs_gtp_xact_t, UPDATE: ogs_pfcp_xact_t */ + ogs_pool_id_t id; /* INITIAL: ogs_gtp_xact_t, UPDATE: ogs_pfcp_xact_t */ } xact_data[NUM_CC_REQUEST_SLOT]; uint32_t cc_request_type; uint32_t cc_request_number; @@ -345,6 +345,12 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, char buf[OGS_PLMNIDSTRLEN]; char digit; + smf_ue_t *smf_ue = NULL; + + ogs_assert(sess); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + /* PS-Information, TS 32.299 sec 7.2.158 */ ret = fd_msg_avp_new(ogs_diam_gy_ps_information, 0, &avpch1); ogs_assert(ret == 0); @@ -555,7 +561,7 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2); ogs_assert(ret == 0); - if (sess->smf_ue->imeisv_len > 0) { + if (smf_ue->imeisv_len > 0) { /* User-Equipment-Info, 3GPP TS 32.299 7.1.17 */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info, 0, &avpch2); @@ -572,7 +578,7 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info_value, 0, &avpch3); ogs_assert(ret == 0); digit = '0'; - val.os.data = (uint8_t*)&sess->smf_ue->imeisv_bcd[0]; + val.os.data = (uint8_t*)&smf_ue->imeisv_bcd[0]; val.os.len = 16; ret = fd_msg_avp_setvalue(avpch3, &val); ogs_assert(ret == 0); @@ -610,7 +616,7 @@ static void fill_service_information_ccr(smf_sess_t *sess, } /* 3GPP TS 32.299 6.4.2 Credit-Control-Request message */ -void smf_gy_send_ccr(smf_sess_t *sess, void *xact, +void smf_gy_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, uint32_t cc_request_type) { @@ -630,7 +636,7 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact, ogs_assert(sess); ogs_assert(sess->ipv4 || sess->ipv6); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("[Gy][Credit-Control-Request]"); @@ -713,14 +719,14 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact, sess_data->cc_request_type, sess_data->cc_request_number); /* Update session state */ - sess_data->sess = sess; + sess_data->sess_id = sess->id; req_slot = sess_data->cc_request_number % NUM_CC_REQUEST_SLOT; if (cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST) sess_data->xact_data[req_slot].pfcp = true; else sess_data->xact_data[req_slot].pfcp = false; sess_data->xact_data[req_slot].cc_req_no = sess_data->cc_request_number; - sess_data->xact_data[req_slot].ptr = xact; + sess_data->xact_data[req_slot].id = xact_id; /* Origin-Host & Origin-Realm */ @@ -958,7 +964,6 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) int new; struct msg *req = NULL; smf_event_t *e = NULL; - void *xact = NULL; smf_sess_t *sess = NULL; ogs_diam_gy_message_t *gy_message = NULL; uint32_t req_slot, cc_request_number = 0; @@ -1007,9 +1012,8 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) ogs_debug(" CC-Request-Number[%d]", cc_request_number); - xact = sess_data->xact_data[req_slot].ptr; ogs_assert(sess_data->xact_data[req_slot].cc_req_no == cc_request_number); - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess); gy_message = ogs_calloc(1, sizeof(ogs_diam_gy_message_t)); @@ -1175,15 +1179,13 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) e = smf_event_new(SMF_EVT_GY_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gy_message = gy_message; - if (gy_message->cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST) { - ogs_assert(sess_data->xact_data[req_slot].pfcp == true); - e->pfcp_xact = xact; - } else { - ogs_assert(sess_data->xact_data[req_slot].pfcp == false); - e->gtp_xact = xact; - } + if (sess_data->xact_data[req_slot].pfcp == true) + e->pfcp_xact_id = sess_data->xact_data[req_slot].id; + else + e->gtp_xact_id = sess_data->xact_data[req_slot].id; + rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); @@ -1302,7 +1304,7 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp, } /* Get Session Information */ - sess = sess_data->sess; + sess = smf_sess_find_by_id(sess_data->sess_id); ogs_assert(sess); /* TODO: parsing of msg into gy_message */ @@ -1311,7 +1313,7 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp, e = smf_event_new(SMF_EVT_GY_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->gy_message = gy_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/smf/n4-build.c b/src/smf/n4-build.c index df2efb8645..cc0d381d29 100644 --- a/src/smf/n4-build.c +++ b/src/smf/n4-build.c @@ -44,7 +44,7 @@ ogs_pkbuf_t *smf_n4_build_session_establishment_request( ogs_debug("Session Establishment Request"); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(xact); diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 8d7f52b7e3..48d560880b 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -267,8 +267,7 @@ void smf_5gc_n4_handle_session_modification_response( } else { /* If smf_5gc_pfcp_send_qos_flow_modification_request() is called */ - qos_flow = xact->data; - ogs_assert(qos_flow); + qos_flow = smf_qos_flow_find_by_id(OGS_POINTER_TO_UINT(xact->data)); } ogs_list_copy(&pdr_to_create_list, &xact->pdr_to_create_list); @@ -496,10 +495,12 @@ void smf_5gc_n4_handle_session_modification_response( ogs_list_for_each_entry_safe(&sess->qos_flow_to_modify_list, next, qos_flow, to_modify_node) { + smf_sess_t *sess = smf_sess_find_by_id(qos_flow->sess_id); + ogs_assert(sess); smf_metrics_inst_by_5qi_add( - &qos_flow->sess->serving_plmn_id, - &qos_flow->sess->s_nssai, - qos_flow->sess->session.qos.index, + &sess->serving_plmn_id, + &sess->s_nssai, + sess->session.qos.index, SMF_METR_GAUGE_SM_QOSFLOWNBR, -1); smf_bearer_remove(qos_flow); } @@ -528,10 +529,12 @@ void smf_5gc_n4_handle_session_modification_response( ogs_list_for_each_entry_safe(&sess->qos_flow_to_modify_list, next, qos_flow, to_modify_node) { + smf_sess_t *sess = smf_sess_find_by_id(qos_flow->sess_id); + ogs_assert(sess); smf_metrics_inst_by_5qi_add( - &qos_flow->sess->serving_plmn_id, - &qos_flow->sess->s_nssai, - qos_flow->sess->session.qos.index, + &sess->serving_plmn_id, + &sess->s_nssai, + sess->session.qos.index, SMF_METR_GAUGE_SM_QOSFLOWNBR, -1); smf_bearer_remove(qos_flow); } @@ -857,8 +860,7 @@ void smf_epc_n4_handle_session_modification_response( /* If smf_epc_pfcp_send_pdr_modification_request() is called */ } else { /* If smf_epc_pfcp_send_bearer_modification_request() is called */ - bearer = xact->data; - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(OGS_POINTER_TO_UINT(xact->data)); } flags = xact->modify_flags; ogs_assert(flags); @@ -867,7 +869,7 @@ void smf_epc_n4_handle_session_modification_response( PFCP Session Report Request, xact->assoc_xact is not a gtp_xact. No need to do anything. */ if (!(flags & OGS_PFCP_MODIFY_URR)) { - gtp_xact = xact->assoc_xact; + gtp_xact = ogs_gtp_xact_find_by_id(xact->assoc_xact_id); gtp_pti = xact->gtp_pti; gtp_cause = xact->gtp_cause; } @@ -1005,7 +1007,7 @@ void smf_epc_n4_handle_session_modification_response( * * To do this, I saved Bearer Context in Transaction Context. */ - gtp_xact->data = bearer; + gtp_xact->data = OGS_UINT_TO_POINTER(bearer->id); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); @@ -1059,9 +1061,15 @@ void smf_epc_n4_handle_session_modification_response( /* SMF send Update PDP Context Response (GTPv1C) to SGSN */ if (gtp_xact->gtp_version == 1) { + ogs_pool_id_t bearer_id = OGS_POINTER_TO_UINT(gtp_xact->data); - bearer = gtp_xact->data; - smf_gtp1_send_update_pdp_context_response(bearer, gtp_xact); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && + bearer_id <= OGS_MAX_POOL_ID); + bearer = smf_bearer_find_by_id(bearer_id); + if (bearer) + smf_gtp1_send_update_pdp_context_response(bearer, gtp_xact); + else + ogs_error("Bearer has already been removed"); } else { @@ -1193,7 +1201,7 @@ uint8_t smf_n4_handle_session_report_request( } ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); report_type.value = pfcp_req->report_type.u8; @@ -1339,7 +1347,8 @@ uint8_t smf_n4_handle_session_report_request( switch (smf_use_gy_iface()) { case 1: if (!sess->gy.final_unit) { - smf_gy_send_ccr(sess, pfcp_xact, + smf_gy_send_ccr( + sess, pfcp_xact->id, OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST); } else { ogs_debug("[%s:%s] Rx PFCP report after Gy Final Unit Indication", @@ -1378,7 +1387,7 @@ uint8_t smf_n4_handle_session_report_request( smf_ue->imsi_bcd, sess->session.name); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_deletion_request( - sess, NULL)); + sess, OGS_INVALID_POOL_ID)); } else { ogs_warn("[%s:%s] Error Indication from gNB", smf_ue->supi, sess->session.name); diff --git a/src/smf/namf-build.c b/src/smf/namf-build.c index e4c7441fec..908e0d4f71 100644 --- a/src/smf/namf-build.c +++ b/src/smf/namf-build.c @@ -44,7 +44,7 @@ ogs_sbi_request_t *smf_namf_comm_build_n1_n2_message_transfer( OpenAPI_ref_to_binary_data_t ngapData; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); diff --git a/src/smf/namf-handler.c b/src/smf/namf-handler.c index 5bfa823da9..c983456812 100644 --- a/src/smf/namf-handler.c +++ b/src/smf/namf-handler.c @@ -29,7 +29,7 @@ bool smf_namf_comm_handle_n1_n2_message_transfer( OpenAPI_n1_n2_message_transfer_rsp_data_t *N1N2MessageTransferRspData; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(state); ogs_assert(recvmsg); diff --git a/src/smf/nas-path.c b/src/smf/nas-path.c index 8705d60818..cb429ad3ec 100644 --- a/src/smf/nas-path.c +++ b/src/smf/nas-path.c @@ -31,7 +31,7 @@ void nas_5gs_send_to_gsm( e = smf_event_new(SMF_EVT_5GSM_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->pkbuf = pkbuf; if (stream) { diff --git a/src/smf/ngap-handler.c b/src/smf/ngap-handler.c index d5d2febb34..793c252685 100644 --- a/src/smf/ngap-handler.c +++ b/src/smf/ngap-handler.c @@ -46,7 +46,7 @@ int ngap_handle_pdu_session_resource_setup_response_transfer( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceSetupResponseTransfer"); @@ -185,7 +185,7 @@ int ngap_handle_pdu_session_resource_setup_unsuccessful_transfer( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceSetupUnsuccessfulTransfer"); @@ -285,7 +285,7 @@ int ngap_handle_pdu_session_resource_modify_response_transfer( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PDUSessionResourceModifyResponseTransfer"); @@ -390,7 +390,7 @@ int ngap_handle_path_switch_request_transfer( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("PathSwitchRequestTransfer"); @@ -517,7 +517,7 @@ int ngap_handle_handover_required_transfer( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("HandoverRequiredTransfer"); @@ -569,7 +569,7 @@ int ngap_handle_handover_request_ack( ogs_assert(stream); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("HandoverRequestAcknowledgeTransfer"); diff --git a/src/smf/ngap-path.c b/src/smf/ngap-path.c index ef5e0752bd..eec640a98a 100644 --- a/src/smf/ngap-path.c +++ b/src/smf/ngap-path.c @@ -30,7 +30,7 @@ void ngap_send_to_n2sm(smf_sess_t *sess, e = smf_event_new(SMF_EVT_NGAP_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->pkbuf = pkbuf; e->ngap.type = type; diff --git a/src/smf/npcf-build.c b/src/smf/npcf-build.c index f4ca9b88fa..5ccde4fc8e 100644 --- a/src/smf/npcf-build.c +++ b/src/smf/npcf-build.c @@ -38,7 +38,7 @@ ogs_sbi_request_t *smf_npcf_smpolicycontrol_build_create( ogs_assert(sess); ogs_assert(sess->sm_context_ref); ogs_assert(sess->session.name); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); memset(&message, 0, sizeof(message)); @@ -301,7 +301,7 @@ ogs_sbi_request_t *smf_npcf_smpolicycontrol_build_delete( ogs_assert(sess); ogs_assert(sess->sm_context_ref); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(sess->policy_association.resource_uri); diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 63435aa88b..e4057a5d85 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -304,7 +304,7 @@ bool smf_npcf_smpolicycontrol_handle_create( ogs_sockaddr_t *addr = NULL, *addr6 = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg); @@ -699,7 +699,7 @@ bool smf_npcf_smpolicycontrol_handle_update_notify( ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg); @@ -748,7 +748,7 @@ bool smf_npcf_smpolicycontrol_handle_terminate_notify( ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(recvmsg); diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 08fd8225c5..7c383e6b47 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -49,7 +49,7 @@ bool smf_nsmf_handle_create_sm_context( ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SmContextCreateData = message->SmContextCreateData; @@ -398,7 +398,7 @@ bool smf_nsmf_handle_update_sm_context( ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); SmContextUpdateData = message->SmContextUpdateData; @@ -818,7 +818,7 @@ bool smf_nsmf_handle_release_sm_context( ogs_assert(stream); ogs_assert(message); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); memset(&param, 0, sizeof(param)); diff --git a/src/smf/nudm-build.c b/src/smf/nudm-build.c index 7ebeb1c9cc..979e982047 100644 --- a/src/smf/nudm-build.c +++ b/src/smf/nudm-build.c @@ -26,7 +26,7 @@ ogs_sbi_request_t *smf_nudm_sdm_build_get(smf_sess_t *sess, void *data) ogs_sbi_request_t *request = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); @@ -62,7 +62,7 @@ ogs_sbi_request_t *smf_nudm_uecm_build_registration( ogs_assert(sess); ogs_assert(sess->psi); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); @@ -123,7 +123,7 @@ ogs_sbi_request_t *smf_nudm_uecm_build_deregistration( ogs_assert(sess); ogs_assert(sess->psi); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(smf_ue->supi); diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index fff72ffd4f..2879ca9659 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -53,7 +53,7 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_assert(sess); ogs_assert(stream); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); server = ogs_sbi_server_from_stream(stream); ogs_assert(server); diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index cb57ef82f5..2739325aaa 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -210,6 +210,7 @@ void smf_pfcp_close(void) static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) { + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; smf_ue_t *smf_ue = NULL; smf_sess_t *sess = NULL; ogs_sbi_stream_t *stream = NULL; @@ -222,27 +223,30 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) ogs_assert(xact); ogs_assert(data); - sess = smf_sess_cycle(data); - if (!sess) { - ogs_warn("Session has already been removed"); - return; - } - smf_ue = sess->smf_ue; - ogs_assert(smf_ue); - if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && xact->assoc_stream_id <= OGS_MAX_POOL_ID) stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); type = xact->seq[0].type; + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_warn("No PFCP session establishment response"); e = smf_event_new(SMF_EVT_N4_TIMER); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->h.timer_id = SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE; e->pfcp_node = sess->pfcp_node; @@ -301,7 +305,7 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) removal from pfcp-sm state machine. */ e = smf_event_new(SMF_EVT_N4_TIMER); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->h.timer_id = SMF_TIMER_PFCP_NO_DELETION_RESPONSE; e->pfcp_node = sess->pfcp_node; @@ -319,11 +323,23 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data) static void sess_epc_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_warn("No PFCP session establishment response"); @@ -342,11 +358,23 @@ static void sess_epc_timeout(ogs_pfcp_xact_t *xact, void *data) static void bearer_epc_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + bearer_id = OGS_POINTER_TO_UINT(data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); + + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: ogs_error("No PFCP session modification response"); @@ -410,7 +438,8 @@ int smf_5gc_pfcp_send_session_establishment_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -483,7 +512,8 @@ int smf_5gc_pfcp_send_all_pdr_modification_request( if ((flags & OGS_PFCP_MODIFY_ERROR_INDICATION) == 0) ogs_assert(stream); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -518,7 +548,8 @@ int smf_5gc_pfcp_send_qos_flow_list_modification_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -551,7 +582,8 @@ int smf_5gc_pfcp_send_session_deletion_request( ogs_assert(sess); ogs_assert(trigger); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_5gc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_5gc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -589,7 +621,7 @@ int smf_5gc_pfcp_send_session_deletion_request( } int smf_epc_pfcp_send_session_establishment_request( - smf_sess_t *sess, void *gtp_xact, uint64_t flags) + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, uint64_t flags) { int rv; ogs_pkbuf_t *n4buf = NULL; @@ -598,14 +630,15 @@ int smf_epc_pfcp_send_session_establishment_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->create_flags = flags; @@ -662,7 +695,7 @@ int smf_epc_pfcp_send_session_establishment_request( } int smf_epc_pfcp_send_all_pdr_modification_request( - smf_sess_t *sess, void *gtp_xact, ogs_pkbuf_t *gtpbuf, + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause) { int rv; @@ -671,14 +704,15 @@ int smf_epc_pfcp_send_all_pdr_modification_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; @@ -704,7 +738,7 @@ int smf_epc_pfcp_send_all_pdr_modification_request( } int smf_epc_pfcp_send_one_bearer_modification_request( - smf_bearer_t *bearer, void *gtp_xact, + smf_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause) { int rv; @@ -712,18 +746,19 @@ int smf_epc_pfcp_send_one_bearer_modification_request( smf_sess_t *sess = NULL; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); xact = ogs_pfcp_xact_local_create( - sess->pfcp_node, bearer_epc_timeout, bearer); + sess->pfcp_node, bearer_epc_timeout, + OGS_UINT_TO_POINTER(bearer->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; } xact->epc = true; /* EPC PFCP transaction */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; xact->modify_flags = flags; @@ -741,7 +776,7 @@ int smf_epc_pfcp_send_one_bearer_modification_request( } int smf_epc_pfcp_send_session_deletion_request( - smf_sess_t *sess, void *gtp_xact) + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id) { int rv; ogs_pkbuf_t *n4buf = NULL; @@ -750,7 +785,8 @@ int smf_epc_pfcp_send_session_deletion_request( ogs_assert(sess); - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_epc_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_epc_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; @@ -779,7 +815,7 @@ int smf_epc_pfcp_send_session_deletion_request( * - Bearer Resource Command * - Delete Bearer Request/Response with DEDICATED BEARER. */ - xact->assoc_xact = gtp_xact; + xact->assoc_xact_id = gtp_xact_id; xact->local_seid = sess->smf_n4_seid; memset(&h, 0, sizeof(ogs_pfcp_header_t)); @@ -811,7 +847,7 @@ int smf_epc_pfcp_send_deactivation(smf_sess_t *sess, uint8_t gtp_cause) smf_sess_t *eutran_sess = NULL, *wlan_sess = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); switch (gtp_cause) { @@ -830,7 +866,7 @@ int smf_epc_pfcp_send_deactivation(smf_sess_t *sess, uint8_t gtp_cause) /* Deactivate WLAN Session */ rv = smf_epc_pfcp_send_all_pdr_modification_request( - wlan_sess, NULL, NULL, + wlan_sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_ACCESS_CHANGED_FROM_NON_3GPP_TO_3GPP); @@ -853,7 +889,7 @@ int smf_epc_pfcp_send_deactivation(smf_sess_t *sess, uint8_t gtp_cause) /* Deactivate EUTRAN Session */ rv = smf_epc_pfcp_send_all_pdr_modification_request( - eutran_sess, NULL, NULL, + eutran_sess, OGS_INVALID_POOL_ID, NULL, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_RAT_CHANGED_FROM_3GPP_TO_NON_3GPP); diff --git a/src/smf/pfcp-path.h b/src/smf/pfcp-path.h index d05145f01d..3ecc2a9f6f 100644 --- a/src/smf/pfcp-path.h +++ b/src/smf/pfcp-path.h @@ -47,15 +47,15 @@ int smf_5gc_pfcp_send_session_deletion_request( smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger); int smf_epc_pfcp_send_session_establishment_request( - smf_sess_t *sess, void *gtp_xact, uint64_t flags); + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, uint64_t flags); int smf_epc_pfcp_send_all_pdr_modification_request( - smf_sess_t *sess, void *gtp_xact, ogs_pkbuf_t *gtpbuf, + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id, ogs_pkbuf_t *gtpbuf, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause); int smf_epc_pfcp_send_one_bearer_modification_request( - smf_bearer_t *bearer, void *gtp_xact, + smf_bearer_t *bearer, ogs_pool_id_t gtp_xact_id, uint64_t flags, uint8_t gtp_pti, uint8_t gtp_cause); int smf_epc_pfcp_send_session_deletion_request( - smf_sess_t *sess, void *gtp_xact); + smf_sess_t *sess, ogs_pool_id_t gtp_xact_id); int smf_epc_pfcp_send_deactivation(smf_sess_t *sess, uint8_t gtp_cause); diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 084b2f1842..86cd34e6cf 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -117,7 +117,7 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_cp_send_association_setup_request(node, node_timeout); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -125,7 +125,7 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) ogs_fsm_dispatch(&sess->sm, e); break; case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -141,7 +141,7 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -223,7 +223,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) { @@ -237,7 +237,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) sess = smf_sess_find_by_seid(xact->local_seid); } if (sess) - e->sess = sess; + e->sess_id = sess->id; switch (message->h.type) { case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: @@ -313,7 +313,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) if (!message->h.seid_presence) ogs_error("No SEID"); if (!sess) { - ogs_gtp_xact_t *gtp_xact = xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(xact->assoc_xact_id); ogs_error("No Session"); if (!gtp_xact) { ogs_error("No associated GTP transaction"); @@ -348,7 +349,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) if (!message->h.seid_presence) ogs_error("No SEID"); if (!sess) { - ogs_gtp_xact_t *gtp_xact = xact->assoc_xact; + ogs_gtp_xact_t *gtp_xact = + ogs_gtp_xact_find_by_id(xact->assoc_xact_id); ogs_error("No Session"); if (!gtp_xact) { ogs_error("No associated GTP transaction"); @@ -397,7 +399,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_send_heartbeat_request(node, node_timeout)); break; case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -405,7 +407,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) ogs_fsm_dispatch(&sess->sm, e); break; case SMF_TIMER_PFCP_NO_DELETION_RESPONSE: - sess = smf_sess_cycle(e->sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_warn("Session has already been removed"); break; @@ -482,7 +484,7 @@ static void pfcp_restoration(ogs_pfcp_node_t *node) OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : ""); ogs_assert(OGS_OK == smf_epc_pfcp_send_session_establishment_request( - sess, NULL, + sess, OGS_INVALID_POOL_ID, OGS_PFCP_CREATE_RESTORATION_INDICATION)); } else { ogs_info("UE SUPI[%s] DNN[%s] IPv4[%s] IPv6[%s]", diff --git a/src/smf/s5c-build.c b/src/smf/s5c-build.c index 0a9d834ae9..88e3323c6e 100644 --- a/src/smf/s5c-build.c +++ b/src/smf/s5c-build.c @@ -337,7 +337,7 @@ ogs_pkbuf_t *smf_s5c_build_modify_bearer_response( smf_bearer_t *bearer = NULL; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(req); @@ -410,7 +410,7 @@ ogs_pkbuf_t *smf_s5c_build_create_bearer_request( char tft_buf[OGS_GTP2_MAX_TRAFFIC_FLOW_TEMPLATE]; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); linked_bearer = smf_default_bearer_in_sess(sess); ogs_assert(linked_bearer); @@ -489,7 +489,7 @@ ogs_pkbuf_t *smf_s5c_build_update_bearer_request( char tft_buf[OGS_GTP2_MAX_TRAFFIC_FLOW_TEMPLATE]; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); ogs_debug("[SMF] Update Bearer Request"); @@ -567,7 +567,7 @@ ogs_pkbuf_t *smf_s5c_build_delete_bearer_request( ogs_gtp2_cause_t cause; ogs_assert(bearer); - sess = bearer->sess; + sess = smf_sess_find_by_id(bearer->sess_id); ogs_assert(sess); linked_bearer = smf_default_bearer_in_sess(sess); ogs_assert(linked_bearer); diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 0eb4b1123e..515703f854 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -29,11 +29,23 @@ static void pfcp_sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + smf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = smf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: ogs_error("No PFCP session establishment response"); @@ -178,7 +190,7 @@ uint8_t smf_s5c_handle_create_session_request( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) return cause_value; - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Set MSISDN: */ @@ -532,7 +544,7 @@ void smf_s5c_handle_modify_bearer_request( * Check ALL Context ********************/ ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); /* Control Plane(DL) : SGW-S5C */ @@ -630,7 +642,7 @@ void smf_s5c_handle_modify_bearer_request( ogs_assert(pfcp_xact); pfcp_xact->epc = true; /* EPC PFCP transaction */ - pfcp_xact->assoc_xact = gtp_xact; + pfcp_xact->assoc_xact_id = gtp_xact->id; pfcp_xact->modify_flags = flags|OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE; @@ -674,6 +686,7 @@ void smf_s5c_handle_create_bearer_response( ogs_gtp2_cause_t *cause = NULL; ogs_gtp2_f_teid_t *sgw_s5u_teid = NULL, *pgw_s5u_teid = NULL; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_pfcp_far_t *dl_far = NULL; ogs_assert(sess); @@ -685,12 +698,22 @@ void smf_s5c_handle_create_bearer_response( * Check Transaction ********************/ ogs_assert(xact); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); + /******************** + * Check ALL Context + ********************/ + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + return; + } + /************************ * Check Session Context ************************/ @@ -699,7 +722,7 @@ void smf_s5c_handle_create_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -756,7 +779,7 @@ void smf_s5c_handle_create_bearer_response( if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -774,7 +797,7 @@ void smf_s5c_handle_create_bearer_response( ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value); ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -787,7 +810,7 @@ void smf_s5c_handle_create_bearer_response( ogs_error("GTP Cause [Value:%d]", cause_value); ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return; @@ -834,7 +857,7 @@ void smf_s5c_handle_create_bearer_response( ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_ACTIVATE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_ACTIVATE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } @@ -849,6 +872,7 @@ void smf_s5c_handle_update_bearer_response( uint64_t gtp_flags = 0; uint64_t pfcp_flags = 0; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_assert(sess); ogs_assert(rsp); @@ -861,8 +885,9 @@ void smf_s5c_handle_update_bearer_response( ogs_assert(xact); gtp_flags = xact->update_flags; ogs_assert(gtp_flags); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -918,8 +943,11 @@ void smf_s5c_handle_update_bearer_response( /******************** * Check ALL Context ********************/ - ogs_assert(sess); - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + return; + } ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]", sess->sgw_s5c_teid, sess->smf_n4_teid); @@ -940,7 +968,7 @@ void smf_s5c_handle_update_bearer_response( if (pfcp_flags) ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, pfcp_flags, + bearer, OGS_INVALID_POOL_ID, pfcp_flags, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } @@ -953,6 +981,7 @@ bool smf_s5c_handle_delete_bearer_response( int rv; uint8_t cause_value; smf_bearer_t *bearer = NULL; + ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; ogs_assert(sess); ogs_assert(rsp); @@ -963,16 +992,19 @@ bool smf_s5c_handle_delete_bearer_response( * Check Transaction ********************/ ogs_assert(xact); - bearer = xact->data; - ogs_assert(bearer); + + bearer_id = OGS_POINTER_TO_UINT(xact->data); + ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); - /******************** - * Check ALL Context - ********************/ - ogs_assert(bearer); + bearer = smf_bearer_find_by_id(bearer_id); + if (!bearer) { + ogs_error("Bearer has already been removed"); + /* Release entire session: */ + return true; + } if (rsp->linked_eps_bearer_id.presence) { /* @@ -1051,7 +1083,7 @@ bool smf_s5c_handle_delete_bearer_response( ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, NULL, OGS_PFCP_MODIFY_REMOVE, + bearer, OGS_INVALID_POOL_ID, OGS_PFCP_MODIFY_REMOVE, OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); return false; @@ -1260,7 +1292,7 @@ void smf_s5c_handle_bearer_resource_command( OGS_GTP2_TFT_CODE_REPLACE_PACKET_FILTERS_IN_EXISTING) { for (i = 0; i < tft.num_of_packet_filter && i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pf[i].identifier+1); if (pf) { if (reconfigure_packet_filter(pf, &tft, i) < 0) { ogs_gtp2_send_error_message( @@ -1326,7 +1358,7 @@ void smf_s5c_handle_bearer_resource_command( for (i = 0; i < tft.num_of_packet_filter && i < OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pf[i].identifier+1); if (!pf) pf = smf_pf_add(bearer); ogs_assert(pf); @@ -1391,7 +1423,7 @@ void smf_s5c_handle_bearer_resource_command( OGS_GTP2_TFT_CODE_DELETE_PACKET_FILTERS_FROM_EXISTING) { for (i = 0; i < tft.num_of_packet_filter && i <= OGS_MAX_NUM_OF_FLOW_IN_GTP; i++) { - pf = smf_pf_find_by_id(bearer, tft.pf[i].identifier+1); + pf = smf_pf_find_by_identifier(bearer, tft.pf[i].identifier+1); if (pf) smf_pf_remove(pf); } @@ -1438,7 +1470,7 @@ void smf_s5c_handle_bearer_resource_command( */ ogs_assert(OGS_OK == smf_epc_pfcp_send_one_bearer_modification_request( - bearer, xact, + bearer, xact->id, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, cmd->procedure_transaction_id.u8, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); @@ -1483,7 +1515,7 @@ void smf_s5c_handle_bearer_resource_command( * * To do this, I saved Bearer Context in Transaction Context. */ - xact->data = bearer; + xact->data = OGS_UINT_TO_POINTER(bearer->id); rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index 09f080cd09..e5ecbdc9df 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -26,7 +26,7 @@ struct sess_state { smf_sess_t *sess; os0_t s6b_sid; /* S6B Session-Id */ - ogs_gtp_xact_t *xact; + ogs_pool_id_t xact_id; struct timespec ts; /* Time of sending the message */ }; @@ -102,7 +102,7 @@ void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact) ogs_assert(xact); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("[AA-Request]"); @@ -165,7 +165,7 @@ void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact) /* Update session state */ sess_data->sess = sess; - sess_data->xact = xact; + sess_data->xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -346,7 +346,6 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) int new; smf_sess_t *sess = NULL; - ogs_gtp_xact_t *xact = NULL; smf_event_t *e = NULL; ogs_diam_s6b_message_t *s6b_message = NULL; @@ -371,8 +370,6 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) sess = sess_data->sess; ogs_assert(sess); - xact = sess_data->xact; - ogs_assert(xact); s6b_message = ogs_calloc(1, sizeof(ogs_diam_s6b_message_t)); ogs_assert(s6b_message); @@ -442,8 +439,8 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) if (error && s6b_message->result_code == ER_DIAMETER_SUCCESS) s6b_message->result_code = error; - e->sess = sess; - e->gtp_xact = xact; + e->sess_id = sess->id; + e->gtp_xact_id = sess_data->xact_id; e->s6b_message = s6b_message; ret = ogs_queue_push(ogs_app()->queue, e); if (ret != OGS_OK) { @@ -516,9 +513,8 @@ void smf_s6b_send_str(smf_sess_t *sess, ogs_gtp_xact_t *xact, uint32_t cause) smf_ue_t *smf_ue = NULL; char *user_name = NULL; - //ogs_assert(xact); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_debug("[Session-Termination-Request]"); @@ -557,7 +553,7 @@ void smf_s6b_send_str(smf_sess_t *sess, ogs_gtp_xact_t *xact, uint32_t cause) /* Update session state */ sess_data->sess = sess; - sess_data->xact = xact; + sess_data->xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -666,6 +662,7 @@ static void smf_s6b_sta_cb(void *data, struct msg **msg) ogs_debug(" Retrieve its data: [%s]", sess_data->s6b_sid); sess = sess_data->sess; + ogs_assert(sess); s6b_message = ogs_calloc(1, sizeof(ogs_diam_s6b_message_t)); ogs_assert(s6b_message); @@ -736,7 +733,7 @@ static void smf_s6b_sta_cb(void *data, struct msg **msg) e = smf_event_new(SMF_EVT_S6B_MESSAGE); ogs_assert(e); - e->sess = sess; + e->sess_id = sess->id; e->s6b_message = s6b_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/smf/sbi-path.c b/src/smf/sbi-path.c index 805853004e..18153f3fd9 100644 --- a/src/smf/sbi-path.c +++ b/src/smf/sbi-path.c @@ -106,7 +106,7 @@ int smf_sbi_discover_and_send( target_nf_type = ogs_sbi_service_type_to_nf_type(service_type); ogs_assert(target_nf_type); ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(build); @@ -198,7 +198,7 @@ int smf_sbi_discover_and_send( } xact = ogs_sbi_xact_add( - 0, &sess->sbi, service_type, discovery_option, + sess->id, &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("smf_sbi_discover_and_send() failed"); @@ -243,7 +243,7 @@ void smf_namf_comm_send_n1_n2_message_transfer( int r; ogs_assert(sess); - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(param); @@ -256,7 +256,8 @@ void smf_namf_comm_send_n1_n2_message_transfer( discovery_option, sess->serving_nf_id); xact = ogs_sbi_xact_add( - 0, &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + sess->id, &sess->sbi, OGS_SBI_SERVICE_TYPE_NAMF_COMM, + discovery_option, (ogs_sbi_build_f)smf_namf_comm_build_n1_n2_message_transfer, sess, param); if (!xact) { diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index c66679fba8..555ad53ee3 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -79,6 +79,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_message_t sbi_message; ogs_sbi_xact_t *sbi_xact = NULL; ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_nas_5gs_message_t nas_message; ogs_pkbuf_t *pkbuf = NULL; @@ -118,7 +119,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pkbuf_free(recvbuf); break; } - e->gtp_xact = gtp_xact; + e->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; if (gtp2_message.h.teid_presence && gtp2_message.h.teid != 0) { sess = smf_sess_find_by_teid(gtp2_message.h.teid); @@ -164,7 +165,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) sess->sgw_s5c_teid, gtp2_sender_f_teid.teid_presence, gtp2_sender_f_teid.teid); - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: @@ -192,7 +193,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; } } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE: @@ -218,7 +219,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_error("TODO: NACK the message"); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE: @@ -260,7 +261,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pkbuf_free(recvbuf); break; } - e->gtp_xact = gtp_xact; + e->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; switch(gtp1_message.h.type) { case OGS_GTP1_ECHO_REQUEST_TYPE: @@ -284,7 +285,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_CAUSE_CONTEXT_NOT_FOUND); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP1_DELETE_PDP_CONTEXT_REQUEST_TYPE: @@ -296,7 +297,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) OGS_GTP1_CAUSE_NON_EXISTENT); break; } - e->sess = sess; + e->sess_id = sess->id; ogs_fsm_dispatch(&sess->sm, e); break; case OGS_GTP1_UPDATE_PDP_CONTEXT_REQUEST_TYPE: @@ -319,7 +320,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) gx_message = e->gx_message; ogs_assert(gx_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(gx_message->cmd_code) { @@ -354,7 +355,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) gy_message = e->gy_message; ogs_assert(gy_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(gy_message->cmd_code) { @@ -376,7 +377,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(e); s6b_message = e->s6b_message; ogs_assert(s6b_message); - sess = e->sess; + sess = smf_sess_find_by_id(e->sess_id); ogs_assert(sess); switch(s6b_message->cmd_code) { @@ -421,7 +422,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) } e->pfcp_message = pfcp_message; - e->pfcp_xact = pfcp_xact; + e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp2_message = NULL; if (pfcp_xact->gtpbuf) { @@ -579,11 +580,11 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) END if (sess) { - smf_ue = sess->smf_ue; + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message; ogs_fsm_dispatch(&sess->sm, e); } @@ -824,8 +825,9 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; } - sess = (smf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -835,16 +837,16 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - smf_ue = smf_ue_cycle(sess->smf_ue); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &sbi_message; ogs_fsm_dispatch(&sess->sm, e); @@ -867,8 +869,9 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; } - sess = (smf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sbi_object_id = sbi_xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -879,12 +882,12 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(sbi_object_id); if (!sess) { ogs_error("Session has already been removed"); break; } - smf_ue = smf_ue_cycle(sess->smf_ue); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); if (state == SMF_UECM_STATE_REGISTERED) { @@ -1055,8 +1058,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_5GSM_MESSAGE: - sess = e->sess; - ogs_assert(sess); pkbuf = e->pkbuf; ogs_assert(pkbuf); @@ -1066,8 +1067,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) return; } - ogs_assert(sess); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_error("Session has already been removed"); ogs_pkbuf_free(pkbuf); @@ -1081,14 +1081,11 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case SMF_EVT_NGAP_MESSAGE: - sess = e->sess; - ogs_assert(sess); pkbuf = e->pkbuf; ogs_assert(pkbuf); ogs_assert(e->ngap.type); - ogs_assert(sess); - sess = smf_sess_cycle(sess); + sess = smf_sess_find_by_id(e->sess_id); if (!sess) { ogs_error("Session has already been removed"); ogs_pkbuf_free(pkbuf); diff --git a/src/upf/context.c b/src/upf/context.c index 6c4690de73..b5311874d4 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -175,9 +175,8 @@ upf_sess_t *upf_sess_add(ogs_pfcp_f_seid_t *cp_f_seid) ogs_assert(cp_f_seid); - ogs_pool_alloc(&upf_sess_pool, &sess); + ogs_pool_id_calloc(&upf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_pfcp_pool_init(&sess->pfcp); @@ -244,7 +243,7 @@ int upf_sess_remove(upf_sess_t *sess) ogs_pfcp_pool_final(&sess->pfcp); ogs_pool_free(&upf_n4_seid_pool, sess->upf_n4_seid_node); - ogs_pool_free(&upf_sess_pool, sess); + ogs_pool_id_free(&upf_sess_pool, sess); if (sess->apn_dnn) ogs_free(sess->apn_dnn); upf_metrics_inst_global_dec(UPF_METR_GLOB_GAUGE_UPF_SESSIONNBR); @@ -352,6 +351,11 @@ upf_sess_t *upf_sess_find_by_ipv6(uint32_t *addr6) return ret; } +upf_sess_t *upf_sess_find_by_id(ogs_pool_id_t id) +{ + return ogs_pool_find_by_id(&upf_sess_pool, id); +} + upf_sess_t *upf_sess_add_by_message(ogs_pfcp_message_t *message) { upf_sess_t *sess = NULL; diff --git a/src/upf/context.h b/src/upf/context.h index 4dbb2a0653..ee44a52f25 100644 --- a/src/upf/context.h +++ b/src/upf/context.h @@ -100,6 +100,7 @@ typedef struct upf_sess_urr_acc_s { #define UPF_SESS(pfcp_sess) ogs_container_of(pfcp_sess, upf_sess_t, pfcp) typedef struct upf_sess_s { ogs_lnode_t lnode; + ogs_pool_id_t id; ogs_pool_id_t *upf_n4_seid_node; /* A node of UPF-N4-SEID */ ogs_pfcp_sess_t pfcp; @@ -141,6 +142,7 @@ upf_sess_t *upf_sess_find_by_smf_n4_f_seid(ogs_pfcp_f_seid_t *f_seid); upf_sess_t *upf_sess_find_by_upf_n4_seid(uint64_t seid); upf_sess_t *upf_sess_find_by_ipv4(uint32_t addr); upf_sess_t *upf_sess_find_by_ipv6(uint32_t *addr6); +upf_sess_t *upf_sess_find_by_id(ogs_pool_id_t id); uint8_t upf_sess_set_ue_ip(upf_sess_t *sess, uint8_t session_type, ogs_pfcp_pdr_t *pdr); diff --git a/src/upf/event.h b/src/upf/event.h index 44e012b330..d07e161566 100644 --- a/src/upf/event.h +++ b/src/upf/event.h @@ -49,7 +49,7 @@ typedef struct upf_event_s { ogs_pkbuf_t *pkbuf; ogs_pfcp_node_t *pfcp_node; - ogs_pfcp_xact_t *pfcp_xact; + ogs_pool_id_t pfcp_xact_id; ogs_pfcp_message_t *pfcp_message; } upf_event_t; diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index 0935e99228..c16762640d 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -270,11 +270,23 @@ int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact, static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) { + upf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; uint8_t type; ogs_assert(xact); type = xact->seq[0].type; + ogs_assert(data); + sess_id = OGS_POINTER_TO_UINT(data); + ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); + + sess = upf_sess_find_by_id(sess_id); + if (!sess) { + ogs_error("Session has already been removed [%d]", type); + return; + } + switch (type) { case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: ogs_error("No PFCP session report response"); @@ -302,7 +314,8 @@ int upf_pfcp_send_session_report_request( h.type = OGS_PFCP_SESSION_REPORT_REQUEST_TYPE; h.seid = sess->smf_n4_f_seid.seid; - xact = ogs_pfcp_xact_local_create(sess->pfcp_node, sess_timeout, sess); + xact = ogs_pfcp_xact_local_create( + sess->pfcp_node, sess_timeout, OGS_UINT_TO_POINTER(sess->id)); if (!xact) { ogs_error("ogs_pfcp_xact_local_create() failed"); return OGS_ERROR; diff --git a/src/upf/pfcp-sm.c b/src/upf/pfcp-sm.c index f7f788e308..7a1f74b947 100644 --- a/src/upf/pfcp-sm.c +++ b/src/upf/pfcp-sm.c @@ -122,7 +122,7 @@ void upf_pfcp_state_will_associate(ogs_fsm_t *s, upf_event_t *e) case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); switch (message->h.type) { @@ -204,7 +204,7 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; ogs_assert(message); - xact = e->pfcp_xact; + xact = ogs_pfcp_xact_find_by_id(e->pfcp_xact_id); ogs_assert(xact); if (message->h.seid_presence && message->h.seid != 0) diff --git a/src/upf/upf-sm.c b/src/upf/upf-sm.c index ea44efb1d9..a4e842546d 100644 --- a/src/upf/upf-sm.c +++ b/src/upf/upf-sm.c @@ -87,7 +87,7 @@ void upf_state_operational(ogs_fsm_t *s, upf_event_t *e) } e->pfcp_message = pfcp_message; - e->pfcp_xact = xact; + e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, upf_pfcp_state_exception)) { ogs_error("PFCP state machine exception"); From 976f2473b05defedd48346c353a720cf8e869eb8 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 30 Jun 2024 21:33:31 +0900 Subject: [PATCH 139/323] [POOL] refactor mem pool in AUSF/PCF/UDM (#3196) Removed ogs_pool_cycle() from AUSF/PCF/UDM memory pool and changed it to find by hash id. --- src/ausf/ausf-sm.c | 12 +++++---- src/ausf/context.c | 16 +++++------- src/ausf/context.h | 3 ++- src/ausf/event.h | 2 +- src/ausf/sbi-path.c | 5 +++- src/ausf/ue-sm.c | 12 ++++----- src/pcf/am-sm.c | 6 ++--- src/pcf/context.c | 34 ++++++++++++------------ src/pcf/context.h | 8 +++--- src/pcf/event.h | 4 +-- src/pcf/nbsf-build.c | 4 +-- src/pcf/nbsf-handler.c | 4 +-- src/pcf/nnrf-handler.c | 11 +++++--- src/pcf/npcf-handler.c | 8 +++--- src/pcf/nudr-build.c | 2 +- src/pcf/nudr-handler.c | 2 +- src/pcf/pcf-sm.c | 59 +++++++++++++++++++++++------------------- src/pcf/sbi-path.c | 14 ++++++---- src/pcf/sm-sm.c | 18 ++++++------- src/udm/context.c | 40 ++++++++++++++-------------- src/udm/context.h | 8 +++--- src/udm/event.h | 4 +-- src/udm/nnrf-handler.c | 11 +++++--- src/udm/nudm-handler.c | 4 +-- src/udm/nudr-build.c | 4 +-- src/udm/nudr-handler.c | 2 +- src/udm/sbi-path.c | 18 +++++++++---- src/udm/sess-sm.c | 8 +++--- src/udm/udm-sm.c | 26 +++++++++++-------- src/udm/ue-sm.c | 6 ++--- 30 files changed, 196 insertions(+), 159 deletions(-) diff --git a/src/ausf/ausf-sm.c b/src/ausf/ausf-sm.c index 40bd029826..4790a80e6b 100644 --- a/src/ausf/ausf-sm.c +++ b/src/ausf/ausf-sm.c @@ -50,6 +50,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; ausf_ue_t *ausf_ue = NULL; + ogs_pool_id_t ausf_ue_id = OGS_INVALID_POOL_ID; ausf_sm_debug(e); @@ -164,7 +165,7 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(OGS_FSM_STATE(&ausf_ue->sm)); - e->ausf_ue = ausf_ue; + e->ausf_ue_id = ausf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&ausf_ue->sm, e); if (OGS_FSM_CHECK(&ausf_ue->sm, ausf_ue_state_exception)) { @@ -326,8 +327,9 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) break; } - ausf_ue = (ausf_ue_t *)sbi_xact->sbi_object; - ogs_assert(ausf_ue); + ausf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(ausf_ue_id >= OGS_MIN_POOL_ID && + ausf_ue_id <= OGS_MAX_POOL_ID); ogs_assert(sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID); @@ -335,13 +337,13 @@ void ausf_state_operational(ogs_fsm_t *s, ausf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - ausf_ue = ausf_ue_cycle(ausf_ue); + ausf_ue = ausf_ue_find_by_id(ausf_ue_id); if (!ausf_ue) { ogs_error("UE(ausf-ue) Context has already been removed"); break; } - e->ausf_ue = ausf_ue; + e->ausf_ue_id = ausf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&ausf_ue->sm, e); diff --git a/src/ausf/context.c b/src/ausf/context.c index 06cfa209b1..4b2bc8d179 100644 --- a/src/ausf/context.c +++ b/src/ausf/context.c @@ -131,13 +131,11 @@ ausf_ue_t *ausf_ue_add(char *suci) ogs_assert(suci); - ogs_pool_alloc(&ausf_ue_pool, &ausf_ue); + ogs_pool_id_calloc(&ausf_ue_pool, &ausf_ue); if (!ausf_ue) { - ogs_error("ogs_pool_alloc() failed"); + ogs_error("ogs_pool_id_calloc() failed"); return NULL; } - ogs_assert(ausf_ue); - memset(ausf_ue, 0, sizeof *ausf_ue); ausf_ue->ctx_id = ogs_msprintf("%d", (int)ogs_pool_index(&ausf_ue_pool, ausf_ue)); @@ -148,7 +146,7 @@ ausf_ue_t *ausf_ue_add(char *suci) ogs_hash_set(self.suci_hash, ausf_ue->suci, strlen(ausf_ue->suci), ausf_ue); memset(&e, 0, sizeof(e)); - e.ausf_ue = ausf_ue; + e.ausf_ue_id = ausf_ue->id; ogs_fsm_init(&ausf_ue->sm, ausf_ue_state_initial, ausf_ue_state_final, &e); ogs_list_add(&self.ausf_ue_list, ausf_ue); @@ -165,7 +163,7 @@ void ausf_ue_remove(ausf_ue_t *ausf_ue) ogs_list_remove(&self.ausf_ue_list, ausf_ue); memset(&e, 0, sizeof(e)); - e.ausf_ue = ausf_ue; + e.ausf_ue_id = ausf_ue->id; ogs_fsm_fini(&ausf_ue->sm, &e); /* Free SBI object memory */ @@ -191,7 +189,7 @@ void ausf_ue_remove(ausf_ue_t *ausf_ue) if (ausf_ue->serving_network_name) ogs_free(ausf_ue->serving_network_name); - ogs_pool_free(&ausf_ue_pool, ausf_ue); + ogs_pool_id_free(&ausf_ue_pool, ausf_ue); } void ausf_ue_remove_all(void) @@ -229,9 +227,9 @@ ausf_ue_t *ausf_ue_find_by_ctx_id(char *ctx_id) return ogs_pool_find(&ausf_ue_pool, atoll(ctx_id)); } -ausf_ue_t *ausf_ue_cycle(ausf_ue_t *ausf_ue) +ausf_ue_t *ausf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&ausf_ue_pool, ausf_ue); + return ogs_pool_find_by_id(&ausf_ue_pool, id); } int get_ue_load(void) diff --git a/src/ausf/context.h b/src/ausf/context.h index ab76f48a63..e885d6f8ab 100644 --- a/src/ausf/context.h +++ b/src/ausf/context.h @@ -44,6 +44,7 @@ typedef struct ausf_context_s { struct ausf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *ctx_id; @@ -93,8 +94,8 @@ ausf_ue_t *ausf_ue_find_by_suci(char *suci); ausf_ue_t *ausf_ue_find_by_supi(char *supi); ausf_ue_t *ausf_ue_find_by_suci_or_supi(char *suci_or_supi); ausf_ue_t *ausf_ue_find_by_ctx_id(char *ctx_id); +ausf_ue_t *ausf_ue_find_by_id(ogs_pool_id_t id); -ausf_ue_t *ausf_ue_cycle(ausf_ue_t *ausf_ue); int get_ue_load(void); #ifdef __cplusplus diff --git a/src/ausf/event.h b/src/ausf/event.h index 413c0b3d82..fa6461e325 100644 --- a/src/ausf/event.h +++ b/src/ausf/event.h @@ -31,7 +31,7 @@ typedef struct ausf_ue_s ausf_ue_t; typedef struct ausf_event_s { ogs_event_t h; - ausf_ue_t *ausf_ue; + ogs_pool_id_t ausf_ue_id; } ausf_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(ausf_event_t)); diff --git a/src/ausf/sbi-path.c b/src/ausf/sbi-path.c index 5c5c966cfb..0471a759b7 100644 --- a/src/ausf/sbi-path.c +++ b/src/ausf/sbi-path.c @@ -88,8 +88,11 @@ int ausf_sbi_discover_and_send( ogs_assert(stream); ogs_assert(build); + ogs_assert(ausf_ue->id >= OGS_MIN_POOL_ID && + ausf_ue->id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - 0, &ausf_ue->sbi, service_type, discovery_option, + ausf_ue->id, &ausf_ue->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, ausf_ue, data); if (!xact) { ogs_error("ausf_sbi_discover_and_send() failed"); diff --git a/src/ausf/ue-sm.c b/src/ausf/ue-sm.c index df204bd8f8..86fd9b03f3 100644 --- a/src/ausf/ue-sm.c +++ b/src/ausf/ue-sm.c @@ -31,7 +31,7 @@ void ausf_ue_state_initial(ogs_fsm_t *s, ausf_event_t *e) ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); OGS_FSM_TRAN(s, &ausf_ue_state_operational); @@ -46,7 +46,7 @@ void ausf_ue_state_final(ogs_fsm_t *s, ausf_event_t *e) ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); } @@ -64,7 +64,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) { @@ -152,7 +152,7 @@ void ausf_ue_state_operational(ogs_fsm_t *s, ausf_event_t *e) message = e->h.sbi.message; ogs_assert(message); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -242,7 +242,7 @@ void ausf_ue_state_deleted(ogs_fsm_t *s, ausf_event_t *e) ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) { @@ -266,7 +266,7 @@ void ausf_ue_state_exception(ogs_fsm_t *s, ausf_event_t *e) ausf_sm_debug(e); - ausf_ue = e->ausf_ue; + ausf_ue = ausf_ue_find_by_id(e->ausf_ue_id); ogs_assert(ausf_ue); switch (e->h.id) { diff --git a/src/pcf/am-sm.c b/src/pcf/am-sm.c index d29d5e0c2a..289abadb3b 100644 --- a/src/pcf/am-sm.c +++ b/src/pcf/am-sm.c @@ -48,7 +48,7 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -177,7 +177,7 @@ void pcf_am_state_deleted(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -201,7 +201,7 @@ void pcf_am_state_exception(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - pcf_ue = e->pcf_ue; + pcf_ue = pcf_ue_find_by_id(e->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { diff --git a/src/pcf/context.c b/src/pcf/context.c index 5514649825..3deecdc425 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -331,9 +331,8 @@ pcf_ue_t *pcf_ue_add(char *supi) ogs_assert(supi); - ogs_pool_alloc(&pcf_ue_pool, &pcf_ue); + ogs_pool_id_calloc(&pcf_ue_pool, &pcf_ue); ogs_assert(pcf_ue); - memset(pcf_ue, 0, sizeof *pcf_ue); /* SBI Type */ pcf_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE; @@ -351,7 +350,7 @@ pcf_ue_t *pcf_ue_add(char *supi) ogs_hash_set(self.supi_hash, pcf_ue->supi, strlen(pcf_ue->supi), pcf_ue); memset(&e, 0, sizeof(e)); - e.pcf_ue = pcf_ue; + e.pcf_ue_id = pcf_ue->id; ogs_fsm_init(&pcf_ue->sm, pcf_am_state_initial, pcf_am_state_final, &e); ogs_list_add(&self.pcf_ue_list, pcf_ue); @@ -368,7 +367,7 @@ void pcf_ue_remove(pcf_ue_t *pcf_ue) ogs_list_remove(&self.pcf_ue_list, pcf_ue); memset(&e, 0, sizeof(e)); - e.pcf_ue = pcf_ue; + e.pcf_ue_id = pcf_ue->id; ogs_fsm_fini(&pcf_ue->sm, &e); /* Free SBI object memory */ @@ -400,7 +399,7 @@ void pcf_ue_remove(pcf_ue_t *pcf_ue) if (pcf_ue->pei) ogs_free(pcf_ue->pei); - ogs_pool_free(&pcf_ue_pool, pcf_ue); + ogs_pool_id_free(&pcf_ue_pool, pcf_ue); } void pcf_ue_remove_all(void) @@ -431,9 +430,8 @@ pcf_sess_t *pcf_sess_add(pcf_ue_t *pcf_ue, uint8_t psi) ogs_assert(pcf_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&pcf_sess_pool, &sess); + ogs_pool_id_calloc(&pcf_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); ogs_list_init(&sess->app_list); @@ -456,14 +454,14 @@ pcf_sess_t *pcf_sess_add(pcf_ue_t *pcf_ue, uint8_t psi) (int)ogs_pool_index(&pcf_sess_pool, sess)); ogs_assert(sess->sm_policy_id); - sess->pcf_ue = pcf_ue; + sess->pcf_ue_id = pcf_ue->id; sess->psi = psi; sess->s_nssai.sst = 0; sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, pcf_sm_state_initial, pcf_sm_state_final, &e); ogs_list_add(&pcf_ue->sess_list, sess); @@ -474,14 +472,16 @@ pcf_sess_t *pcf_sess_add(pcf_ue_t *pcf_ue, uint8_t psi) void pcf_sess_remove(pcf_sess_t *sess) { pcf_event_t e; + pcf_ue_t *pcf_ue = NULL; ogs_assert(sess); - ogs_assert(sess->pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); + ogs_assert(pcf_ue); - ogs_list_remove(&sess->pcf_ue->sess_list, sess); + ogs_list_remove(&pcf_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); /* Free SBI object memory */ @@ -520,7 +520,7 @@ void pcf_sess_remove(pcf_sess_t *sess) if (sess->subscribed_default_qos) OpenAPI_subscribed_default_qos_free(sess->subscribed_default_qos); - ogs_pool_free(&pcf_sess_pool, sess); + ogs_pool_id_free(&pcf_sess_pool, sess); } void pcf_sess_remove_all(pcf_ue_t *pcf_ue) @@ -710,14 +710,14 @@ pcf_sess_t *pcf_sess_find_by_ipv6prefix(char *ipv6prefix_string) &ipv6prefix, (ipv6prefix.len >> 3) + 1); } -pcf_ue_t *pcf_ue_cycle(pcf_ue_t *pcf_ue) +pcf_ue_t *pcf_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pcf_ue_pool, pcf_ue); + return ogs_pool_find_by_id(&pcf_ue_pool, id); } -pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess) +pcf_sess_t *pcf_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&pcf_sess_pool, sess); + return ogs_pool_find_by_id(&pcf_sess_pool, id); } pcf_app_t *pcf_app_add(pcf_sess_t *sess) diff --git a/src/pcf/context.h b/src/pcf/context.h index b8756390d0..7eda1ed8f4 100644 --- a/src/pcf/context.h +++ b/src/pcf/context.h @@ -47,6 +47,7 @@ typedef struct pcf_context_s { struct pcf_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *association_id; @@ -75,6 +76,7 @@ struct pcf_ue_s { struct pcf_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; char *sm_policy_id; @@ -154,7 +156,7 @@ struct pcf_sess_s { ogs_list_t app_list; /* Related Context */ - pcf_ue_t *pcf_ue; + ogs_pool_id_t pcf_ue_id; }; typedef struct pcf_app_s { @@ -202,8 +204,8 @@ pcf_sess_t *pcf_sess_find_by_ipv6prefix(char *ipv6prefix_string); int pcf_sessions_number_by_snssai_and_dnn( pcf_ue_t *pcf_ue, ogs_s_nssai_t *s_nssai, char *dnn); -pcf_ue_t *pcf_ue_cycle(pcf_ue_t *pcf_ue); -pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess); +pcf_ue_t *pcf_ue_find_by_id(ogs_pool_id_t id); +pcf_sess_t *pcf_sess_find_by_id(ogs_pool_id_t id); pcf_app_t *pcf_app_add(pcf_sess_t *sess); int pcf_app_remove(pcf_app_t *app); diff --git a/src/pcf/event.h b/src/pcf/event.h index 38e2a6f7fb..9ecadf287e 100644 --- a/src/pcf/event.h +++ b/src/pcf/event.h @@ -33,8 +33,8 @@ typedef struct pcf_app_s pcf_app_t; typedef struct pcf_event_s { ogs_event_t h; - pcf_ue_t *pcf_ue; - pcf_sess_t *sess; + ogs_pool_id_t pcf_ue_id; + ogs_pool_id_t sess_id; pcf_app_t *app; } pcf_event_t; diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index 9dc7850047..81680eddba 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -38,7 +38,7 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( int i; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); nf_instance = data; @@ -187,7 +187,7 @@ ogs_sbi_request_t *pcf_nbsf_management_build_de_register( ogs_sbi_request_t *request = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(sess->binding.resource_uri); diff --git a/src/pcf/nbsf-handler.c b/src/pcf/nbsf-handler.c index 9176efc423..7cb5a28a9b 100644 --- a/src/pcf/nbsf-handler.c +++ b/src/pcf/nbsf-handler.c @@ -70,7 +70,7 @@ bool pcf_nbsf_management_handle_register( ogs_sockaddr_t *addr = NULL, *addr6 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream); @@ -423,7 +423,7 @@ bool pcf_nbsf_management_handle_register( if (SmPolicyDecision.supp_feat) ogs_free(SmPolicyDecision.supp_feat); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_CTR_PA_POLICYSMASSOSUCC, 1); OGS_SESSION_DATA_FREE(&session_data); diff --git a/src/pcf/nnrf-handler.c b/src/pcf/nnrf-handler.c index 64ab2c487b..ca5d6ea667 100644 --- a/src/pcf/nnrf-handler.c +++ b/src/pcf/nnrf-handler.c @@ -26,6 +26,7 @@ void pcf_nnrf_handle_nf_discover( int r; ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_sbi_stream_t *stream = NULL; @@ -48,6 +49,10 @@ void pcf_nnrf_handle_nf_discover( requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); + sbi_object_id = xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + discovery_option = xact->discovery_option; if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && @@ -61,12 +66,12 @@ void pcf_nnrf_handle_nf_discover( } if (sbi_object->type == OGS_SBI_OBJ_UE_TYPE) { - pcf_ue = (pcf_ue_t *)sbi_object; + pcf_ue = pcf_ue_find_by_id(sbi_object_id); ogs_assert(pcf_ue); } else if (sbi_object->type == OGS_SBI_OBJ_SESS_TYPE) { - sess = (pcf_sess_t *)sbi_object; + sess = pcf_sess_find_by_id(sbi_object_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); } else { ogs_fatal("(NF discover) Not implemented [%s:%d]", diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index 6065905420..845fcdd7a4 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -235,7 +235,7 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, char *home_network_domain = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(message); @@ -580,7 +580,7 @@ bool pcf_npcf_smpolicycontrol_handle_delete(pcf_sess_t *sess, OpenAPI_sm_policy_delete_data_t *SmPolicyDeleteData = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(message); @@ -681,7 +681,7 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(stream); ogs_assert(recvmsg); @@ -1188,7 +1188,7 @@ bool pcf_npcf_policyauthorization_handle_update( OpenAPI_lnode_t *node = NULL, *node2 = NULL, *node3 = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(app_session); ogs_assert(stream); ogs_assert(recvmsg); diff --git a/src/pcf/nudr-build.c b/src/pcf/nudr-build.c index fc99b9f34d..4a96994abd 100644 --- a/src/pcf/nudr-build.c +++ b/src/pcf/nudr-build.c @@ -51,7 +51,7 @@ ogs_sbi_request_t *pcf_nudr_dr_build_query_sm_data( ogs_sbi_request_t *request = NULL; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); memset(&message, 0, sizeof(message)); diff --git a/src/pcf/nudr-handler.c b/src/pcf/nudr-handler.c index c800dc8b94..16d724ae98 100644 --- a/src/pcf/nudr-handler.c +++ b/src/pcf/nudr-handler.c @@ -193,7 +193,7 @@ bool pcf_nudr_dr_handle_query_sm_data( int r; ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream); diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 25f9e92466..7354c67d36 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -54,7 +54,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; pcf_ue_t *pcf_ue = NULL; + ogs_pool_id_t pcf_ue_id = OGS_INVALID_POOL_ID; pcf_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; pcf_app_t *app_session = NULL; pcf_sm_debug(e); @@ -169,7 +171,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(OGS_FSM_STATE(&pcf_ue->sm)); - e->pcf_ue = pcf_ue; + e->pcf_ue_id = pcf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&pcf_ue->sm, e); if (OGS_FSM_CHECK(&pcf_ue->sm, pcf_am_state_exception)) { @@ -274,7 +276,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { @@ -324,7 +326,7 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->app = app_session; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -492,8 +494,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) break; } - pcf_ue = (pcf_ue_t *)sbi_xact->sbi_object; - ogs_assert(pcf_ue); + pcf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(pcf_ue_id >= OGS_MIN_POOL_ID && + pcf_ue_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -502,14 +505,14 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(pcf_ue_id); if (!pcf_ue) { ogs_error("UE(pcf_ue) Context " "has already been removed"); break; } - e->pcf_ue = pcf_ue; + e->pcf_ue_id = pcf_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&pcf_ue->sm, e); @@ -534,8 +537,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) break; } - sess = (pcf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -544,18 +548,16 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - sess = pcf_sess_cycle(sess); + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; } - pcf_ue = sess->pcf_ue; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -597,8 +599,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) break; } - sess = (pcf_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -606,18 +609,16 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) ogs_sbi_xact_remove(sbi_xact); - sess = pcf_sess_cycle(sess); + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; } - pcf_ue = sess->pcf_ue; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -751,9 +752,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) switch(sbi_object->type) { case OGS_SBI_OBJ_UE_TYPE: - pcf_ue = (pcf_ue_t *)sbi_object; - ogs_assert(pcf_ue); - pcf_ue = pcf_ue_cycle(pcf_ue); + pcf_ue_id = sbi_xact->sbi_object_id; + ogs_assert(pcf_ue_id >= OGS_MIN_POOL_ID && + pcf_ue_id <= OGS_MAX_POOL_ID); + + pcf_ue = pcf_ue_find_by_id(pcf_ue_id); if (!pcf_ue) { ogs_error("UE(pcf_ue) has already been removed"); break; @@ -762,9 +765,11 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) break; case OGS_SBI_OBJ_SESS_TYPE: - sess = (pcf_sess_t *)sbi_object; - ogs_assert(sess); - sess = pcf_sess_cycle(sess); + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); + + sess = pcf_sess_find_by_id(sess_id); if (!sess) { ogs_error("Session has already been removed"); break; diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index cb0c9f361c..fe18a40262 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -124,6 +124,7 @@ bool pcf_sbi_send_request( } static int pcf_sbi_discover_and_send( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -138,8 +139,11 @@ static int pcf_sbi_discover_and_send( ogs_assert(stream); ogs_assert(build); + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - 0, sbi_object, service_type, discovery_option, + sbi_object_id, sbi_object, service_type, discovery_option, build, context, data); if (!xact) { ogs_error("ogs_sbi_xact_add() failed"); @@ -171,8 +175,8 @@ int pcf_ue_sbi_discover_and_send( int r; r = pcf_sbi_discover_and_send( - &pcf_ue->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, pcf_ue, stream, data); + pcf_ue->id, &pcf_ue->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, pcf_ue, stream, data); if (r != OGS_OK) { ogs_error("pcf_ue_sbi_discover_and_send() failed"); ogs_assert(true == @@ -219,8 +223,8 @@ int pcf_sess_sbi_discover_and_send( int r; r = pcf_sbi_discover_and_send( - &sess->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, sess, stream, data); + sess->id, &sess->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, sess, stream, data); if (r != OGS_OK) { ogs_error("pcf_sess_sbi_discover_and_send() failed"); ogs_assert(true == diff --git a/src/pcf/sm-sm.c b/src/pcf/sm-sm.c index 6e48aa1ec6..edd0f07fab 100644 --- a/src/pcf/sm-sm.c +++ b/src/pcf/sm-sm.c @@ -50,9 +50,9 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { @@ -334,15 +334,14 @@ void pcf_sm_state_deleted(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_assert(sess->pcf_ue); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_GAUGE_PA_SESSIONNBR, -1); break; @@ -366,15 +365,14 @@ void pcf_sm_state_exception(ogs_fsm_t *s, pcf_event_t *e) pcf_sm_debug(e); - sess = e->sess; + sess = pcf_sess_find_by_id(e->sess_id); ogs_assert(sess); - pcf_ue = sess->pcf_ue; + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_assert(sess->pcf_ue); - pcf_metrics_inst_by_slice_add(&sess->pcf_ue->guami.plmn_id, + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, &sess->s_nssai, PCF_METR_GAUGE_PA_SESSIONNBR, -1); break; diff --git a/src/udm/context.c b/src/udm/context.c index 7f20796247..a3de76a271 100644 --- a/src/udm/context.c +++ b/src/udm/context.c @@ -151,12 +151,11 @@ udm_ue_t *udm_ue_add(char *suci) ogs_assert(suci); - ogs_pool_alloc(&udm_ue_pool, &udm_ue); + ogs_pool_id_calloc(&udm_ue_pool, &udm_ue); if (!udm_ue) { ogs_error("No memory pool [%s]", suci); return NULL; } - memset(udm_ue, 0, sizeof *udm_ue); /* SBI Type */ udm_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE; @@ -165,7 +164,7 @@ udm_ue_t *udm_ue_add(char *suci) (int)ogs_pool_index(&udm_ue_pool, udm_ue)); if (!udm_ue->ctx_id) { ogs_error("No memory for udm_ue->ctx_id [%s]", suci); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -173,7 +172,7 @@ udm_ue_t *udm_ue_add(char *suci) if (!udm_ue->suci) { ogs_error("No memory for udm_ue->suci [%s]", suci); ogs_free(udm_ue->ctx_id); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -182,7 +181,7 @@ udm_ue_t *udm_ue_add(char *suci) ogs_error("No memory for udm_ue->supi [%s]", suci); ogs_free(udm_ue->suci); ogs_free(udm_ue->ctx_id); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); return NULL; } @@ -190,7 +189,7 @@ udm_ue_t *udm_ue_add(char *suci) ogs_hash_set(self.supi_hash, udm_ue->supi, strlen(udm_ue->supi), udm_ue); memset(&e, 0, sizeof(e)); - e.udm_ue = udm_ue; + e.udm_ue_id = udm_ue->id; ogs_fsm_init(&udm_ue->sm, udm_ue_state_initial, udm_ue_state_final, &e); ogs_list_add(&self.udm_ue_list, udm_ue); @@ -207,7 +206,7 @@ void udm_ue_remove(udm_ue_t *udm_ue) ogs_list_remove(&self.udm_ue_list, udm_ue); memset(&e, 0, sizeof(e)); - e.udm_ue = udm_ue; + e.udm_ue_id = udm_ue->id; ogs_fsm_fini(&udm_ue->sm, &e); /* Free SBI object memory */ @@ -240,7 +239,7 @@ void udm_ue_remove(udm_ue_t *udm_ue) if (udm_ue->dereg_callback_uri) ogs_free(udm_ue->dereg_callback_uri); - ogs_pool_free(&udm_ue_pool, udm_ue); + ogs_pool_id_free(&udm_ue_pool, udm_ue); } void udm_ue_remove_all(void) @@ -286,18 +285,17 @@ udm_sess_t *udm_sess_add(udm_ue_t *udm_ue, uint8_t psi) ogs_assert(udm_ue); ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED); - ogs_pool_alloc(&udm_sess_pool, &sess); + ogs_pool_id_calloc(&udm_sess_pool, &sess); ogs_assert(sess); - memset(sess, 0, sizeof *sess); /* SBI Type */ sess->sbi.type = OGS_SBI_OBJ_SESS_TYPE; - sess->udm_ue = udm_ue; + sess->udm_ue_id = udm_ue->id; sess->psi = psi; memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_init(&sess->sm, udm_sess_state_initial, udm_sess_state_final, &e); ogs_list_add(&udm_ue->sess_list, sess); @@ -308,14 +306,16 @@ udm_sess_t *udm_sess_add(udm_ue_t *udm_ue, uint8_t psi) void udm_sess_remove(udm_sess_t *sess) { udm_event_t e; + udm_ue_t *udm_ue = NULL; ogs_assert(sess); - ogs_assert(sess->udm_ue); + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); + ogs_assert(udm_ue); - ogs_list_remove(&sess->udm_ue->sess_list, sess); + ogs_list_remove(&udm_ue->sess_list, sess); memset(&e, 0, sizeof(e)); - e.sess = sess; + e.sess_id = sess->id; ogs_fsm_fini(&sess->sm, &e); /* Free SBI object memory */ @@ -329,7 +329,7 @@ void udm_sess_remove(udm_sess_t *sess) if (sess->smf_instance_id) ogs_free(sess->smf_instance_id); - ogs_pool_free(&udm_sess_pool, sess); + ogs_pool_id_free(&udm_sess_pool, sess); } void udm_sess_remove_all(udm_ue_t *udm_ue) @@ -352,14 +352,14 @@ udm_sess_t *udm_sess_find_by_psi(udm_ue_t *udm_ue, uint8_t psi) return NULL; } -udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue) +udm_ue_t *udm_ue_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&udm_ue_pool, udm_ue); + return ogs_pool_find_by_id(&udm_ue_pool, id); } -udm_sess_t *udm_sess_cycle(udm_sess_t *sess) +udm_sess_t *udm_sess_find_by_id(ogs_pool_id_t id) { - return ogs_pool_cycle(&udm_sess_pool, sess); + return ogs_pool_find_by_id(&udm_sess_pool, id); } udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue) diff --git a/src/udm/context.h b/src/udm/context.h index 791b5d1f21..535fafbb1e 100644 --- a/src/udm/context.h +++ b/src/udm/context.h @@ -46,6 +46,7 @@ typedef struct udm_context_s { struct udm_ue_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; OpenAPI_auth_event_t *auth_event; @@ -78,6 +79,7 @@ struct udm_ue_s { struct udm_sess_s { ogs_sbi_object_t sbi; + ogs_pool_id_t id; ogs_fsm_t sm; uint8_t psi; /* PDU Session Identity */ @@ -87,7 +89,7 @@ struct udm_sess_s { char *smf_instance_id; /* Related Context */ - udm_ue_t *udm_ue; + ogs_pool_id_t udm_ue_id; }; typedef struct udm_sdm_subscription_s { @@ -118,8 +120,8 @@ void udm_sess_remove(udm_sess_t *sess); void udm_sess_remove_all(udm_ue_t *udm_ue); udm_sess_t *udm_sess_find_by_psi(udm_ue_t *udm_ue, uint8_t psi); -udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue); -udm_sess_t *udm_sess_cycle(udm_sess_t *sess); +udm_ue_t *udm_ue_find_by_id(ogs_pool_id_t id); +udm_sess_t *udm_sess_find_by_id(ogs_pool_id_t id); udm_sdm_subscription_t *udm_sdm_subscription_add(udm_ue_t *udm_ue); void udm_sdm_subscription_remove(udm_sdm_subscription_t *subscription); diff --git a/src/udm/event.h b/src/udm/event.h index fa2039e77d..b1ceead8fd 100644 --- a/src/udm/event.h +++ b/src/udm/event.h @@ -32,8 +32,8 @@ typedef struct udm_sess_s udm_sess_t; typedef struct udm_event_s { ogs_event_t h; - udm_ue_t *udm_ue; - udm_sess_t *sess; + ogs_pool_id_t udm_ue_id; + ogs_pool_id_t sess_id; } udm_event_t; OGS_STATIC_ASSERT(OGS_EVENT_SIZE >= sizeof(udm_event_t)); diff --git a/src/udm/nnrf-handler.c b/src/udm/nnrf-handler.c index 0c5cafb600..ce60056e5a 100644 --- a/src/udm/nnrf-handler.c +++ b/src/udm/nnrf-handler.c @@ -25,6 +25,7 @@ void udm_nnrf_handle_nf_discover( { ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_object_t *sbi_object = NULL; + ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; @@ -46,6 +47,10 @@ void udm_nnrf_handle_nf_discover( requester_nf_type = xact->requester_nf_type; ogs_assert(requester_nf_type); + sbi_object_id = xact->sbi_object_id; + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + discovery_option = xact->discovery_option; SearchResult = recvmsg->SearchResult; @@ -55,12 +60,12 @@ void udm_nnrf_handle_nf_discover( } if (sbi_object->type == OGS_SBI_OBJ_UE_TYPE) { - udm_ue = (udm_ue_t *)sbi_object; + udm_ue = udm_ue_find_by_id(sbi_object_id); ogs_assert(udm_ue); } else if (sbi_object->type == OGS_SBI_OBJ_SESS_TYPE) { - sess = (udm_sess_t *)sbi_object; + sess = udm_sess_find_by_id(sbi_object_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); } else { ogs_fatal("(NF discover) Not implemented [%s:%d]", diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 4f2923b320..45b3848c06 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -530,7 +530,7 @@ bool udm_nudm_uecm_handle_smf_registration( ogs_assert(message); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); SmfRegistration = message->SmfRegistration; @@ -604,7 +604,7 @@ bool udm_nudm_uecm_handle_smf_deregistration( ogs_assert(message); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); r = udm_sess_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL, diff --git a/src/udm/nudr-build.c b/src/udm/nudr-build.c index d32b3d37f0..ae0683a3a7 100644 --- a/src/udm/nudr-build.c +++ b/src/udm/nudr-build.c @@ -256,7 +256,7 @@ ogs_sbi_request_t *udm_nudr_dr_build_update_smf_context( ogs_sbi_request_t *request = NULL; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); memset(&message, 0, sizeof(message)); @@ -301,7 +301,7 @@ ogs_sbi_request_t *udm_nudr_dr_build_delete_smf_context( ogs_sbi_request_t *request = NULL; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); memset(&message, 0, sizeof(message)); diff --git a/src/udm/nudr-handler.c b/src/udm/nudr-handler.c index 0bd5a874c8..a6050bda69 100644 --- a/src/udm/nudr-handler.c +++ b/src/udm/nudr-handler.c @@ -754,7 +754,7 @@ bool udm_nudr_dr_handle_smf_registration( int status; ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); ogs_assert(stream); server = ogs_sbi_server_from_stream(stream); diff --git a/src/udm/sbi-path.c b/src/udm/sbi-path.c index 28d606d993..ad771e5227 100644 --- a/src/udm/sbi-path.c +++ b/src/udm/sbi-path.c @@ -97,6 +97,7 @@ bool udm_sbi_send_request( } static int udm_sbi_discover_and_send( + ogs_pool_id_t sbi_object_id, ogs_sbi_object_t *sbi_object, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -111,8 +112,11 @@ static int udm_sbi_discover_and_send( ogs_assert(stream); ogs_assert(build); + ogs_assert(sbi_object_id >= OGS_MIN_POOL_ID && + sbi_object_id <= OGS_MAX_POOL_ID); + xact = ogs_sbi_xact_add( - 0, sbi_object, service_type, discovery_option, + sbi_object_id, sbi_object, service_type, discovery_option, (ogs_sbi_build_f)build, context, data); if (!xact) { ogs_error("udm_sbi_discover_and_send() failed"); @@ -143,9 +147,11 @@ int udm_ue_sbi_discover_and_send( { int r; + ogs_assert(udm_ue->id >= OGS_MIN_POOL_ID && udm_ue->id <= OGS_MAX_POOL_ID); + r = udm_sbi_discover_and_send( - &udm_ue->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, udm_ue, stream, data); + udm_ue->id, &udm_ue->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, udm_ue, stream, data); if (r != OGS_OK) { ogs_error("udm_ue_sbi_discover_and_send() failed"); ogs_assert(true == @@ -166,9 +172,11 @@ int udm_sess_sbi_discover_and_send( { int r; + ogs_assert(sess->id >= OGS_MIN_POOL_ID && sess->id <= OGS_MAX_POOL_ID); + r = udm_sbi_discover_and_send( - &sess->sbi, service_type, discovery_option, - (ogs_sbi_build_f)build, sess, stream, data); + sess->id, &sess->sbi, service_type, discovery_option, + (ogs_sbi_build_f)build, sess, stream, data); if (r != OGS_OK) { ogs_error("udm_sess_sbi_discover_and_send() failed"); ogs_assert(true == diff --git a/src/udm/sess-sm.c b/src/udm/sess-sm.c index 7ab70c2edd..d341bb8d90 100644 --- a/src/udm/sess-sm.c +++ b/src/udm/sess-sm.c @@ -48,9 +48,9 @@ void udm_sess_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_sm_debug(e); - sess = e->sess; + sess = udm_sess_find_by_id(e->sess_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { @@ -179,9 +179,9 @@ void udm_sess_state_exception(ogs_fsm_t *s, udm_event_t *e) udm_sm_debug(e); - sess = e->sess; + sess = udm_sess_find_by_id(e->sess_id); ogs_assert(sess); - udm_ue = sess->udm_ue; + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { diff --git a/src/udm/udm-sm.c b/src/udm/udm-sm.c index fe0cd9d52b..309f73d1c8 100644 --- a/src/udm/udm-sm.c +++ b/src/udm/udm-sm.c @@ -51,7 +51,9 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_pool_id_t sbi_xact_id = OGS_INVALID_POOL_ID; udm_ue_t *udm_ue = NULL; + ogs_pool_id_t udm_ue_id = OGS_INVALID_POOL_ID; udm_sess_t *sess = NULL; + ogs_pool_id_t sess_id = OGS_INVALID_POOL_ID; udm_sm_debug(e); @@ -213,7 +215,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_assert(sess); ogs_assert(OGS_FSM_STATE(&sess->sm)); - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, udm_sess_state_exception)) { @@ -226,7 +228,7 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) DEFAULT ogs_assert(OGS_FSM_STATE(&udm_ue->sm)); - e->udm_ue = udm_ue; + e->udm_ue_id = udm_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&udm_ue->sm, e); if (OGS_FSM_CHECK(&udm_ue->sm, udm_ue_state_exception)) { @@ -401,8 +403,9 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) break; } - sess = (udm_sess_t *)sbi_xact->sbi_object; - ogs_assert(sess); + sess_id = sbi_xact->sbi_object_id; + ogs_assert(sess_id >= OGS_MIN_POOL_ID && + sess_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -411,19 +414,19 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_sbi_xact_remove(sbi_xact); - sess = udm_sess_cycle(sess); + sess = udm_sess_find_by_id(sess_id); if (!sess) { ogs_error("SESS Context has already been removed"); break; } - udm_ue = udm_ue_cycle(sess->udm_ue); + udm_ue = udm_ue_find_by_id(sess->udm_ue_id); if (!udm_ue) { ogs_error("UE Context has already been removed"); break; } - e->sess = sess; + e->sess_id = sess->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); @@ -449,8 +452,9 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) break; } - udm_ue = (udm_ue_t *)sbi_xact->sbi_object; - ogs_assert(udm_ue); + udm_ue_id = sbi_xact->sbi_object_id; + ogs_assert(udm_ue_id >= OGS_MIN_POOL_ID && + udm_ue_id <= OGS_MAX_POOL_ID); if (sbi_xact->assoc_stream_id >= OGS_MIN_POOL_ID && sbi_xact->assoc_stream_id <= OGS_MAX_POOL_ID) @@ -459,13 +463,13 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e) ogs_sbi_xact_remove(sbi_xact); - udm_ue = udm_ue_cycle(udm_ue); + udm_ue = udm_ue_find_by_id(udm_ue_id); if (!udm_ue) { ogs_error("UE Context has already been removed"); break; } - e->udm_ue = udm_ue; + e->udm_ue_id = udm_ue->id; e->h.sbi.message = &message; ogs_fsm_dispatch(&udm_ue->sm, e); diff --git a/src/udm/ue-sm.c b/src/udm/ue-sm.c index 70bf789836..3e42618539 100644 --- a/src/udm/ue-sm.c +++ b/src/udm/ue-sm.c @@ -47,7 +47,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) udm_sm_debug(e); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { @@ -273,7 +273,7 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e) message = e->h.sbi.message; ogs_assert(message); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); @@ -346,7 +346,7 @@ void udm_ue_state_exception(ogs_fsm_t *s, udm_event_t *e) udm_sm_debug(e); - udm_ue = e->udm_ue; + udm_ue = udm_ue_find_by_id(e->udm_ue_id); ogs_assert(udm_ue); switch (e->h.id) { From 555c20c4c54f3825420551744511af21da9607c0 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 30 Jun 2024 21:35:50 +0900 Subject: [PATCH 140/323] [POOL] REMOVE ogs_pool_cycle() (#3196) --- lib/core/ogs-pool.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index b7bebeb826..daabb746cd 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -152,8 +152,6 @@ typedef int32_t ogs_pool_id_t; #define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) #define ogs_pool_find(pool, _index) \ (_index > 0 && _index <= (pool)->size) ? (pool)->index[_index-1] : NULL -#define ogs_pool_cycle(pool, node) \ - ogs_pool_find((pool), ogs_pool_index((pool), (node))) #define ogs_pool_id_calloc(pool, node) do { \ ogs_pool_alloc(pool, node); \ From 133fafa395537e2a3b02d5486972196efe6eb883 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 4 Jul 2024 17:37:16 +0900 Subject: [PATCH 141/323] [MME] Fixed Error Indication (#3302) We've encountered an issue where Downlink Data Notification Acks are not sent in the following situations. 1. SGW-U received Error Indication 2. SGW-U sends PFCP Report Request to SGW-C 3. SGW-C sends PFCP Report Response to SGW-U 4. SGW-C sends Downlink Data Notification to MME (MME Connected with eNB) 5. MME sends UEContextReleaseCommand to the eNB 6. eNB sends UEContextReleaseComplete to the MME 7. MME sends S1-Paging to the eNB 8. eNB sends Service-Request to the MME 9. MME sends InitialContextSetupRequest to the eNB 10. eNB sends InitialContextSetupResponse to the MME Here, MME needs to send Downlink Data Notification Acknowledge. So, we've fixed it --- src/mme/mme-s11-handler.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 0c335fd24c..dee828358d 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1645,6 +1645,8 @@ void mme_s11_handle_downlink_data_notification( enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); + MME_STORE_PAGING_INFO(mme_ue, + MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer->id); r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_S1_PAGING, 0); From a5d42541412d60db1ab0cf7e0a96c3d661fb17b4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 6 Jul 2024 15:59:25 +0900 Subject: [PATCH 142/323] [GTP] Error Indication with deleting bearer(#3302) We fixed an issue in #3302 where MME does not send Downlink Data Notification Acknowledge to SGW-C in Error Indication situation. However, it did not work properly when this occurred in conjunction with releasing the bearer as shown below. >>>Seesion-Termination in Diameter >>>SMF sends E-RABReleaseCommand and Deactivate EPS bearer request context 1. SGW-U received Error Indication 2. SGW-U sends PFCP Report Request to SGW-C 3. SGW-C sends PFCP Report Response to SGW-U 4. SGW-C sends Downlink Data Notification to MME (MME Connected with eNB) >>> eNB sends E-RABReleaseCommand >>> UE sends Deactivate EPS bearer context accept 5. MME sends UEContextReleaseCommand to the eNB 6. eNB sends UEContextReleaseComplete to the MME 7. MME sends S1-Paging to the eNB 8. eNB sends Service-Request to the MME 9. MME sends InitialContextSetupRequest to the eNB 10. eNB sends InitialContextSetupResponse to the MME No bearer context, so cannot send Downlink Data Notification Acknowledge So, we've fixed it as below. >>>Seesion-Termination in Diameter >>>SMF sends E-RABReleaseCommand and Deactivate EPS bearer request context 1. SGW-U received Error Indication 2. SGW-U sends PFCP Report Request to SGW-C 3. SGW-C sends PFCP Report Response to SGW-U 4. SGW-C sends Downlink Data Notification to MME (MME Connected with eNB) >>>>>>>> Since eNB Connected, we send Downlink Data Notification Acknowledge here. >>> eNB sends E-RABReleaseCommand >>> UE sends Deactivate EPS bearer context accept 5. MME sends UEContextReleaseCommand to the eNB 6. eNB sends UEContextReleaseComplete to the MME 7. MME sends S1-Paging to the eNB 8. eNB sends Service-Request to the MME 9. MME sends InitialContextSetupRequest to the eNB 10. eNB sends InitialContextSetupResponse to the MME --- src/mme/mme-s11-handler.c | 10 ++++------ src/sgwc/gtp-path.c | 4 ++-- src/sgwc/s11-handler.c | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index dee828358d..8d7bca452c 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1612,6 +1612,10 @@ void mme_s11_handle_downlink_data_notification( ogs_assert(r != OGS_ERROR); } else if (ECM_CONNECTED(mme_ue)) { MME_CLEAR_PAGING_INFO(mme_ue); + ogs_assert(OGS_OK == + mme_gtp_send_downlink_data_notification_ack( + bearer, OGS_GTP2_CAUSE_UE_ALREADY_RE_ATTACHED)); + if (cause_value == OGS_GTP2_CAUSE_ERROR_INDICATION_RECEIVED) { /* @@ -1645,17 +1649,11 @@ void mme_s11_handle_downlink_data_notification( enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); - MME_STORE_PAGING_INFO(mme_ue, - MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer->id); r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_S1_PAGING, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - } else { - ogs_assert(OGS_OK == - mme_gtp_send_downlink_data_notification_ack( - bearer, OGS_GTP2_CAUSE_UE_ALREADY_RE_ATTACHED)); } } } diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index eeddadf1a7..fc9be805bd 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -158,7 +158,7 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data) bearer = sgwc_bearer_find_by_id(bearer_id); if (!bearer) { - ogs_error("Bearer has already been removed [%d]", type); + ogs_error("Bearer[%d] has already been removed [%d]", bearer_id, type); return; } @@ -235,7 +235,7 @@ int sgwc_gtp_send_downlink_data_notification( ogs_assert(sgwc_ue); ogs_assert(sgwc_ue->gnode); - ogs_debug("Downlink Data Notification"); + ogs_debug("Downlink Data Notification [%d]", bearer->id); ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid); diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 21ff7dbdfa..5336c71e12 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -1309,7 +1309,7 @@ void sgwc_s11_handle_downlink_data_notification_ack( ogs_error("No Cause"); } - ogs_debug("Downlink Data Notification Acknowledge"); + ogs_debug("Downlink Data Notification Acknowledge [%d]", bearer->id); if (sgwc_ue) { ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid); From 3e1096316828ebf1d0dfff9946abab61473bfa71 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 6 Jul 2024 16:57:39 +0900 Subject: [PATCH 143/323] [MME/GTP] More fix to manage multiple GTP (#3251) Update Bearer Request Modify Bearer Context Request Modify Bearer Context Accept Update Bearer Response In the process above, we incorrectly used the Timer that the MME uses to wait for the eNB. We used xact's holding timer, which continues to hold the transaction for further exception handling even after sending the Update Bearer Response. This timer should end exactly when the Update Bearer Response is sent by the MME to the SGW-C. Therefore, we have added a new peer timer in xact for this purpose. --- lib/gtp/xact.c | 43 ++++++++++++++++++++++++++------------- lib/gtp/xact.h | 4 ++++ src/mme/mme-context.c | 1 + src/mme/mme-gtp-path.c | 7 +++++++ src/mme/mme-path.c | 8 ++++++++ src/mme/mme-s11-handler.c | 24 ++++++++++++++++------ 6 files changed, 67 insertions(+), 20 deletions(-) diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index f3adbc1f04..7f2ffd904e 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -41,6 +41,7 @@ static int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type); static void response_timeout(void *data); static void holding_timeout(void *data); +static void peer_timeout(void *data); int ogs_gtp_xact_init(void) { @@ -158,6 +159,9 @@ ogs_gtp_xact_t *ogs_gtp_xact_local_create(ogs_gtp_node_t *gnode, ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, xact); + ogs_assert(xact->tm_peer); + ogs_list_add(&xact->gnode->local_list, xact); rv = ogs_gtp_xact_update_tx(xact, hdesc, pkbuf); @@ -203,6 +207,9 @@ static ogs_gtp_xact_t *ogs_gtp_xact_remote_create(ogs_gtp_node_t *gnode, uint8_t ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, xact); + ogs_assert(xact->tm_peer); + ogs_list_add(&xact->gnode->remote_list, xact); ogs_debug("[%d] REMOTE Create peer [%s]:%d", @@ -800,24 +807,30 @@ static void holding_timeout(void *data) xact->step, xact->seq[xact->step-1].type, OGS_ADDR(&xact->gnode->addr, buf), OGS_PORT(&xact->gnode->addr)); - /* - * Even for remotely created transactions, there are things - * that need to be done, such as returning memory - * when the transaction is deleted after a holding timeout. - * We added a Callback Function for that purpose. - * - * You can set it up and use it as follows. - * - * xact->cb = gtp_remote_holding_timeout; - * xact->data = bearer; - */ - if (xact->cb) - xact->cb(xact, xact->data); - ogs_gtp_xact_delete(xact); } } +static void peer_timeout(void *data) +{ + char buf[OGS_ADDRSTRLEN]; + ogs_gtp_xact_t *xact = data; + + ogs_assert(xact); + ogs_assert(xact->gnode); + + ogs_error("[%d] %s Peer Timeout " + "for step %d type %d peer [%s]:%d", + xact->xid, + xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", + xact->step, xact->seq[xact->step-1].type, + OGS_ADDR(&xact->gnode->addr, buf), + OGS_PORT(&xact->gnode->addr)); + + if (xact->peer_cb) + xact->peer_cb(xact, xact->peer_data); +} + int ogs_gtp1_xact_receive( ogs_gtp_node_t *gnode, ogs_gtp1_header_t *h, ogs_gtp_xact_t **xact) { @@ -1175,6 +1188,8 @@ static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact) ogs_timer_delete(xact->tm_response); if (xact->tm_holding) ogs_timer_delete(xact->tm_holding); + if (xact->tm_peer) + ogs_timer_delete(xact->tm_peer); assoc_xact = ogs_gtp_xact_find_by_id(xact->assoc_xact_id); if (assoc_xact) diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index a04cd4884e..c24ba800b5 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -109,6 +109,10 @@ typedef struct ogs_gtp_xact_s { ogs_timer_t *tm_holding; /**< Timer waiting for holding message */ uint8_t holding_rcount; + ogs_timer_t *tm_peer; /**< Timer waiting for peer message */ + void (*peer_cb)(ogs_gtp_xact_t *, void *); /**< timer expiration handler */ + void *peer_data; /**< Peer timeout data */ + uint32_t local_teid; /**< Local TEID, expected in reply from peer */ diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 4ebd6683c9..620da0100d 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -4234,6 +4234,7 @@ void mme_bearer_remove(mme_bearer_t *bearer) ogs_list_for_each_entry_safe(&bearer->update.xact_list, next_xact, xact, to_update_node) { + ogs_timer_stop(xact->tm_peer); ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); } diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index ef44b85f11..711400c5ab 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -484,6 +484,13 @@ int mme_gtp_send_update_bearer_response( return OGS_OK; } + /* + * eNB sends Modify EPS Bearer Accept to the MME + * MME can send Update Bearer Response to the SGW-C, + * so stop the peer waiting timer + */ + ogs_timer_stop(xact->tm_peer); + memset(&h, 0, sizeof(ogs_gtp2_header_t)); h.type = OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE; h.teid = sgw_ue->sgw_s11_teid; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 4b8602bbe4..3a824d6f21 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -232,6 +232,14 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) goto cleanup; } + /* + * MME must wait for Modify Bearer Context Accept + * before sending Update Bearer Response, + * To check this, start a peer timer to check it. + */ + ogs_timer_start(xact->tm_peer, + ogs_local_conf()->time.message.gtp.t3_response_duration); + r = nas_eps_send_modify_bearer_context_request(bearer, (xact->update_flags & OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0, diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 8d7bca452c..a6cebe1a9a 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -59,7 +59,7 @@ static uint8_t esm_cause_from_gtp(uint8_t gtp_cause) return OGS_NAS_ESM_CAUSE_NETWORK_FAILURE; } -static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) +static void gtp_remote_peer_timeout(ogs_gtp_xact_t *xact, void *data) { char buf[OGS_ADDRSTRLEN]; mme_bearer_t *bearer = NULL; @@ -68,8 +68,7 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) ogs_assert(xact); type = xact->seq[xact->step-1].type; - ogs_error("[%d] %s HOLDING TIMEOUT " - "for step %d type %d peer [%s]:%d", + ogs_error("[%d] %s Peer Timeout for step %d type %d peer [%s]:%d", xact->xid, xact->org == OGS_GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, @@ -110,6 +109,7 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) if (ogs_list_exists( &bearer->update.xact_list, &xact->to_update_node) == true) { + ogs_error("Bearer-ID [%d] removed from the list", bearer->id); ogs_list_remove(&bearer->update.xact_list, &xact->to_update_node); } else { ogs_error("[%d] %s HAVE ALREADY BEEN REMOVED " @@ -121,6 +121,7 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) OGS_PORT(&xact->gnode->addr)); } break; +#if 0 case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: /* * The following is the case where the UE sends @@ -142,8 +143,11 @@ static void gtp_remote_holding_timeout(ogs_gtp_xact_t *xact, void *data) xact->step, type, OGS_ADDR(&xact->gnode->addr, buf), OGS_PORT(&xact->gnode->addr)); + } else { + ogs_error("Not existed"); } break; +#endif default: ogs_fatal("Unknown type[%d]", type); ogs_assert_if_reached(); @@ -1146,15 +1150,15 @@ void mme_s11_handle_update_bearer_request( * If the UE does not send a Modify EPS bearer context accept, * the MME cannot send an Update Bearer Response to the SGW-C. * - * In this case, REMOTE holding timeout occurs, and a callback function + * In this case, peer timeout occurs, and a callback function * is registered as follows to free memory. * * Also, as shown above, multiple Update Bearer Request/Response can occur, * so we manage the Transaction Node as a list within the Bearer Context. */ - xact->cb = gtp_remote_holding_timeout; - xact->data = OGS_UINT_TO_POINTER(bearer->id); + xact->peer_cb = gtp_remote_peer_timeout; + xact->peer_data = OGS_UINT_TO_POINTER(bearer->id); ogs_list_add(&bearer->update.xact_list, &xact->to_update_node); @@ -1196,6 +1200,14 @@ void mme_s11_handle_update_bearer_request( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { + /* + * MME must wait for Modify Bearer Context Accept + * before sending Update Bearer Response, + * To check this, start a peer timer to check it. + */ + ogs_timer_start(xact->tm_peer, + ogs_local_conf()->time.message.gtp.t3_response_duration); + MME_CLEAR_PAGING_INFO(mme_ue); r = nas_eps_send_modify_bearer_context_request(bearer, req->bearer_contexts.bearer_level_qos.presence, From d6cc83bae021a8efc295e3eb8575065c38866614 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 6 Jul 2024 17:45:40 +0900 Subject: [PATCH 144/323] [SGWC] Fixed a crash --- src/sgwc/sxa-handler.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index 202dd3458d..150279dce7 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -514,19 +514,22 @@ void sgwc_sxa_handle_session_modification_response( bearer_id <= OGS_MAX_POOL_ID); bearer = sgwc_bearer_find_by_id(bearer_id); - ogs_assert(bearer); + if (!bearer) { + ogs_error("No Bearer Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } else { + if (!sess) { + ogs_error("No Context"); - if (!sess) { - ogs_error("No Context"); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); - sess = sgwc_sess_find_by_id(bearer->sess_id); - ogs_assert(sess); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } - cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); + ogs_assert(sgwc_ue); } - - sgwc_ue = sgwc_ue_find_by_id(bearer->sgwc_ue_id); - ogs_assert(sgwc_ue); } if (pfcp_rsp->cause.presence) { @@ -1404,7 +1407,10 @@ void sgwc_sxa_handle_session_deletion_response( } cleanup: - sgwc_sess_remove(sess); + if (sess) + sgwc_sess_remove(sess); + else + ogs_error("No Session"); } void sgwc_sxa_handle_session_report_request( From c920f53d39c9227f2bd407063f0e8f14781822d4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 6 Jul 2024 18:21:40 +0900 Subject: [PATCH 145/323] [MME] UEContextReleaseCommand cause (#3280) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 4G only... when UE sent an inactivity UEContextReleaseRequest, Open5GS sent back UEContextReleaseCommand **with cause=normal-release. This, in turn, does not allow the Samsung UE to return to the low power state in our testing of the scenario. Comparing the behavior of open5gs to other cores that we have tested the other cores are sending a ** cause=“Radio Network Layer Cause”: User inactivity ** when the UE sends inactivity. And this is what allows other cores to transition the UE to the low power state whereas with open5gs the UE is not entering the low power state. We've fixed to allow open5gs to come to the same level of compliance in this area as to the other cores. --- src/mme/emm-sm.c | 7 ++++++- src/mme/mme-context.h | 6 ++++++ src/mme/mme-path.c | 2 +- src/mme/mme-s11-handler.c | 2 +- src/mme/s1ap-handler.c | 5 +++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 63e82fdb97..55812c2042 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -674,8 +674,11 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code); } - if (!mme_ue->nas_eps.update.active_flag) + if (!mme_ue->nas_eps.update.active_flag) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; mme_send_release_access_bearer_or_ue_context_release(enb_ue); + } if (mme_ue->next.m_tmsi) { ogs_fatal("MME does not create new GUTI"); @@ -743,6 +746,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; mme_send_release_access_bearer_or_ue_context_release( enb_ue); break; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 5736d8e15e..4c59551247 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -287,6 +287,12 @@ struct enb_ue_s { /* S1 Holding timer for removing this context */ ogs_timer_t *t_s1_holding; + /* UEContextReleaseRequest or InitialContextSetupFailure */ + struct { + S1AP_Cause_PR group; + long cause; + } relcause; + /* Store by UE Context Release Command * Retrieve by UE Context Release Complete */ #define S1AP_UE_CTX_REL_INVALID_ACTION 0 diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 3a824d6f21..8dd1609b06 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -156,7 +156,7 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) } else { ogs_debug("No UE Context"); r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index a6cebe1a9a..265a6faa5a 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1435,7 +1435,7 @@ void mme_s11_handle_release_access_bearers_response( enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, + enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index d6c37554c6..e8063ecf89 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1195,6 +1195,9 @@ void s1ap_handle_initial_context_setup_failure( CLEAR_MME_UE_ALL_TIMERS(mme_ue); } + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + /* * 19.2.2.3 in Spec 36.300 * @@ -1759,6 +1762,8 @@ void s1ap_handle_ue_context_release_request( break; } + enb_ue->relcause.group = Cause->present; + enb_ue->relcause.cause = (int)Cause->choice.radioNetwork; mme_send_release_access_bearer_or_ue_context_release(enb_ue); } From be68ea7b04d3eaa6eb77ed205f64ad51cf70b276 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 7 Jul 2024 20:44:10 +0900 Subject: [PATCH 146/323] [SGWC/SMF] Fixed a crash (#3196) We're troubleshooting additional crashes that occur while trying to fix the ogs_pool_cycle() issue. --- src/sgwc/s11-handler.c | 32 ++++++++++++++++++++++++-------- src/sgwc/sxa-handler.c | 6 +++++- src/smf/gx-path.c | 5 ++++- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 5336c71e12..aa700b7609 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -775,7 +775,8 @@ void sgwc_s11_handle_create_bearer_response( bearer_id <= OGS_MAX_POOL_ID); bearer = sgwc_bearer_find_by_id(bearer_id); - ogs_assert(bearer); + if (!bearer) + ogs_error("No Bearer ID [%d]", bearer_id); } else { ogs_assert(s11_xact->data); bearer_id = OGS_POINTER_TO_UINT(s11_xact->data); @@ -783,11 +784,15 @@ void sgwc_s11_handle_create_bearer_response( bearer_id <= OGS_MAX_POOL_ID); bearer = sgwc_bearer_find_by_id(bearer_id); - ogs_assert(bearer); + if (!bearer) + ogs_error("No Bearer ID [%d]", bearer_id); } - sess = sgwc_sess_find_by_id(bearer->sess_id); - ogs_assert(sess); + if (bearer) { + sess = sgwc_sess_find_by_id(bearer->sess_id); + if (!sess) + ogs_error("No Session ID [%d]", bearer->sess_id); + } rv = ogs_gtp_xact_commit(s11_xact); ogs_expect(rv == OGS_OK); @@ -823,11 +828,22 @@ void sgwc_s11_handle_create_bearer_response( cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } + if (!bearer) { + ogs_error("No Bearer Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } + if (!sess) { + ogs_error("No Session Context"); + cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND; + } + if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - ogs_assert(OGS_OK == - sgwc_pfcp_send_bearer_modification_request( - bearer, OGS_INVALID_POOL_ID, NULL, - OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); + if (bearer) { + ogs_assert(OGS_OK == + sgwc_pfcp_send_bearer_modification_request( + bearer, OGS_INVALID_POOL_ID, NULL, + OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE)); + } ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0, OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value); return; diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index 150279dce7..48ba184472 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -615,7 +615,11 @@ void sgwc_sxa_handle_session_modification_response( OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value); } - sgwc_bearer_remove(bearer); + if (bearer) + sgwc_bearer_remove(bearer); + else + ogs_error("No Bearer"); + } else if (flags & OGS_PFCP_MODIFY_CREATE) { s5c_xact = ogs_gtp_xact_find_by_id(pfcp_xact->assoc_xact_id); ogs_assert(s5c_xact); diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index d5d1bdc304..4d7a69f833 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -1165,7 +1165,10 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp, /* Get Session Information */ sess = smf_sess_find_by_id(sess_data->sess_id); - ogs_assert(sess); + if (!sess) { + ogs_error("No Session ID [%d]", sess_data->sess_id); + goto out; + } ret = fd_msg_browse(qry, MSG_BRW_FIRST_CHILD, &avp, NULL); ogs_assert(ret == 0); From 8c97ccf570096983a4d5689a91b88ceb1435bf45 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 8 Jul 2024 16:28:07 +0900 Subject: [PATCH 147/323] [SMF] Fixed a crash when sess is NULL (#3240) --- src/smf/smf-sm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 555ad53ee3..7b9ed728e4 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -209,14 +209,23 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); + if (!sess) { + /* Don't have to send NACK the message */ + ogs_error("No Session"); + rv = ogs_gtp_xact_commit(gtp_xact); + ogs_expect(rv == OGS_OK); + break; + } smf_s5c_handle_update_bearer_response( sess, gtp_xact, &gtp2_message.update_bearer_response); break; case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* TODO: NACK the message */ - ogs_error("TODO: NACK the message"); + /* Don't have to send NACK the message */ + ogs_error("No Session"); + rv = ogs_gtp_xact_commit(gtp_xact); + ogs_expect(rv == OGS_OK); break; } e->sess_id = sess->id; From ed0c1f4efb893f71360d40d931da50aadb76ce1e Mon Sep 17 00:00:00 2001 From: herlesupreeth <herlesupreeth@gmail.com> Date: Sun, 7 Jul 2024 19:44:08 +0200 Subject: [PATCH 148/323] [SMF]: Issue PFCP session modification request if there are additional flows in RAR --- src/smf/binding.c | 102 +++++++++++++++++++++++++++---------------- src/smf/binding.h | 1 + src/smf/n4-handler.c | 4 ++ 3 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/smf/binding.c b/src/smf/binding.c index 4024dc310e..3617e8973c 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -127,9 +127,6 @@ void smf_bearer_binding(smf_sess_t *sess) ogs_assert(sess); for (i = 0; i < sess->policy.num_of_pcc_rule; i++) { - ogs_gtp_xact_t *xact = NULL; - ogs_gtp2_header_t h; - ogs_pkbuf_t *pkbuf = NULL; smf_bearer_t *bearer = NULL; ogs_pcc_rule_t *pcc_rule = &sess->policy.pcc_rule[i]; @@ -359,45 +356,21 @@ void smf_bearer_binding(smf_sess_t *sess) OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } else { - ogs_gtp2_tft_t tft; + uint64_t pfcp_flags = OGS_PFCP_MODIFY_NETWORK_REQUESTED; - memset(&tft, 0, sizeof tft); if (ogs_list_count(&bearer->pf_to_add_list) > 0) { - encode_traffic_flow_template( - &tft, bearer, - OGS_GTP2_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT); + pfcp_flags |= OGS_PFCP_MODIFY_EPC_TFT_UPDATE; + smf_bearer_tft_update(bearer); } - - memset(&h, 0, sizeof(ogs_gtp2_header_t)); - h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; - h.teid = sess->sgw_s5c_teid; - - pkbuf = smf_s5c_build_update_bearer_request( - h.type, bearer, - OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, - (ogs_list_count(&bearer->pf_to_add_list) > 0) ? - &tft : NULL, qos_presence); - if (!pkbuf) { - ogs_error("smf_s5c_build_update_bearer_request() failed"); - return; - } - - xact = ogs_gtp_xact_local_create( - sess->gnode, &h, pkbuf, gtp_bearer_timeout, - OGS_UINT_TO_POINTER(bearer->id)); - if (!xact) { - ogs_error("ogs_gtp_xact_local_create() failed"); - return; + if (qos_presence == true) { + pfcp_flags |= OGS_PFCP_MODIFY_EPC_QOS_UPDATE; + smf_bearer_qos_update(bearer); } - xact->local_teid = sess->smf_n4_teid; - - if (ogs_list_count(&bearer->pf_to_add_list) > 0) - xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE; - if (qos_presence == true) - xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE; - - rv = ogs_gtp_xact_commit(xact); - ogs_expect(rv == OGS_OK); + ogs_assert(OGS_OK == + smf_epc_pfcp_send_one_bearer_modification_request( + bearer, OGS_INVALID_POOL_ID, pfcp_flags, + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, + OGS_GTP2_CAUSE_UNDEFINED_VALUE)); } } else if (pcc_rule->type == OGS_PCC_RULE_TYPE_REMOVE) { @@ -474,6 +447,59 @@ int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer) return rv; } +int smf_gtp2_send_update_bearer_request(smf_bearer_t *bearer) +{ + int rv; + + smf_sess_t *sess = NULL; + ogs_gtp_xact_t *xact = NULL; + + ogs_gtp2_header_t h; + ogs_pkbuf_t *pkbuf = NULL; + ogs_gtp2_tft_t tft; + + ogs_assert(bearer); + sess = smf_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); + + memset(&h, 0, sizeof(ogs_gtp2_header_t)); + h.type = OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE; + h.teid = sess->sgw_s5c_teid; + + memset(&tft, 0, sizeof tft); + if (ogs_list_count(&bearer->pf_to_add_list) > 0) { + encode_traffic_flow_template(&tft, bearer, + OGS_GTP2_TFT_CODE_ADD_PACKET_FILTERS_TO_EXISTING_TFT); + } + + pkbuf = smf_s5c_build_update_bearer_request( + h.type, bearer, + OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, + (ogs_list_count(&bearer->pf_to_add_list) > 0) ? + &tft : NULL, true); + if (!pkbuf) { + ogs_error("smf_s5c_build_update_bearer_request() failed"); + return OGS_ERROR; + } + + xact = ogs_gtp_xact_local_create( + sess->gnode, &h, pkbuf, gtp_bearer_timeout, + OGS_UINT_TO_POINTER(bearer->id)); + if (!xact) { + ogs_error("ogs_gtp_xact_local_create() failed"); + return OGS_ERROR; + } + xact->local_teid = sess->smf_n4_teid; + xact->update_flags |= OGS_GTP_MODIFY_QOS_UPDATE; + if (ogs_list_count(&bearer->pf_to_add_list) > 0) + xact->update_flags |= OGS_GTP_MODIFY_TFT_UPDATE; + + rv = ogs_gtp_xact_commit(xact); + ogs_expect(rv == OGS_OK); + + return rv; +} + void smf_qos_flow_binding(smf_sess_t *sess) { int rv; diff --git a/src/smf/binding.h b/src/smf/binding.h index 511028e3b3..b8b3774cd8 100644 --- a/src/smf/binding.h +++ b/src/smf/binding.h @@ -28,6 +28,7 @@ extern "C" { void smf_bearer_binding(smf_sess_t *sess); int smf_gtp2_send_create_bearer_request(smf_bearer_t *bearer); +int smf_gtp2_send_update_bearer_request(smf_bearer_t *bearer); void smf_qos_flow_binding(smf_sess_t *sess); diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 48d560880b..2f5fcb419d 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -950,6 +950,10 @@ void smf_epc_n4_handle_session_modification_response( } else if (flags & OGS_PFCP_MODIFY_CREATE) { ogs_assert(bearer); ogs_assert(OGS_OK == smf_gtp2_send_create_bearer_request(bearer)); + + } else if (flags & OGS_PFCP_MODIFY_NETWORK_REQUESTED) { + ogs_assert(bearer); + ogs_assert(OGS_OK == smf_gtp2_send_update_bearer_request(bearer)); } else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) { /* From 3134bcc5e8482ebabf0ef6ee4dc9848ae6c60b23 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Jul 2024 15:58:51 +0900 Subject: [PATCH 149/323] [MME] Fixed crash when double free mme_ue (#3196) --- src/mme/mme-path.c | 4 +++- src/mme/mme-s11-handler.c | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 8dd1609b06..3b31497882 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -69,7 +69,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) * Ch 5.3.8.3 MME-initiated Detach procedure (Without Step 1) */ case MME_DETACH_TYPE_MME_IMPLICIT: - ogs_debug("Implicit MME Detach"); + ogs_warn("[%s] Implicit MME Detach", mme_ue->imsi_bcd); mme_gtp_send_delete_all_sessions(mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); @@ -78,11 +78,13 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) xact_count) { enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { + ogs_warn("[%s] UEContextReleaseCommand Sent", mme_ue->imsi_bcd); ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { + ogs_warn("[%s] MME-UE Context Removed", mme_ue->imsi_bcd); mme_ue_remove(mme_ue); } } diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 265a6faa5a..aaf6c430d4 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -802,6 +802,10 @@ void mme_s11_handle_delete_session_response( if (mme_sess_count(mme_ue) == 1) /* Last Session */ { if (ECM_IDLE(mme_ue)) { mme_ue_remove(mme_ue); + + /* mme_sess_remove() should not be called here + * since mme_ue_remove() has already been executed. */ + return; } else { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, From d2ca1dbd1313380dc9411bfdd54750ccb77c031e Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Jul 2024 22:20:12 +0900 Subject: [PATCH 150/323] [MME] Fixed crash on GTP sending timeout (#3196) --- src/mme/mme-gtp-path.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 711400c5ab..152f9e4c55 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -122,14 +122,22 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) ogs_assert(mme_ue_id >= OGS_MIN_POOL_ID && mme_ue_id <= OGS_MAX_POOL_ID); mme_ue = mme_ue_find_by_id(mme_ue_id); - ogs_assert(mme_ue); + if (!mme_ue) { + ogs_error("MME-UE[%d] has already been removed [%d]", + mme_ue_id, type); + return; + } break; case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE: case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: sess_id = OGS_POINTER_TO_UINT(data); ogs_assert(sess_id >= OGS_MIN_POOL_ID && sess_id <= OGS_MAX_POOL_ID); sess = mme_sess_find_by_id(sess_id); - ogs_assert(sess); + if (!sess) { + ogs_error("Session[%d] has already been removed [%d]", + sess_id, type); + return; + } mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); break; @@ -138,7 +146,11 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) ogs_assert(bearer_id >= OGS_MIN_POOL_ID && bearer_id <= OGS_MAX_POOL_ID); bearer = mme_bearer_find_by_id(bearer_id); - ogs_assert(bearer); + if (!bearer) { + ogs_error("Bearer[%d] has already been removed [%d]", + bearer_id, type); + return; + } sess = mme_sess_find_by_id(bearer->sess_id); ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); From 9ed06f1da1880cd48c5cea68e8fff589673ff6e4 Mon Sep 17 00:00:00 2001 From: Emanuele Di Pascale <emanuele.dipascale@alefedge.com> Date: Wed, 12 Jun 2024 13:18:54 +0200 Subject: [PATCH 151/323] [MME,SMF]: allow setting of diameter TC_TIMER ... via the YAML configuration --- lib/diameter/common/base.h | 4 ++++ lib/diameter/common/config.c | 5 +++++ src/mme/mme-context.c | 11 +++++++++++ src/smf/context.c | 11 +++++++++++ 4 files changed, 31 insertions(+) diff --git a/lib/diameter/common/base.h b/lib/diameter/common/base.h index fe04c713c1..2cf8600ed3 100644 --- a/lib/diameter/common/base.h +++ b/lib/diameter/common/base.h @@ -43,6 +43,9 @@ typedef struct ogs_diam_config_s { /* the local port for Diameter/TLS (default: 5658) in host byte order */ uint16_t cnf_port_tls; + /* default TC timer */ + int cnf_timer_tc; + struct { /* the peer does not relay messages (0xffffff app id) */ unsigned no_fwd: 1; @@ -64,6 +67,7 @@ typedef struct ogs_diam_config_s { const char *identity; const char *addr; /* IP address of the remote peer */ uint16_t port; /* port to connect to. 0: default. */ + int tc_timer; /* TcTimer value to use for this peer, use default if 0 */ } conn[MAX_NUM_OF_FD_CONN]; int num_of_conn; } ogs_diam_config_t; diff --git a/lib/diameter/common/config.c b/lib/diameter/common/config.c index 14a2dede17..09705f71c7 100644 --- a/lib/diameter/common/config.c +++ b/lib/diameter/common/config.c @@ -69,6 +69,9 @@ static int diam_config_apply(ogs_diam_config_t *fd_config) if (fd_config->cnf_flags.no_fwd) fd_g_config->cnf_flags.no_fwd = fd_config->cnf_flags.no_fwd; + if (fd_config->cnf_timer_tc) + fd_g_config->cnf_timer_tc = fd_config->cnf_timer_tc; + /******************************************************************** * Diameter Client */ @@ -86,6 +89,8 @@ static int diam_config_apply(ogs_diam_config_t *fd_config) fddpi.config.pic_flags.alg = PI_ALGPREF_SCTP; fddpi.config.pic_flags.sec |= PI_SEC_NONE; + fddpi.config.pic_tctimer = fd_config->conn[i].tc_timer; + fddpi.config.pic_port = fd_config->conn[i].port; fddpi.pi_diamid = (DiamId_t)fd_config->conn[i].identity; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 620da0100d..e35ab7bbeb 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -508,6 +508,7 @@ int mme_context_parse_config(void) const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -540,6 +541,10 @@ int mme_context_parse_config(void) const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -555,10 +560,16 @@ int mme_context_parse_config(void) self.diam_config-> conn[self.diam_config->num_of_conn]. port = port; + self.diam_config-> + conn[self.diam_config->num_of_conn]. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } diff --git a/src/smf/context.c b/src/smf/context.c index f255e17240..11d577935c 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -398,6 +398,7 @@ int smf_context_parse_config(void) const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -430,6 +431,10 @@ int smf_context_parse_config(void) const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -445,10 +450,16 @@ int smf_context_parse_config(void) self.diam_config-> conn[self.diam_config->num_of_conn]. port = port; + self.diam_config-> + conn[self.diam_config->num_of_conn]. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } From b98731de96432cae5dedcb1645831f34f5dbb7db Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 9 Jul 2024 22:29:16 +0900 Subject: [PATCH 152/323] Follow-up on #3282 --- src/hss/hss-context.c | 11 +++++++++++ src/pcrf/pcrf-context.c | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index f80cded8db..a9c42bd6e3 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -270,6 +270,7 @@ int hss_context_parse_config(void) const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -304,6 +305,10 @@ int hss_context_parse_config(void) const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -319,10 +324,16 @@ int hss_context_parse_config(void) self.diam_config-> conn[self.diam_config->num_of_conn]. port = port; + self.diam_config-> + conn[self.diam_config->num_of_conn]. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } diff --git a/src/pcrf/pcrf-context.c b/src/pcrf/pcrf-context.c index 4f30b28f4c..e6523a97f0 100644 --- a/src/pcrf/pcrf-context.c +++ b/src/pcrf/pcrf-context.c @@ -270,6 +270,7 @@ int pcrf_context_parse_config(void) const char *identity = NULL; const char *addr = NULL; uint16_t port = 0; + int tc_timer = 0; if (ogs_yaml_iter_type(&conn_array) == YAML_MAPPING_NODE) { @@ -302,6 +303,10 @@ int pcrf_context_parse_config(void) const char *v = ogs_yaml_iter_value(&conn_iter); if (v) port = atoi(v); + } else if (!strcmp(conn_key, "tc_timer")) { + const char *v = + ogs_yaml_iter_value(&conn_iter); + if (v) tc_timer = atoi(v); } else ogs_warn("unknown key `%s`", conn_key); @@ -317,10 +322,16 @@ int pcrf_context_parse_config(void) self.diam_config-> conn[self.diam_config->num_of_conn]. port = port; + self.diam_config-> + conn[self.diam_config->num_of_conn]. + tc_timer = tc_timer; self.diam_config->num_of_conn++; } } while (ogs_yaml_iter_type(&conn_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(fd_key, "tc_timer")) { + const char *v = ogs_yaml_iter_value(&fd_iter); + if (v) self.diam_config->cnf_timer_tc = atoi(v); } else ogs_warn("unknown key `%s`", fd_key); } From 6f73a746902ee4ef2a1954390649fa7a9fe3938d Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 10 Jul 2024 10:20:19 +0900 Subject: [PATCH 153/323] [GTP/PFCP] Use Pool-ID in XACT (#3196) Due to the possiblity of problems with NS's like SMF using GTP/PFCP, I changed the transaction memory to the pool id method. --- lib/gtp/xact.c | 63 ++++++++++++++++++++++++++++++++++++++----------- lib/pfcp/xact.c | 57 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 94 insertions(+), 26 deletions(-) diff --git a/lib/gtp/xact.c b/lib/gtp/xact.c index 7f2ffd904e..68a3def036 100644 --- a/lib/gtp/xact.c +++ b/lib/gtp/xact.c @@ -92,14 +92,16 @@ ogs_gtp_xact_t *ogs_gtp1_xact_local_create(ogs_gtp_node_t *gnode, * message (for which a response has been defined) is sent." */ if (hdesc->type != OGS_GTP1_RAN_INFORMATION_RELAY_TYPE) { xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount; } xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount; @@ -149,17 +151,20 @@ ogs_gtp_xact_t *ogs_gtp_xact_local_create(ogs_gtp_node_t *gnode, xact->data = data; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount, xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, - xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, xact); + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_peer); ogs_list_add(&xact->gnode->local_list, xact); @@ -197,17 +202,20 @@ static ogs_gtp_xact_t *ogs_gtp_xact_remote_create(ogs_gtp_node_t *gnode, uint8_t xact->gnode = gnode; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.gtp.n3_response_rcount, xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.gtp.n3_holding_rcount, - xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, xact); + xact->tm_peer = ogs_timer_add(ogs_app()->timer_mgr, peer_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_peer); ogs_list_add(&xact->gnode->remote_list, xact); @@ -739,9 +747,18 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact) static void response_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_gtp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->gnode); ogs_debug("[%d] %s Response Timeout " @@ -782,9 +799,18 @@ static void response_timeout(void *data) static void holding_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_gtp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->gnode); ogs_debug("[%d] %s Holding Timeout " @@ -814,9 +840,18 @@ static void holding_timeout(void *data) static void peer_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_gtp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_gtp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_gtp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("GTP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->gnode); ogs_error("[%d] %s Peer Timeout " diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index 78a900e35b..30f3f9f12f 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -86,19 +86,22 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, xact->data = data; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.pfcp.n1_response_rcount; xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.pfcp.n1_holding_rcount; xact->tm_delayed_commit = ogs_timer_add( - ogs_app()->timer_mgr, delayed_commit_timeout, xact); + ogs_app()->timer_mgr, delayed_commit_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_delayed_commit); ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? @@ -132,19 +135,22 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( xact->node = node; xact->tm_response = ogs_timer_add( - ogs_app()->timer_mgr, response_timeout, xact); + ogs_app()->timer_mgr, response_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_response); xact->response_rcount = ogs_local_conf()->time.message.pfcp.n1_response_rcount; xact->tm_holding = ogs_timer_add( - ogs_app()->timer_mgr, holding_timeout, xact); + ogs_app()->timer_mgr, holding_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_holding); xact->holding_rcount = ogs_local_conf()->time.message.pfcp.n1_holding_rcount; xact->tm_delayed_commit = ogs_timer_add( - ogs_app()->timer_mgr, delayed_commit_timeout, xact); + ogs_app()->timer_mgr, delayed_commit_timeout, + OGS_UINT_TO_POINTER(xact->id)); ogs_assert(xact->tm_delayed_commit); ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? @@ -576,9 +582,18 @@ void ogs_pfcp_xact_delayed_commit(ogs_pfcp_xact_t *xact, ogs_time_t duration) static void response_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("[%d] %s Response Timeout " @@ -619,9 +634,18 @@ static void response_timeout(void *data) static void holding_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("[%d] %s Holding Timeout " @@ -651,9 +675,18 @@ static void holding_timeout(void *data) static void delayed_commit_timeout(void *data) { char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_xact_t *xact = data; + ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; + ogs_pfcp_xact_t *xact = NULL; - ogs_assert(xact); + ogs_assert(data); + xact_id = OGS_POINTER_TO_UINT(data); + ogs_assert(xact_id >= OGS_MIN_POOL_ID && xact_id <= OGS_MAX_POOL_ID); + + xact = ogs_pfcp_xact_find_by_id(xact_id); + if (!xact) { + ogs_error("PFCP Transaction has already been removed [%d]", xact_id); + return;; + } ogs_assert(xact->node); ogs_debug("[%d] %s Delayed Send Timeout " From 1b82ff08b68756c37e6ce33a4b2c176722241673 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 12 Jul 2024 13:19:02 +0900 Subject: [PATCH 154/323] [AMF] Added Additional-GUTI to ClearText (#3315) UE attached to 4G cell, terminates 4G connection, then attempts 5G cell attach with TAC update - fails connection Setup a UE on a 4G cell. Also have a 5G cell available to the UE. Next, disable the 4G cell. The 4G connection terminates normally. The UE scans the network and finds the 5G cell. At this time the UE sends a registration to the 5G cell. Open5gs sent back a reject with reason "Semantically incorrect message". Then the UE did not try to attach again and lost the call forever. Compare this scenario with a different core that we tested this scenario on. With a different core (other than open5gs) the core sent back a reject also but with a reason "UE can't be derived by network". Then the UE tried attach again and the 5G call was successful. Although this was successful for the other core it could be suggested that not rejecting at all is good behavior. There is a workaround which is that the Samsung UE could be put into airplane mode and taken out of airplane mode and at that point the UE is able to attach to the 5G cell. But this is a lot of manual effort on the user of the UE which could be avoided with a simple open5gs change. Note: Issue only happens when registration request + tracking area update occurs on 5G cell attach following LTE cell being disabled. If only registration occurs without a tracking area update (such as the first time system is up) then it is ok with no rejection. To solve this issue, added Additional-GUTI to the ClearText Group. --- src/amf/gmm-handler.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 05a07ab7e3..44a9caed39 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -107,7 +107,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, (OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT| \ OGS_NAS_5GS_REGISTRATION_REQUEST_UE_STATUS_PRESENT| \ OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT| \ - OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) + OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT| \ + OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT) if (ngap_code == NGAP_ProcedureCode_id_InitialUEMessage && registration_request->presencemask & From eebbfd28b35096ad75ab0d96ba8b0e1266e8ea37 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 12 Jul 2024 13:32:58 +0900 Subject: [PATCH 155/323] UPF Performance enhancement (#3306) (#3318) * [UPF/SGW-U] Optimizing data-path (#3306) In ogs_pfcp_up_handle_pdr, there is a copy operation performed on recvbuf, which can reduce the sending performance in the data path. Personally, We believe that this copy operation can be eliminated. Of course, if it is canceled, the recvbuf does not need to be released again at the location where ogs_pfcp_up_handle_pdr is called. After testing, it has indeed shown an improvement in performance of approximately 15-18%. /* sendbuf = ogs_pkbuf_copy(recvbuf); if (!sendbuf) { ogs_error("ogs_pkbuf_copy() failed"); return false; }*/ sendbuf = recvbuf;</div> * update it --- lib/pfcp/handler.c | 11 ++--------- src/sgwu/gtp-path.c | 6 ++++++ src/upf/gtp-path.c | 23 +++++++++++++++++++++-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index c1bac05bf2..0da0814aa9 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -227,14 +227,13 @@ bool ogs_pfcp_up_handle_association_setup_response( bool ogs_pfcp_up_handle_pdr( ogs_pfcp_pdr_t *pdr, uint8_t type, - ogs_gtp2_header_desc_t *recvhdr, ogs_pkbuf_t *recvbuf, + ogs_gtp2_header_desc_t *recvhdr, ogs_pkbuf_t *sendbuf, ogs_pfcp_user_plane_report_t *report) { ogs_pfcp_far_t *far = NULL; - ogs_pkbuf_t *sendbuf = NULL; bool buffering; - ogs_assert(recvbuf); + ogs_assert(sendbuf); ogs_assert(type); ogs_assert(pdr); ogs_assert(report); @@ -244,12 +243,6 @@ bool ogs_pfcp_up_handle_pdr( memset(report, 0, sizeof(*report)); - sendbuf = ogs_pkbuf_copy(recvbuf); - if (!sendbuf) { - ogs_error("ogs_pkbuf_copy() failed"); - return false; - } - buffering = false; if (!far->gnode) { diff --git a/src/sgwu/gtp-path.c b/src/sgwu/gtp-path.c index e44c0c7f6b..ab229d3689 100644 --- a/src/sgwu/gtp-path.c +++ b/src/sgwu/gtp-path.c @@ -276,6 +276,12 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) ogs_assert(OGS_OK == sgwu_pfcp_send_session_report_request(sess, &report)); } + + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; } else { ogs_error("[DROP] Invalid GTPU Type [%d]", header_desc.type); ogs_log_hexdump(OGS_LOG_ERROR, pkbuf->data, pkbuf->len); diff --git a/src/upf/gtp-path.c b/src/upf/gtp-path.c index d2fef084db..7daa439e5a 100644 --- a/src/upf/gtp-path.c +++ b/src/upf/gtp-path.c @@ -242,6 +242,12 @@ static void _gtpv1_tun_recv_common_cb( upf_pfcp_send_session_report_request(sess, &report)); } + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + cleanup: ogs_pkbuf_free(recvbuf); } @@ -366,7 +372,6 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) ogs_error("[DROP] Cannot find FAR by Error-Indication"); ogs_log_hexdump(OGS_LOG_ERROR, pkbuf->data, pkbuf->len); } - } else if (header_desc.type == OGS_GTPU_MSGTYPE_GPDU) { uint16_t eth_type = 0; struct ip *ip_h = NULL; @@ -669,6 +674,12 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) upf_pfcp_send_session_report_request(sess, &report)); } + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + } else if (far->dst_if == OGS_PFCP_INTERFACE_CP_FUNCTION) { if (!far->gnode) { @@ -687,6 +698,12 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) ogs_assert(report.type.downlink_data_report == 0); + /* + * The ogs_pfcp_up_handle_pdr() function + * buffers or frees the Packet Buffer(pkbuf) memory. + */ + return; + } else { ogs_fatal("Not implemented : FAR-DST_IF[%d]", far->dst_if); ogs_assert_if_reached(); @@ -872,10 +889,12 @@ static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf) ogs_list_for_each(&sess->pfcp.pdr_list, pdr) { if (pdr->src_if == OGS_PFCP_INTERFACE_CORE) { + ogs_pkbuf_t *sendbuf = ogs_pkbuf_copy(recvbuf); + ogs_assert(sendbuf); ogs_assert(true == ogs_pfcp_up_handle_pdr( pdr, OGS_GTPU_MSGTYPE_GPDU, - NULL, recvbuf, &report)); + NULL, sendbuf, &report)); break; } } From 3df444704957411a157b35cdf69442f760807a1e Mon Sep 17 00:00:00 2001 From: Nikhil Malik <66406124+nik-netlox@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:55:31 +0900 Subject: [PATCH 156/323] Added NGAP LB blog in docs.md (#3329) * Update docs.md --- docs/_pages/docs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index 99c1a8221f..350ef50ffa 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -85,3 +85,4 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - @loxilb - [Exploring 5G SCP with Open5GS and LoxiLB](https://dev.to/nikhilmalik/5g-service-communication-proxy-with-loxilb-4242) + - [NGAP Load Balancing with Open5GS and LoxiLB](https://www.loxilb.io/post/ngap-load-balancing-with-loxilb) From 0af9db84f82f974351e022c9e5c391240509d507 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 20 Jul 2024 07:31:14 +0900 Subject: [PATCH 157/323] [MME] Fixed Crash in mme-fd-path.c (#3196) Because mme_ue_find_by_id() and enb_ue_find_by_id() could be NULL, we should not use assert() --- src/mme/mme-fd-path.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index 35fc11197a..c42c0960a1 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -871,9 +871,17 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) } mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); - ogs_assert(mme_ue); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed [%d]", + sess_data->mme_ue_id); + return; + } enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); - ogs_assert(enb_ue); + if (!enb_ue) { + ogs_error("[%s] ENB-S1 Context has already been removed [%d]", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Authentication-Information Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1308,9 +1316,17 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) } mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); - ogs_assert(mme_ue); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed [%d]", + sess_data->mme_ue_id); + return; + } enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); - ogs_assert(enb_ue); + if (!enb_ue) { + ogs_error("[%s] ENB-S1 Context has already been removed [%d]", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Update-Location Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); @@ -1665,9 +1681,17 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) } mme_ue = mme_ue_find_by_id(sess_data->mme_ue_id); - ogs_assert(mme_ue); + if (!mme_ue) { + ogs_error("MME-UE Context has already been removed [%d]", + sess_data->mme_ue_id); + return; + } enb_ue = enb_ue_find_by_id(sess_data->enb_ue_id); - ogs_assert(enb_ue); + if (!enb_ue) { + ogs_error("[%s] ENB-S1 Context has already been removed [%d]", + mme_ue->imsi_bcd, sess_data->enb_ue_id); + return; + } /* Set Purge-UE Command */ s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t)); From a9a60135f9dff6743f81fddb95df515d4aeafc0a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 20 Jul 2024 09:59:26 +0900 Subject: [PATCH 158/323] [AMF] Fix the crash since validityTime->30s(#3210) We're experiencing an issue after changing SearchResult.validityTime from 3600 seconds to 30 seconds. When AMF finds a PCF through Discovery, it can be deleted after 30 seconds by ValidityTime. We have changed our implementation to not send the PCF-ID in this case. What we need to do is proactively add a part that will re-discover the PCF when a situation arises where we really need the PCF-ID. --- src/amf/nsmf-build.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 1b0f6716ac..2f56667ccb 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -190,14 +190,25 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( goto end; } + /* + * We're experiencing an issue after changing SearchResult.validityTime + * from 3600 seconds to 30 seconds. (#3210) + * + * When AMF finds a PCF through Discovery, it can be deleted + * after 30 seconds by ValidityTime. + * + * We have changed our implementation to not send the PCF-ID in this case. + * + * What we need to do is proactively add a part that will re-discover + * the PCF when a situation arises where we really need the PCF-ID. + */ pcf_nf_instance = OGS_SBI_GET_NF_INSTANCE( amf_ue->sbi.service_type_array[ OGS_SBI_SERVICE_TYPE_NPCF_AM_POLICY_CONTROL]); - if (!pcf_nf_instance) { + if (pcf_nf_instance) + SmContextCreateData.pcf_id = pcf_nf_instance->id; + else ogs_error("No pcf_nf_instance"); - goto end; - } - SmContextCreateData.pcf_id = pcf_nf_instance->id; message.SmContextCreateData = &SmContextCreateData; From 8d2d03731480682368d74015ad3a04802bb28453 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 20 Jul 2024 10:16:28 +0900 Subject: [PATCH 159/323] [DIAM] Fix the crash when terminating Diameter When exiting a diameter interface, the session state data could be NULL. So we added code to check the session state data to prevent SIGSEGV occurring. --- src/hss/hss-s6a-path.c | 5 +++++ src/mme/mme-fd-path.c | 5 +++++ src/pcrf/pcrf-gx-path.c | 5 ++++- src/pcrf/pcrf-rx-path.c | 5 ++++- src/smf/gx-path.c | 5 +++++ src/smf/gy-path.c | 5 +++++ src/smf/s6b-path.c | 5 +++++ tests/non3gpp/diameter-s6b-path.c | 5 ++++- tests/non3gpp/diameter-swx-path.c | 5 +++++ tests/volte/diameter-cx-path.c | 5 +++++ tests/volte/diameter-rx-path.c | 5 +++++ 11 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index fac0c8fdb5..385f8f0408 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -49,6 +49,11 @@ struct sess_state { static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + ogs_free(sess_data); } diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index c42c0960a1..9983545cab 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -45,6 +45,11 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg); static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + ogs_free(sess_data); } diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index 0074d5c669..3ebd201c84 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -180,7 +180,10 @@ static struct rx_sess_state *find_rx_state(struct sess_state *gx, os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->peer_host) ogs_free(sess_data->peer_host); diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index 82149c3af2..a350e2dccd 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -73,7 +73,10 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->rx_sid) ogs_free((char *)sess_data->rx_sid); diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index 4d7a69f833..f9c8595a6d 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -76,6 +76,11 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->gx_sid) ogs_free(sess_data->gx_sid); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index c897af5a1a..b03d27254b 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -80,6 +80,11 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->gy_sid) ogs_free(sess_data->gy_sid); diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index e5ecbdc9df..47d79395a3 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -64,6 +64,11 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->s6b_sid) ogs_free(sess_data->s6b_sid); diff --git a/tests/non3gpp/diameter-s6b-path.c b/tests/non3gpp/diameter-s6b-path.c index d680bd6aa6..1472ca8491 100644 --- a/tests/non3gpp/diameter-s6b-path.c +++ b/tests/non3gpp/diameter-s6b-path.c @@ -66,7 +66,10 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No session state"); + return; + } if (sess_data->sid) ogs_free(sess_data->sid); diff --git a/tests/non3gpp/diameter-swx-path.c b/tests/non3gpp/diameter-swx-path.c index 7e775288d0..c371cbe31d 100644 --- a/tests/non3gpp/diameter-swx-path.c +++ b/tests/non3gpp/diameter-swx-path.c @@ -48,6 +48,11 @@ static void test_swx_saa_cb(void *data, struct msg **msg); static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->user_name) ogs_free(sess_data->user_name); diff --git a/tests/volte/diameter-cx-path.c b/tests/volte/diameter-cx-path.c index 7c2c681b04..8ee4bc8271 100644 --- a/tests/volte/diameter-cx-path.c +++ b/tests/volte/diameter-cx-path.c @@ -52,6 +52,11 @@ static void test_cx_lia_cb(void *data, struct msg **msg); static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->user_name) ogs_free(sess_data->user_name); if (sess_data->public_identity) diff --git a/tests/volte/diameter-rx-path.c b/tests/volte/diameter-rx-path.c index 11200bb311..c3703403d4 100644 --- a/tests/volte/diameter-rx-path.c +++ b/tests/volte/diameter-rx-path.c @@ -51,6 +51,11 @@ static __inline__ struct sess_state *new_state(os0_t sid) static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) { + if (!sess_data) { + ogs_error("No session state"); + return; + } + if (sess_data->sid) ogs_free(sess_data->sid); From 08a9291da157506d16177f2ce0c8510952ea9bde Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 20 Jul 2024 20:07:23 +0900 Subject: [PATCH 160/323] [MME] Fix the crash after removing ogs_pool_cycle() (#3196) --- src/mme/mme-s11-handler.c | 41 ++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index aaf6c430d4..214f3fa8c9 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -207,9 +207,8 @@ void mme_s11_handle_create_session_response( ogs_assert(xact); create_action = xact->create_action; sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); - ogs_assert(sess); - - mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -217,6 +216,11 @@ void mme_s11_handle_create_session_response( return; } + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; @@ -694,10 +698,8 @@ void mme_s11_handle_delete_session_response( action = xact->delete_action; ogs_assert(action); sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); - ogs_assert(sess); - - ogs_debug("delete_session_response - xact:%p, sess:%p", xact, sess); - mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -705,6 +707,11 @@ void mme_s11_handle_delete_session_response( return; } + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; @@ -1937,12 +1944,14 @@ void mme_s11_handle_bearer_resource_failure_indication( /******************** * Check Transaction ********************/ + ogs_assert(ind); ogs_assert(xact); bearer = mme_bearer_find_by_id(OGS_POINTER_TO_UINT(xact->data)); - ogs_assert(ind); - sess = mme_sess_find_by_id(bearer->sess_id); - ogs_assert(sess); - mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + if (bearer) { + sess = mme_sess_find_by_id(bearer->sess_id); + if (sess) + mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + } rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1950,6 +1959,16 @@ void mme_s11_handle_bearer_resource_failure_indication( return; } + if (!bearer) { + ogs_error("Bearer Context has already been removed"); + return; + } + + if (!sess) { + ogs_error("Session Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; From 2b793b35343fa213a3f7684c8f8fba47365930f6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 20 Jul 2024 20:18:15 +0900 Subject: [PATCH 161/323] [SMF] add debug log in ogs_gtp2_parse_tft() SMF crashed in ogs_gtp2_parse_tft(). Add debug to find out how the UE sends a Bearer Resource Modification Request and SMF crashes. --- lib/gtp/v2/types.c | 4 ++-- src/smf/s5c-handler.c | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/gtp/v2/types.c b/lib/gtp/v2/types.c index 11da8c0990..949588ef4d 100644 --- a/lib/gtp/v2/types.c +++ b/lib/gtp/v2/types.c @@ -439,7 +439,8 @@ int16_t ogs_gtp2_parse_tft(ogs_gtp2_tft_t *tft, ogs_tlv_octet_t *octet) size += len; } - ogs_assert(size == octet->len); + if (size != octet->len) + ogs_error("Mismatch IE Length[%d] != Decoded[%d]", octet->len, size); return size; } @@ -607,7 +608,6 @@ int16_t ogs_gtp2_build_tft( } } - octet->len = size; return octet->len; diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 515703f854..d71e97d5a1 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1281,6 +1281,14 @@ void smf_s5c_handle_bearer_resource_command( sess->sgw_s5c_teid, sess->smf_n4_teid); decoded = ogs_gtp2_parse_tft(&tft, &cmd->traffic_aggregate_description); + if (cmd->traffic_aggregate_description.len != decoded) { + ogs_fatal("ogs_gtp2_parse_tft() failed"); + ogs_log_hexdump(OGS_LOG_FATAL, + cmd->traffic_aggregate_description.data, + cmd->traffic_aggregate_description.len); + ogs_assert_if_reached(); + } + ogs_assert(cmd->traffic_aggregate_description.len == decoded); if (tft.code == OGS_GTP2_TFT_CODE_NO_TFT_OPERATION) { From 919176a9ab9b8a95c5908b69758f3fcfebf58652 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 25 Jul 2024 23:28:02 +0900 Subject: [PATCH 162/323] [TFT] Incrase the number of flows 8->16 (#3339) TS24.008 10.5.6.12 Traffic Flow Template Table 10.5.162: Traffic flow template information element Number of packet filters (octet 3) The number of packet filters contains the binary coding for the number of packet filters in the packet filter list. The number of packet filters field is encoded in bits 4 through 1 of octet 3 where bit 4 is the most significant and bit 1 is the least significant bit. For the "delete existing TFT" operation and for the "no TFT operation", the number of packet filters shall be coded as 0. For all other operations, the number of packet filters shall be greater than 0 and less than or equal to 15. The array of TLV messages is limited to 16. So, Flow(PDI.SDF_Filter) in PDR is limited to 16. Therefore, we defined the maximum number of flows as 16. --- lib/proto/types.h | 25 +++++++++++++++++++------ src/smf/s5c-handler.c | 12 ++++++++---- src/smf/smf-sm.c | 2 -- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 45d0dfde05..84641f36e8 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -34,15 +34,28 @@ extern "C" { #define OGS_MAX_NUM_OF_PACKET_BUFFER 64 /* Num of PacketBuffer per UE */ /* - * The array of TLV messages is limited to 8. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 8. + * TS24.008 + * 10.5.6.12 Traffic Flow Template + * Table 10.5.162: Traffic flow template information element * - * However, the number of flow in bearer context seems to need more than 16. + * Number of packet filters (octet 3) + * The number of packet filters contains the binary coding + * for the number of packet filters in the packet filter list. + * The number of packet filters field is encoded in bits 4 + * through 1 of octet 3 where bit 4 is the most significant + * and bit 1 is the least significant bit. * - * Therefore, the maximum number of flows of messages is defined as 8, - * and the maximum number of flows stored by the context is 16. + * For the "delete existing TFT" operation and + * for the "no TFT operation", the number of packet filters shall be + * coded as 0. For all other operations, the number of packet filters + * shall be greater than 0 and less than or equal to 15. + * + * The array of TLV messages is limited to 16. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. + * + * Therefore, we defined the maximum number of flows as 16. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 8 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 #define OGS_MAX_NUM_OF_FLOW_IN_GTP OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_NAS OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE OGS_MAX_NUM_OF_FLOW_IN_PDR diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index d71e97d5a1..a977d620bb 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1281,12 +1281,16 @@ void smf_s5c_handle_bearer_resource_command( sess->sgw_s5c_teid, sess->smf_n4_teid); decoded = ogs_gtp2_parse_tft(&tft, &cmd->traffic_aggregate_description); - if (cmd->traffic_aggregate_description.len != decoded) { - ogs_fatal("ogs_gtp2_parse_tft() failed"); - ogs_log_hexdump(OGS_LOG_FATAL, + if (cmd->traffic_aggregate_description.len == decoded) { + ogs_error("ogs_gtp2_parse_tft() failed"); + ogs_log_hexdump(OGS_LOG_ERROR, cmd->traffic_aggregate_description.data, cmd->traffic_aggregate_description.len); - ogs_assert_if_reached(); + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), + OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, + OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); + return; } ogs_assert(cmd->traffic_aggregate_description.len == decoded); diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 7b9ed728e4..75ee9157e3 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -210,7 +210,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); @@ -222,7 +221,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); From 455f164c609a91b6461e75b75222305980c8e23c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 25 Jul 2024 23:32:53 +0900 Subject: [PATCH 163/323] Revert "[TFT] Incrase the number of flows 8->16 (#3339)" This reverts commit 919176a9ab9b8a95c5908b69758f3fcfebf58652. --- lib/proto/types.h | 25 ++++++------------------- src/smf/s5c-handler.c | 12 ++++-------- src/smf/smf-sm.c | 2 ++ 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 84641f36e8..45d0dfde05 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -34,28 +34,15 @@ extern "C" { #define OGS_MAX_NUM_OF_PACKET_BUFFER 64 /* Num of PacketBuffer per UE */ /* - * TS24.008 - * 10.5.6.12 Traffic Flow Template - * Table 10.5.162: Traffic flow template information element + * The array of TLV messages is limited to 8. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 8. * - * Number of packet filters (octet 3) - * The number of packet filters contains the binary coding - * for the number of packet filters in the packet filter list. - * The number of packet filters field is encoded in bits 4 - * through 1 of octet 3 where bit 4 is the most significant - * and bit 1 is the least significant bit. + * However, the number of flow in bearer context seems to need more than 16. * - * For the "delete existing TFT" operation and - * for the "no TFT operation", the number of packet filters shall be - * coded as 0. For all other operations, the number of packet filters - * shall be greater than 0 and less than or equal to 15. - * - * The array of TLV messages is limited to 16. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. - * - * Therefore, we defined the maximum number of flows as 16. + * Therefore, the maximum number of flows of messages is defined as 8, + * and the maximum number of flows stored by the context is 16. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 8 #define OGS_MAX_NUM_OF_FLOW_IN_GTP OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_NAS OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE OGS_MAX_NUM_OF_FLOW_IN_PDR diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index a977d620bb..d71e97d5a1 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1281,16 +1281,12 @@ void smf_s5c_handle_bearer_resource_command( sess->sgw_s5c_teid, sess->smf_n4_teid); decoded = ogs_gtp2_parse_tft(&tft, &cmd->traffic_aggregate_description); - if (cmd->traffic_aggregate_description.len == decoded) { - ogs_error("ogs_gtp2_parse_tft() failed"); - ogs_log_hexdump(OGS_LOG_ERROR, + if (cmd->traffic_aggregate_description.len != decoded) { + ogs_fatal("ogs_gtp2_parse_tft() failed"); + ogs_log_hexdump(OGS_LOG_FATAL, cmd->traffic_aggregate_description.data, cmd->traffic_aggregate_description.len); - ogs_gtp2_send_error_message( - xact, get_sender_f_teid(sess, sender_f_teid), - OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, - OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); - return; + ogs_assert_if_reached(); } ogs_assert(cmd->traffic_aggregate_description.len == decoded); diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 75ee9157e3..7b9ed728e4 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -210,6 +210,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { + /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); @@ -221,6 +222,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { + /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); From 3f23d332bf42df695f429dac4b85c9997eb5c079 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 25 Jul 2024 23:34:53 +0900 Subject: [PATCH 164/323] [TFT] Incrase the number of flows 8->16 (#3343) TS24.008 10.5.6.12 Traffic Flow Template Table 10.5.162: Traffic flow template information element Number of packet filters (octet 3) The number of packet filters contains the binary coding for the number of packet filters in the packet filter list. The number of packet filters field is encoded in bits 4 through 1 of octet 3 where bit 4 is the most significant and bit 1 is the least significant bit. For the "delete existing TFT" operation and for the "no TFT operation", the number of packet filters shall be coded as 0. For all other operations, the number of packet filters shall be greater than 0 and less than or equal to 15. The array of TLV messages is limited to 16. So, Flow(PDI.SDF_Filter) in PDR is limited to 16. Therefore, we defined the maximum number of flows as 16. --- lib/proto/types.h | 25 +++++++++++++++++++------ src/smf/s5c-handler.c | 10 +++++++--- src/smf/smf-sm.c | 2 -- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 45d0dfde05..84641f36e8 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -34,15 +34,28 @@ extern "C" { #define OGS_MAX_NUM_OF_PACKET_BUFFER 64 /* Num of PacketBuffer per UE */ /* - * The array of TLV messages is limited to 8. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 8. + * TS24.008 + * 10.5.6.12 Traffic Flow Template + * Table 10.5.162: Traffic flow template information element * - * However, the number of flow in bearer context seems to need more than 16. + * Number of packet filters (octet 3) + * The number of packet filters contains the binary coding + * for the number of packet filters in the packet filter list. + * The number of packet filters field is encoded in bits 4 + * through 1 of octet 3 where bit 4 is the most significant + * and bit 1 is the least significant bit. * - * Therefore, the maximum number of flows of messages is defined as 8, - * and the maximum number of flows stored by the context is 16. + * For the "delete existing TFT" operation and + * for the "no TFT operation", the number of packet filters shall be + * coded as 0. For all other operations, the number of packet filters + * shall be greater than 0 and less than or equal to 15. + * + * The array of TLV messages is limited to 16. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. + * + * Therefore, we defined the maximum number of flows as 16. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 8 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 #define OGS_MAX_NUM_OF_FLOW_IN_GTP OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_NAS OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE OGS_MAX_NUM_OF_FLOW_IN_PDR diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index d71e97d5a1..7923c55feb 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -1282,11 +1282,15 @@ void smf_s5c_handle_bearer_resource_command( decoded = ogs_gtp2_parse_tft(&tft, &cmd->traffic_aggregate_description); if (cmd->traffic_aggregate_description.len != decoded) { - ogs_fatal("ogs_gtp2_parse_tft() failed"); - ogs_log_hexdump(OGS_LOG_FATAL, + ogs_error("ogs_gtp2_parse_tft() failed"); + ogs_log_hexdump(OGS_LOG_ERROR, cmd->traffic_aggregate_description.data, cmd->traffic_aggregate_description.len); - ogs_assert_if_reached(); + ogs_gtp2_send_error_message( + xact, get_sender_f_teid(sess, sender_f_teid), + OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, + OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT); + return; } ogs_assert(cmd->traffic_aggregate_description.len == decoded); diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 7b9ed728e4..75ee9157e3 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -210,7 +210,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); @@ -222,7 +221,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE: if (!gtp2_message.h.teid_presence) ogs_error("No TEID"); if (!sess) { - /* Don't have to send NACK the message */ ogs_error("No Session"); rv = ogs_gtp_xact_commit(gtp_xact); ogs_expect(rv == OGS_OK); From 98285096680f5e368f8fb6fd45f168037bf8ce3b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 25 Jul 2024 23:55:53 +0900 Subject: [PATCH 165/323] [DIAM] Added sanity routine to avoid crash --- src/pcrf/pcrf-gx-path.c | 7 +++++-- src/pcrf/pcrf-rx-path.c | 8 +++++++- src/smf/gx-path.c | 5 ++++- src/smf/gy-path.c | 5 ++++- src/smf/s6b-path.c | 15 ++++++++++++--- tests/volte/diameter-rx-path.c | 21 +++++++++++++++++---- 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index 3ebd201c84..a42e662736 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -731,7 +731,7 @@ int pcrf_gx_send_rar( ret = fd_sess_state_retrieve(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); if (sess_data == NULL) { - ogs_error("No session data"); + ogs_error("No Session Data"); ret = fd_msg_free(req); ogs_assert(ret == 0); rx_message->result_code = OGS_DIAM_UNKNOWN_SESSION_ID; @@ -1061,7 +1061,10 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(pcrf_gx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); /* Value of Result Code */ diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index a350e2dccd..32ba39f69f 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -493,7 +493,13 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(pcrf_rx_reg, session, &sess_data); - ogs_assert(sess_data); + ogs_assert(ret == 0); + if (!sess_data) { + ogs_error("No Session Data"); + ret = fd_msg_free(req); + ogs_assert(ret == 0); + return OGS_ERROR; + } /* Update State */ sess_data->state = SESSION_ABORTED; diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index f9c8595a6d..6d01a4e27d 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -745,7 +745,10 @@ static void smf_gx_cca_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(smf_gx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: [%s]", sess_data->gx_sid); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index b03d27254b..997d0c4da1 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -991,7 +991,10 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(smf_gy_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: [%s]", sess_data->gy_sid); diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index 47d79395a3..092970913b 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -368,7 +368,10 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: [%s]", sess_data->s6b_sid); @@ -553,7 +556,10 @@ void smf_s6b_send_str(smf_sess_t *sess, ogs_gtp_xact_t *xact, uint32_t cause) /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_debug(" Retrieve session: [%s]", sess_data->s6b_sid); /* Update session state */ @@ -661,7 +667,10 @@ static void smf_s6b_sta_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(smf_s6b_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); ogs_debug(" Retrieve its data: [%s]", sess_data->s6b_sid); diff --git a/tests/volte/diameter-rx-path.c b/tests/volte/diameter-rx-path.c index c3703403d4..0b75dc5111 100644 --- a/tests/volte/diameter-rx-path.c +++ b/tests/volte/diameter-rx-path.c @@ -1678,7 +1678,10 @@ static void pcscf_rx_aaa_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } ogs_assert((void *)sess_data == data); /* Value of Result Code */ @@ -1807,7 +1810,10 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp, ret = fd_sess_state_retrieve(pcscf_rx_reg, sess, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return EINVAL; + } /* Create answer header */ qry = *msg; @@ -1910,7 +1916,10 @@ void test_rx_send_str(uint8_t *rx_sid) /* Retrieve session state in this session */ ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); @@ -1997,7 +2006,11 @@ static void pcscf_rx_sta_cb(void *data, struct msg **msg) ret = fd_sess_state_retrieve(pcscf_rx_reg, session, &sess_data); ogs_assert(ret == 0); - ogs_assert(sess_data && (void *)sess_data == data); + if (!sess_data) { + ogs_error("No Session Data"); + return; + } + ogs_assert((void *)sess_data == data); /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); From c5025ec64cf6dc6bf65579e6466ff2ffcad51751 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 2 Aug 2024 17:27:03 +0900 Subject: [PATCH 166/323] [MEM] valgrind memcheck findings (#3349) The proposal out of the valgrind memcheck procedure are a couple of small patches to open5gs within the patches subdirectory. --- lib/crypt/zuc.c | 10 +++++++-- tests/common/context.c | 37 +++++++++++++++++++++++++++------- tests/volte/diameter-rx-path.c | 2 -- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/crypt/zuc.c b/lib/crypt/zuc.c index a395edf2c9..185c4cbd9c 100644 --- a/lib/crypt/zuc.c +++ b/lib/crypt/zuc.c @@ -327,12 +327,18 @@ void zuc_eea3(u8* CK, u32 COUNT, u32 BEARER, u32 DIRECTION, C[i] = M[i] ^ ((z[i/4] >> (3-i%4)*8) & 0xff); } + /* + * Issues #3349 + * Valgrind memcheck: Invalid read & write: Add {}. + */ + /* zero last bits of data in case its length is not word-aligned (32 bits) this is an addition to the C reference code, which did not handle it */ - if (lastbits) + if (lastbits) { i--; C[i] &= 0x100 - (1<<lastbits); - + } + ogs_free(z); } /* end of EEA3.c */ diff --git a/tests/common/context.c b/tests/common/context.c index cf1a9cbc6d..8bae36a72d 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -1021,6 +1021,7 @@ static void test_ue_set_mobile_identity(test_ue_t *test_ue, mobile_identity->length = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE + scheme_output_size; mobile_identity->buffer = ogs_calloc(1, mobile_identity->length); + ogs_assert(mobile_identity->buffer); memcpy(mobile_identity->buffer, mobile_identity_suci, OGS_NAS_5GS_MOBILE_IDENTITY_SUCI_MIN_SIZE); @@ -1047,9 +1048,12 @@ static void test_ue_set_mobile_identity(test_ue_t *test_ue, static void test_ue_set_mobile_identity_imsi(test_ue_t *test_ue) { + int imsi_len = 0; ogs_assert(test_ue); ogs_assert(test_ue->imsi); + imsi_len = strlen(test_ue->imsi); + test_ue->mobile_identity_imsi.odd_even = OGS_NAS_MOBILE_IDENTITY_ODD; test_ue->mobile_identity_imsi.type = OGS_NAS_MOBILE_IDENTITY_IMSI; test_ue->mobile_identity_imsi.digit1 = test_ue->imsi[0] - '0'; @@ -1060,13 +1064,32 @@ static void test_ue_set_mobile_identity_imsi(test_ue_t *test_ue) test_ue->mobile_identity_imsi.digit6 = test_ue->imsi[5] - '0'; test_ue->mobile_identity_imsi.digit7 = test_ue->imsi[6] - '0'; test_ue->mobile_identity_imsi.digit8 = test_ue->imsi[7] - '0'; - test_ue->mobile_identity_imsi.digit9 = test_ue->imsi[8] - '0'; - test_ue->mobile_identity_imsi.digit10 = test_ue->imsi[9] - '0'; - test_ue->mobile_identity_imsi.digit11 = test_ue->imsi[10] - '0'; - test_ue->mobile_identity_imsi.digit12 = test_ue->imsi[11] - '0'; - test_ue->mobile_identity_imsi.digit13 = test_ue->imsi[12] - '0'; - test_ue->mobile_identity_imsi.digit14 = test_ue->imsi[13] - '0'; - test_ue->mobile_identity_imsi.digit15 = test_ue->imsi[14] - '0'; + + /* + * Issue #3349 + * + * Valgrind memcheck: Function test_ue_set_mobile_identity_imsi() uses + * a max 15 digit IMSI. The configuration file slice.yaml.in uses + * a 3 digit MCC & 2 digit MNC. The memcheck tool reports an issue + * for an invalid memory read when a <15 digit IMSI is used + * in test_ue_set_mobile_identity_imsi(). 1 way to fix the issue is + * to use a full 10 digit MSIN here (was using 8 digits). + */ + + if (imsi_len > 8) + test_ue->mobile_identity_imsi.digit9 = test_ue->imsi[8] - '0'; + if (imsi_len > 9) + test_ue->mobile_identity_imsi.digit10 = test_ue->imsi[9] - '0'; + if (imsi_len > 10) + test_ue->mobile_identity_imsi.digit11 = test_ue->imsi[10] - '0'; + if (imsi_len > 11) + test_ue->mobile_identity_imsi.digit12 = test_ue->imsi[11] - '0'; + if (imsi_len > 12) + test_ue->mobile_identity_imsi.digit13 = test_ue->imsi[12] - '0'; + if (imsi_len > 13) + test_ue->mobile_identity_imsi.digit14 = test_ue->imsi[13] - '0'; + if (imsi_len > 14) + test_ue->mobile_identity_imsi.digit15 = test_ue->imsi[14] - '0'; } static void test_ue_set_mobile_identity_imsisv(test_ue_t *test_ue) diff --git a/tests/volte/diameter-rx-path.c b/tests/volte/diameter-rx-path.c index 0b75dc5111..a8fcb021c9 100644 --- a/tests/volte/diameter-rx-path.c +++ b/tests/volte/diameter-rx-path.c @@ -2122,8 +2122,6 @@ int test_rx_init(void) int ret; struct disp_when data; - test_cx_init(); - /* Install objects definitions for this application */ ret = ogs_diam_rx_init(); ogs_assert(ret == 0); From d9a3132400403c50039a7e4eedb776f5f670bb6a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 3 Aug 2024 12:42:18 +0000 Subject: [PATCH 167/323] Tested on FreeBSD-14.1-STABLE (#3350) - Upgraded libraries to 4.5 to address compile error issues with CXX11 support - Change the default version of FreeBSD Vagrant to 14.1-STABLE - FreeBSD Platform documentation also changed to 14.x version --- docs/_docs/platform/07-freebsd.md | 16 ++++++++-------- subprojects/libtins.wrap | 2 +- vagrant/freebsd/Vagrantfile | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_docs/platform/07-freebsd.md b/docs/_docs/platform/07-freebsd.md index 26ec88cc53..ca9ec2aa0f 100644 --- a/docs/_docs/platform/07-freebsd.md +++ b/docs/_docs/platform/07-freebsd.md @@ -3,10 +3,10 @@ title: FreeBSD head_inline: "<style> .blue { color: blue; } </style>" --- -This guide is based on **FreeBSD-13.1-STABLE**. +This guide is based on **FreeBSD-14.1-STABLE**. {: .blue} -## Install **FreeBSD-13.1-STABLE** from Vagrant box (optional) +## Install **FreeBSD-14.1-STABLE** from Vagrant box (optional) --- Vagrant provides a simple way to create and deploy Virtual Machines from pre-built images using VirtualBox, libvirt, or VMWare as a hypervisor engine. @@ -20,13 +20,13 @@ The instructions to install Vagrant are provided at [vagrantup.com](https://www.vagrantup.com/). -### Create a FreeBSD-13.1-STABLE Virtual Machine using Vagrant +### Create a FreeBSD-14.1-STABLE Virtual Machine using Vagrant --- Use the supplied `Vagrantfile` in the `vagrant` directory to create the virtual machine. -Note that this Vagrantfile is identical to the base FreeBSD 13 box, with +Note that this Vagrantfile is identical to the base FreeBSD 14 box, with the exception that the amount of virtual memory has been increased to 1GB: ```bash @@ -37,7 +37,7 @@ vagrant up --provider virtualbox ### Log into the newly created FreeBSD VM --- -Use SSH to log into the FreeBSD 13 VM: +Use SSH to log into the FreeBSD 14 VM: ```bash vagrant ssh @@ -45,10 +45,10 @@ vagrant ssh Note that the Open5GS source is *not* copied into the VM. The instructions below provide the step by step instructions for setting up Open5GS for -either a bare metal or virtual FreeBSD 13 system. +either a bare metal or virtual FreeBSD 14 system. The rest of the commands below are performed inside the FreeBSD VM as the -user 'vagrant', or on your bare metal FreeBSD 13 system as any normal user. +user 'vagrant', or on your bare metal FreeBSD 14 system as any normal user. ### Getting MongoDB --- @@ -171,7 +171,7 @@ $ meson build --prefix=`pwd`/install $ ninja -C build ``` -**Note:** No source code changes are required for FreeBSD 11.x version. However, in FreeBSD 12.x/13.x version, we'll getting a crash with segmentation fault when calling basename(3). To avoid this, you need to change the freeDiameter source code as below. +**Note:** No source code changes are required for FreeBSD 11.x version. However, in FreeBSD 12.x/13.x/14.x version, we'll getting a crash with segmentation fault when calling basename(3). To avoid this, you need to change the freeDiameter source code as below. {: .blue} ```diff diff --git a/subprojects/libtins.wrap b/subprojects/libtins.wrap index 0c53a09704..e888ef6283 100644 --- a/subprojects/libtins.wrap +++ b/subprojects/libtins.wrap @@ -1,4 +1,4 @@ [wrap-git] directory = libtins url = https://github.com/open5gs/libtins.git -revision = r4.3 +revision = r4.5 diff --git a/vagrant/freebsd/Vagrantfile b/vagrant/freebsd/Vagrantfile index cd6beca8c2..36c5c77440 100644 --- a/vagrant/freebsd/Vagrantfile +++ b/vagrant/freebsd/Vagrantfile @@ -12,7 +12,7 @@ Vagrant.configure("2") do |config| # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. - config.vm.box = "freebsd/FreeBSD-13.1-STABLE" + config.vm.box = "freebsd/FreeBSD-14.1-STABLE" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs From b35dee93276cf6d5e50a1d268f5bad7e83a90152 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Aug 2024 13:27:42 +0900 Subject: [PATCH 168/323] [NRF] Fix the subscription valdityTime (#3360 #3361 #3363 #3364) NF should accept 204 No Content for Update Subscription requests. According to 3GPP 29.510 NRF specification document in figure 5.2.2.5.6.1 NRF may return 204 or 200 for success update operations. 2a. On success, if the NRF accepts the extension of the lifetime of the subscription, and it accepts the requested value for the "validityTime" attribute, a response with status code "204 No Content" shall be returned. 2b. On success, if the NRF accepts the extension of the lifetime of the subscription, but it assigns a validity time different than the value suggested by the NF Service Consumer, a "200 OK" response code shall be returned. The response shall contain the new resource representation of the "subscription" resource, which includes the new validity time, as determined by the NRF, after which the subscription becomes invalid. I changed it so that all NFs can receive both 200 and 204 STATUS. I also changed the default behavior of NRFs to respond with 204, which is NO CONTEXT. --- lib/core/ogs-time.h | 5 +- lib/sbi/context.h | 7 +- lib/sbi/nnrf-build.c | 5 +- lib/sbi/nnrf-handler.c | 92 +++++++++++++++++---------- src/nrf/nnrf-handler.c | 141 +++++++++++++++++++++++------------------ tests/app/5gc-init.c | 2 +- 6 files changed, 148 insertions(+), 104 deletions(-) diff --git a/lib/core/ogs-time.h b/lib/core/ogs-time.h index 0257f19661..b89e39ea65 100644 --- a/lib/core/ogs-time.h +++ b/lib/core/ogs-time.h @@ -84,8 +84,11 @@ typedef int64_t ogs_time_t; /** @return ogs_time_t as a msec */ #define ogs_time_msec(time) (((time) / 1000) % 1000) -/** @return ogs_time_t as a msec */ +/** @return ogs_time_t to msec */ #define ogs_time_to_msec(time) ((time) ? (1 + ((time) - 1) / 1000) : 0) +/** @return ogs_time_t to sec */ +#define ogs_time_to_sec(time) \ + ((time) ? (1 + ((time) - 1) / OGS_USEC_PER_SEC) : 0) /** @return milliseconds as an ogs_time_t */ #define ogs_time_from_msec(msec) ((ogs_time_t)(msec) * 1000) diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 12b3e128f4..1e375748a6 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -285,12 +285,7 @@ typedef struct ogs_sbi_subscription_spec_s { typedef struct ogs_sbi_subscription_data_s { ogs_lnode_t lnode; -#define OGS_SBI_VALIDITY_SEC(v) \ - ogs_time_sec(v) + (ogs_time_usec(v) ? 1 : 0) - struct { - int validity_duration; - } time; - + ogs_time_t validity_duration; /* valditiyTime(unit: usec) */ ogs_timer_t *t_validity; /* check validation */ ogs_timer_t *t_patch; /* for sending PATCH */ diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index 6d3eb814b4..71c3d2d098 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -1722,10 +1722,9 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_update( goto end; } - ogs_assert(subscription_data->time.validity_duration); + ogs_assert(subscription_data->validity_duration); validity_time = ogs_sbi_localtime_string( - ogs_time_now() + - ogs_time_from_sec(subscription_data->time.validity_duration)); + ogs_time_now() + subscription_data->validity_duration); ogs_assert(validity_time); ValidityItem.op = OpenAPI_patch_operation_replace; diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index c8072aea92..1617d21d59 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -794,31 +794,43 @@ static void handle_validity_time( { ogs_time_t time, validity, patch; - ogs_assert(validity_time); ogs_assert(subscription_data); ogs_assert(action); - if (ogs_sbi_time_from_string(&time, validity_time) == false) { - ogs_error("[%s] Subscription %s until %s [parser error]", - subscription_data->id, action, validity_time); - return; - } - - validity = time - ogs_time_now(); - if (validity < 0) { - ogs_error("[%s] Subscription %s until %s [validity:%d.%06d]", - subscription_data->id, action, validity_time, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); - return; - } - /* - * Store subscription_data->time.validity_duration to derive NRF validity. - * It will be used in ogs_nnrf_nfm_build_status_update(). + * If there is a validity_time, then the NRF is updating + * the validity_time by sending HTTP_STATUS to 200. + * Therefore, change subscription_data->valdity_duration + * according to this value. * - * So, you should not remove the following lines. + * If validity_time is NULL, NRF sent an HTTP_STATUS of 204 (No content). + * In this case, use the existing subscription_data->validity_duration. */ - subscription_data->time.validity_duration = OGS_SBI_VALIDITY_SEC(validity); + if (validity_time) { + if (ogs_sbi_time_from_string(&time, validity_time) == false) { + ogs_error("[%s] Subscription %s until %s [parser error]", + subscription_data->id, action, validity_time); + return; + } + + validity = time - ogs_time_now(); + if (validity < 0) { + ogs_error("[%s] Subscription %s until %s [validity:%d.%06d]", + subscription_data->id, action, validity_time, + (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); + return; + } + + /* + * Store subscription_data->validity_duration to derive NRF validity. + * It will be used in ogs_nnrf_nfm_build_status_update(). + * + * So, you should not remove the following lines. + */ + subscription_data->validity_duration = + /* Normalize seconds */ + ogs_time_from_sec(ogs_time_to_sec(validity)); + } if (!subscription_data->t_validity) { subscription_data->t_validity = @@ -826,13 +838,14 @@ static void handle_validity_time( ogs_timer_subscription_validity, subscription_data); ogs_assert(subscription_data->t_validity); } - ogs_timer_start(subscription_data->t_validity, validity); + ogs_timer_start(subscription_data->t_validity, + subscription_data->validity_duration); /* * PATCH request will be sent before VALIDITY is expired. */ #define PATCH_TIME_FROM_VALIDITY(x) ((x) / 2) - patch = PATCH_TIME_FROM_VALIDITY(validity); + patch = PATCH_TIME_FROM_VALIDITY(subscription_data->validity_duration); if (!subscription_data->t_patch) { subscription_data->t_patch = @@ -843,10 +856,11 @@ static void handle_validity_time( ogs_timer_start(subscription_data->t_patch, patch); ogs_info("[%s] Subscription %s until %s " - "[duration:%d,validity:%d.%06d,patch:%d.%06d]", + "[duration:%ld,validity:%d.%06d,patch:%d.%06d]", subscription_data->id, action, validity_time, - subscription_data->time.validity_duration, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity), + subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration), (int)ogs_time_sec(patch), (int)ogs_time_usec(patch)); } @@ -952,20 +966,34 @@ void ogs_nnrf_nfm_handle_nf_status_update( ogs_sbi_message_t *recvmsg) { OpenAPI_subscription_data_t *SubscriptionData = NULL; + char *validity_time = NULL; ogs_assert(recvmsg); ogs_assert(subscription_data); - SubscriptionData = recvmsg->SubscriptionData; - if (!SubscriptionData) { - ogs_error("No SubscriptionData"); - return; + if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_OK) { + SubscriptionData = recvmsg->SubscriptionData; + if (!SubscriptionData) { + ogs_error("No SubscriptionData"); + return; + } + if (!SubscriptionData->validity_time) { + ogs_error("No validityTime"); + return; + } + + validity_time = SubscriptionData->validity_time; + } else if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT) { + /* No valdityTime. Re-use current subscription_data->valdity_duration */ + } else { + ogs_fatal("[%s] HTTP response error [%d]", + subscription_data->id ? subscription_data->id : "Unknown", + recvmsg->res_status); + ogs_assert_if_reached(); } - /* Subscription Validity Time */ - if (SubscriptionData->validity_time) - handle_validity_time( - subscription_data, SubscriptionData->validity_time, "updated"); + /* Update Subscription Validity Time */ + handle_validity_time(subscription_data, validity_time, "updated"); } bool ogs_nnrf_nfm_handle_nf_status_notify( diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 5dc81ef203..7471837d89 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -424,13 +424,13 @@ bool nrf_nnrf_handle_nf_status_subscribe( /* * The NRF validity is initially set in configuration. */ - subscription_data->time.validity_duration = - ogs_local_conf()->time.subscription.validity_duration; + subscription_data->validity_duration = + ogs_time_from_sec( + ogs_local_conf()->time.subscription.validity_duration); - if (subscription_data->time.validity_duration) { + if (subscription_data->validity_duration) { SubscriptionData->validity_time = ogs_sbi_localtime_string( - ogs_time_now() + ogs_time_from_sec( - subscription_data->time.validity_duration)); + ogs_time_now() + subscription_data->validity_duration); ogs_assert(SubscriptionData->validity_time); if (!subscription_data->t_validity) { @@ -440,13 +440,16 @@ bool nrf_nnrf_handle_nf_status_subscribe( ogs_assert(subscription_data->t_validity); } ogs_timer_start(subscription_data->t_validity, - ogs_time_from_sec(subscription_data->time.validity_duration)); + subscription_data->validity_duration); } - ogs_info("[%s] Subscription created until %s [validity_duration:%d]", + ogs_info("[%s] Subscription created until %s " + "[duration:%ld,validity:%d.%06d]", subscription_data->id, SubscriptionData->validity_time, - subscription_data->time.validity_duration); + subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration)); /* Location */ server = ogs_sbi_server_from_stream(stream); @@ -487,6 +490,8 @@ bool nrf_nnrf_handle_nf_status_update( ogs_sbi_subscription_data_t *subscription_data = NULL; + ogs_time_t time, validity; + ogs_assert(stream); ogs_assert(recvmsg); @@ -553,73 +558,87 @@ bool nrf_nnrf_handle_nf_status_update( END } - if (validity_time) { - ogs_time_t time, validity; - - if (ogs_sbi_time_from_string(&time, validity_time) == false) { - ogs_error("[%s] Subscription updated until %s [parser error]", - subscription_data->id, validity_time); - goto end; - } - - validity = time - ogs_time_now(); - if (validity < 0) { - ogs_error("[%s] Subscription updated until %s [validity:%d.%06d]", - subscription_data->id, validity_time, - (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); - goto end; - } - - /* - * The NRF validity is updated if NF sent the PATCH Request. - */ - subscription_data->time.validity_duration = - OGS_SBI_VALIDITY_SEC(validity); + if (!validity_time) { + ogs_error("[%s] No validityTime", subscription_data->id); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "No validityTime", subscription_data->id, + NULL)); + return false; + } - if (!subscription_data->t_validity) { - subscription_data->t_validity = - ogs_timer_add(ogs_app()->timer_mgr, - nrf_timer_subscription_validity, subscription_data); - ogs_assert(subscription_data->t_validity); - } - ogs_timer_start(subscription_data->t_validity, - ogs_time_from_sec(subscription_data->time.validity_duration)); + if (ogs_sbi_time_from_string(&time, validity_time) == false) { + ogs_error("[%s] Subscription updated until %s [parser error]", + subscription_data->id, validity_time); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "parse error", subscription_data->id, + validity_time)); + return false; + } - ogs_info("[%s] Subscription updated until %s " - "[duration:%d,validity:%d.%06d]", + validity = time - ogs_time_now(); + if (validity < 0) { + ogs_error("[%s] Subscription updated until %s [validity:%d.%06d]", subscription_data->id, validity_time, - subscription_data->time.validity_duration, (int)ogs_time_sec(validity), (int)ogs_time_usec(validity)); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "invalid validity", subscription_data->id, + validity_time)); + return false; + } - /* To send SubscriptionData to the NF */ - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.SubscriptionData = &SubscriptionData; + /* + * The NRF validity is updated if NF sent the PATCH Request. + */ + subscription_data->validity_duration = + /* Normalize seconds */ + ogs_time_from_sec(ogs_time_to_sec(validity)); + + if (!subscription_data->t_validity) { + subscription_data->t_validity = + ogs_timer_add(ogs_app()->timer_mgr, + nrf_timer_subscription_validity, subscription_data); + ogs_assert(subscription_data->t_validity); + } + ogs_timer_start(subscription_data->t_validity, + subscription_data->validity_duration); - /* Mandatory */ - SubscriptionData.nf_status_notification_uri = - subscription_data->notification_uri; + ogs_info("[%s] Subscription updated until %s " + "[duration:%ld,validity:%d.%06d]", + subscription_data->id, validity_time, + subscription_data->validity_duration, + (int)ogs_time_sec(subscription_data->validity_duration), + (int)ogs_time_usec(subscription_data->validity_duration)); - /* Validity Time */ - SubscriptionData.validity_time = ogs_sbi_localtime_string( - ogs_time_now() + ogs_time_from_sec( - subscription_data->time.validity_duration)); - ogs_assert(SubscriptionData.validity_time); + /* To send SubscriptionData to the NF */ + memset(&sendmsg, 0, sizeof(sendmsg)); - response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); +#if 0 /* Use HTTP_STATUS_NO_CONTENT(204) instead of HTTP_STATUS_OK(200) */ + sendmsg.SubscriptionData = &SubscriptionData; - ogs_free(SubscriptionData.validity_time); + /* Mandatory */ + SubscriptionData.nf_status_notification_uri = + subscription_data->notification_uri; - return true; - } + /* Validity Time */ + SubscriptionData.validity_time = ogs_sbi_localtime_string( + ogs_time_now() + subscription_data->validity_duration); + ogs_assert(SubscriptionData.validity_time); -end: - response = ogs_sbi_build_response( - recvmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); +#else + response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); +#endif ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + ogs_free(SubscriptionData.validity_time); + return true; } diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 6dda686557..737fb9cbe1 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -85,7 +85,7 @@ int app_initialize(const char *const argv[]) * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(500); + ogs_msleep(1000); return OGS_OK;; } From d3a17338a06ae121b3a607da39616a758d5b9fd4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Aug 2024 20:22:59 +0900 Subject: [PATCH 169/323] Follow-up on #3368 There was an issue with the output of the LOG message. I fixed it again and applied it to the main branch. Refer to #3360 #3361 #3363 #3364 --- lib/sbi/nnrf-handler.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 1617d21d59..7e4e7055f7 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -793,6 +793,7 @@ static void handle_validity_time( char *validity_time, const char *action) { ogs_time_t time, validity, patch; + char *validity_time_string = NULL; ogs_assert(subscription_data); ogs_assert(action); @@ -855,13 +856,24 @@ static void handle_validity_time( } ogs_timer_start(subscription_data->t_patch, patch); + if (validity_time) { + validity_time_string = ogs_strdup(validity_time); + ogs_assert(validity_time_string); + } else { + validity_time_string = ogs_sbi_localtime_string( + ogs_time_now() + subscription_data->validity_duration); + ogs_assert(validity_time_string); + } + ogs_info("[%s] Subscription %s until %s " "[duration:%ld,validity:%d.%06d,patch:%d.%06d]", - subscription_data->id, action, validity_time, + subscription_data->id, action, validity_time_string, subscription_data->validity_duration, (int)ogs_time_sec(subscription_data->validity_duration), (int)ogs_time_usec(subscription_data->validity_duration), (int)ogs_time_sec(patch), (int)ogs_time_usec(patch)); + + ogs_free(validity_time_string); } void ogs_nnrf_nfm_handle_nf_status_subscribe( @@ -967,6 +979,7 @@ void ogs_nnrf_nfm_handle_nf_status_update( { OpenAPI_subscription_data_t *SubscriptionData = NULL; char *validity_time = NULL; + const char *action = NULL; ogs_assert(recvmsg); ogs_assert(subscription_data); @@ -983,8 +996,10 @@ void ogs_nnrf_nfm_handle_nf_status_update( } validity_time = SubscriptionData->validity_time; + action = "updated(200 OK)"; } else if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT) { /* No valdityTime. Re-use current subscription_data->valdity_duration */ + action = "updated(204 No Content)"; } else { ogs_fatal("[%s] HTTP response error [%d]", subscription_data->id ? subscription_data->id : "Unknown", @@ -993,7 +1008,7 @@ void ogs_nnrf_nfm_handle_nf_status_update( } /* Update Subscription Validity Time */ - handle_validity_time(subscription_data, validity_time, "updated"); + handle_validity_time(subscription_data, validity_time, action); } bool ogs_nnrf_nfm_handle_nf_status_notify( From 5697cd792e860999df6726d3310743892fbd4273 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Aug 2024 20:39:12 +0900 Subject: [PATCH 170/323] Release v2.7.2 --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 54f800a791..b3befad2bf 100644 --- a/meson.build +++ b/meson.build @@ -16,7 +16,7 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. project('open5gs', 'c', 'cpp', - version : '2.7.1', + version : '2.7.2', license : 'AGPL-3.0-or-later', meson_version : '>= 0.43.0', default_options : [ @@ -25,7 +25,7 @@ project('open5gs', 'c', 'cpp', ], ) -libogslib_version = '2.7.1' +libogslib_version = '2.7.2' prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir')) From 43fa4857cce8af6b6ec3c8e3b0cbf99444948f76 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Aug 2024 21:10:00 +0900 Subject: [PATCH 171/323] Release v2.7.2 (Compilation error fix) --- debian/changelog | 30 ++++++++++++++++++++++++++++++ lib/sbi/nnrf-handler.c | 4 ++-- src/nrf/nnrf-handler.c | 8 ++++---- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5810857ffd..8983f34e31 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,33 @@ +open5gs (2.7.2) unstable; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:03:45 +0900 + +open5gs (2.7.2~jammy1) jammy; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:02:06 +0900 + +open5gs (2.7.2~focal1) focal; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 21:00:24 +0900 + +open5gs (2.7.2~noble1) noble; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 20:58:44 +0900 + +open5gs (2.7.2~bionic1) bionic; urgency=medium + + * Bug Fixed + + -- Sukchan Lee <acetcom@gmail.com> Sun, 04 Aug 2024 20:56:49 +0900 + open5gs (2.7.1) unstable; urgency=medium * Bug Fixed diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 7e4e7055f7..2cddbdf14d 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -866,9 +866,9 @@ static void handle_validity_time( } ogs_info("[%s] Subscription %s until %s " - "[duration:%ld,validity:%d.%06d,patch:%d.%06d]", + "[duration:%lld,validity:%d.%06d,patch:%d.%06d]", subscription_data->id, action, validity_time_string, - subscription_data->validity_duration, + (long long)subscription_data->validity_duration, (int)ogs_time_sec(subscription_data->validity_duration), (int)ogs_time_usec(subscription_data->validity_duration), (int)ogs_time_sec(patch), (int)ogs_time_usec(patch)); diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 7471837d89..d6b9e2468c 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -444,10 +444,10 @@ bool nrf_nnrf_handle_nf_status_subscribe( } ogs_info("[%s] Subscription created until %s " - "[duration:%ld,validity:%d.%06d]", + "[duration:%lld,validity:%d.%06d]", subscription_data->id, SubscriptionData->validity_time, - subscription_data->validity_duration, + (long long)subscription_data->validity_duration, (int)ogs_time_sec(subscription_data->validity_duration), (int)ogs_time_usec(subscription_data->validity_duration)); @@ -609,9 +609,9 @@ bool nrf_nnrf_handle_nf_status_update( subscription_data->validity_duration); ogs_info("[%s] Subscription updated until %s " - "[duration:%ld,validity:%d.%06d]", + "[duration:%lld,validity:%d.%06d]", subscription_data->id, validity_time, - subscription_data->validity_duration, + (long long)subscription_data->validity_duration, (int)ogs_time_sec(subscription_data->validity_duration), (int)ogs_time_usec(subscription_data->validity_duration)); From 37430970f7b5a965f9fd06a0348e8ebd23e2ec44 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 4 Aug 2024 21:13:24 +0900 Subject: [PATCH 172/323] Update document for v2.7.2 --- docs/_posts/2024-08-04-release-v2.7.2.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/_posts/2024-08-04-release-v2.7.2.md diff --git a/docs/_posts/2024-08-04-release-v2.7.2.md b/docs/_posts/2024-08-04-release-v2.7.2.md new file mode 100644 index 0000000000..6190b5b019 --- /dev/null +++ b/docs/_posts/2024-08-04-release-v2.7.2.md @@ -0,0 +1,15 @@ +--- +title: "v2.7.2 - ogs_pool_cycle() removed" +date: 2024-08-04 21:13:00 +0900 +categories: + - Release +tags: + - News + - Release +head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>" +--- + +See [Release Note](https://github.com/open5gs/open5gs/releases/tag/v2.7.2) + +Download -- [v2.7.2.tar.gz](https://github.com/open5gs/open5gs/archive/v2.7.2.tar.gz) +{: .notice--info} From 1a2247997766fa690f79922546449c8333571c46 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 15 Aug 2024 18:32:11 +0900 Subject: [PATCH 173/323] [AMF] Remove ngap_send_amf_ue_context_release_command() ngap_send_amf_ue_context_release_command() is unnecessary. So, change ngap_send_amf_ue_context_release_command() to ngap_send_ran_ue_context_release_command. --- src/amf/gmm-sm.c | 3 ++- src/amf/ngap-handler.c | 2 +- src/amf/ngap-path.c | 20 -------------------- src/amf/ngap-path.h | 3 --- src/amf/nsmf-handler.c | 22 +++++----------------- src/amf/sbi-path.h | 1 - 6 files changed, 8 insertions(+), 43 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index c1ef620690..0fc13cbbd5 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -2522,7 +2522,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 5617d914ad..53a3addfe3 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -1626,7 +1626,7 @@ void ngap_handle_ue_context_release_request( } if (amf_sess_xact_count(amf_ue) == xact_count) { - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command(ran_ue, Cause->present, (int)Cause->choice.radioNetwork, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index 64ad9a7d27..5b9ce2bdf5 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -415,26 +415,6 @@ int ngap_send_ran_ue_context_release_command( return rv; } -int ngap_send_amf_ue_context_release_command( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause, - uint8_t action, ogs_time_t duration) -{ - int rv; - - if (!amf_ue) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } - - rv = ngap_send_ran_ue_context_release_command( - ran_ue_find_by_id(amf_ue->ran_ue_id), - group, cause, action, duration); - ogs_expect(rv == OGS_OK); - ogs_debug(" SUPI[%s]", amf_ue->supi); - - return rv; -} - int ngap_send_paging(amf_ue_t *amf_ue) { ogs_pkbuf_t *ngapbuf = NULL; diff --git a/src/amf/ngap-path.h b/src/amf/ngap-path.h index e734176ff4..116502744f 100644 --- a/src/amf/ngap-path.h +++ b/src/amf/ngap-path.h @@ -55,9 +55,6 @@ int ngap_send_ran_configuration_update_failure( int ngap_send_ran_ue_context_release_command( ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause, uint8_t action, ogs_time_t duration); -int ngap_send_amf_ue_context_release_command( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause, - uint8_t action, ogs_time_t duration); int ngap_send_paging(amf_ue_t *amf_ue); diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index da6538c10b..4d79281a94 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -586,7 +586,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( ogs_warn("PDUSessionResourceSetupResponse(Unsuccessful)"); ogs_assert(amf_ue->deactivation.group); - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command(ran_ue, amf_ue->deactivation.group, amf_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); @@ -624,7 +624,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { ogs_assert(amf_ue->deactivation.group); - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command(ran_ue, amf_ue->deactivation.group, amf_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); @@ -1188,20 +1188,7 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - if (state == AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE) { - /* - * 1. Initial context setup failure - * 2. Release All SM contexts - * 3. UE Context release command - * 4. UE Context release complete - */ - r = ngap_send_amf_ue_context_release_command(amf_ue, - NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, - NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - - } else if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) { + if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) { /* Not reached here */ ogs_assert_if_reached(); @@ -1386,7 +1373,8 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) * 3. UE Context release command * 4. UE Context release complete */ - r = ngap_send_amf_ue_context_release_command(amf_ue, + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); diff --git a/src/amf/sbi-path.h b/src/amf/sbi-path.h index 3f666f5d68..6ece6b3c9f 100644 --- a/src/amf/sbi-path.h +++ b/src/amf/sbi-path.h @@ -58,7 +58,6 @@ bool amf_sbi_send_request( #define AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY 23 #define AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL 24 #define AMF_RELEASE_SM_CONTEXT_NO_STATE 31 -#define AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE 32 #define AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT 33 #define AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT 34 #define AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED 51 From a7d594c2b7d27573df64205c096d3a1f522f0d35 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 15 Aug 2024 20:56:35 +0900 Subject: [PATCH 174/323] [AMF] fix UEContextReleaseCommand encode fail (#3388) UEContextReleaseCommand fails to encode as an ASN.1 message if the Group is 0. This is added because there is currently no exception handling when the gNB sends a Group of 0. --- src/amf/context.h | 12 ++++++------ src/amf/ngap-handler.c | 21 +++++++++++++-------- src/amf/nsmf-handler.c | 14 ++++++++------ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/amf/context.h b/src/amf/context.h index 0fe8e6b22d..a70063e4c8 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -217,6 +217,12 @@ struct ran_ue_s { uint16_t activated; /* Activated PSI Mask */ } psimask; + /* UEContextReleaseRequest or InitialContextSetupFailure */ + struct { + NGAP_Cause_PR group; + long cause; + } deactivation; + /* Related Context */ ogs_pool_id_t gnb_id; ogs_pool_id_t amf_ue_id; @@ -514,12 +520,6 @@ struct amf_ue_s { /* UE Radio Capability */ OCTET_STRING_t ueRadioCapability; - /* UEContextReleaseRequest or InitialContextSetupFailure */ - struct { - NGAP_Cause_PR group; - long cause; - } deactivation; - /* Handover Info */ struct { NGAP_HandoverType_t type; diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 53a3addfe3..15b350c527 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -1279,8 +1279,8 @@ void ngap_handle_initial_context_setup_failure( old_xact_count = amf_sess_xact_count(amf_ue); - amf_ue->deactivation.group = NGAP_Cause_PR_nas; - amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; + ran_ue->deactivation.group = NGAP_Cause_PR_nas; + ran_ue->deactivation.cause = NGAP_CauseNas_normal_release; amf_sbi_send_deactivate_all_sessions( ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, @@ -1566,8 +1566,13 @@ void ngap_handle_ue_context_release_request( ogs_warn("NAS-Cause[%d]", (int)Cause->choice.nas); break; default: - ogs_warn("Invalid cause group[%d]", Cause->present); - break; + ogs_error("Invalid cause group [%d]", Cause->present); + r = ngap_send_error_indication( + gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, + NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; } amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); @@ -1582,8 +1587,8 @@ void ngap_handle_ue_context_release_request( } else { int xact_count = amf_sess_xact_count(amf_ue); - amf_ue->deactivation.group = Cause->present; - amf_ue->deactivation.cause = (int)Cause->choice.radioNetwork; + ran_ue->deactivation.group = Cause->present; + ran_ue->deactivation.cause = (int)Cause->choice.radioNetwork; if (!PDUSessionList) { amf_sbi_send_deactivate_all_sessions( @@ -2154,8 +2159,8 @@ void ngap_handle_pdu_session_resource_setup_response( param.n2SmInfoType = OpenAPI_n2_sm_info_type_PDU_RES_SETUP_FAIL; ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size); - amf_ue->deactivation.group = NGAP_Cause_PR_nas; - amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; + ran_ue->deactivation.group = NGAP_Cause_PR_nas; + ran_ue->deactivation.cause = NGAP_CauseNas_normal_release; r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 4d79281a94..7c5054de94 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -584,11 +584,12 @@ int amf_nsmf_pdusession_handle_update_sm_context( * 6. UEContextReleaseComplete */ ogs_warn("PDUSessionResourceSetupResponse(Unsuccessful)"); - ogs_assert(amf_ue->deactivation.group); + ogs_assert(ran_ue); + ogs_assert(ran_ue->deactivation.group); r = ngap_send_ran_ue_context_release_command(ran_ue, - amf_ue->deactivation.group, - amf_ue->deactivation.cause, + ran_ue->deactivation.group, + ran_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -622,11 +623,12 @@ int amf_nsmf_pdusession_handle_update_sm_context( */ if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - ogs_assert(amf_ue->deactivation.group); + ogs_assert(ran_ue); + ogs_assert(ran_ue->deactivation.group); r = ngap_send_ran_ue_context_release_command(ran_ue, - amf_ue->deactivation.group, - amf_ue->deactivation.cause, + ran_ue->deactivation.group, + ran_ue->deactivation.cause, NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); From 11e51846d767afba3b4b7349c73b683fec5f499a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 15 Aug 2024 23:00:13 +0900 Subject: [PATCH 175/323] [MME] Deliver ENB-UE over GTP XACT (#3388) When a GTP transaction occurs, the ENB-UE associated with the MME-UE may change. To address this, we have changed the structure to include the ENB-UE in the GTP transaction, similar to AMF. When a UEContextReleaseRequest and a Service Request occur simultaneously, the ENB-UE in the Release Access Bearer Request/Response GTP transaction is designed to persist even if the ENB-UE Context changes. --- lib/gtp/xact.h | 2 + src/mme/emm-handler.c | 44 ++++++++++---------- src/mme/emm-handler.h | 34 ++++++++++------ src/mme/emm-sm.c | 58 ++++++++++++++------------- src/mme/esm-handler.c | 21 ++++++---- src/mme/esm-handler.h | 10 +++-- src/mme/esm-sm.c | 33 ++++++++++----- src/mme/mme-gn-handler.c | 3 +- src/mme/mme-gtp-path.c | 45 +++++++++++++++------ src/mme/mme-gtp-path.h | 20 ++++++---- src/mme/mme-path.c | 30 +++++++++----- src/mme/mme-path.h | 7 ++-- src/mme/mme-s11-handler.c | 84 ++++++++++++++++++++++++++++----------- src/mme/mme-s6a-handler.c | 14 +++++-- src/mme/mme-sm.c | 30 +++++++++----- src/mme/s1ap-handler.c | 27 +++++++------ src/mme/sgsap-handler.c | 28 ++++++++----- 17 files changed, 316 insertions(+), 174 deletions(-) diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index c24ba800b5..56f1056440 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -119,6 +119,8 @@ typedef struct ogs_gtp_xact_s { ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */ void *pfcp_xact; /**< Associated PFCP transaction */ + ogs_pool_id_t enb_ue_id; + #define OGS_GTP_MODIFY_TFT_UPDATE ((uint64_t)1<<0) #define OGS_GTP_MODIFY_QOS_UPDATE ((uint64_t)1<<1) uint64_t update_flags; diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 7fa4ea4ca1..de8e8be5c6 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -34,7 +34,7 @@ static uint8_t emm_cause_from_access_control(mme_ue_t *mme_ue); -int emm_handle_attach_request(mme_ue_t *mme_ue, +int emm_handle_attach_request(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf) { int r; @@ -44,7 +44,6 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, ogs_nas_eps_mobile_identity_guti_t *eps_mobile_identity_guti = NULL; ogs_nas_eps_guti_t nas_guti; - enb_ue_t *enb_ue = NULL; ogs_nas_eps_attach_type_t *eps_attach_type = &attach_request->eps_attach_type; ogs_nas_eps_mobile_identity_t *eps_mobile_identity = @@ -55,8 +54,6 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; ogs_assert(mme_ue); - - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(esm_message_container); @@ -251,7 +248,8 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, } int emm_handle_attach_complete( - mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_attach_complete_t *attach_complete) { int r, rv; ogs_pkbuf_t *emmbuf = NULL; @@ -269,6 +267,7 @@ int emm_handle_attach_complete( struct tm gmt, local; ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); @@ -356,8 +355,7 @@ int emm_handle_attach_complete( return OGS_ERROR; } - r = nas_eps_send_to_downlink_nas_transport( - enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf); + r = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -368,17 +366,16 @@ int emm_handle_attach_complete( } int emm_handle_identity_response( - mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_identity_response_t *identity_response) { int r; uint8_t emm_cause; ogs_nas_mobile_identity_t *mobile_identity = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(identity_response); ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); mobile_identity = &identity_response->mobile_identity; @@ -433,12 +430,14 @@ int emm_handle_identity_response( } int emm_handle_detach_request( - mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_detach_request_from_ue_t *detach_request) { ogs_nas_detach_type_t *detach_type = NULL; ogs_assert(detach_request); ogs_assert(mme_ue); + ogs_assert(enb_ue); detach_type = &detach_request->detach_type; @@ -507,12 +506,14 @@ int emm_handle_detach_request( } int emm_handle_service_request( - mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_service_request_t *service_request) { ogs_nas_ksi_and_sequence_number_t *ksi_and_sequence_number = &service_request->ksi_and_sequence_number; ogs_assert(mme_ue); + ogs_assert(enb_ue); /* Set EPS Service */ mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST; @@ -578,8 +579,10 @@ bool emm_tau_request_ue_comes_from_gb_or_iu(const ogs_nas_eps_tracking_area_upda } } -int emm_handle_tau_request(mme_ue_t *mme_ue, - ogs_nas_eps_tracking_area_update_request_t *tau_request, ogs_pkbuf_t *pkbuf) +int emm_handle_tau_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_tracking_area_update_request_t *tau_request, + ogs_pkbuf_t *pkbuf) { int r; int served_tai_index = 0; @@ -591,10 +594,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, &tau_request->eps_update_type; ogs_nas_eps_mobile_identity_t *eps_mobile_identity = &tau_request->old_guti; - enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); ogs_assert(pkbuf); @@ -735,7 +736,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, return OGS_OK; } -int emm_handle_extended_service_request(mme_ue_t *mme_ue, +int emm_handle_extended_service_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_extended_service_request_t *extended_service_request) { int r; @@ -746,10 +748,8 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue, ogs_nas_mobile_identity_t *mobile_identity = &extended_service_request->m_tmsi; ogs_nas_mobile_identity_tmsi_t *mobile_identity_tmsi = NULL; - enb_ue_t *enb_ue = NULL; ogs_assert(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); ogs_assert(enb_ue); /* Set Service Type */ @@ -816,12 +816,14 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue, return OGS_OK; } -int emm_handle_security_mode_complete(mme_ue_t *mme_ue, - ogs_nas_eps_security_mode_complete_t *security_mode_complete) +int emm_handle_security_mode_complete( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_security_mode_complete_t *security_mode_complete) { ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv; ogs_assert(mme_ue); + ogs_assert(enb_ue); if (security_mode_complete->presencemask & OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) { diff --git a/src/mme/emm-handler.h b/src/mme/emm-handler.h index 3bc1701a91..0c5af4d07c 100644 --- a/src/mme/emm-handler.h +++ b/src/mme/emm-handler.h @@ -26,32 +26,40 @@ extern "C" { #endif -int emm_handle_attach_request(mme_ue_t *mme_ue, +int emm_handle_attach_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf); int emm_handle_attach_complete( - mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_attach_complete_t *attach_complete); int emm_handle_identity_response( - mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_identity_response_t *identity_response); int emm_handle_detach_request( - mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_detach_request_from_ue_t *detach_request); int emm_handle_service_request( - mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_service_request_t *service_request); -int emm_handle_tau_request(mme_ue_t *mme_ue, - ogs_nas_eps_tracking_area_update_request_t *tau_request, - ogs_pkbuf_t *pkbuf); +int emm_handle_tau_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_tracking_area_update_request_t *tau_request, + ogs_pkbuf_t *pkbuf); -int emm_handle_extended_service_request(mme_ue_t *mme_ue, - ogs_nas_eps_extended_service_request_t *extended_service_request); +int emm_handle_extended_service_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_extended_service_request_t *extended_service_request); -int emm_handle_security_mode_complete(mme_ue_t *mme_ue, - ogs_nas_eps_security_mode_complete_t *security_mode_complete); +int emm_handle_security_mode_complete( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_eps_security_mode_complete_t *security_mode_complete); bool emm_tau_request_ue_comes_from_gb_or_iu( - const ogs_nas_eps_tracking_area_update_request_t *tau_request); + const ogs_nas_eps_tracking_area_update_request_t *tau_request); #ifdef __cplusplus } diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 55812c2042..792c09c3ac 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -263,7 +263,11 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -328,7 +332,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } rv = emm_handle_service_request( - mme_ue, &message->emm.service_request); + enb_ue, mme_ue, &message->emm.service_request); if (rv != OGS_OK) { ogs_error("emm_handle_service_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -404,7 +408,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_info("Identity response"); CLEAR_MME_UE_TIMER(mme_ue->t3470); - rv = emm_handle_identity_response(mme_ue, + rv = emm_handle_identity_response(enb_ue, mme_ue, &message->emm.identity_response); if (rv != OGS_OK) { ogs_error("emm_handle_identity_response() failed"); @@ -418,7 +422,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, break; } - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -433,7 +437,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, case OGS_NAS_EPS_ATTACH_REQUEST: ogs_info("[%s] Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -456,7 +460,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, */ CLEAR_S1_CONTEXT(mme_ue); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -479,7 +483,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -495,7 +499,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST: ogs_info("[%s] Tracking area update request", mme_ue->imsi_bcd); - rv = emm_handle_tau_request(mme_ue, + rv = emm_handle_tau_request(enb_ue, mme_ue, &message->emm.tracking_area_update_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_tau_request() failed"); @@ -693,7 +697,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_info("[%s] Extended service request", mme_ue->imsi_bcd); rv = emm_handle_extended_service_request( - mme_ue, &message->emm.extended_service_request); + enb_ue, mme_ue, &message->emm.extended_service_request); if (rv != OGS_OK) { ogs_error("emm_handle_extended_service_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -838,7 +842,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, case OGS_NAS_EPS_DETACH_REQUEST: ogs_info("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -873,7 +877,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1049,7 +1053,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("[%s] Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1066,7 +1070,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1101,7 +1105,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1227,7 +1231,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) CLEAR_S1_CONTEXT(mme_ue); emm_handle_security_mode_complete( - mme_ue, &message->emm.security_mode_complete); + enb_ue, mme_ue, &message->emm.security_mode_complete); ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); @@ -1257,7 +1261,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("[%s] Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1282,7 +1286,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1317,7 +1321,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1443,7 +1447,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) CLEAR_MME_UE_TIMER(mme_ue->t3450); rv = emm_handle_attach_complete( - mme_ue, &message->emm.attach_complete); + enb_ue, mme_ue, &message->emm.attach_complete); if (rv != OGS_OK) { ogs_error("emm_handle_attach_complete() failed " "in emm_state_initial_context_setup"); @@ -1511,14 +1515,14 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("[%s] Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); break; } - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -1537,7 +1541,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( - mme_ue, &message->emm.detach_request_from_ue); + enb_ue, mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { ogs_error("emm_handle_detach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1572,7 +1576,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + mme_send_delete_session_or_detach(enb_ue, mme_ue); } OGS_FSM_TRAN(s, &emm_state_de_registered); @@ -1671,7 +1675,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_ATTACH_REQUEST: ogs_warn("[%s] Attach request", mme_ue->imsi_bcd); rv = emm_handle_attach_request( - mme_ue, &message->emm.attach_request, e->pkbuf); + enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf); if (rv != OGS_OK) { ogs_error("emm_handle_attach_request() failed"); OGS_FSM_TRAN(s, emm_state_exception); @@ -1696,7 +1700,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) */ CLEAR_S1_CONTEXT(mme_ue); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -1719,7 +1723,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e) OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index e829df6287..92637993f6 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -28,8 +28,10 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __esm_log_domain -int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, - ogs_nas_eps_pdn_connectivity_request_t *req, int create_action) +int esm_handle_pdn_connectivity_request( + enb_ue_t *enb_ue, mme_bearer_t *bearer, + ogs_nas_eps_pdn_connectivity_request_t *req, + int create_action) { int r; mme_ue_t *mme_ue = NULL; @@ -41,6 +43,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(req); @@ -159,7 +162,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, } ogs_assert(OGS_OK == - mme_gtp_send_create_session_request(sess, create_action)); + mme_gtp_send_create_session_request(enb_ue, sess, create_action)); } else { ogs_error("No APN"); r = nas_eps_send_pdn_connectivity_reject( @@ -172,7 +175,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, return OGS_OK; } -int esm_handle_information_response(mme_sess_t *sess, +int esm_handle_information_response( + enb_ue_t *enb_ue, mme_sess_t *sess, ogs_nas_eps_esm_information_response_t *rsp) { int r; @@ -181,6 +185,7 @@ int esm_handle_information_response(mme_sess_t *sess, ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(rsp); @@ -249,7 +254,7 @@ int esm_handle_information_response(mme_sess_t *sess, } else { ogs_assert(OGS_OK == mme_gtp_send_create_session_request( - sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST)); + enb_ue, sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST)); } } else { if (rsp->access_point_name.length) @@ -269,7 +274,7 @@ int esm_handle_information_response(mme_sess_t *sess, } int esm_handle_bearer_resource_allocation_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message) + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message) { int r; mme_ue_t *mme_ue = NULL; @@ -280,6 +285,7 @@ int esm_handle_bearer_resource_allocation_request( ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); r = nas_eps_send_bearer_resource_allocation_reject( mme_ue, sess->pti, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE); @@ -290,13 +296,14 @@ int esm_handle_bearer_resource_allocation_request( } int esm_handle_bearer_resource_modification_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message) + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message) { mme_ue_t *mme_ue = NULL; ogs_assert(bearer); mme_ue = mme_ue_find_by_id(bearer->mme_ue_id); ogs_assert(mme_ue); + ogs_assert(enb_ue); ogs_assert(OGS_OK == mme_gtp_send_bearer_resource_command(bearer, message)); diff --git a/src/mme/esm-handler.h b/src/mme/esm-handler.h index d27d9ff1a3..3cc63e8e37 100644 --- a/src/mme/esm-handler.h +++ b/src/mme/esm-handler.h @@ -26,15 +26,17 @@ extern "C" { #endif -int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, +int esm_handle_pdn_connectivity_request( + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_pdn_connectivity_request_t *req, int create_action); -int esm_handle_information_response(mme_sess_t *sess, +int esm_handle_information_response( + enb_ue_t *enb_ue, mme_sess_t *sess, ogs_nas_eps_esm_information_response_t *rsp); int esm_handle_bearer_resource_allocation_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message); + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message); int esm_handle_bearer_resource_modification_request( - mme_bearer_t *bearer, ogs_nas_eps_message_t *message); + enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message); #ifdef __cplusplus } diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 382e50cc5e..290bfb536d 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -70,8 +70,8 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; - sgw_ue_t *sgw_ue = NULL; enb_ue_t *enb_ue = NULL; + sgw_ue_t *sgw_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -102,13 +102,16 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_assert(enb_ue); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("PDN Connectivity request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); @@ -124,7 +127,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_assert(sgw_ue); ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(sgw_ue, sess, + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -186,7 +189,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) } rv = esm_handle_information_response( - sess, &message->esm.esm_information_response); + enb_ue, sess, &message->esm.esm_information_response); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); break; @@ -203,7 +206,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_list_add(&mme_ue->bearer_to_modify_list, &bearer->to_modify_node); ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, 0, 0)); + mme_gtp_send_modify_bearer_request(enb_ue, mme_ue, 0, 0)); } nas_eps_send_activate_all_dedicated_bearers(bearer); @@ -278,6 +281,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) { int r, rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; @@ -304,13 +308,16 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_assert(enb_ue); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("PDN Connectivity request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); @@ -328,7 +335,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_assert(sgw_ue); ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request(sgw_ue, sess, + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST)); } else { r = nas_eps_send_deactivate_bearer_context_request(bearer); @@ -364,13 +371,15 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("Bearer resource allocation request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); - esm_handle_bearer_resource_allocation_request(bearer, message); + esm_handle_bearer_resource_allocation_request( + enb_ue, bearer, message); break; case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST: ogs_debug("Bearer resource modification request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); - esm_handle_bearer_resource_modification_request(bearer, message); + esm_handle_bearer_resource_modification_request( + enb_ue, bearer, message); break; default: ogs_error("Unknown message(type:%d)", @@ -388,6 +397,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) { int rv; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; ogs_nas_eps_message_t *message = NULL; @@ -413,6 +423,9 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) message = e->nas_message; ogs_assert(message); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + ogs_assert(enb_ue); + switch (message->esm.h.message_type) { case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: ogs_debug("[D] Deactivate EPS bearer " @@ -426,7 +439,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request, + enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index 188ac6c41e..e90844acd6 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -424,7 +424,8 @@ int mme_gn_handle_sgsn_context_response( rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, xact); - mme_gtp_send_create_session_request(sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + mme_gtp_send_create_session_request( + enb_ue, sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); return ret_cause; diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 152f9e4c55..26a91796f3 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -163,6 +163,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) } ogs_assert(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); switch (type) { case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE: @@ -177,7 +178,6 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) */ CLEAR_SESSION_CONTEXT(mme_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -192,7 +192,10 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) /* Nothing to do */ break; default: - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("No S1 Context"); break; } @@ -258,7 +261,8 @@ void mme_gtp_close(void) ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); } -int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) +int mme_gtp_send_create_session_request( + enb_ue_t *enb_ue, mme_sess_t *sess, int create_action) { int rv; ogs_gtp2_header_t h; @@ -267,6 +271,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) mme_ue_t *mme_ue = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -296,6 +301,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) } xact->create_action = create_action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -304,7 +310,8 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) } int mme_gtp_send_modify_bearer_request( - mme_ue_t *mme_ue, int uli_presence, int modify_action) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + int uli_presence, int modify_action) { int rv; @@ -314,6 +321,7 @@ int mme_gtp_send_modify_bearer_request( ogs_gtp2_header_t h; ogs_pkbuf_t *pkbuf = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -337,6 +345,7 @@ int mme_gtp_send_modify_bearer_request( } xact->modify_action = modify_action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -345,7 +354,7 @@ int mme_gtp_send_modify_bearer_request( } int mme_gtp_send_delete_session_request( - sgw_ue_t *sgw_ue, mme_sess_t *sess, int action) + enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action) { int rv; ogs_pkbuf_t *s11buf = NULL; @@ -353,6 +362,7 @@ int mme_gtp_send_delete_session_request( ogs_gtp_xact_t *xact = NULL; mme_ue_t *mme_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(sess); mme_ue = mme_ue_find_by_id(sess->mme_ue_id); @@ -378,6 +388,7 @@ int mme_gtp_send_delete_session_request( } xact->delete_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; ogs_debug("delete_session_request - xact:%p, sess:%p", xact, sess); rv = ogs_gtp_xact_commit(xact); @@ -386,11 +397,13 @@ int mme_gtp_send_delete_session_request( return rv; } -void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) +void mme_gtp_send_delete_all_sessions( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { mme_sess_t *sess = NULL, *next_sess = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -398,7 +411,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) ogs_list_for_each_safe(&mme_ue->sess_list, next_sess, sess) { if (MME_HAVE_SGW_S1U_PATH(sess)) { - mme_gtp_send_delete_session_request(sgw_ue, sess, action); + mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, action); } else { MME_SESS_CLEAR(sess); } @@ -573,7 +586,8 @@ int mme_gtp_send_delete_bearer_response( return rv; } -int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) +int mme_gtp_send_release_access_bearers_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { int rv; ogs_gtp2_header_t h; @@ -581,6 +595,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -605,6 +620,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action) } xact->release_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -645,7 +661,8 @@ void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action) } ogs_assert(OGS_OK == - mme_gtp_send_release_access_bearers_request(mme_ue, action)); + mme_gtp_send_release_access_bearers_request( + enb_ue, mme_ue, action)); } else { ogs_warn("mme_gtp_send_release_all_ue_in_enb()"); ogs_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] Action[%d]", @@ -711,7 +728,7 @@ int mme_gtp_send_downlink_data_notification_ack( } int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue) + enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int rv; ogs_gtp2_header_t h; @@ -719,6 +736,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -743,6 +761,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( return OGS_ERROR; } xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); @@ -751,7 +770,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( } int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue, int action) + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action) { int rv; ogs_gtp2_header_t h; @@ -759,6 +778,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( ogs_gtp_xact_t *xact = NULL; sgw_ue_t *sgw_ue = NULL; + ogs_assert(enb_ue); ogs_assert(action); ogs_assert(mme_ue); sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); @@ -784,6 +804,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( } xact->delete_indirect_action = action; xact->local_teid = mme_ue->gn.mme_gn_teid; + xact->enb_ue_id = enb_ue->id; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); diff --git a/src/mme/mme-gtp-path.h b/src/mme/mme-gtp-path.h index 3ef1b7ad47..41ea459aab 100644 --- a/src/mme/mme-gtp-path.h +++ b/src/mme/mme-gtp-path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -29,28 +29,32 @@ extern "C" { int mme_gtp_open(void); void mme_gtp_close(void); -int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action); +int mme_gtp_send_create_session_request( + enb_ue_t *enb_ue, mme_sess_t *sess, int create_action); int mme_gtp_send_modify_bearer_request( - mme_ue_t *mme_ue, int uli_presence, int modify_action); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, + int uli_presence, int modify_action); int mme_gtp_send_delete_session_request( - sgw_ue_t *sgw_ue, mme_sess_t *sess, int action); -void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action); + enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action); +void mme_gtp_send_delete_all_sessions( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); int mme_gtp_send_create_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_update_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_delete_bearer_response( mme_bearer_t *bearer, uint8_t cause_value); -int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action); +int mme_gtp_send_release_access_bearers_request( + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action); int mme_gtp_send_downlink_data_notification_ack( mme_bearer_t *bearer, uint8_t cause_value); int mme_gtp_send_create_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue); + enb_ue_t *enb_ue, mme_ue_t *mme_ue); int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue_t *mme_ue, int action); + enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action); int mme_gtp_send_bearer_resource_command( mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message); diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 3b31497882..d8f02796d7 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -25,10 +25,11 @@ #include "mme-fd-path.h" #include "mme-sm.h" -void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) +void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int r, xact_count; ogs_assert(mme_ue); + ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); @@ -36,7 +37,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) case MME_DETACH_TYPE_REQUEST_FROM_UE: ogs_debug("Detach Request from UE"); mme_gtp_send_delete_all_sessions( - mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT); + enb_ue, mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == @@ -61,7 +62,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) */ case MME_DETACH_TYPE_HSS_EXPLICIT: ogs_debug("Explicit HSS Detach"); - mme_gtp_send_delete_all_sessions(mme_ue, OGS_GTP_DELETE_NO_ACTION); + mme_gtp_send_delete_all_sessions( + enb_ue, mme_ue, OGS_GTP_DELETE_NO_ACTION); break; /* MME Implicit Detach, ie: Lost Communication @@ -70,7 +72,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) */ case MME_DETACH_TYPE_MME_IMPLICIT: ogs_warn("[%s] Implicit MME Detach", mme_ue->imsi_bcd); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && @@ -106,7 +108,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) */ case MME_DETACH_TYPE_HSS_IMPLICIT: ogs_debug("Implicit HSS Detach"); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); break; @@ -116,21 +118,22 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) } } -void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue) +void mme_send_delete_session_or_mme_ue_context_release( + enb_ue_t *enb_ue, mme_ue_t *mme_ue) { int r, xact_count = 0; ogs_assert(mme_ue); + ogs_assert(enb_ue); xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR); - mme_gtp_send_delete_all_sessions(mme_ue, + mme_gtp_send_delete_all_sessions(enb_ue, mme_ue, OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); if (!MME_SESSION_RELEASE_PENDING(mme_ue) && mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) == xact_count) { - enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -154,7 +157,8 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd); ogs_assert(OGS_OK == mme_gtp_send_release_access_bearers_request( - mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND)); + enb_ue, mme_ue, + OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND)); } else { ogs_debug("No UE Context"); r = s1ap_send_ue_context_release_command(enb_ue, @@ -300,7 +304,11 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } } break; diff --git a/src/mme/mme-path.h b/src/mme/mme-path.h index afc6f13e87..10f8fe64c3 100644 --- a/src/mme/mme-path.h +++ b/src/mme/mme-path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -26,8 +26,9 @@ extern "C" { #endif -void mme_send_delete_session_or_detach(mme_ue_t *mme_ue); -void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue); +void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue); +void mme_send_delete_session_or_mme_ue_context_release( + enb_ue_t *enb_ue, mme_ue_t *mme_ue); void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue); void mme_send_after_paging(mme_ue_t *mme_ue, bool failed); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 214f3fa8c9..b7264f2c8a 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -209,6 +209,7 @@ void mme_s11_handle_create_session_response( sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); if (sess) mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -221,13 +222,17 @@ void mme_s11_handle_create_session_response( return; } + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; } source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(source_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) { target_ue = sgw_ue_find_by_id(source_ue->target_ue_id); @@ -267,7 +272,7 @@ void mme_s11_handle_create_session_response( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -325,7 +330,7 @@ void mme_s11_handle_create_session_response( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -357,7 +362,7 @@ void mme_s11_handle_create_session_response( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } } @@ -377,7 +382,7 @@ void mme_s11_handle_create_session_response( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -416,7 +421,7 @@ void mme_s11_handle_create_session_response( bearer = mme_bearer_find_by_ue_ebi(mme_ue, rsp->bearer_contexts_created[i].eps_bearer_id.u8); if (!bearer) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); return; } @@ -572,6 +577,7 @@ void mme_s11_handle_modify_bearer_response( int modify_action = 0; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; ogs_assert(rsp); @@ -585,6 +591,7 @@ void mme_s11_handle_modify_bearer_response( modify_action = xact->modify_action; mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -620,7 +627,10 @@ void mme_s11_handle_modify_bearer_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -635,7 +645,10 @@ void mme_s11_handle_modify_bearer_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -646,7 +659,10 @@ void mme_s11_handle_modify_bearer_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -700,6 +716,7 @@ void mme_s11_handle_delete_session_response( sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data)); if (sess) mme_ue = mme_ue_find_by_id(sess->mme_ue_id); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -712,6 +729,11 @@ void mme_s11_handle_delete_session_response( return; } + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + if (!mme_ue) { ogs_error("MME-UE Context has already been removed"); return; @@ -769,8 +791,6 @@ void mme_s11_handle_delete_session_response( ogs_assert(target_ue); ogs_assert(source_ue); - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", mme_ue->mme_s11_teid, source_ue->sgw_s11_teid); @@ -1394,6 +1414,7 @@ void mme_s11_handle_release_access_bearers_response( ogs_assert(action); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1443,7 +1464,6 @@ void mme_s11_handle_release_access_bearers_response( } if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) { - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); if (enb_ue) { r = s1ap_send_ue_context_release_command(enb_ue, enb_ue->relcause.group, enb_ue->relcause.cause, @@ -1471,8 +1491,6 @@ void mme_s11_handle_release_access_bearers_response( * for new UE-associated logical S1-connections over the S1 interface, * the MME shall respond with the RESET ACKNOWLEDGE message. */ - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - enb_ue_unlink(mme_ue); if (enb_ue) { @@ -1494,8 +1512,6 @@ void mme_s11_handle_release_access_bearers_response( } else if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL) { enb_ue_t *iter = NULL; - enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - enb_ue_unlink(mme_ue); if (enb_ue) { @@ -1691,6 +1707,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( sgw_ue_t *sgw_ue = NULL; mme_bearer_t *bearer = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; enb_ue_t *source_ue = NULL; ogs_gtp2_f_teid_t *teid = NULL; @@ -1704,6 +1721,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( ********************/ ogs_assert(xact); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1739,7 +1757,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1754,7 +1775,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1765,7 +1789,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1826,6 +1853,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE; int action = 0; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; sgw_ue_t *sgw_ue = NULL; ogs_assert(rsp); @@ -1839,6 +1867,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( action = xact->delete_indirect_action; ogs_assert(action); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); + enb_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1874,7 +1903,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1889,7 +1921,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } @@ -1900,7 +1935,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("GTP Cause [VALUE:%d]", session_cause); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + if (enb_ue) + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); return; } diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index 23ab8d625e..fedf9c3323 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -283,7 +283,11 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } } break; @@ -308,7 +312,11 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { - mme_send_delete_session_or_detach(mme_ue); + enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } break; default: diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index e83f896b83..64459de334 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -347,7 +347,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_fsm_dispatch(&mme_ue->sm, e); if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) { - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); } ogs_pkbuf_free(pkbuf); @@ -802,10 +802,15 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) GTP_COUNTER_INCREMENT( mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH); - ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request( - sgw_ue, sess, - OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) { + ogs_assert(OGS_OK == + mme_gtp_send_delete_session_request( + enb_ue, sgw_ue, sess, + OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + } else + ogs_error("ENB-S1 Context has already been removed"); + } break; @@ -895,10 +900,15 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_list_for_each(&mme_ue->sess_list, sess) { GTP_COUNTER_INCREMENT( mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH); - ogs_assert(OGS_OK == - mme_gtp_send_delete_session_request( - sgw_ue, sess, - OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) { + ogs_assert(OGS_OK == + mme_gtp_send_delete_session_request( + enb_ue, sgw_ue, sess, + OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST)); + } else + ogs_error("ENB-S1 Context has already been removed"); } break; diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index e8063ecf89..faeeaea3cf 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -1073,7 +1073,8 @@ void s1ap_handle_initial_context_setup_response( if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, uli_presence, 0)); + mme_gtp_send_modify_bearer_request( + enb_ue, mme_ue, uli_presence, 0)); } } @@ -1596,7 +1597,8 @@ void s1ap_handle_e_rab_setup_response( ogs_list_add(&mme_ue->bearer_to_modify_list, &bearer->to_modify_node); ogs_assert(OGS_OK == - mme_gtp_send_modify_bearer_request(mme_ue, 0, 0)); + mme_gtp_send_modify_bearer_request( + enb_ue, mme_ue, 0, 0)); } else { ogs_assert(OGS_OK == mme_gtp_send_create_bearer_response( @@ -1978,7 +1980,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE)); + enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE)); } else { ogs_warn("Check your eNodeB"); ogs_warn(" No INDIRECT TUNNEL"); @@ -1999,7 +2001,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( - mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL)); + enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL)); } else { ogs_warn("Check your eNodeB"); ogs_warn(" No INDIRECT TUNNEL"); @@ -2225,7 +2227,7 @@ void s1ap_handle_e_rab_modification_indication( if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( - mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION)); + enb_ue, mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION)); } } @@ -2661,7 +2663,7 @@ void s1ap_handle_path_switch_request( if (relocation == SGW_WITHOUT_RELOCATION) { if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( - mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)); + enb_ue, mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)); } } else if (relocation == SGW_WITH_RELOCATION) { mme_sess_t *sess = NULL; @@ -2672,7 +2674,7 @@ void s1ap_handle_path_switch_request( ogs_assert(OGS_OK == mme_gtp_send_create_session_request( - sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)); + enb_ue, sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)); } } else if (relocation == SGW_HAS_ALREADY_BEEN_RELOCATED) { ogs_error("SGW has already been relocated"); @@ -3232,8 +3234,8 @@ void s1ap_handle_handover_request_ack( if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == - mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue)\ - ); + mme_gtp_send_create_indirect_data_forwarding_tunnel_request( + source_ue, mme_ue)); } else { r = s1ap_send_handover_command(source_ue); ogs_expect(r == OGS_OK); @@ -3789,7 +3791,8 @@ void s1ap_handle_handover_notification( } if (ogs_list_count(&mme_ue->bearer_to_modify_list)) { - ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(mme_ue, 1, 0)); + ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request( + target_ue, mme_ue, 1, 0)); } } @@ -3945,7 +3948,7 @@ void s1ap_handle_s1_reset( mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); if (mme_ue) { ogs_assert(OGS_OK == - mme_gtp_send_release_access_bearers_request(mme_ue, + mme_gtp_send_release_access_bearers_request(enb_ue, mme_ue, OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL)); } else { enb_ue_remove(enb_ue); diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index d9b93b88c2..b1d4d47850 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -33,6 +33,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) int r; ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; @@ -124,13 +125,17 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) return; error: - r = nas_eps_send_attach_reject( - enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, - OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, - OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) { + r = nas_eps_send_attach_reject( + enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, + OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, + OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); + } else + ogs_error("ENB-S1 Context has already been removed"); } void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) @@ -226,6 +231,7 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) { ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; @@ -295,7 +301,11 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd); - mme_send_delete_session_or_detach(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (enb_ue) + mme_send_delete_session_or_detach(enb_ue, mme_ue); + else + ogs_error("ENB-S1 Context has already been removed"); } void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) From 96a64d7c4377fd84528ffe741a8954dfe2a4e5b4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 15 Aug 2024 23:11:41 +0900 Subject: [PATCH 176/323] [MME] fix UEContextReleaseCommand encode fail (#3388) UEContextReleaseCommand fails to encode as an ASN.1 message if the Group is 0. This is added because there is currently no exception handling when the gNB sends a Group of 0. --- src/mme/mme-path.c | 1 + src/mme/mme-s11-handler.c | 1 + src/mme/s1ap-handler.c | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index d8f02796d7..0ed85d8041 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -161,6 +161,7 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND)); } else { ogs_debug("No UE Context"); + ogs_assert(enb_ue->relcause.group); r = s1ap_send_ue_context_release_command(enb_ue, enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index b7264f2c8a..afab8f6876 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1465,6 +1465,7 @@ void mme_s11_handle_release_access_bearers_response( if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) { if (enb_ue) { + ogs_assert(enb_ue->relcause.group); r = s1ap_send_ue_context_release_command(enb_ue, enb_ue->relcause.group, enb_ue->relcause.cause, S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index faeeaea3cf..bbb308f31b 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1760,8 +1760,12 @@ void s1ap_handle_ue_context_release_request( ogs_warn("NAS-Cause[%d]", (int)Cause->choice.nas); break; default: - ogs_warn("Invalid cause group[%d]", Cause->present); - break; + ogs_error("Invalid cause group[%d]", Cause->present); + r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + return; } enb_ue->relcause.group = Cause->present; From d2e9583d771178825aed4618133c7a76be451d3d Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 13 Aug 2024 14:11:07 +0200 Subject: [PATCH 177/323] [SMF] Handle SDM subscription to UDM during PDU session lifetime - create SDM subscription to UDM when PDU session is created, just before sending SMF registration to UDM - delete SDM subscription when PDU session is released - handle SDM Change Notification, but not yet process items in it --- lib/sbi/message.c | 13 ++++ lib/sbi/message.h | 7 ++ src/smf/context.c | 4 ++ src/smf/context.h | 31 ++++++++ src/smf/gsm-sm.c | 156 ++++++++++++++++++++++++++++++++++++++--- src/smf/nsmf-handler.c | 111 +++++++++++++++++++++++++++++ src/smf/nsmf-handler.h | 3 + src/smf/nudm-build.c | 120 +++++++++++++++++++++++++++++++ src/smf/nudm-build.h | 4 ++ src/smf/nudm-handler.c | 125 +++++++++++++++++++++++++++++---- src/smf/nudm-handler.h | 2 + src/smf/smf-sm.c | 5 ++ 12 files changed, 559 insertions(+), 22 deletions(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 322ca594ba..63488c4509 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -2490,6 +2490,19 @@ static int parse_json(ogs_sbi_message_t *message, END break; + CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY) + if (message->res_status < 300) { + message->ModificationNotification = + OpenAPI_modification_notification_parseFromJSON(item); + if (!message->ModificationNotification) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", message->res_status); + } + break; + DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name [%s]", diff --git a/lib/sbi/message.h b/lib/sbi/message.h index 281066bab2..c27bce6d62 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -169,6 +169,13 @@ extern "C" { #define OGS_SBI_NPCF_AM_POLICY_CONTROL_MULTIPLE_ACCESS_TYPES 5 #define OGS_SBI_NPCF_AM_POLICY_CONTROL_WIRELINE_WIRELESS_CONVERGE 6 +#define OGS_SBI_NUDM_SDM_SHARED_DATA 1 +#define OGS_SBI_NUDM_SDM_IMMEDIATE_REPORT 2 +#define OGS_SBI_NUDM_SDM_PATCH_REPORT 3 +#define OGS_SBI_NUDM_SDM_NSSAA 4 +#define OGS_SBI_NUDM_SDM_CAG_FEATURE 5 +#define OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS 13 + #define OGS_SBI_NPCF_SMPOLICYCONTROL_TSC 1 #define OGS_SBI_NPCF_SMPOLICYCONTROL_RES_SHARE 2 #define OGS_SBI_NPCF_SMPOLICYCONTROL_3GPP_PS_DATA_OFF 3 diff --git a/src/smf/context.c b/src/smf/context.c index 11d577935c..a397e19ecc 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1745,6 +1745,10 @@ void smf_sess_remove(smf_sess_t *sess) if (sess->policy_association.client) ogs_sbi_client_remove(sess->policy_association.client); + UDM_SDM_CLEAR(sess); + if (sess->data_change_subscription.client) + ogs_sbi_client_remove(sess->data_change_subscription.client); + if (sess->session.name) ogs_free(sess->session.name); if (sess->full_dnn) diff --git a/src/smf/context.h b/src/smf/context.h index 81c42953ed..9b3f571edb 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -318,6 +318,37 @@ typedef struct smf_sess_s { ogs_sbi_client_t *client; } policy_association; + /* SubscriptionId of Subscription to Data Change Notification to UDM */ +#define UDM_SDM_SUBSCRIBED(__sESS) \ + ((__sESS) && ((__sESS)->data_change_subscription.id)) +#define UDM_SDM_CLEAR(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + if ((__sESS)->data_change_subscription.resource_uri) \ + ogs_free((__sESS)->data_change_subscription.resource_uri); \ + (__sESS)->data_change_subscription.resource_uri = NULL; \ + if ((__sESS)->data_change_subscription.id) \ + ogs_free((__sESS)->data_change_subscription.id); \ + (__sESS)->data_change_subscription.id = NULL; \ + } while(0) +#define UDM_SDM_STORE(__sESS, __rESOURCE_URI, __iD) \ + do { \ + ogs_assert((__sESS)); \ + ogs_assert((__rESOURCE_URI)); \ + ogs_assert((__iD)); \ + UDM_SDM_CLEAR(__sESS); \ + (__sESS)->data_change_subscription.resource_uri = \ + ogs_strdup(__rESOURCE_URI); \ + ogs_assert((__sESS)->data_change_subscription.resource_uri); \ + (__sESS)->data_change_subscription.id = ogs_strdup(__iD); \ + ogs_assert((__sESS)->data_change_subscription.id); \ + } while(0) + struct { + char *resource_uri; + char *id; + ogs_sbi_client_t *client; + } data_change_subscription; + OpenAPI_up_cnx_state_e up_cnx_state; /* Serving PLMN ID & Home PLMN ID */ diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 951a5afdbc..13b595fcce 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -546,6 +546,31 @@ void smf_gsm_state_wait_5gc_sm_policy_association(ogs_fsm_t *s, smf_event_t *e) } break; + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED)) { + strerror = ogs_msprintf("[%s:%d] HTTP response error [%d]", + smf_ue->supi, sess->psi, sbi_message->res_status); + ogs_assert(strerror); + + ogs_error("%s", strerror); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, sbi_message->res_status, + sbi_message, strerror, NULL, NULL)); + ogs_free(strerror); + + OGS_FSM_TRAN(s, smf_gsm_state_exception); + break; + } + + if (smf_nudm_sdm_handle_subscription( + sess, stream, sbi_message) == false) { + ogs_error("smf_nudm_sdm_handle_subscription() failed"); + OGS_FSM_TRAN(s, smf_gsm_state_exception); + } + break; + DEFAULT strerror = ogs_msprintf("[%s:%d] Invalid resource name [%s]", smf_ue->supi, sess->psi, @@ -1166,6 +1191,15 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else if (UDM_SDM_SUBSCRIBED(sess)) { + ogs_warn("[%s:%d] No PolicyAssociationId. " + "Forcibly remove SESSION", smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); } else { ogs_warn("[%s:%d] No PolicyAssociationId. " "Forcibly remove SESSION", smf_ue->supi, sess->psi); @@ -1469,12 +1503,22 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e) trigger == OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT) { - int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, stream, - SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (UDM_SDM_SUBSCRIBED(sess)) { + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + else { + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } OGS_FSM_TRAN(s, smf_gsm_state_5gc_session_will_deregister); @@ -1798,6 +1842,47 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, n1smbuf, OpenAPI_n2_sm_info_type_NULL, NULL); break; + + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + SWITCH(sbi_message->h.resource.component[1]) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + + if (e->h.sbi.data) { + /* stream is optional here in this case, + * depending on the different code paths */ + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + } + int state = e->h.sbi.state; + + UDM_SDM_CLEAR(sess); + + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, + sess, stream, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + + DEFAULT + ogs_warn("[%s] Ignore invalid HTTP method [%s]", + smf_ue->supi, sbi_message->h.method); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[1]); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("[%s:%d] Invalid API name [%s]", smf_ue->supi, sess->psi, sbi_message->h.service.name); @@ -1866,8 +1951,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) sess->n2_released = true; if ((sess->n1_released) && (sess->n2_released)) { int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, NULL, + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, NULL, SMF_UECM_STATE_DEREGISTERED_BY_N1_N2_RELEASE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1908,8 +1993,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e) sess->n1_released = true; if ((sess->n1_released) && (sess->n2_released)) { int r = smf_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, - smf_nudm_uecm_build_deregistration, sess, NULL, + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, NULL, SMF_UECM_STATE_DEREGISTERED_BY_N1_N2_RELEASE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2117,6 +2202,57 @@ void smf_gsm_state_5gc_session_will_deregister(ogs_fsm_t *s, smf_event_t *e) END break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + + if (e->h.sbi.data) { + /* stream is optional here in this case, + * depending on the different code paths */ + stream_id = OGS_POINTER_TO_UINT(e->h.sbi.data); + ogs_assert(stream_id >= OGS_MIN_POOL_ID && + stream_id <= OGS_MAX_POOL_ID); + + stream = ogs_sbi_stream_find_by_id(stream_id); + } + int state = e->h.sbi.state; + + SWITCH(sbi_message->h.resource.component[1]) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + + UDM_SDM_CLEAR(sess); + + int r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + smf_nudm_uecm_build_deregistration, + sess, stream, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + + DEFAULT + ogs_warn("Ignore invalid HTTP method [%s]", + sbi_message->h.method); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[1]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid API name [%s]", sbi_message->h.service.name); + END + break; + default: ogs_error("Unknown event %s", smf_event_get_name(e)); break; diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 7c383e6b47..93be163834 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -771,6 +771,15 @@ bool smf_nsmf_handle_update_sm_context( OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else if (UDM_SDM_SUBSCRIBED(sess)) { + ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", + smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); } else { ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", smf_ue->supi, sess->psi); @@ -870,6 +879,15 @@ bool smf_nsmf_handle_release_sm_context( OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT, &param); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else if (UDM_SDM_SUBSCRIBED(sess)) { + ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", + smf_ue->supi, sess->psi); + r = smf_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription_delete, sess, stream, + SMF_UECM_STATE_DEREGISTERED_BY_AMF, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); } else { ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", smf_ue->supi, sess->psi); @@ -883,3 +901,96 @@ bool smf_nsmf_handle_release_sm_context( return true; } + + +bool smf_nsmf_callback_handle_sdm_data_change_notify( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) +{ + int status = OGS_SBI_HTTP_STATUS_NO_CONTENT; + smf_ue_t *smf_ue = NULL; + + ogs_sbi_message_t sendmsg; + ogs_sbi_response_t *response = NULL; + + OpenAPI_modification_notification_t *ModificationNotification; + OpenAPI_lnode_t *node; + + char *ueid = NULL; + char *res_name = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + ModificationNotification = recvmsg->ModificationNotification; + if (!ModificationNotification) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("No ModificationNotification"); + goto cleanup; + } + + OpenAPI_list_for_each(ModificationNotification->notify_items, node) { + OpenAPI_notify_item_t *item = node->data; + char *saveptr = NULL; + + ueid = ogs_sbi_parse_uri(item->resource_id, "/", &saveptr); + if (!ueid) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("[%s] No UeId", item->resource_id); + goto cleanup; + } + + smf_ue = smf_ue_find_by_supi(ueid); + if (!smf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + ogs_error("Cannot find SUPI [%s]", ueid); + goto cleanup; + } + + res_name = ogs_sbi_parse_uri(NULL, "/", &saveptr); + if (!res_name) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("[%s] No Resource Name", item->resource_id); + goto cleanup; + } + + SWITCH(res_name) + CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) + OpenAPI_lnode_t *node_ci; + + OpenAPI_list_for_each(item->changes, node_ci) { + /* + TODO: + OpenAPI_change_item_t *change_item = node_ci->data; + */ + } + + break; + DEFAULT + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + ogs_error("Unknown Resource Name: [%s]", res_name); + goto cleanup; + END + + ogs_free(ueid); + ogs_free(res_name); + + ueid = NULL; + res_name = NULL; + } + + +cleanup: + if (ueid) + ogs_free(ueid); + if (res_name) + ogs_free(res_name); + + memset(&sendmsg, 0, sizeof(sendmsg)); + + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + return OGS_OK; +} + diff --git a/src/smf/nsmf-handler.h b/src/smf/nsmf-handler.h index 3583ed4a5a..0677a120a6 100644 --- a/src/smf/nsmf-handler.h +++ b/src/smf/nsmf-handler.h @@ -33,6 +33,9 @@ bool smf_nsmf_handle_update_sm_context( bool smf_nsmf_handle_release_sm_context( smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *message); +bool smf_nsmf_callback_handle_sdm_data_change_notify( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); + #ifdef __cplusplus } #endif diff --git a/src/smf/nudm-build.c b/src/smf/nudm-build.c index 979e982047..eb88a79b39 100644 --- a/src/smf/nudm-build.c +++ b/src/smf/nudm-build.c @@ -151,3 +151,123 @@ ogs_sbi_request_t *smf_nudm_uecm_build_deregistration( return request; } + +ogs_sbi_request_t *smf_nudm_sdm_build_subscription( + smf_sess_t *sess, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_header_t header; + ogs_sbi_request_t *request = NULL; + ogs_sbi_server_t *server = NULL; + smf_ue_t *smf_ue; + + OpenAPI_sdm_subscription_t SDMSubscription; + OpenAPI_snssai_t sNSSAI; + uint64_t supported_features = 0; + + char *monres = NULL; + + ogs_assert(sess); + ogs_assert(data); + + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + ogs_assert(smf_ue->supi); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NUDM_SDM; + message.h.api.version = (char *)OGS_SBI_API_V2; + message.h.resource.component[0] = smf_ue->supi; + message.h.resource.component[1] = + (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; + + memset(&SDMSubscription, 0, sizeof(SDMSubscription)); + + SDMSubscription.nf_instance_id = + NF_INSTANCE_ID(ogs_sbi_self()->nf_instance); + + server = ogs_sbi_server_first(); + if (!server) { + ogs_error("No server"); + goto end; + } + + memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_CALLBACK; + header.api.version = (char *)OGS_SBI_API_V1; + header.resource.component[0] = + (char *)OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY; + header.resource.component[1] = smf_ue->supi; + SDMSubscription.callback_reference = ogs_sbi_server_uri(server, &header); + if (!SDMSubscription.callback_reference) { + ogs_error("No callback_reference"); + goto end; + } + + SDMSubscription.monitored_resource_uris = OpenAPI_list_create(); + + monres = ogs_msprintf("%s/%s", smf_ue->supi, (char *)data); + ogs_assert(monres); + + OpenAPI_list_add(SDMSubscription.monitored_resource_uris, monres); + SDMSubscription.is_implicit_unsubscribe = true; + SDMSubscription.implicit_unsubscribe = 1; + + OGS_SBI_FEATURES_SET(supported_features, + OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS); + SDMSubscription.supported_features = + ogs_uint64_to_string(supported_features); + + SDMSubscription.is_unique_subscription = true; + SDMSubscription.unique_subscription = 1; + + SDMSubscription.dnn = sess->session.name; + SDMSubscription.plmn_id = ogs_sbi_build_plmn_id(&sess->serving_plmn_id); + + memset(&sNSSAI, 0, sizeof(sNSSAI)); + sNSSAI.sst = sess->s_nssai.sst; + sNSSAI.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + SDMSubscription.single_nssai = &sNSSAI; + + message.SDMSubscription = &SDMSubscription; + + message.http.custom.callback = + (char *)OGS_SBI_CALLBACK_NUDM_SDM_NOTIFICATION; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + +end: + if (sNSSAI.sd) + ogs_free(sNSSAI.sd); + if (SDMSubscription.plmn_id) + ogs_sbi_free_plmn_id(SDMSubscription.plmn_id); + if (SDMSubscription.supported_features) + ogs_free(SDMSubscription.supported_features); + if (monres) + ogs_free(monres); + OpenAPI_list_free(SDMSubscription.monitored_resource_uris); + if (SDMSubscription.callback_reference) + ogs_free(SDMSubscription.callback_reference); + return request; +} + +ogs_sbi_request_t *smf_nudm_sdm_build_subscription_delete( + smf_sess_t *sess, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + ogs_assert(sess); + ogs_assert(sess->data_change_subscription.resource_uri); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; + message.h.uri = sess->data_change_subscription.resource_uri; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + return request; +} diff --git a/src/smf/nudm-build.h b/src/smf/nudm-build.h index 434321223e..c227997a06 100644 --- a/src/smf/nudm-build.h +++ b/src/smf/nudm-build.h @@ -32,6 +32,10 @@ ogs_sbi_request_t *smf_nudm_uecm_build_registration( smf_sess_t *sess, void *data); ogs_sbi_request_t *smf_nudm_uecm_build_deregistration( smf_sess_t *sess, void *data); +ogs_sbi_request_t *smf_nudm_sdm_build_subscription( + smf_sess_t *sess, void *data); +ogs_sbi_request_t *smf_nudm_sdm_build_subscription_delete( + smf_sess_t *sess, void *data); #ifdef __cplusplus } diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index 2879ca9659..c0cb334dbf 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -29,13 +29,6 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, smf_ue_t *smf_ue = NULL; ogs_pkbuf_t *n1smbuf = NULL; - OpenAPI_sm_context_created_data_t SmContextCreatedData; - - ogs_sbi_server_t *server = NULL; - ogs_sbi_header_t header; - ogs_sbi_message_t sendmsg; - ogs_sbi_response_t *response = NULL; - OpenAPI_session_management_subscription_data_t *SessionManagementSubscriptionData = NULL; OpenAPI_list_t *dnnConfigurationList = NULL; @@ -55,9 +48,6 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_assert(stream); smf_ue = smf_ue_find_by_id(sess->smf_ue_id); ogs_assert(smf_ue); - server = ogs_sbi_server_from_stream(stream); - ogs_assert(server); - ogs_assert(recvmsg); @@ -330,21 +320,132 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_assert(cause_value == OGS_PFCP_CAUSE_REQUEST_ACCEPTED); + + r = smf_sbi_discover_and_send(OGS_SBI_SERVICE_TYPE_NUDM_SDM, NULL, + smf_nudm_sdm_build_subscription, sess, stream, 0, + (char *)OGS_SBI_RESOURCE_NAME_SM_DATA); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + return true; + +cleanup: + ogs_assert(strerror); + + ogs_error("%s", strerror); + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, strerror, NULL, NULL)); + ogs_free(strerror); + + return false; +} + +bool smf_nudm_sdm_handle_subscription(smf_sess_t *sess, ogs_sbi_stream_t *stream, + ogs_sbi_message_t *recvmsg) +{ + int r; + int rv; + char *strerror = NULL; + smf_ue_t *smf_ue; + + ogs_sbi_server_t *server = NULL; + ogs_sbi_header_t header; + ogs_sbi_message_t sendmsg; + ogs_sbi_message_t message; + ogs_sbi_response_t *response = NULL; + OpenAPI_sm_context_created_data_t SmContextCreatedData; + + bool rc; + ogs_sbi_client_t *client = NULL; + OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; + char *fqdn = NULL; + uint16_t fqdn_port = 0; + ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + + ogs_assert(sess); + smf_ue = smf_ue_find_by_id(sess->smf_ue_id); + ogs_assert(smf_ue); + ogs_assert(smf_ue->supi); + + + if (!recvmsg->http.location) { + strerror = ogs_msprintf("[%s] No http.location", smf_ue->supi); + goto cleanup; + } + + memset(&header, 0, sizeof(header)); + header.uri = recvmsg->http.location; + + rv = ogs_sbi_parse_header(&message, &header); + if (rv != OGS_OK) { + strerror = ogs_msprintf("[%s] Cannot parse http.location [%s]", + smf_ue->supi, recvmsg->http.location); + goto cleanup; + } + + if (!message.h.resource.component[2]) { + ogs_sbi_header_free(&header); + strerror = ogs_msprintf("[%s] No Subscription ID [%s]", + smf_ue->supi, recvmsg->http.location); + goto cleanup; + } + + rc = ogs_sbi_getaddr_from_uri( + &scheme, &fqdn, &fqdn_port, &addr, &addr6, header.uri); + if (rc == false || scheme == OpenAPI_uri_scheme_NULL) { + ogs_sbi_header_free(&header); + strerror = ogs_msprintf("[%s] Invalid URI [%s]", + smf_ue->supi, header.uri); + goto cleanup; + } + + client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + ogs_debug("[%s] ogs_sbi_client_add()", smf_ue->supi); + client = ogs_sbi_client_add(scheme, fqdn, fqdn_port, addr, addr6); + if (!client) { + strerror = ogs_msprintf("[%s] ogs_sbi_client_add() failed", + smf_ue->supi); + + ogs_sbi_header_free(&header); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + goto cleanup; + } + } + + OGS_SBI_SETUP_CLIENT(&sess->data_change_subscription, client); + + ogs_free(fqdn); + ogs_freeaddrinfo(addr); + ogs_freeaddrinfo(addr6); + + UDM_SDM_STORE(sess, header.uri, message.h.resource.component[2]); + + ogs_sbi_header_free(&header); + + /********************************************************************* * Send HTTP_STATUS_CREATED(/nsmf-pdusession/v1/sm-context) to the AMF *********************************************************************/ memset(&SmContextCreatedData, 0, sizeof(SmContextCreatedData)); - memset(&sendmsg, 0, sizeof(sendmsg)); - memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NSMF_PDUSESSION; header.api.version = (char *)OGS_SBI_API_V1; header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_CONTEXTS; header.resource.component[1] = sess->sm_context_ref; + server = ogs_sbi_server_from_stream(stream); + ogs_assert(server); + sendmsg.http.location = ogs_sbi_server_uri(server, &header); ogs_assert(sendmsg.http.location); diff --git a/src/smf/nudm-handler.h b/src/smf/nudm-handler.h index 95cb8c1926..aa03e2e68f 100644 --- a/src/smf/nudm-handler.h +++ b/src/smf/nudm-handler.h @@ -28,6 +28,8 @@ extern "C" { bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +bool smf_nudm_sdm_handle_subscription(smf_sess_t *sess, ogs_sbi_stream_t *stream, + ogs_sbi_message_t *recvmsg); #ifdef __cplusplus } diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 75ee9157e3..dab4a81694 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -28,6 +28,7 @@ #include "gy-handler.h" #include "nnrf-handler.h" #include "namf-handler.h" +#include "nsmf-handler.h" #include "npcf-handler.h" void smf_state_initial(ogs_fsm_t *s, smf_event_t *e) @@ -658,6 +659,10 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) sbi_message.h.resource.component[0], NULL)); END break; + CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY) + smf_nsmf_callback_handle_sdm_data_change_notify( + stream, &sbi_message); + break; DEFAULT ogs_error("Invalid resource name [%s]", sbi_message.h.resource.component[0]); From cba4479c5cd0ece8bbdfca4a42741f2dd8ad30da Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 16 Aug 2024 15:56:00 +0900 Subject: [PATCH 178/323] [SMF] Follow-up on #3393 --- src/smf/gsm-sm.c | 2 +- src/smf/nsmf-handler.c | 4 ++-- src/smf/nudm-build.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 13b595fcce..0fbc33260f 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -1201,7 +1201,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - ogs_warn("[%s:%d] No PolicyAssociationId. " + ogs_warn("[%s:%d] No SDM Subscription. " "Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 93be163834..30bb0b9db5 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -781,7 +781,7 @@ bool smf_nsmf_handle_update_sm_context( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", + ogs_warn("[%s:%d] No UDM Subscription. Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, @@ -889,7 +889,7 @@ bool smf_nsmf_handle_release_sm_context( ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - ogs_warn("[%s:%d] No PolicyAssociationId. Forcibly remove SESSION", + ogs_warn("[%s:%d] No UDM Subscription. Forcibly remove SESSION", smf_ue->supi, sess->psi); r = smf_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, diff --git a/src/smf/nudm-build.c b/src/smf/nudm-build.c index eb88a79b39..5df1dd2a95 100644 --- a/src/smf/nudm-build.c +++ b/src/smf/nudm-build.c @@ -183,6 +183,7 @@ ogs_sbi_request_t *smf_nudm_sdm_build_subscription( (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; memset(&SDMSubscription, 0, sizeof(SDMSubscription)); + memset(&sNSSAI, 0, sizeof(sNSSAI)); SDMSubscription.nf_instance_id = NF_INSTANCE_ID(ogs_sbi_self()->nf_instance); @@ -225,7 +226,6 @@ ogs_sbi_request_t *smf_nudm_sdm_build_subscription( SDMSubscription.dnn = sess->session.name; SDMSubscription.plmn_id = ogs_sbi_build_plmn_id(&sess->serving_plmn_id); - memset(&sNSSAI, 0, sizeof(sNSSAI)); sNSSAI.sst = sess->s_nssai.sst; sNSSAI.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); SDMSubscription.single_nssai = &sNSSAI; From a328f9a2f5d74ea9d02197fcd2d1bfeb5175a5b1 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Wed, 14 Aug 2024 09:10:29 +0200 Subject: [PATCH 179/323] [AMF,SMF] Add optional PLMN-ID parameter to SDM GET queries --- src/amf/nudm-build.c | 4 ++++ src/smf/nudm-build.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/amf/nudm-build.c b/src/amf/nudm-build.c index e20093c83d..e5d2091ce7 100644 --- a/src/amf/nudm-build.c +++ b/src/amf/nudm-build.c @@ -164,6 +164,10 @@ ogs_sbi_request_t *amf_nudm_sdm_build_get(amf_ue_t *amf_ue, void *data) message.h.resource.component[0] = amf_ue->supi; message.h.resource.component[1] = data; + message.param.plmn_id_presence = true; + memcpy(&message.param.plmn_id, &amf_ue->home_plmn_id, + sizeof(message.param.plmn_id)); + request = ogs_sbi_build_request(&message); ogs_expect(request); diff --git a/src/smf/nudm-build.c b/src/smf/nudm-build.c index 5df1dd2a95..1834290c3a 100644 --- a/src/smf/nudm-build.c +++ b/src/smf/nudm-build.c @@ -41,6 +41,10 @@ ogs_sbi_request_t *smf_nudm_sdm_build_get(smf_sess_t *sess, void *data) memcpy(&message.param.s_nssai, &sess->s_nssai, sizeof(message.param.s_nssai)); + message.param.plmn_id_presence = true; + memcpy(&message.param.plmn_id, &sess->home_plmn_id, + sizeof(message.param.plmn_id)); + if (sess->session.name) message.param.dnn = sess->session.name; From 06df59e654baeb97e215ed41e4e5ded7be00e9c7 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Wed, 14 Aug 2024 11:21:14 +0200 Subject: [PATCH 180/323] [AMF] Send 5GMM cause in request to SMF on AMF-initiated session release Previously, 5GMM cause was not being sent due to missing "is_x_value" not being set to true. --- src/amf/nsmf-build.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 2f56667ccb..2a0df02de1 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -437,7 +437,10 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_release_sm_context( ngApCause.value = param->ngApCause.value; } - SmContextReleaseData._5g_mm_cause_value = param->gmm_cause; + if (param->gmm_cause) { + SmContextReleaseData._5g_mm_cause_value = param->gmm_cause; + SmContextReleaseData.is__5g_mm_cause_value = true; + } } memset(&ueLocation, 0, sizeof(ueLocation)); From ed482784b9feb3cdad0013da38ebcc715c2f15ec Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Wed, 14 Aug 2024 09:39:29 +0200 Subject: [PATCH 181/323] [NRF] Add it's own available services to the NfProfile This can be used when retrieving a list of registered NRF's and how to connect to them. --- src/nrf/sbi-path.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/nrf/sbi-path.c b/src/nrf/sbi-path.c index 1e92f0d21f..02c0b967ea 100644 --- a/src/nrf/sbi-path.c +++ b/src/nrf/sbi-path.c @@ -25,6 +25,7 @@ static int client_notify_cb( int nrf_sbi_open(void) { ogs_sbi_nf_instance_t *nf_instance = NULL; + ogs_sbi_nf_service_t *service = NULL; /* Initialize SELF NF instance */ nf_instance = ogs_sbi_self()->nf_instance; @@ -33,6 +34,22 @@ int nrf_sbi_open(void) /* Build NF instance information. */ ogs_sbi_nf_instance_build_default(nf_instance); + if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NNRF_NFM)) { + service = ogs_sbi_nf_service_build_default( + nf_instance, OGS_SBI_SERVICE_NAME_NNRF_NFM); + ogs_assert(service); + ogs_sbi_nf_service_add_version( + service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL); + } + + if (ogs_sbi_nf_service_is_available(OGS_SBI_SERVICE_NAME_NNRF_DISC)) { + service = ogs_sbi_nf_service_build_default( + nf_instance, OGS_SBI_SERVICE_NAME_NNRF_DISC); + ogs_assert(service); + ogs_sbi_nf_service_add_version( + service, OGS_SBI_API_V1, OGS_SBI_API_V1_0_0, NULL); + } + if (ogs_sbi_server_start_all(ogs_sbi_server_handler) != OGS_OK) return OGS_ERROR; From 333d3fe1c652aeb9aa667c9ff633a1b258593f48 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 16 Aug 2024 16:39:54 +0900 Subject: [PATCH 182/323] clang scan-build static analysis findings/resolutions (#3387) The clang scan-build procedure ``` Assume Ubuntu docker container with open5gs mounted to /src. Assume these tools are installed to docker container: sudo apt install -y clang-tools clang For easy reference to clang scan-build tool: Put normal open5gs build procedure into a file called /src/build ======================= Inside docker container: ======================= export CLANG_OUT_DIR=/src/scan_build_results scan-build -disable-checker deadcode.DeadStores --override-compiler --keep-going --exclude subprojects --exclude tests --exclude lib/asn1c -maxloop 200 -o $CLANG_OUT_DIR -plist-html /src/build 2>&1 | tee /src/logclang.txt ======================= Results: ======================= Results are in html format in $CLANG_OUT_DIR - top level index.html ``` Note that in this analysis the following suppressions were assumed: - no deadcode.DeadStores analysis since those are not functional findings - exclude lib/asn1c for reason that is outside of open5gs control - exclude tests for reason that those are not functional findings - exclude subprojects since those are outside of open5gs control --- lib/core/abts.c | 22 +++++++++++++++---- lib/crypt/ecc.c | 10 +++++++++ lib/crypt/kasumi.c | 12 +++++++++++ lib/crypt/ogs-aes.c | 12 +++++++++++ lib/gtp/v1/types.c | 6 ++++++ lib/ipfw/dummynet.c | 4 ++++ lib/ipfw/ipfw2.c | 36 +++++++++++++++++++++++++++++-- lib/ipfw/tables.c | 47 +++++++++++++++++++++++++++++++++++------ lib/sbi/conv.c | 7 ++++++ lib/sctp/ogs-lksctp.c | 4 ++++ src/amf/nsmf-handler.c | 10 +++++---- src/mme/mme-fd-path.c | 17 ++++++++++++++- src/mme/mme-sm.c | 5 +++++ src/mme/s1ap-handler.c | 4 ++++ src/mme/sgsap-handler.c | 5 +++++ src/nssf/context.c | 4 ++++ src/pcf/pcf-sm.c | 6 ++++-- src/sgwc/context.c | 3 ++- src/sgwc/pfcp-sm.c | 3 +++ src/sgwc/sxa-handler.c | 2 ++ src/smf/gn-build.c | 11 ++++++++++ src/smf/gy-path.c | 10 +++++++++ src/udm/nudm-handler.c | 3 ++- 23 files changed, 222 insertions(+), 21 deletions(-) diff --git a/lib/core/abts.c b/lib/core/abts.c index a81e6b870e..86f05a14cd 100644 --- a/lib/core/abts.c +++ b/lib/core/abts.c @@ -152,10 +152,17 @@ abts_suite *abts_add_suite(abts_suite *suite, const char *suite_name_full) suite = malloc(sizeof(*suite)); suite->head = subsuite; suite->tail = subsuite; - } - else { - suite->tail->next = subsuite; - suite->tail = subsuite; + } else { + /* Clang scan-build SA: NULL pointer dereference: add check for suite->tail=NULL */ + if (suite->tail) { + suite->tail->next = subsuite; + suite->tail = subsuite; + } else { + fprintf(stderr, "suite->tail=NULL\n"); + fflush(stderr); + free(subsuite); + return(NULL); + } } if (!should_test_run(subsuite->name)) { @@ -203,6 +210,13 @@ static int report(abts_suite *suite) end_suite(suite); } + /* Clang scan-build SA: NULL pointer dereference: suite=NULL */ + if (!suite) { + fprintf(stderr, "suite=NULL\n"); + fflush(stderr); + return(1); + } + for (dptr = suite->head; dptr; dptr = dptr->next) { count += dptr->failed; } diff --git a/lib/crypt/ecc.c b/lib/crypt/ecc.c index 411abe9231..9066a21ad1 100644 --- a/lib/crypt/ecc.c +++ b/lib/crypt/ecc.c @@ -1075,6 +1075,11 @@ int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTE EccPoint l_public; unsigned l_tries = 0; + /* Clang scan-build SA: Branch condition evaluates to garbage value: In 1st pass thru the do loop the struct l_public + * will not contain a value in the while() check if vli_isZero(l_private)==true and the continue branch is taken. + * Initialize l_public to fix the issue. */ + memset(&l_public, 0, sizeof(EccPoint)); + do { if(!getRandomNumber(l_private) || (l_tries++ >= MAX_TRIES)) @@ -1255,6 +1260,11 @@ int ecdsa_sign(const uint8_t p_privateKey[ECC_BYTES], const uint8_t p_hash[ECC_B EccPoint p; unsigned l_tries = 0; + /* Clang scan-build SA: Branch condition evaluates to garbage value: In 1st pass thru the do loop the struct "p" + * will not contain a value in the while() check if vli_isZero(k)==true and the continue branch is taken. + * Initialize "p" to fix the issue. */ + memset(&p, 0, sizeof(EccPoint)); + do { if(!getRandomNumber(k) || (l_tries++ >= MAX_TRIES)) diff --git a/lib/crypt/kasumi.c b/lib/crypt/kasumi.c index 7ce7fed044..14cc86cade 100644 --- a/lib/crypt/kasumi.c +++ b/lib/crypt/kasumi.c @@ -292,7 +292,13 @@ void kasumi_f8(u8 *key, u32 count, u32 bearer, u32 dir, u8 *data, int length) /* Construct the modified key and then "kasumi" A */ for( n=0; n<16; ++n ) ModKey[n] = (u8)(key[n] ^ 0x55); + + /* Clang scan-build SA: Result of operation is garbage: The function kasumi_key_schedule() is reporting that + * the array parameter "k" (ModKey) has garbage/uninitialized values. Don't see how that is possible + * because the array is fully populated by the loop above. */ +#ifndef __clang_analyzer__ kasumi_key_schedule( ModKey ); +#endif kasumi( A.b8 ); /* First encryption to create modifier */ @@ -454,7 +460,13 @@ u8 *kasumi_f9(u8 *key, u32 count, u32 fresh, u32 dir, u8 *data, int length) * key XORd with 0xAAAA..... */ for( n=0; n<16; ++n ) ModKey[n] = (u8)*key++ ^ 0xAA; + + /* Clang scan-build SA: Result of operation is garbage: The function kasumi_key_schedule() is reporting that + * the array parameter "k" (ModKey) has garbage/uninitialized values. Don't see how that is possible + * because the array is fully populated by the loop above. */ +#ifndef __clang_analyzer__ kasumi_key_schedule( ModKey ); +#endif kasumi( B.b8 ); /* We return the left-most 32-bits of the result */ diff --git a/lib/crypt/ogs-aes.c b/lib/crypt/ogs-aes.c index 382a90537d..d8c4c58ce7 100644 --- a/lib/crypt/ogs-aes.c +++ b/lib/crypt/ogs-aes.c @@ -1255,6 +1255,12 @@ int ogs_aes_cbc_encrypt(const uint8_t *key, const uint32_t keybits, *outlen = ((inlen - 1) / OGS_AES_BLOCK_SIZE + 1) * OGS_AES_BLOCK_SIZE; + /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_encrypt() is reporting that the + * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path + * through ogs_aes_setup_enc() that doesn't match a valid keybits value and therefore the function is not + * populating rk. Fix the issue by initializing rk to 0 here. */ + memset(rk, 0, sizeof(rk)); + nrounds = ogs_aes_setup_enc(rk, key, keybits); while (len >= OGS_AES_BLOCK_SIZE) @@ -1310,6 +1316,12 @@ int ogs_aes_cbc_decrypt(const uint8_t *key, const uint32_t keybits, *outlen = inlen; + /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_decrypt() is reporting that the + * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path + * through ogs_aes_setup_enc() (from ogs_aes_setup_dec()) that doesn't match a valid keybits value and + * therefore the function is not populating rk. Fix the issue by initializing rk to 0 here. */ + memset(rk, 0, sizeof(rk)); + nrounds = ogs_aes_setup_dec(rk, key, keybits); if (in != out) diff --git a/lib/gtp/v1/types.c b/lib/gtp/v1/types.c index ba812d7a74..78a0d0159f 100644 --- a/lib/gtp/v1/types.c +++ b/lib/gtp/v1/types.c @@ -921,6 +921,12 @@ int ogs_gtp1_parse_pdp_context( CHECK_SPACE_ERR(1 + *ptr); rv = ogs_fqdn_parse(decoded->apn, (const char *)ptr + 1, ogs_min(*ptr, sizeof(decoded->apn))); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv <= 0) { + ogs_error("ogs_fqdn_parse() failed"); + return OGS_ERROR; + } + ptr += 1 + *ptr; CHECK_SPACE_ERR(2); diff --git a/lib/ipfw/dummynet.c b/lib/ipfw/dummynet.c index f31367503f..6f56899d4c 100644 --- a/lib/ipfw/dummynet.c +++ b/lib/ipfw/dummynet.c @@ -853,6 +853,10 @@ ipfw_config_pipe(int ac, char **av) fs->fs_nr = i + DN_MAX_ID; fs->sched_nr = i; break; + default: + /* Clang scan-build SA: NULL pointer dereference: missing "default" case leaves fs=NULL. */ + ogs_error("unrecognised option %d", co.do_pipe); + break; } /* set to -1 those fields for which we want to reuse existing * values from the kernel. diff --git a/lib/ipfw/ipfw2.c b/lib/ipfw/ipfw2.c index 9711b9c493..2675bf4512 100644 --- a/lib/ipfw/ipfw2.c +++ b/lib/ipfw/ipfw2.c @@ -764,6 +764,8 @@ print_flags_buffer(char *buf, size_t sz, struct _s_x *list, uint32_t set) int _substrcmp(const char *str1, const char* str2) { + /* Clang scan-build SA: Argument with nonnull attribute passed null. */ + if ((!str1) || (!str2)) return(1); if (strncmp(str1, str2, strlen(str1)) != 0) return 1; @@ -2464,9 +2466,15 @@ list_dyn_range(struct cmdline_opts *co, struct format_opts *fo, void ipfw_list(int ac, char *av[], int show_counters) { + /* Clang scan-build SA: Uninitialized argument value: false-positive report for the variable + * sz being uninitialized if ipfw_get_config() doesn't fill in sz and returns an error. + * ipfw_get_config() only returns success if sz is filled in. The SA is incorrectly creating + * a path where ipfw_get_config() doesn't fill in sz on an error but the SA is using + * error=0 (success) below to pass an unitialized sz to ipfw_show_config(). + * Initialize sz=0 to make the SA happy. */ ipfw_cfg_lheader *cfg; struct format_opts sfo; - size_t sz; + size_t sz = 0; int error; int lac; char **lav; @@ -2535,6 +2543,12 @@ ipfw_show_config(struct cmdline_opts *co, struct format_opts *fo, ipfw_obj_ctlv *ctlv, *tstate; ipfw_obj_tlv *rbase; + /* Clang scan-build SA: NULL pointer dereference */ + if (!cfg) { + ogs_error("!cfg"); + return(EX_DATAERR); + } + /* * Handle tablenames TLV first, if any */ @@ -2853,7 +2867,10 @@ fill_ip(ipfw_insn_ip *cmd, char *av, int cblen, struct tidx *tstate) d[1] = htonl(~0 << (32 - masklen)); break; case '{': /* no mask, assume /24 and put back the '{' */ - d[1] = htonl(~0 << (32 - 24)); + /* Clang scan-build SA: Result of operation is garbage: The SA is whining that the result of the << is + * undefined because the left operand (~0) is negative. Fix by casting to unsigned. Why is this + * the only place the SA reports this issue? Same code a few lines above... */ + d[1] = htonl((uint32_t)(~0) << (32 - 24)); *(--p) = md; break; @@ -4914,6 +4931,14 @@ ipfw_get_tracked_ifaces(ipfw_obj_lheader **polh) } sz = req.size; +#ifndef __clang_analyzer__ + /* Clang scan-build SA: Memory error - use of 0 allocated: This is a code bug or a false-positive that is + * not clear. do_get3(..., &req.opheader, &sz) calls getsockopt(..., optval=&req.opheader, optlen=&sz) + * which fills in optval & optlen on return. However opheader does not contain a size field and + * sz (optlen) is overwritten by the line above. req.size appears to still be 0 from the memset() at the + * top of the function. This looks like a bug but hard to believe because this is code from/for a BSD + * linux firewall package. */ + if ((olh = calloc(1, sz)) == NULL) return (ENOMEM); @@ -4924,6 +4949,7 @@ ipfw_get_tracked_ifaces(ipfw_obj_lheader **polh) } *polh = olh; +#endif return (0); } @@ -4954,6 +4980,12 @@ ipfw_list_tifaces(void) err(EX_OSERR, "Unable to request ipfw tracked interface list"); + /* Clang scan-build SA: NULL pointer dereference: false-positive report that olh=NULL after + * ipfw_get_tracked_ifaces()=0 (2 functions up). This is incorrect because ipfw_get_tracked_ifaces() + * only returns 0 when it sets the olh pointer. But add an assert just in case and to stop the SA from + * reporting this. */ + ogs_assert(olh); + qsort(olh + 1, olh->count, olh->objsize, ifinfo_cmp); info = (ipfw_iface_info *)(olh + 1); diff --git a/lib/ipfw/tables.c b/lib/ipfw/tables.c index e75b59ae41..87690e7a76 100644 --- a/lib/ipfw/tables.c +++ b/lib/ipfw/tables.c @@ -263,9 +263,16 @@ ipfw_table_handler(int ac, char *av[]) case TOK_INFO: arg = (tcmd == TOK_DETAIL) ? (void *)1 : NULL; if (is_all == 0) { + /* Clang scan-build SA: Uninitialized argument value: false-positive report for the contents + * of "i" being undefined if table_get_info() doesn't fill in "i" and returns an error. + * table_get_info() only returns success if "i" is filled in. The SA is incorrectly creating + * a path where table_get_info() doesn't fill in "i" on an error but the SA is using + * error=0 (success) below to pass an uninitialized "i" to table_show_info(). */ +#ifndef __clang_analyzer__ if ((error = table_get_info(&oh, &i)) != 0) err(EX_OSERR, "failed to request table info"); table_show_info(&i, arg); +#endif } else { error = tables_foreach(table_show_info, arg, 1); if (error != 0) @@ -275,9 +282,16 @@ ipfw_table_handler(int ac, char *av[]) case TOK_LIST: if (is_all == 0) { ipfw_xtable_info i; + /* Clang scan-build SA: Result of operation is garbage: false-positive report for the contents + * of "i" being undefined if table_get_info() doesn't fill in "i" and returns an error. + * table_get_info() only returns success if "i" is filled in. The SA is incorrectly creating + * a path where table_get_info() doesn't fill in "i" on an error but the SA is using + * error=0 (success) below to pass an uninitialized "i" to table_show_one(). */ +#ifndef __clang_analyzer__ if ((error = table_get_info(&oh, &i)) != 0) err(EX_OSERR, "failed to request table info"); table_show_one(&i, NULL); +#endif } else { error = tables_foreach(table_show_one, NULL, 1); if (error != 0) @@ -1588,6 +1602,14 @@ tables_foreach(table_cb_t *f, void *arg, int sort) static int table_do_get_list(ipfw_xtable_info *i, ipfw_obj_header **poh) { + /* Clang scan-build SA: Memory error - use of 0 allocated: This is a code bug or a false-positive that + * is not clear. The SA is taking a path that assumes i->size=0 on 1st pass thru the for loop & + * therefore the "sz < i->size" check fails and sz=0 remains from the initialization at the top of + * the function for the calloc() call. "i->size=0" would be from tables_foreach(). In that + * function ipfw_xtable_info is contained within a larger buffer that is init'ed by calloc(). It + * is not obvious how ipfw_xtable_info->size is getting set to a >0 value before getting passed + * to this function. */ +#ifndef __clang_analyzer__ ipfw_obj_header *oh; size_t sz; int c; @@ -1612,6 +1634,7 @@ table_do_get_list(ipfw_xtable_info *i, ipfw_obj_header **poh) break; } free(oh); +#endif return (errno); } @@ -1626,6 +1649,12 @@ table_show_list(ipfw_obj_header *oh, int need_header) uint32_t count; ipfw_xtable_info *i; + /* Clang scan-build SA: NULL pointer dereference: oh=NULL. */ + if (!oh) { + ogs_error("Unable to print table list, oh=NULL"); + return; + } + i = (ipfw_xtable_info *)(oh + 1); tent = (ipfw_obj_tentry *)(i + 1); @@ -1829,14 +1858,17 @@ table_do_get_vlist(ipfw_obj_lheader **polh) void ipfw_list_ta(int ac, char *av[]) { - ipfw_obj_lheader *olh; + /* Clang scan-build SA: Result of operation is garbage: initialize olh=NULL and check for NULL before use. */ + ipfw_obj_lheader *olh = NULL; ipfw_ta_info *info; int error, i; const char *atype; error = table_do_get_algolist(&olh); - if (error != 0) - err(EX_OSERR, "Unable to request algorithm list"); + if ((error != 0) || (!olh)) { + ogs_error("Unable to request algorithm list"); + return; + } info = (ipfw_ta_info *)(olh + 1); for (i = 0; i < olh->count; i++) { @@ -1890,15 +1922,18 @@ compare_values(const void *_a, const void *_b) void ipfw_list_values(int ac, char *av[]) { - ipfw_obj_lheader *olh; + /* Clang scan-build SA: Result of operation is garbage: initialize olh=NULL and check for NULL before use. */ + ipfw_obj_lheader *olh = NULL; struct _table_value *v; int error, i; uint32_t vmask; char buf[128]; error = table_do_get_vlist(&olh); - if (error != 0) - err(EX_OSERR, "Unable to request value list"); + if ((error != 0) || (!olh)) { + ogs_error("Unable to request value list"); + return; + } vmask = 0x7FFFFFFF; /* Similar to IPFW_VTYPE_LEGACY */ diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index e5a83fb89a..353a6a07a1 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -94,6 +94,13 @@ char *ogs_supi_from_suci(char *suci) return NULL; } + /* Clang scan-build SA: Branch condition evaluates to a garbage value: If array "array" is not fully populated + * in the while loop below then later access in the following switch-case may check uninitialized values. + * Initialize "array" to NULL pointers to fix the issue. */ + for (i = 0; i < MAX_SUCI_TOKEN; i++) { + array[i] = NULL; + } + p = tmp; i = 0; while((array[i++] = strsep(&p, "-"))) { diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index a0548229d8..89a6b985cf 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -194,6 +194,10 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) ogs_assert(sock); + /* Clang scan-build SA: NULL pointer dereference: if addr=sa_list=NULL then the macro OGS_PORT(sa_list) will + * dereference the NULL pointer. */ + ogs_assert(sa_list); + addr = sa_list; while (addr) { if (ogs_sock_connect(sock, addr) == OGS_OK) { diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index da6538c10b..6b7aa83241 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -377,8 +377,9 @@ int amf_nsmf_pdusession_handle_update_sm_context( case OpenAPI_n2_sm_info_type_PDU_RES_MOD_REQ: if (!n1smbuf) { - ogs_error("[%s:%d] No N1 SM Content [%s]", - amf_ue->supi, sess->psi, n1SmMsg->content_id); + /* Clang scan-build SA: NULL pointer deference: n1SmMsg=NULL, remove logging of n1SmMsg->content_id. */ + ogs_error("[%s:%d] No N1 SM Content", + amf_ue->supi, sess->psi); r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); @@ -419,8 +420,9 @@ int amf_nsmf_pdusession_handle_update_sm_context( case OpenAPI_n2_sm_info_type_PDU_RES_REL_CMD: if (!n1smbuf) { - ogs_error("[%s:%d] No N1 SM Content [%s]", - amf_ue->supi, sess->psi, n1SmMsg->content_id); + /* Clang scan-build SA: NULL pointer deference: n1SmMsg=NULL, remove logging of n1SmMsg->content_id. */ + ogs_error("[%s:%d] No N1 SM Content", + amf_ue->supi, sess->psi); r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index 9983545cab..3e159e0016 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -146,6 +146,8 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_assert(ret == 0); if (avpch1) { ret = fd_msg_avp_hdr(avpch1, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); ogs_ascii_to_hex( (char*)hdr->avp_value->os.data, (int)hdr->avp_value->os.len, buf, sizeof(buf)); @@ -292,6 +294,8 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_assert(ret == 0); if (avpch3) { ret = fd_msg_avp_hdr(avpch3, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); session->name = ogs_strndup( (char*)hdr->avp_value->os.data, hdr->avp_value->os.len); @@ -565,6 +569,8 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_assert(ret == 0); while (avpch4) { ret = fd_msg_avp_hdr(avpch4, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); switch(hdr->avp_code) { case OGS_DIAM_S6A_AVP_CODE_MIP_HOME_AGENT_ADDRESS: ret = fd_msg_avp_value_interpret(avpch4, @@ -1018,8 +1024,12 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ret = fd_avp_search_avp(avp_e_utran_vector, ogs_diam_s6a_rand, &avp_rand); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); if (avp) { ret = fd_msg_avp_hdr(avp_rand, &hdr); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); memcpy(e_utran_vector->rand, hdr->avp_value->os.data, ogs_min(hdr->avp_value->os.len, OGS_ARRAY_SIZE(e_utran_vector->rand))); @@ -1440,6 +1450,8 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) uint32_t subdatamask = 0; ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, mme_ue, &subdatamask); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); if (!(subdatamask & OGS_DIAM_S6A_SUBDATA_NAM)) { mme_ue->network_access_mode = 0; @@ -1999,7 +2011,8 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, int ret; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; uint32_t result_code = 0; - bool has_subscriber_data; + /* Clang scan-build SA: Branch condition evaluates to a garbage value: has_subscriber_data can be used uninitialized. */ + bool has_subscriber_data = false; struct msg *ans, *qry; @@ -2064,6 +2077,8 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, uint32_t subdatamask = 0; ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, mme_ue, &subdatamask); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); idr_message->subdatamask = subdatamask; ogs_info("[%s] Subscription-Data Processed.", imsi_bcd); } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index e83f896b83..074dd2cbed 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -854,6 +854,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) mme_gn_handle_sgsn_context_request(xact, &gtp1_message.sgsn_context_request); break; case OGS_GTP1_SGSN_CONTEXT_RESPONSE_TYPE: + /* Clang scan-build SA: NULL pointer dereference: mme_ue=NULL if both gtp1_message.h.teid=0 and + * xact->local_teid=0. The following function mme_gn_handle_sgsn_context_response() handles the NULL + * but the later calls to OGS_FSM_TRAN() to change state will be a NULL pointer dereference. */ + ogs_assert(mme_ue); + /* 3GPP TS 23.401 Figure D.3.6-1 step 5 */ rv = mme_gn_handle_sgsn_context_response(xact, mme_ue, &gtp1_message.sgsn_context_response); if (rv == OGS_GTP1_CAUSE_ACCEPT) { diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index e8063ecf89..62fc0895b1 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -2268,6 +2268,10 @@ void s1ap_handle_enb_direct_information_transfer( } } + /* Clang scan-build SA: NULL pointer dereference: Inter_SystemInformationTransferType=NULL if above + * protocolIEs.list.count=0 in loop. */ + ogs_assert(Inter_SystemInformationTransferType); + RIMTransfer = Inter_SystemInformationTransferType->choice.rIMTransfer; RIMInformation = &RIMTransfer->rIMInformation; diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index d9b93b88c2..3779bac137 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -124,6 +124,11 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) return; error: + /* Clang scan-build SA: NULL pointer dereference: mme_ue=NULL if root=NULL. */ + if (!mme_ue) { + ogs_error("!mme_ue"); + return; + } r = nas_eps_send_attach_reject( enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, diff --git a/src/nssf/context.c b/src/nssf/context.c index d776926f20..ae472b27f5 100644 --- a/src/nssf/context.c +++ b/src/nssf/context.c @@ -233,6 +233,10 @@ int nssf_context_parse_config(void) addr, addr6, port, &h); ogs_assert(nrf_id); + /* Clang scan-build SA: Argument with nonnull attribute passed null: + * sst may be NULL in atoi(sst) if the "uri" key path is followed. */ + ogs_assert(sst); + nsi = nssf_nsi_add( nrf_id, atoi(sst), diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 7354c67d36..700320500d 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -280,8 +280,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { + /* Clang scan-build SA: NULL pointer dereference: pcf_ue=NULL, remove logging of pcf_ue->supi. */ ogs_error("[%s:%d] State machine exception", - pcf_ue->supi, sess->psi); + pcf_ue ? pcf_ue->supi : "Unknown", sess->psi); pcf_sess_remove(sess); } break; @@ -331,8 +332,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) e->h.sbi.message = &message; ogs_fsm_dispatch(&sess->sm, e); if (OGS_FSM_CHECK(&sess->sm, pcf_sm_state_exception)) { + /* Clang scan-build SA: NULL pointer dereference: pcf_ue=NULL, remove logging of pcf_ue->supi. */ ogs_error("[%s:%d] State machine exception", - pcf_ue->supi, sess->psi); + pcf_ue ? pcf_ue->supi : "Unknown", sess->psi); pcf_sess_remove(sess); } break; diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 9ab44cd88d..7d7e11de3e 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -163,7 +163,8 @@ int sgwc_context_parse_config(void) sgwc_ue_t *sgwc_ue_add_by_message(ogs_gtp2_message_t *message) { sgwc_ue_t *sgwc_ue = NULL; - ogs_gtp2_create_session_request_t *req = &message->create_session_request; + /* Clang scan-build SA: Dead initialization: Don't set req before message is checked for NULL. */ + ogs_gtp2_create_session_request_t *req; ogs_assert(message); diff --git a/src/sgwc/pfcp-sm.c b/src/sgwc/pfcp-sm.c index c23f77cd66..e0357ae61b 100644 --- a/src/sgwc/pfcp-sm.c +++ b/src/sgwc/pfcp-sm.c @@ -302,6 +302,9 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) } up_f_seid = rsp->up_f_seid.data; ogs_assert(up_f_seid); + /* Clang scan-build SA: NULL pointer dereference: sess=NULL if both message->h.seid=0 and + * xact->local_seid=0. */ + ogs_assert(sess); sess->sgwu_sxa_seid = be64toh(up_f_seid->seid); } else { sgwc_sxa_handle_session_establishment_response( diff --git a/src/sgwc/sxa-handler.c b/src/sgwc/sxa-handler.c index 48ba184472..9fdf72e9c0 100644 --- a/src/sgwc/sxa-handler.c +++ b/src/sgwc/sxa-handler.c @@ -865,6 +865,8 @@ void sgwc_sxa_handle_session_modification_response( pgw_s5u_teid.teid = htobe32(ul_tunnel->remote_teid); rv = ogs_gtp2_ip_to_f_teid( &ul_tunnel->remote_ip, &pgw_s5u_teid, &len); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(rv == OGS_OK); gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.presence = 1; gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.data = &pgw_s5u_teid; gtp_rsp->bearer_contexts.s5_s8_u_pgw_f_teid.len = len; diff --git a/src/smf/gn-build.c b/src/smf/gn-build.c index a6c12b01ae..abdc8e4d0c 100644 --- a/src/smf/gn-build.c +++ b/src/smf/gn-build.c @@ -192,8 +192,19 @@ ogs_pkbuf_t *smf_gn_build_create_pdp_context_response( /* End User Address */ rv = ogs_paa_to_ip(&sess->paa, &ip_eua); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv != OGS_OK) { + ogs_error("ogs_paa_to_ip() failed"); + return NULL; + } rv = ogs_gtp1_ip_to_eua(sess->session.session_type, &ip_eua, &eua, &eua_len); + /* Clang scan-build SA: Value stored is not used: add check for rv error. */ + if (rv != OGS_OK) { + ogs_error("ogs_gtp1_ip_to_eua() failed"); + return NULL; + } + rsp->end_user_address.presence = 1; rsp->end_user_address.data = &eua; rsp->end_user_address.len = eua_len; diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 997d0c4da1..791ab40eb6 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -401,11 +401,15 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, /* PDP-Address, TS 32.299 7.2.137 */ if (sess->ipv4) { ret = fd_msg_avp_new(ogs_diam_gy_pdp_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin.sin_family = AF_INET; memcpy(&sin.sin_addr.s_addr, (uint8_t*)&sess->ipv4->addr[0], OGS_IPV4_LEN); ret = fd_msg_avp_value_encode(&sin, avpch2); ogs_assert(ret == 0); ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); } if (sess->ipv6) { ret = fd_msg_avp_new(ogs_diam_gy_pdp_address, 0, &avpch2); @@ -425,6 +429,8 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, /* SGSN-Address */ if (sess->sgw_s5c_ip.ipv4) { ret = fd_msg_avp_new(ogs_diam_gy_sgsn_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin.sin_family = AF_INET; memcpy(&sin.sin_addr.s_addr, (uint8_t*)&sess->sgw_s5c_ip.addr, OGS_IPV4_LEN); ret = fd_msg_avp_value_encode(&sin, avpch2); @@ -434,6 +440,8 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, } if (sess->sgw_s5c_ip.ipv6) { ret = fd_msg_avp_new(ogs_diam_gy_sgsn_address, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); sin6.sin6_family = AF_INET6; memcpy(&sin6.sin6_addr.s6_addr, (uint8_t*)&sess->sgw_s5c_ip.addr6[0], OGS_IPV6_LEN); ret = fd_msg_avp_value_encode(&sin6, avpch2); @@ -569,6 +577,8 @@ static void fill_ps_information(smf_sess_t *sess, uint32_t cc_request_type, if (smf_ue->imeisv_len > 0) { /* User-Equipment-Info, 3GPP TS 32.299 7.1.17 */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info, 0, &avpch2); + /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ + ogs_assert(ret == 0); /* User-Equipment-Info-Type 0 (IMEI) */ ret = fd_msg_avp_new(ogs_diam_gy_user_equipment_info_type, 0, &avpch3); diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 45b3848c06..8ce08e7fab 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -690,7 +690,8 @@ bool udm_nudm_sdm_handle_subscription_create( return false; } - if ((!SDMSubscription->monitored_resource_uris) && + /* Clang scan-build SA: NULL pointer dereference: change && to || in case monitored_resource_uris=NULL. */ + if ((!SDMSubscription->monitored_resource_uris) || (!SDMSubscription->monitored_resource_uris->count)) { ogs_error("[%s] No monitoredResourceUris", udm_ue->supi); ogs_assert(true == From b0c3dbe4ddb3472ca724443ee369533d93e2475c Mon Sep 17 00:00:00 2001 From: Alexander Couzens <lynxis@fe80.eu> Date: Tue, 20 Aug 2024 16:27:21 +0200 Subject: [PATCH 183/323] [MME] mme-context.h: fix indention --- src/mme/mme-context.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 4c59551247..81059c5218 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -460,7 +460,7 @@ struct mme_ue_s { uint8_t kenb[OGS_SHA256_DIGEST_SIZE]; uint8_t hash_mme[OGS_HASH_MME_LEN]; uint32_t nonceue, noncemme; - uint8_t gprs_ciphering_key_sequence_number; + uint8_t gprs_ciphering_key_sequence_number; struct { ED2(uint8_t nhcc_spare:5;, From 62ddcd87579bc7d17d87969b7b83867f55d59aea Mon Sep 17 00:00:00 2001 From: Alexander Couzens <lynxis@fe80.eu> Date: Tue, 20 Aug 2024 16:24:39 +0200 Subject: [PATCH 184/323] [MME] mme-gn-handler: correct ARP for the translated bearer (2G->4G) The old comment describe the 4G to 2G mobility, not the 2G to 4G. Correct the comments. Also set the translated bearer vulnerability to 1, translated bearer should always vulnerable to it. --- src/mme/mme-gn-handler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index e90844acd6..127e6c2764 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -243,8 +243,8 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ ogs_gtp1_qos_profile_to_qci(qos_pdec, &qci); ogs_sess->qos.index = qci; ogs_sess->qos.arp.priority_level = qos_pdec->qos_profile.arp; /* 3GPP TS 23.401 Annex E Table E.2 */ - ogs_sess->qos.arp.pre_emption_capability = 0; /* ignored as per 3GPP TS 23.401 Annex E */ - ogs_sess->qos.arp.pre_emption_vulnerability = 0; /* ignored as per 3GPP TS 23.401 Annex E */ + ogs_sess->qos.arp.pre_emption_capability = 0; /* operator policy, hardcoded, 3GPP TS 23.401 Annex E */ + ogs_sess->qos.arp.pre_emption_vulnerability = 1; /* operator policy, hardcoded, 3GPP TS 23.401 Annex E */ if (qos_pdec->data_octet6_to_13_present) { ogs_sess->ambr.downlink = qos_pdec->dec_mbr_kbps_dl * 1000; ogs_sess->ambr.uplink = qos_pdec->dec_mbr_kbps_ul * 1000; From 3f36e2b8f2572d35279711f4dd8ac4220b0e5168 Mon Sep 17 00:00:00 2001 From: Alexander Couzens <lynxis@fe80.eu> Date: Tue, 20 Aug 2024 16:26:31 +0200 Subject: [PATCH 185/323] [MME] mme-gn-handler: 2G->4G: set QoS on the translated bearer Otherwise the bearer contains qci = 0 and 0 values for the priority, certain eNodeBs (Ericsson rbs6402) will reject such bearers. --- src/mme/mme-gn-handler.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index 127e6c2764..dc7be73988 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -289,6 +289,10 @@ static mme_sess_t *mme_ue_session_from_gtp1_pdp_ctx(mme_ue_t *mme_ue, const ogs_ bearer->enb_s1u_ip.ipv4 = 1; bearer->enb_s1u_ip.addr = 0; bearer->enb_s1u_teid = 0xffffffff; + bearer->qos.index = ogs_sess->qos.index; + bearer->qos.arp.priority_level = ogs_sess->qos.arp.priority_level; + bearer->qos.arp.pre_emption_capability = ogs_sess->qos.arp.pre_emption_capability; + bearer->qos.arp.pre_emption_vulnerability = ogs_sess->qos.arp.pre_emption_vulnerability; return sess; } From ecbe26d8d99d3a51c530503f0ac8f3972f3c933f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 24 Aug 2024 19:05:32 +0900 Subject: [PATCH 186/323] Introducing NewPlane --- README.md | 6 +++++- docs/_pages/support.md | 16 ++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6ce235a621..4349ee481c 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,8 @@ If you're contributing through a pull request to Open5GS project on GitHub, plea ## License - Open5GS Open Source files are made available under the terms of the GNU Affero General Public License ([GNU AGPL v3.0](https://www.gnu.org/licenses/agpl-3.0.html)). -- [Commercial licenses](https://open5gs.org/open5gs/support/) are also available from [NeoPlane](https://neoplane.io/) +- [Commercial licenses](https://open5gs.org/open5gs/support/) are also available from [NewPlane](https://newplane.io/) at [\<sales@newplane.io\>](mailto:sales@newplane.io). + +## Support + +Technical support and customized services for Open5GS are provided by [NewPlane](https://newplane.io/) at [\<support@newplane.io\>](mailto:support@newplane.io). diff --git a/docs/_pages/support.md b/docs/_pages/support.md index a71d757479..0895357d9a 100644 --- a/docs/_pages/support.md +++ b/docs/_pages/support.md @@ -5,18 +5,22 @@ subject: Support permalink: /support/ --- -###### Updated Sep, 2022 +###### Updated Aug, 2024 -### Open5GS Licensing +### Open5GS Support -Open5GS is licensed under a dual licensing model designed to meet the development and distribution needs of both commercial and open source projects. +Open5GS receives strong and ongoing support from [NewPlane](https://newplane.io), which proudly backs the project and contributes to its continuous development and success. -The commercial Open5GS license gives you the full rights to create and distribute software on your own terms without any open source license obligations. You can grow with Open5GS by establishing a close strategic relationship with [NeoPlane](https://neoplane.io). +#### Licensing Options: +- **Commercial License**: Available for those who wish to develop and distribute their software without adhering to open-source license requirements. This option allows for full utilization of Open5GS capabilities and involves a strategic partnership with NewPlane. For more information, reach out to NewPlane at +[\<sales@newplane.io\>](mailto:sales@newplane.io). -Open5GS is also available under AGPL-3.0 open source licenses. The Open5GS open source licensing is ideal for use cases such as open source projects with open source distribution, student/academic purposes, hobby projects, internal research projects without external distribution, or other projects where all AGPL-3.0 obligations can be met. +- **AGPL-3.0 License**: Ideal for open-source projects, academic research, and internal use where compliance with AGPL-3.0 is feasible. This license supports the open-source ethos and is suitable for a wide range of uses. If you have concerns about AGPL compliance, consider the commercial licensing option instead. -If your legal department has policies regarding use of software licensed under the AGPL, you may prefer to have a commercial license. Contact [Sukchan Lee \<sales@neoplane.io\>](mailto:sales@neoplane.io) for more information on commercial licenses. +#### Support and Customization: + +NewPlane offers comprehensive support and customization services to enhance your experience with Open5GS. Their team is equipped to assist with troubleshooting, address specific issues, and implement customized solutions. For support and customization inquiries, please contact NewPlane at [\<support@newplane.io\>](mailto:support@newplane.io). ### Our Partners From 0a58a5bcc2dba361be79ce9555ec35e77c72e2c8 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 24 Aug 2024 19:13:15 +0900 Subject: [PATCH 187/323] update support page --- docs/_pages/support.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/_pages/support.md b/docs/_pages/support.md index 0895357d9a..1cd5497dbe 100644 --- a/docs/_pages/support.md +++ b/docs/_pages/support.md @@ -7,18 +7,16 @@ permalink: /support/ ###### Updated Aug, 2024 -### Open5GS Support - Open5GS receives strong and ongoing support from [NewPlane](https://newplane.io), which proudly backs the project and contributes to its continuous development and success. -#### Licensing Options: +### Licensing Options: - **Commercial License**: Available for those who wish to develop and distribute their software without adhering to open-source license requirements. This option allows for full utilization of Open5GS capabilities and involves a strategic partnership with NewPlane. For more information, reach out to NewPlane at [\<sales@newplane.io\>](mailto:sales@newplane.io). - **AGPL-3.0 License**: Ideal for open-source projects, academic research, and internal use where compliance with AGPL-3.0 is feasible. This license supports the open-source ethos and is suitable for a wide range of uses. If you have concerns about AGPL compliance, consider the commercial licensing option instead. -#### Support and Customization: +### Support and Customization: NewPlane offers comprehensive support and customization services to enhance your experience with Open5GS. Their team is equipped to assist with troubleshooting, address specific issues, and implement customized solutions. For support and customization inquiries, please contact NewPlane at [\<support@newplane.io\>](mailto:support@newplane.io). From 2d2e03507bfab30fdcacb6cf9d9d9d0484486307 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 24 Aug 2024 19:15:54 +0900 Subject: [PATCH 188/323] Remove Date in Support page --- docs/_pages/support.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/_pages/support.md b/docs/_pages/support.md index 1cd5497dbe..6be21de7ee 100644 --- a/docs/_pages/support.md +++ b/docs/_pages/support.md @@ -5,8 +5,6 @@ subject: Support permalink: /support/ --- -###### Updated Aug, 2024 - Open5GS receives strong and ongoing support from [NewPlane](https://newplane.io), which proudly backs the project and contributes to its continuous development and success. ### Licensing Options: From 681115c4e5e49efc478339bf68f20ac378ca405f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 24 Aug 2024 19:18:55 +0900 Subject: [PATCH 189/323] update document --- README.md | 4 ++-- docs/_pages/support.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4349ee481c..f930db6207 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ If you're contributing through a pull request to Open5GS project on GitHub, plea ## License - Open5GS Open Source files are made available under the terms of the GNU Affero General Public License ([GNU AGPL v3.0](https://www.gnu.org/licenses/agpl-3.0.html)). -- [Commercial licenses](https://open5gs.org/open5gs/support/) are also available from [NewPlane](https://newplane.io/) at [\<sales@newplane.io\>](mailto:sales@newplane.io). +- [Commercial licenses](https://open5gs.org/open5gs/support/) are also available from [NewPlane](https://newplane.io/) at [sales@newplane.io](mailto:sales@newplane.io). ## Support -Technical support and customized services for Open5GS are provided by [NewPlane](https://newplane.io/) at [\<support@newplane.io\>](mailto:support@newplane.io). +Technical support and customized services for Open5GS are provided by [NewPlane](https://newplane.io/) at [support@newplane.io](mailto:support@newplane.io). diff --git a/docs/_pages/support.md b/docs/_pages/support.md index 6be21de7ee..9cf59f9f80 100644 --- a/docs/_pages/support.md +++ b/docs/_pages/support.md @@ -10,13 +10,13 @@ Open5GS receives strong and ongoing support from [NewPlane](https://newplane.io) ### Licensing Options: - **Commercial License**: Available for those who wish to develop and distribute their software without adhering to open-source license requirements. This option allows for full utilization of Open5GS capabilities and involves a strategic partnership with NewPlane. For more information, reach out to NewPlane at -[\<sales@newplane.io\>](mailto:sales@newplane.io). +[sales@newplane.io](mailto:sales@newplane.io). - **AGPL-3.0 License**: Ideal for open-source projects, academic research, and internal use where compliance with AGPL-3.0 is feasible. This license supports the open-source ethos and is suitable for a wide range of uses. If you have concerns about AGPL compliance, consider the commercial licensing option instead. ### Support and Customization: -NewPlane offers comprehensive support and customization services to enhance your experience with Open5GS. Their team is equipped to assist with troubleshooting, address specific issues, and implement customized solutions. For support and customization inquiries, please contact NewPlane at [\<support@newplane.io\>](mailto:support@newplane.io). +NewPlane offers comprehensive support and customization services to enhance your experience with Open5GS. Their team is equipped to assist with troubleshooting, address specific issues, and implement customized solutions. For support and customization inquiries, please contact NewPlane at [support@newplane.io](mailto:support@newplane.io). ### Our Partners From d57bb9423b6725a5616320bbcdb12e34143b1b3b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 24 Aug 2024 22:21:55 +0900 Subject: [PATCH 190/323] update it --- docs/_pages/support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/support.md b/docs/_pages/support.md index 9cf59f9f80..d572556123 100644 --- a/docs/_pages/support.md +++ b/docs/_pages/support.md @@ -5,7 +5,7 @@ subject: Support permalink: /support/ --- -Open5GS receives strong and ongoing support from [NewPlane](https://newplane.io), which proudly backs the project and contributes to its continuous development and success. +Open5GS receives strong and ongoing support from [NewPlane Inc.](https://newplane.io), which proudly backs the project and contributes to its continuous development and success. ### Licensing Options: From b6d80cb2448ea16e7275e2739e9f885929d9a4da Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 20 Aug 2024 07:14:06 +0200 Subject: [PATCH 191/323] [AMF] add supportedFeatures field in SDMSubscription request Set flag LimitedSubscriptions in the supportedFeatures field in SDMSubscription. This flag should be set in case that AMF supports unique SDM Subscription, notifying UDM in this case of the support. --- src/amf/nudm-build.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/amf/nudm-build.c b/src/amf/nudm-build.c index e5d2091ce7..db71e981d8 100644 --- a/src/amf/nudm-build.c +++ b/src/amf/nudm-build.c @@ -182,6 +182,7 @@ ogs_sbi_request_t *amf_nudm_sdm_build_subscription(amf_ue_t *amf_ue, void *data) ogs_sbi_server_t *server = NULL; OpenAPI_sdm_subscription_t SDMSubscription; + uint64_t supported_features = 0; char *monres = NULL; @@ -232,6 +233,14 @@ ogs_sbi_request_t *amf_nudm_sdm_build_subscription(amf_ue_t *amf_ue, void *data) SDMSubscription.is_implicit_unsubscribe = true; SDMSubscription.implicit_unsubscribe = 1; + OGS_SBI_FEATURES_SET(supported_features, + OGS_SBI_NUDM_SDM_LIMITED_SUBSCRIPTIONS); + SDMSubscription.supported_features = + ogs_uint64_to_string(supported_features); + + SDMSubscription.is_unique_subscription = true; + SDMSubscription.unique_subscription = 1; + message.SDMSubscription = &SDMSubscription; message.http.custom.callback = @@ -241,7 +250,8 @@ ogs_sbi_request_t *amf_nudm_sdm_build_subscription(amf_ue_t *amf_ue, void *data) ogs_expect(request); end: - + if (SDMSubscription.supported_features) + ogs_free(SDMSubscription.supported_features); if (monres) ogs_free(monres); OpenAPI_list_free(SDMSubscription.monitored_resource_uris); From 9d878d255d49baa0fd861cfd4b3f1c0f9bf7cdf9 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 20 Aug 2024 07:34:33 +0200 Subject: [PATCH 192/323] [SMF] Fix handling allowed SSC Modes and Session Types The standard mandates that one SSC Mode is the default (if UE does not request one), with up to 2 additional SSC Modes can be selected. Always check also the default SSC Mode if it can be selected. Same logic applies for Session Types. --- src/smf/nudm-handler.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index c0cb334dbf..844bca7377 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -136,6 +136,12 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, } } } + + if (sess->ue_session_type == + pduSessionTypeList->default_session_type) { + sess->session.session_type = + pduSessionTypeList->default_session_type; + } } if (!sess->session.session_type) @@ -152,6 +158,10 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, } } } + + if (sess->ue_ssc_mode == sscModeList->default_ssc_mode) { + sess->session.ssc_mode = sess->ue_ssc_mode; + } } else { sess->session.ssc_mode = sscModeList->default_ssc_mode; } From 591f0a2fcaeec5ab68a8c5e3753e1d1792049aeb Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Tue, 20 Aug 2024 16:34:18 +0200 Subject: [PATCH 193/323] ogs_fqdn_parse: Don't fail when parsing the empty APN The osmocom ttcn3-mme-ogs test uses an APN consisting simply of the NULL byte. This corresponds to one label of length zero, so simply the APN "". Since commit 333d3fe1 ogs_fqdn_parse() returning zero is considered an error in ogs_gtp1_parse_pdp_context(). Fix this by returning a negative value on error in ogs_fqdn_parse() and checking for that. --- lib/gtp/v1/types.c | 2 +- lib/proto/types.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gtp/v1/types.c b/lib/gtp/v1/types.c index 78a0d0159f..ce19821993 100644 --- a/lib/gtp/v1/types.c +++ b/lib/gtp/v1/types.c @@ -922,7 +922,7 @@ int ogs_gtp1_parse_pdp_context( rv = ogs_fqdn_parse(decoded->apn, (const char *)ptr + 1, ogs_min(*ptr, sizeof(decoded->apn))); /* Clang scan-build SA: Value stored is not used: add check for rv error. */ - if (rv <= 0) { + if (rv < 0) { ogs_error("ogs_fqdn_parse() failed"); return OGS_ERROR; } diff --git a/lib/proto/types.c b/lib/proto/types.c index f43f46f120..5fd491d83e 100644 --- a/lib/proto/types.c +++ b/lib/proto/types.c @@ -422,7 +422,7 @@ int ogs_fqdn_parse(char *dst, const char *src, int length) ogs_error("Invalid FQDN encoding[j:%d+len:%d] + 1 > length[%d]", j, len, length); ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)src, length); - return 0; + return -EINVAL; } memcpy(&dst[j], &src[i], len); From 28f9de4b41efcb87cdd33b0dbaefd6dfc29d1fac Mon Sep 17 00:00:00 2001 From: Daniel Willmann <dwillmann@sysmocom.de> Date: Tue, 20 Aug 2024 17:45:08 +0200 Subject: [PATCH 194/323] ogs_fqdn_parse: Write the terminating NULL byte even if the APN is empty Enter the while loop even if length == 1 (with len being 0) so that the terminating NULL byte is written to dst. --- lib/proto/types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/proto/types.c b/lib/proto/types.c index 5fd491d83e..1b6b7d4865 100644 --- a/lib/proto/types.c +++ b/lib/proto/types.c @@ -416,7 +416,7 @@ int ogs_fqdn_parse(char *dst, const char *src, int length) int i = 0, j = 0; uint8_t len = 0; - while (i+1 < length) { + while (i+1 <= length) { len = src[i++]; if ((j + len + 1) > length) { ogs_error("Invalid FQDN encoding[j:%d+len:%d] + 1 > length[%d]", From 49536282759e65c74b50bc3622fe743d09aaf320 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 21 Aug 2024 13:48:58 +0200 Subject: [PATCH 195/323] [MME] Avoid crash if tx Security Mode Command fails This can happen if a UE never sends the UE Network Capabilities IE (eg Attach or TAU) when coming from 2G to 4G: """ 08/21 11:45:31.476: [emm] DEBUG: emm_state_security_mode(): ENTRY (/open5gs/src/mme/emm-sm.c:1162) 08/21 11:45:31.476: [mme] DEBUG: [262420000000007] Security mode command (/open5gs/src/mme/nas-path.c:336) 08/21 11:45:31.476: [emm] DEBUG: Replayed UE SEC[LEN:2 EEA:0x0 EIA:0x0 UEA:0x0 UIA:0x0 GEA:0x0] (/open5gs/src/mme/emm-build.c:385) 08/21 11:45:31.476: [emm] DEBUG: Selected[Integrity:0x0 Encrypt:0x0] (/open5gs/src/mme/emm-build.c:393) 08/21 11:45:31.476: [emm] ERROR: Encrypt[0x0] can be skipped with EEA0, but Integrity[0x0] cannot be bypassed with EIA0 (/open5gs/src/mme/emm-build.c:447) 08/21 11:45:31.476: [mme] ERROR: emm_build_security_mode_command() failed (/open5gs/src/mme/nas-path.c:343) 08/21 11:45:31.476: [emm] ERROR: emm_state_security_mode: Expectation `r == OGS_OK' failed. (/open5gs/src/mme/emm-sm.c:1171) """ Instead of crashing the MME, fail gracefuly sending a UeContextReleaseCommand. --- src/mme/emm-sm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 792c09c3ac..7e216e22f9 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -1167,7 +1167,8 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) CLEAR_MME_UE_TIMER(mme_ue->t3460); r = nas_eps_send_security_mode_command(mme_ue); ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (r == OGS_ERROR) + OGS_FSM_TRAN(s, &emm_state_exception); break; case OGS_FSM_EXIT_SIG: break; From 8305c4d50e69af479ff6c110dca34fc85b3a0ed5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 25 Aug 2024 10:06:32 +0900 Subject: [PATCH 196/323] [AMF/MME] Avoid crash if tx Security Mode Command fails (#3413) This can happen if a UE never sends the UE Network Capabilities IE (eg Attach or TAU) when coming from 2G to 4G: ``` 08/21 11:45:31.476: [emm] DEBUG: emm_state_security_mode(): ENTRY (/open5gs/src/mme/emm-sm.c:1162) 08/21 11:45:31.476: [mme] DEBUG: [262420000000007] Security mode command (/open5gs/src/mme/nas-path.c:336) 08/21 11:45:31.476: [emm] DEBUG: Replayed UE SEC[LEN:2 EEA:0x0 EIA:0x0 UEA:0x0 UIA:0x0 GEA:0x0] (/open5gs/src/mme/emm-build.c:385) 08/21 11:45:31.476: [emm] DEBUG: Selected[Integrity:0x0 Encrypt:0x0] (/open5gs/src/mme/emm-build.c:393) 08/21 11:45:31.476: [emm] ERROR: Encrypt[0x0] can be skipped with EEA0, but Integrity[0x0] cannot be bypassed with EIA0 (/open5gs/src/mme/emm-build.c:447) 08/21 11:45:31.476: [mme] ERROR: emm_build_security_mode_command() failed (/open5gs/src/mme/nas-path.c:343) 08/21 11:45:31.476: [emm] ERROR: emm_state_security_mode: Expectation `r == OGS_OK' failed. (/open5gs/src/mme/emm-sm.c:1171) ``` Instead of crashing the MME/AME, fail gracefuly sending a UeContextReleaseCommand. Reproduced/tested with a WIP ttcn3 test. --- src/amf/gmm-build.c | 11 ++--------- src/amf/gmm-sm.c | 16 ++++++++++++++++ src/mme/emm-build.c | 11 ++--------- src/mme/emm-sm.c | 18 ++++++++++++++++-- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/amf/gmm-build.c b/src/amf/gmm-build.c index 83643679a0..9bf003ec16 100644 --- a/src/amf/gmm-build.c +++ b/src/amf/gmm-build.c @@ -425,9 +425,6 @@ ogs_pkbuf_t *gmm_build_security_mode_command(amf_ue_t *amf_ue) OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM; message.gmm.h.message_type = OGS_NAS_5GS_SECURITY_MODE_COMMAND; - amf_ue->selected_int_algorithm = amf_selected_int_algorithm(amf_ue); - amf_ue->selected_enc_algorithm = amf_selected_enc_algorithm(amf_ue); - selected_nas_security_algorithms->type_of_integrity_protection_algorithm = amf_ue->selected_int_algorithm; selected_nas_security_algorithms->type_of_ciphering_algorithm = @@ -474,12 +471,8 @@ ogs_pkbuf_t *gmm_build_security_mode_command(amf_ue_t *amf_ue) additional_security_information-> retransmission_of_initial_nas_message_request = 1; - if (amf_ue->selected_int_algorithm == OGS_NAS_SECURITY_ALGORITHMS_EIA0) { - ogs_error("Encrypt[0x%x] can be skipped with NEA0, " - "but Integrity[0x%x] cannot be bypassed with NIA0", - amf_ue->selected_enc_algorithm, amf_ue->selected_int_algorithm); - return NULL; - } + ogs_assert(amf_ue->selected_int_algorithm != + OGS_NAS_SECURITY_ALGORITHMS_EIA0); ogs_kdf_nas_5gs(OGS_KDF_NAS_INT_ALG, amf_ue->selected_int_algorithm, amf_ue->kamf, amf_ue->knas_int); diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 0fc13cbbd5..0aefc8bef6 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1832,6 +1832,22 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); } else { + amf_ue->selected_int_algorithm = + amf_selected_int_algorithm(amf_ue); + amf_ue->selected_enc_algorithm = + amf_selected_enc_algorithm(amf_ue); + + if (amf_ue->selected_int_algorithm == + OGS_NAS_SECURITY_ALGORITHMS_EIA0) { + ogs_error("Encrypt[0x%x] can be skipped " + "with NEA0, but Integrity[0x%x] cannot be " + "bypassed with NIA0", + amf_ue->selected_enc_algorithm, + amf_ue->selected_int_algorithm); + OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + break; + } + OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_security_mode); } break; diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index e4fb76c2ce..9747de6f59 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -345,9 +345,6 @@ ogs_pkbuf_t *emm_build_security_mode_command(mme_ue_t *mme_ue) message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.emm.h.message_type = OGS_NAS_EPS_SECURITY_MODE_COMMAND; - mme_ue->selected_int_algorithm = mme_selected_int_algorithm(mme_ue); - mme_ue->selected_enc_algorithm = mme_selected_enc_algorithm(mme_ue); - selected_nas_security_algorithms->type_of_integrity_protection_algorithm = mme_ue->selected_int_algorithm; selected_nas_security_algorithms->type_of_ciphering_algorithm = @@ -443,12 +440,8 @@ ogs_pkbuf_t *emm_build_security_mode_command(mme_ue_t *mme_ue) sizeof(mme_ue->ue_additional_security_capability)); } - if (mme_ue->selected_int_algorithm == OGS_NAS_SECURITY_ALGORITHMS_EIA0) { - ogs_error("Encrypt[0x%x] can be skipped with EEA0, " - "but Integrity[0x%x] cannot be bypassed with EIA0", - mme_ue->selected_enc_algorithm, mme_ue->selected_int_algorithm); - return NULL; - } + ogs_assert(mme_ue->selected_int_algorithm != + OGS_NAS_SECURITY_ALGORITHMS_EIA0); ogs_kdf_nas_eps(OGS_KDF_NAS_INT_ALG, mme_ue->selected_int_algorithm, mme_ue->kasme, mme_ue->knas_int); diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 7e216e22f9..c01e00c81f 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -1003,6 +1003,21 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); } else { + mme_ue->selected_int_algorithm = + mme_selected_int_algorithm(mme_ue); + mme_ue->selected_enc_algorithm = + mme_selected_enc_algorithm(mme_ue); + + if (mme_ue->selected_int_algorithm == + OGS_NAS_SECURITY_ALGORITHMS_EIA0) { + ogs_error("Encrypt[0x%x] can be skipped with EEA0, " + "but Integrity[0x%x] cannot be bypassed with EIA0", + mme_ue->selected_enc_algorithm, + mme_ue->selected_int_algorithm); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); + break; + } + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); } @@ -1167,8 +1182,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) CLEAR_MME_UE_TIMER(mme_ue->t3460); r = nas_eps_send_security_mode_command(mme_ue); ogs_expect(r == OGS_OK); - if (r == OGS_ERROR) - OGS_FSM_TRAN(s, &emm_state_exception); + ogs_assert(r != OGS_ERROR); break; case OGS_FSM_EXIT_SIG: break; From 19f6e0cf96004068ed85af4525d43e873425ae41 Mon Sep 17 00:00:00 2001 From: Runamook <tothe8c@gmail.com> Date: Sat, 24 Aug 2024 19:46:42 +0300 Subject: [PATCH 197/323] MSISDN Subscription-Id in Gx --- src/smf/gx-path.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index 6d01a4e27d..69c5e97840 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -284,6 +284,32 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); + /* Subscription-Id (MSISDN) */ + if (smf_ue->msisdn_len > 0) { + ret = fd_msg_avp_new(ogs_diam_subscription_id, 0, &avp); + ogs_assert(ret == 0); + + ret = fd_msg_avp_new(ogs_diam_subscription_id_type, 0, &avpch1); + ogs_assert(ret == 0); + val.i32 = OGS_DIAM_SUBSCRIPTION_ID_TYPE_END_USER_E164; + ret = fd_msg_avp_setvalue (avpch1, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); + ogs_assert(ret == 0); + + ret = fd_msg_avp_new(ogs_diam_subscription_id_data, 0, &avpch1); + ogs_assert(ret == 0); + val.os.data = (uint8_t *)smf_ue->msisdn_bcd; + val.os.len = strlen(smf_ue->msisdn_bcd); + ret = fd_msg_avp_setvalue (avpch1, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1); + ogs_assert(ret == 0); + + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } + if (cc_request_type != OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST) { /* Set Supported-Features */ ret = fd_msg_avp_new(ogs_diam_gx_supported_features, 0, &avp); From b6ddd7fffb52352aa9ad6bf3a0f6a5dca32e4eaf Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 26 Aug 2024 13:46:36 +0900 Subject: [PATCH 198/323] [SMF] Reject PDU session during establishment(#3408) In case that UE requests a PDU session with specific SSC Mode for which it is not authorized, reject the request instead of trying to continue processing it. --- src/smf/nudm-handler.c | 48 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index 844bca7377..2bc23c1d43 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -84,7 +84,7 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, OGS_5GSM_CAUSE_MISSING_OR_UNKNOWN_DNN); ogs_assert(n1smbuf); - ogs_warn("%s", strerror); + ogs_error("%s", strerror); smf_sbi_send_sm_context_create_error(stream, OGS_SBI_HTTP_STATUS_NOT_FOUND, OGS_SBI_APP_ERRNO_NULL, strerror, NULL, n1smbuf); @@ -119,6 +119,12 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, continue; } + sessionAmbr = dnnConfiguration->session_ambr; + if (!sessionAmbr) { + ogs_error("No Session-AMBR"); + continue; + } + if (sess->session.name && ogs_strcasecmp(sess->session.name, dnnConfigurationMap->key) != 0) @@ -171,12 +177,6 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, continue; } - sessionAmbr = dnnConfiguration->session_ambr; - if (!sessionAmbr) { - ogs_error("No Session-AMBR"); - continue; - } - sess->session.ambr.uplink = ogs_sbi_bitrate_from_string(sessionAmbr->uplink); sess->session.ambr.downlink = @@ -301,9 +301,39 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, } if (!sess->session.name) { - strerror = ogs_msprintf("[%s:%d] No dnnConfiguration", + strerror = ogs_msprintf("[%s:%d] No DNN", smf_ue->supi, sess->psi); + ogs_assert(strerror); + + n1smbuf = gsm_build_pdu_session_establishment_reject(sess, + OGS_5GSM_CAUSE_MISSING_OR_UNKNOWN_DNN_IN_A_SLICE); + ogs_assert(n1smbuf); + + ogs_error("%s", strerror); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, + OGS_SBI_APP_ERRNO_DNN_DENIED, + strerror, NULL, n1smbuf); + ogs_free(strerror); + + return false; + } + + if (!sess->session.ssc_mode) { + strerror = ogs_msprintf("[%s:%d] SSCMode is not allowed", smf_ue->supi, sess->psi); ogs_assert(strerror); + + n1smbuf = gsm_build_pdu_session_establishment_reject(sess, + OGS_5GSM_CAUSE_NOT_SUPPORTED_SSC_MODE); + ogs_assert(n1smbuf); + + ogs_error("%s", strerror); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, + OGS_SBI_APP_ERRNO_SSC_DENIED, + strerror, NULL, n1smbuf); + ogs_free(strerror); + return false; } @@ -319,7 +349,7 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, OGS_5GSM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE_AND_DNN); ogs_assert(n1smbuf); - ogs_warn("%s", strerror); + ogs_error("%s", strerror); smf_sbi_send_sm_context_create_error(stream, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, OGS_SBI_APP_ERRNO_NULL, strerror, NULL, n1smbuf); From 561a55f7902b1b8dc1c65e9bc616f517aa1cf505 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Aug 2024 14:41:03 +0200 Subject: [PATCH 199/323] cosmetic: MME: Fix trailing whitespace --- src/mme/mme-fd-path.c | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index 3e159e0016..b88dc970dc 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -134,14 +134,14 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, } /* AVP: '3GPP-Charging-Characteristics'(13) - * For GGSN, it contains the charging characteristics for - * this PDP Context received in the Create PDP Context - * Request Message (only available in R99 and later releases). - * For PGW, it contains the charging characteristics for the + * For GGSN, it contains the charging characteristics for + * this PDP Context received in the Create PDP Context + * Request Message (only available in R99 and later releases). + * For PGW, it contains the charging characteristics for the * IP-CAN bearer. * Reference: 3GPP TS 29.061 16.4.7.2 13 */ - ret = fd_avp_search_avp(avp, ogs_diam_s6a_3gpp_charging_characteristics, + ret = fd_avp_search_avp(avp, ogs_diam_s6a_3gpp_charging_characteristics, &avpch1); ogs_assert(ret == 0); if (avpch1) { @@ -343,14 +343,14 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, } /* AVP: '3GPP-Charging-Characteristics'(13) - * For GGSN, it contains the charging characteristics for - * this PDP Context received in the Create PDP Context - * Request Message (only available in R99 and later releases). - * For PGW, it contains the charging characteristics for the + * For GGSN, it contains the charging characteristics for + * this PDP Context received in the Create PDP Context + * Request Message (only available in R99 and later releases). + * For PGW, it contains the charging characteristics for the * IP-CAN bearer. * Reference: 3GPP TS 29.061 16.4.7.2 13 */ - ret = fd_avp_search_avp(avpch2, + ret = fd_avp_search_avp(avpch2, ogs_diam_s6a_3gpp_charging_characteristics, &avpch3); ogs_assert(ret == 0); if (avpch3) { @@ -363,7 +363,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, buf, OGS_CHRGCHARS_LEN); session->charging_characteristics_presence = true; } else { - memcpy(session->charging_characteristics, + memcpy(session->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN); session->charging_characteristics_presence = false; } @@ -600,7 +600,7 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_error("Unknown AVP-Code:%d", hdr->avp_code); error++; - break; + break; } fd_msg_browse(avpch4, MSG_BRW_NEXT, &avpch4, NULL); @@ -717,7 +717,7 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, /* Create a new session */ #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" - ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, + ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); ogs_assert(ret == 0); ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); @@ -806,7 +806,7 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ret = ogs_diam_message_vendor_specific_appid_set( req, OGS_DIAM_S6A_APPLICATION_ID); ogs_assert(ret == 0); - + ret = clock_gettime(CLOCK_REALTIME, &sess_data->ts); ogs_assert(ret == 0); @@ -833,7 +833,7 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, static void mme_s6a_aia_cb(void *data, struct msg **msg) { int ret; - + struct sess_state *sess_data = NULL; struct timespec ts; struct session *session; @@ -852,7 +852,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ogs_diam_e_utran_vector_t *e_utran_vector = NULL; ogs_debug("[MME] Authentication-Information-Answer"); - + ret = clock_gettime(CLOCK_REALTIME, &ts); ogs_assert(ret == 0); @@ -866,7 +866,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ogs_error("fd_msg_sess_get() failed"); return; } - + ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); @@ -902,7 +902,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ogs_assert(aia_message); e_utran_vector = &aia_message->e_utran_vector; ogs_assert(e_utran_vector); - + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -1071,11 +1071,11 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) /* Free the message */ ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + + dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); if (ogs_diam_logger_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * + ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * ogs_diam_logger_self()->stats.nb_recv + dur) / (ogs_diam_logger_self()->stats.nb_recv + 1); /* Min, max */ @@ -1090,21 +1090,21 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) } if (error) ogs_diam_logger_self()->stats.nb_errs++; - else + else ogs_diam_logger_self()->stats.nb_recv++; ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); - + /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec - sess_data->ts.tv_sec), (long)(ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); else - ogs_trace("in %d.%06ld sec", + ogs_trace("in %d.%06ld sec", (int)(ts.tv_sec + 1 - sess_data->ts.tv_sec), (long)(1000000000 + ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - + ret = fd_msg_free(*msg); ogs_assert(ret == 0); *msg = NULL; @@ -1149,7 +1149,7 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) /* Create a new session */ #define OGS_DIAM_S6A_APP_SID_OPT "app_s6a" - ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, + ret = fd_msg_new_session(req, (os0_t)OGS_DIAM_S6A_APP_SID_OPT, CONSTSTRLEN(OGS_DIAM_S6A_APP_SID_OPT)); ogs_assert(ret == 0); ret = fd_msg_sess_get(fd_g_config->cnf_dict, req, &session, NULL); @@ -1265,7 +1265,7 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) svg = sess_data; /* Store this value in the session */ - ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); + ret = fd_sess_state_store(mme_s6a_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data == 0); @@ -1315,7 +1315,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) ogs_error("fd_msg_sess_get() failed"); return; } - + ret = fd_sess_state_retrieve(mme_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); @@ -1459,7 +1459,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) "PACKET_AND_CIRCUIT (0)"); } if (!(subdatamask & OGS_DIAM_S6A_SUBDATA_CC)) { - memcpy(mme_ue->charging_characteristics, (uint8_t *)"\x00\x00", + memcpy(mme_ue->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN); mme_ue->charging_characteristics_presence = false; } @@ -1523,7 +1523,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) } if (error) ogs_diam_logger_self()->stats.nb_errs++; - else + else ogs_diam_logger_self()->stats.nb_recv++; ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); @@ -1870,12 +1870,12 @@ static int mme_ogs_diam_s6a_clr_cb( struct msg **msg, struct avp *avp, struct session *session, void *opaque, enum disp_action *act) { int ret, rv; - + mme_event_t *e = NULL; mme_ue_t *mme_ue = NULL; struct msg *ans, *qry; - ogs_diam_s6a_clr_message_t *clr_message = NULL; + ogs_diam_s6a_clr_message_t *clr_message = NULL; struct avp_hdr *hdr; union avp_value val; @@ -1988,7 +1988,7 @@ static int mme_ogs_diam_s6a_clr_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - + /* Set Vendor-Specific-Application-Id AVP */ ret = ogs_diam_message_vendor_specific_appid_set( ans, OGS_DIAM_S6A_APPLICATION_ID); @@ -2075,7 +2075,7 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, } else { has_subscriber_data = true; uint32_t subdatamask = 0; - ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, + ret = mme_s6a_subscription_data_from_avp(avp, subscription_data, mme_ue, &subdatamask); /* Clang scan-build SA: Value stored is not used: add ogs_assert(). */ ogs_assert(ret == 0); @@ -2283,7 +2283,7 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - + /* Set Vendor-Specific-Application-Id AVP */ ret = ogs_diam_message_vendor_specific_appid_set( ans, OGS_DIAM_S6A_APPLICATION_ID); @@ -2326,7 +2326,7 @@ int mme_fd_init(void) data.command = ogs_diam_s6a_cmd_idr; ret = fd_disp_register(mme_ogs_diam_s6a_idr_cb, DISP_HOW_CC, &data, NULL, &hdl_s6a_idr); - ogs_assert(ret == 0); + ogs_assert(ret == 0); /* Advertise the support for the application in the peer */ ret = fd_disp_app_support(ogs_diam_s6a_application, ogs_diam_vendor, 1, 0); From ad80448c11c38aa034c3b73d0a7e2d8a1e034126 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Aug 2024 17:22:28 +0200 Subject: [PATCH 200/323] [MME] Reject SGSN Context Resp if establishing session fail --- src/mme/mme-gn-handler.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index dc7be73988..380b2186e7 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -425,6 +425,10 @@ int mme_gn_handle_sgsn_context_response( } sess = mme_ue_session_from_gtp1_pdp_ctx(mme_ue, &gtp1_pdp_ctx); + if (!sess) { + gtp1_cause = OGS_GTP1_CAUSE_SYSTEM_FAILURE; + goto nack_and_reject; + } rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, xact); From c1fb688f156a14c15e8ab84b807e2d63b2ef1687 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Aug 2024 16:06:35 +0200 Subject: [PATCH 201/323] [MME] S6a AIA: Trigger next step in auth procedure in the FSM This is a preparatory patch for follow-up patches, making them easier to review and placing actions in the FSM code. --- src/mme/mme-s6a-handler.c | 5 ----- src/mme/mme-sm.c | 7 +++++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index fedf9c3323..3895830758 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -39,7 +39,6 @@ static uint8_t mme_ue_session_from_slice_data(mme_ue_t *mme_ue, uint8_t mme_s6a_handle_aia( mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) { - int r; ogs_diam_s6a_aia_message_t *aia_message = NULL; ogs_diam_e_utran_vector_t *e_utran_vector = NULL; @@ -67,10 +66,6 @@ uint8_t mme_s6a_handle_aia( if (mme_ue->nas_eps.ksi == OGS_NAS_KSI_NO_KEY_IS_AVAILABLE) mme_ue->nas_eps.ksi = 0; - r = nas_eps_send_authentication_request(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - return OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED; } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 9347f37d19..fc5bf6b39e 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -595,7 +595,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + break; } + + /* Auth-Info accepted from HSS, now authenticate the UE: */ + r = nas_eps_send_authentication_request(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; case OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION"); From 5b0a0bf6cf98c08d82421f63c51a7ccaefe9bf32 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Aug 2024 16:06:35 +0200 Subject: [PATCH 202/323] [MME] 2g->4g: Delay SGSN Context Ack after Auth-Info towards HSS As per 3GPP TS 23.401 Annex D.3.6 step 6, "Security functions may be executed" during TAU (UE cell reselection 2g->4g). The idea is that the 4G network should check the integrity of the TAU, and only if iexisting and valid then accept it right away. Otherwise, an authorization procedure is started. Until now, during 2g->4g TAU we were retrieving and acking the PDP Context received from the SGSN and creating the session against the SGW right away. Tests done so far with real phones ended up in unsuccesful results when tring to reuse the 4g context derived from 2g, due to yet unknown reasons. Hence, with this patch we simply force for now the re-auth and recreation of security context before completing the TAU. This showed good results during testing with real phones. The security context is recreated through: * S6a 3gpp-Authentication-Info towards HSS * S1AP/NAS Authentication Request+Response towards UE * SecurityModeCommand towards UE. This patch is the first step towards delaying SGSN Context Ack after the whole authentication is done against the UE. Patches are splitted for ease of review. This patch is only delaying session setup after the S6a procedure. Follow-up patch will delay it further. --- src/mme/mme-event.h | 1 + src/mme/mme-fd-path.c | 22 +++++++++++-- src/mme/mme-fd-path.h | 3 ++ src/mme/mme-gn-handler.c | 7 ++-- src/mme/mme-sm.c | 69 +++++++++++++++++++++++++++++++++------- 5 files changed, 83 insertions(+), 19 deletions(-) diff --git a/src/mme/mme-event.h b/src/mme/mme-event.h index cf3b18e2cd..37670dd812 100644 --- a/src/mme/mme-event.h +++ b/src/mme/mme-event.h @@ -99,6 +99,7 @@ typedef struct mme_event_s { ogs_pool_id_t sgw_ue_id; ogs_pool_id_t mme_ue_id; ogs_pool_id_t bearer_id; + ogs_pool_id_t gtp_xact_id; ogs_timer_t *timer; } mme_event_t; diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index b88dc970dc..8bf420111f 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -37,6 +37,7 @@ struct sess_state { ogs_pool_id_t mme_ue_id; ogs_pool_id_t enb_ue_id; struct timespec ts; /* Time of sending the message */ + ogs_pool_id_t gtp_xact_id; /* GTPv1C (Gn) xact originating this session */ }; static void mme_s6a_aia_cb(void *data, struct msg **msg); @@ -673,9 +674,9 @@ static int mme_s6a_subscription_data_from_avp(struct avp *avp, } /* MME Sends Authentication Information Request to HSS */ -void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, - ogs_nas_authentication_failure_parameter_t - *authentication_failure_parameter) +static void _mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, + ogs_gtp_xact_t *gtp_xact) { int ret; @@ -710,6 +711,7 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, sess_data->mme_ue_id = mme_ue->id; sess_data->enb_ue_id = enb_ue->id; + sess_data->gtp_xact_id = gtp_xact ? gtp_xact->id : OGS_INVALID_POOL_ID; /* Create the request */ ret = fd_msg_new(ogs_diam_s6a_cmd_air, MSGFL_ALLOC_ETEID, &req); @@ -829,6 +831,19 @@ void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); } +void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_nas_authentication_failure_parameter_t + *authentication_failure_parameter) +{ + _mme_s6a_send_air(enb_ue, mme_ue, authentication_failure_parameter, NULL); +}; + +/* Trigger authentication for session/bearer/PdpCtx coming from Gn: */ +void mme_s6a_send_air_from_gn(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_gtp_xact_t *gtp_xact) +{ + _mme_s6a_send_air(enb_ue, mme_ue, NULL, gtp_xact); +}; + /* MME received Authentication Information Answer from HSS */ static void mme_s6a_aia_cb(void *data, struct msg **msg) { @@ -1058,6 +1073,7 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) ogs_assert(e); e->mme_ue_id = mme_ue->id; e->enb_ue_id = enb_ue->id; + e->gtp_xact_id = sess_data->gtp_xact_id; e->s6a_message = s6a_message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { diff --git a/src/mme/mme-fd-path.h b/src/mme/mme-fd-path.h index 68c571b454..8b5aef4e65 100644 --- a/src/mme/mme-fd-path.h +++ b/src/mme/mme-fd-path.h @@ -33,6 +33,9 @@ void mme_fd_final(void); void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter); +void mme_s6a_send_air_from_gn(enb_ue_t *enb_ue, mme_ue_t *mme_ue, + ogs_gtp_xact_t *gtp_xact); + /* MME Sends Update Location Request to HSS */ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue); /* MME Sends Purge UE Request to HSS */ diff --git a/src/mme/mme-gn-handler.c b/src/mme/mme-gn-handler.c index 380b2186e7..a97521cb69 100644 --- a/src/mme/mme-gn-handler.c +++ b/src/mme/mme-gn-handler.c @@ -429,11 +429,8 @@ int mme_gn_handle_sgsn_context_response( gtp1_cause = OGS_GTP1_CAUSE_SYSTEM_FAILURE; goto nack_and_reject; } - - rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, xact); - - mme_gtp_send_create_session_request( - enb_ue, sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + /* Store sess id to be able to retrieve it later on from xact: */ + xact->data = OGS_UINT_TO_POINTER(sess->pti); return ret_cause; diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index fc5bf6b39e..7dab462496 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -580,15 +580,41 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) switch (s6a_message->cmd_code) { case OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION"); + if (e->gtp_xact_id != OGS_INVALID_POOL_ID) + xact = ogs_gtp_xact_find_by_id(e->gtp_xact_id); + else + xact = NULL; emm_cause = mme_s6a_handle_aia(mme_ue, s6a_message); if (emm_cause != OGS_NAS_EMM_CAUSE_REQUEST_ACCEPTED) { - ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", - mme_ue->imsi_bcd, emm_cause); - r = nas_eps_send_attach_reject( - enb_ue, mme_ue, emm_cause, - OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + /* If authentication was triggered due to subscriber coming from + * an SGSN, report to it that something went wrong: */ + if (xact) { + rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_AUTHENTICATION_FAILURE, xact); + if (rv != OGS_OK) + ogs_warn("Failed to send SGSN Context Ack (rv %d)", rv); + } else + ogs_warn("Originating SGSN Context xact no longer valid (%d)", e->gtp_xact_id); + + /* Finally reject the UE: */ + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + ogs_info("[%s] Attach reject [OGS_NAS_EMM_CAUSE:%d]", + mme_ue->imsi_bcd, emm_cause); + r = nas_eps_send_attach_reject( + enb_ue, mme_ue, emm_cause, + OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + /* This is usually an UE coming from 2G (Cell reselection), + * which we decided to re-authenticate */ + ogs_info("[%s] TAU reject [OGS_NAS_EMM_CAUSE:%d]", + mme_ue->imsi_bcd, emm_cause); + r = nas_eps_send_tau_reject( + enb_ue, mme_ue, emm_cause); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else + ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type); r = s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, @@ -598,6 +624,22 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; } + /* TODO: Delay this further until AuthReq below + SecurityModeCommand succeeds against UE */ + if (xact) { + rv = mme_gtp1_send_sgsn_context_ack(mme_ue, + OGS_GTP1_CAUSE_REQUEST_ACCEPTED, + xact); + if (rv != OGS_OK) { + ogs_warn("Tx SGSN Context Request failed(%d)", rv); + break; + } + mme_sess_t *sess = mme_sess_find_by_pti(mme_ue, OGS_POINTER_TO_UINT(xact->data)); + ogs_assert(sess); + mme_gtp_send_create_session_request(enb_ue, sess, + OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_initial_context_setup); + } + /* Auth-Info accepted from HSS, now authenticate the UE: */ r = nas_eps_send_authentication_request(mme_ue); ogs_expect(r == OGS_OK); @@ -870,13 +912,18 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) * xact->local_teid=0. The following function mme_gn_handle_sgsn_context_response() handles the NULL * but the later calls to OGS_FSM_TRAN() to change state will be a NULL pointer dereference. */ ogs_assert(mme_ue); + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); + break; + } /* 3GPP TS 23.401 Figure D.3.6-1 step 5 */ rv = mme_gn_handle_sgsn_context_response(xact, mme_ue, &gtp1_message.sgsn_context_response); - if (rv == OGS_GTP1_CAUSE_ACCEPT) { - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_initial_context_setup); - } else if (rv == OGS_GTP1_CAUSE_REQUEST_IMEI) { - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); + if (rv == OGS_GTP1_CAUSE_ACCEPT || rv == OGS_GTP1_CAUSE_REQUEST_IMEI) { + mme_s6a_send_air_from_gn(enb_ue, mme_ue, xact); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_authentication); } else { OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); } From 51aca2826f4c64b9a9288baa8af34474afb6f887 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 26 Aug 2024 17:08:24 +0200 Subject: [PATCH 203/323] [MME] 2g->4g: Delay SGSN Context Ack after UE becomes authorized This commit is a follow-up from previous one, split to ease review. In this commit, the SGSN Context Ack towards SGSN plus session creation towards SGW is further delayed until authorizing + SecurityModeCommand against UE has succeeded, hence meaning we have a fully operating context to communicate with it. --- src/mme/emm-sm.c | 25 +++++++++++++++++++++++++ src/mme/mme-context.c | 1 + src/mme/mme-context.h | 1 + src/mme/mme-sm.c | 16 +++------------- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index c01e00c81f..170317cfa6 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -1256,6 +1256,31 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) /* Create New GUTI */ mme_ue_new_guti(mme_ue); + /* Special path when SGSN (Gn interface) is involved: */ + if (mme_ue->gn.gtp_xact_id != OGS_INVALID_POOL_ID) { + ogs_gtp_xact_t *gtp_xact = ogs_gtp_xact_find_by_id(mme_ue->gn.gtp_xact_id); + if (!gtp_xact) { + ogs_warn("Not xact found!"); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + uint8_t pti = OGS_POINTER_TO_UINT(gtp_xact->data); + rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, gtp_xact); + if (rv != OGS_OK) { + ogs_warn("Tx SGSN Context Request failed(%d)", rv); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + mme_ue->gn.gtp_xact_id = OGS_INVALID_POOL_ID; + + mme_sess_t *sess = mme_sess_find_by_pti(mme_ue, pti); + ogs_assert(sess); + mme_gtp_send_create_session_request(enb_ue, sess, + OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); + OGS_FSM_TRAN(s, &emm_state_initial_context_setup); + break; + } + mme_s6a_send_ulr(enb_ue, mme_ue); if (mme_ue->next.m_tmsi) { diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index e35ab7bbeb..4f65375343 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -3354,6 +3354,7 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) ogs_pool_id_free(&mme_ue_pool, mme_ue); return NULL; } + mme_ue->gn.gtp_xact_id = OGS_INVALID_POOL_ID; mme_ebi_pool_init(mme_ue); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 81059c5218..26ad58635e 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -402,6 +402,7 @@ struct mme_ue_s { ogs_ip_t sgsn_gn_ip_alt; /* Unnamed timer in 3GPP TS 23.401 D.3.5 step 2), see also 3GPP TS 23.060 6.9.1.2.2 */ ogs_timer_t *t_gn_holding; + ogs_pool_id_t gtp_xact_id; /* 2g->4g SGSN Context Req/Resp/Ack gtp1c xact */ } gn; struct { diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 7dab462496..7cc0d4c634 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -624,20 +624,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; } - /* TODO: Delay this further until AuthReq below + SecurityModeCommand succeeds against UE */ if (xact) { - rv = mme_gtp1_send_sgsn_context_ack(mme_ue, - OGS_GTP1_CAUSE_REQUEST_ACCEPTED, - xact); - if (rv != OGS_OK) { - ogs_warn("Tx SGSN Context Request failed(%d)", rv); - break; - } - mme_sess_t *sess = mme_sess_find_by_pti(mme_ue, OGS_POINTER_TO_UINT(xact->data)); - ogs_assert(sess); - mme_gtp_send_create_session_request(enb_ue, sess, - OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE); - OGS_FSM_TRAN(&mme_ue->sm, &emm_state_initial_context_setup); + /* Subscriber coming from SGSN, store info so we can SGSN + * Context Ack after authenticating the UE: */ + mme_ue->gn.gtp_xact_id = e->gtp_xact_id; } /* Auth-Info accepted from HSS, now authenticate the UE: */ From 9d83eba550bd693bd18568d60189b14161b97f06 Mon Sep 17 00:00:00 2001 From: Jiaxun Yang <jiaxun.yang@flygoat.com> Date: Tue, 27 Aug 2024 16:49:04 +0100 Subject: [PATCH 204/323] [MME] Implement HSS Selection process Implement HSS selection process as described in TS 29.272 Section 7.16. Use hss_map config entry to map between plmn and HSS realm & host. Closes: https://github.com/open5gs/open5gs/issues/3422 Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> --- lib/proto/types.c | 7 ++ lib/proto/types.h | 1 + src/mme/mme-context.c | 149 ++++++++++++++++++++++++++++++++++++++++++ src/mme/mme-context.h | 18 +++++ src/mme/mme-fd-path.c | 72 ++++++++++++-------- 5 files changed, 220 insertions(+), 27 deletions(-) diff --git a/lib/proto/types.c b/lib/proto/types.c index 1b6b7d4865..c678bfffb1 100644 --- a/lib/proto/types.c +++ b/lib/proto/types.c @@ -146,6 +146,13 @@ char *ogs_home_network_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id) ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id)); } +char *ogs_epc_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id) +{ + ogs_assert(plmn_id); + return ogs_msprintf("epc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG, + ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id)); +} + char *ogs_nrf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id) { return ogs_msprintf("nrf.5gc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG, diff --git a/lib/proto/types.h b/lib/proto/types.h index 84641f36e8..12c7ab4a9d 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -230,6 +230,7 @@ char *ogs_plmn_id_to_string(const ogs_plmn_id_t *plmn_id, char *buf); char *ogs_serving_network_name_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_home_network_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id); +char *ogs_epc_domain_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_nrf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_nssf_fqdn_from_plmn_id(const ogs_plmn_id_t *plmn_id); char *ogs_home_network_domain_from_fqdn(char *fqdn); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 4f65375343..f1d42af786 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -43,6 +43,7 @@ static OGS_POOL(mme_sgw_pool, mme_sgw_t); static OGS_POOL(mme_pgw_pool, mme_pgw_t); static OGS_POOL(mme_vlr_pool, mme_vlr_t); static OGS_POOL(mme_csmap_pool, mme_csmap_t); +static OGS_POOL(mme_hssmap_pool, mme_hssmap_t); static OGS_POOL(mme_enb_pool, mme_enb_t); static OGS_POOL(mme_ue_pool, mme_ue_t); @@ -97,6 +98,7 @@ void mme_context_init(void) ogs_list_init(&self.enb_list); ogs_list_init(&self.vlr_list); ogs_list_init(&self.csmap_list); + ogs_list_init(&self.hssmap_list); ogs_pool_init(&mme_sgsn_route_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_sgsn_pool, ogs_app()->pool.nf); @@ -104,6 +106,7 @@ void mme_context_init(void) ogs_pool_init(&mme_pgw_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_vlr_pool, ogs_app()->pool.nf); ogs_pool_init(&mme_csmap_pool, ogs_app()->pool.csmap); + ogs_pool_init(&mme_hssmap_pool, ogs_app()->pool.nf); /* Allocate TWICE the pool to check if maximum number of eNBs is reached */ ogs_pool_init(&mme_enb_pool, ogs_global_conf()->max.peer*2); @@ -1832,6 +1835,73 @@ int mme_context_parse_config(void) } while (ogs_yaml_iter_type(&access_control_array) == YAML_SEQUENCE_NODE); + } else if (!strcmp(mme_key, "hss_map")) { + ogs_yaml_iter_t hss_map_array, hss_map_iter; + ogs_yaml_iter_recurse(&mme_iter, &hss_map_array); + do { + if (ogs_yaml_iter_type(&hss_map_array) == + YAML_MAPPING_NODE) { + memcpy(&hss_map_iter, &hss_map_array, + sizeof(ogs_yaml_iter_t)); + } else if (ogs_yaml_iter_type(&hss_map_array) == + YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next(&hss_map_array)) + break; + ogs_yaml_iter_recurse(&hss_map_array, + &hss_map_iter); + } else if (ogs_yaml_iter_type(&hss_map_array) == + YAML_SCALAR_NODE) { + break; + } else + ogs_assert_if_reached(); + + while (ogs_yaml_iter_next(&hss_map_iter)) { + const char *mnc = NULL, *mcc = NULL, *realm = NULL, *host = NULL; + const char *hss_map_key = + ogs_yaml_iter_key(&hss_map_iter); + ogs_assert(hss_map_key); + if (!strcmp(hss_map_key, "plmn_id")) { + ogs_yaml_iter_t plmn_id_iter; + + ogs_yaml_iter_recurse(&hss_map_iter, + &plmn_id_iter); + while (ogs_yaml_iter_next(&plmn_id_iter)) { + const char *plmn_id_key = + ogs_yaml_iter_key(&plmn_id_iter); + ogs_assert(plmn_id_key); + if (!strcmp(plmn_id_key, "host")) { + const char *v = ogs_yaml_iter_value( + &plmn_id_iter); + if (v) host = ogs_strndup(v, OGS_MAX_FQDN_LEN); + } else if (!strcmp(plmn_id_key, "realm")) { + const char *v = ogs_yaml_iter_value( + &plmn_id_iter); + if (v) realm = ogs_strndup(v, OGS_MAX_FQDN_LEN); + } else if (!strcmp(plmn_id_key, "mcc")) { + mcc = ogs_yaml_iter_value( + &plmn_id_iter); + } else if (!strcmp(plmn_id_key, "mnc")) { + mnc = ogs_yaml_iter_value( + &plmn_id_iter); + } + } + + if (mcc && mnc) { + ogs_plmn_id_t plmn_id; + mme_hssmap_t *hssmap = NULL; + + ogs_plmn_id_build(&plmn_id, + atoi(mcc), atoi(mnc), strlen(mnc)); + + hssmap = mme_hssmap_add(&plmn_id, realm, host); + ogs_assert(hssmap); + } + } else + ogs_warn("unknown key `%s`", + hss_map_key); + } + } while (ogs_yaml_iter_type(&hss_map_array) == + YAML_SEQUENCE_NODE); } else if (!strcmp(mme_key, "security")) { ogs_yaml_iter_t security_iter; ogs_yaml_iter_recurse(&mme_iter, &security_iter); @@ -2798,6 +2868,73 @@ mme_csmap_t *mme_csmap_find_by_nas_lai(const ogs_nas_lai_t *lai) return NULL; } +mme_hssmap_t *mme_hssmap_add(ogs_plmn_id_t *plmn_id, const char *realm, + const char *host) +{ + mme_hssmap_t *hssmap = NULL; + + ogs_assert(plmn_id); + + ogs_pool_alloc(&mme_hssmap_pool, &hssmap); + ogs_assert(hssmap); + memset(hssmap, 0, sizeof *hssmap); + + hssmap->plmn_id = *plmn_id; + if (realm) + hssmap->realm = ogs_strdup(realm); + else + hssmap->realm = ogs_epc_domain_from_plmn_id(plmn_id); + + if (host) + hssmap->host = ogs_strdup(host); + else + hssmap->host = NULL; + + ogs_list_add(&self.hssmap_list, hssmap); + + return hssmap; +} + +void mme_hssmap_remove(mme_hssmap_t *hssmap) +{ + ogs_assert(hssmap); + + ogs_list_remove(&self.hssmap_list, hssmap); + + if (hssmap->realm != NULL) + ogs_free(hssmap->realm); + + if (hssmap->host != NULL) + ogs_free(hssmap->host); + + ogs_pool_free(&mme_hssmap_pool, hssmap); +} + +void mme_hssmap_remove_all(void) +{ + mme_hssmap_t *hssmap = NULL, *next_hssmap = NULL; + + ogs_list_for_each_safe(&self.hssmap_list, next_hssmap, hssmap) + mme_hssmap_remove(hssmap); +} + +mme_hssmap_t *mme_hssmap_find_by_imsi_bcd(const char *imsi_bcd) +{ + mme_hssmap_t *hssmap = NULL; + ogs_assert(imsi_bcd); + + ogs_list_for_each(&self.hssmap_list, hssmap) { + char plmn_id_str[OGS_PLMNIDSTRLEN] = ""; + + ogs_plmn_id_to_string(&hssmap->plmn_id, plmn_id_str); + if (strncmp(plmn_id_str, imsi_bcd, strlen(plmn_id_str)) == 0) { + return hssmap; + } + } + + return NULL; +} + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) { mme_enb_t *enb = NULL; @@ -3809,6 +3946,18 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) ogs_hash_set(self.imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, mme_ue); + mme_ue->hssmap = mme_hssmap_find_by_imsi_bcd(mme_ue->imsi_bcd); + if (mme_ue->hssmap) { + char plmn_id_str[OGS_PLMNIDSTRLEN]; + const char *realm = mme_ue->hssmap->realm ? mme_ue->hssmap->realm : "NULL"; + const char *host = mme_ue->hssmap->host ? mme_ue->hssmap->host : "NULL"; + + ogs_plmn_id_to_string(&mme_ue->hssmap->plmn_id, plmn_id_str); + ogs_debug("[%s]: HSS Map HPLMN[%s] Realm[%s] Host[%s]", + mme_ue->imsi_bcd, plmn_id_str, realm, host); + + } + return OGS_OK; } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 26ad58635e..b909418834 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -52,6 +52,7 @@ typedef struct mme_sgw_s mme_sgw_t; typedef struct mme_pgw_s mme_pgw_t; typedef struct mme_vlr_s mme_vlr_t; typedef struct mme_csmap_s mme_csmap_t; +typedef struct mme_hssmap_s mme_hssmap_t; typedef struct enb_ue_s enb_ue_t; typedef struct sgw_ue_s sgw_ue_t; @@ -97,6 +98,7 @@ typedef struct mme_context_s { ogs_list_t vlr_list; /* VLR SGsAP Client List */ ogs_list_t csmap_list; /* TAI-LAI Map List */ + ogs_list_t hssmap_list; /* PLMN HSS Map List */ /* Served GUMME */ int num_of_served_gummei; @@ -232,6 +234,14 @@ typedef struct mme_csmap_s { mme_vlr_t *vlr; } mme_csmap_t; +typedef struct mme_hssmap_s { + ogs_lnode_t lnode; + + ogs_plmn_id_t plmn_id; + char *realm; + char *host; +} mme_hssmap_t; + typedef struct mme_enb_s { ogs_lnode_t lnode; ogs_pool_id_t id; @@ -700,6 +710,7 @@ struct mme_ue_s { ogs_list_t bearer_to_modify_list; mme_csmap_t *csmap; + mme_hssmap_t *hssmap; }; #define SESSION_CONTEXT_IS_AVAILABLE(__mME) \ @@ -930,6 +941,13 @@ void mme_csmap_remove_all(void); mme_csmap_t *mme_csmap_find_by_tai(const ogs_eps_tai_t *tai); mme_csmap_t *mme_csmap_find_by_nas_lai(const ogs_nas_lai_t *lai); +mme_hssmap_t *mme_hssmap_add(ogs_plmn_id_t *plmn_id, const char *realm, + const char *host); +void mme_hssmap_remove(mme_hssmap_t *hssmap); +void mme_hssmap_remove_all(void); + +mme_hssmap_t *mme_hssmap_find_by_imsi_bcd(const char *imsi_bcd); + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr); int mme_enb_remove(mme_enb_t *enb); int mme_enb_remove_all(void); diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index 8bf420111f..bcad1ce375 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -54,6 +54,45 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) ogs_free(sess_data); } +static void mme_add_hss_destination(mme_ue_t *mme_ue, struct msg *req) +{ + int ret; + struct avp *avp; + union avp_value val; + const char *realm = NULL, *host = NULL; + + ogs_assert(mme_ue); + ogs_assert(req); + + if (mme_ue->hssmap) { + realm = mme_ue->hssmap->realm; + host = mme_ue->hssmap->host; + } + + if (realm == NULL) + realm = fd_g_config->cnf_diamrlm; + + ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)realm; + val.os.len = strlen(realm); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + + if (host != NULL) { + ret = fd_msg_avp_new(ogs_diam_destination_host, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)host; + val.os.len = strlen(host); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } +} + /* s6a process Subscription-Data from avp */ static int mme_s6a_subscription_data_from_avp(struct avp *avp, ogs_subscription_data_t *subscription_data, @@ -738,15 +777,8 @@ static void _mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); @@ -1184,15 +1216,8 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); @@ -1616,15 +1641,8 @@ void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue) ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); - /* Set the Destination-Realm AVP */ - ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); - ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); - ret = fd_msg_avp_setvalue(avp, &val); - ogs_assert(ret == 0); - ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); - ogs_assert(ret == 0); + /* Set the Destination-Realm & Destination-Host */ + mme_add_hss_destination(mme_ue, req); /* Set the User-Name AVP */ ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp); From deef017dfeb276f5f6a17c286df0646c17e9b201 Mon Sep 17 00:00:00 2001 From: Jiaxun Yang <jiaxun.yang@flygoat.com> Date: Tue, 27 Aug 2024 16:59:20 +0100 Subject: [PATCH 205/323] [MME] config: Document hss_map yaml entry Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> --- configs/open5gs/mme.yaml.in | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/configs/open5gs/mme.yaml.in b/configs/open5gs/mme.yaml.in index 87c251b9dc..b3daf838d7 100644 --- a/configs/open5gs/mme.yaml.in +++ b/configs/open5gs/mme.yaml.in @@ -277,5 +277,23 @@ mme: # mcc: 999 # mnc: 70 # +# o HSS Selection +# o realm and host are optional +# o realm will be generated from plmn_id if not provided +# o host will not be used if not provided +# hss_map: +# - plmn_id: +# mcc: 001 +# mnc: 01 +# - plmn_id: +# mcc: 002 +# mnc: 02 +# realm: epc.mnc002.mcc002.3gppnetwork.org +# - plmn_id: +# mcc: 999 +# mnc: 70 +# realm: localdomain +# host: hss.localdomain +# # o Relative Capacity # relative_capacity: 100 From ed68d0b016c3f475836f0f509336f71afd4ca4a3 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 3 Sep 2024 21:48:25 +0900 Subject: [PATCH 206/323] [MME] Follow-up on #3429 #3422 --- src/mme/mme-context.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index f1d42af786..a0e9920f74 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -158,6 +158,7 @@ void mme_context_final(void) mme_csmap_remove_all(); mme_vlr_remove_all(); mme_sgsn_remove_all(); + mme_hssmap_remove_all(); ogs_assert(self.enb_addr_hash); ogs_hash_destroy(self.enb_addr_hash); @@ -190,6 +191,7 @@ void mme_context_final(void) ogs_pool_final(&mme_pgw_pool); ogs_pool_final(&mme_csmap_pool); ogs_pool_final(&mme_vlr_pool); + ogs_pool_final(&mme_hssmap_pool); context_initialized = 0; } From 5cf92c9851f5f5cedfe49199ae9d4f8e68e77cae Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Wed, 7 Aug 2024 14:12:12 +0200 Subject: [PATCH 207/323] [tests] Upgrade tests for multiple NFs The test scenario can now deploy multiple AMFs and other NFs. --- configs/sample.yaml.in | 44 ++++++ configs/transfer.yaml.in | 272 +++++++++++++++++++++++++++++++++++++ lib/app/ogs-config.c | 28 +++- lib/app/ogs-config.h | 11 ++ lib/app/ogs-context.h | 2 + lib/app/ogs-init.c | 23 +++- lib/core/abts.c | 11 +- lib/gtp/context.c | 4 +- lib/metrics/context.c | 4 +- lib/pfcp/context.c | 4 +- lib/sbi/context.c | 8 +- src/amf/context.c | 4 +- src/ausf/context.c | 4 +- src/bsf/context.c | 4 +- src/main.c | 11 +- src/nssf/context.c | 4 +- src/pcf/context.c | 4 +- src/smf/context.c | 4 +- src/udm/context.c | 4 +- src/udr/context.c | 4 +- src/upf/context.c | 4 +- tests/app/5gc-init.c | 117 +++++++++++----- tests/transfer/abts-main.c | 74 ++++++++++ tests/transfer/meson.build | 28 ++++ 24 files changed, 626 insertions(+), 51 deletions(-) create mode 100644 configs/transfer.yaml.in create mode 100644 tests/transfer/abts-main.c create mode 100644 tests/transfer/meson.build diff --git a/configs/sample.yaml.in b/configs/sample.yaml.in index 12f3f68594..8b9734ac10 100644 --- a/configs/sample.yaml.in +++ b/configs/sample.yaml.in @@ -189,6 +189,50 @@ amf: t3512: value: 540 # 9 mintues * 60 = 540 seconds +# amf #2 +amf: + sbi: + server: + - address: 127.0.0.50 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.50 + metrics: + server: + - address: 127.0.0.50 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : [ NIA2, NIA1, NIA0 ] + ciphering_order : [ NEA0, NEA1, NEA2 ] + network_name: + full: Open5GS + amf_name: open5gs-amf1 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + sgwu: pfcp: server: diff --git a/configs/transfer.yaml.in b/configs/transfer.yaml.in new file mode 100644 index 0000000000..56336d534e --- /dev/null +++ b/configs/transfer.yaml.in @@ -0,0 +1,272 @@ +db_uri: mongodb://localhost/open5gs + +logger: + +test: + serving: + - plmn_id: + mcc: 999 + mnc: 70 + +global: + parameter: +# no_nrf: true +# no_scp: true + no_sepp: true +# no_amf: true +# no_smf: true +# no_upf: true +# no_ausf: true +# no_udm: true +# no_pcf: true +# no_nssf: true +# no_bsf: true +# no_udr: true + no_mme: true + no_sgwc: true + no_sgwu: true + no_pcrf: true + no_hss: true + + +smf: + sbi: + server: + - address: 127.0.0.4 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + pfcp: + server: + - address: 127.0.0.4 + client: + upf: + - address: 127.0.0.7 + gtpc: + server: + - address: 127.0.0.4 + gtpu: + server: + - address: 127.0.0.4 + metrics: + server: + - address: 127.0.0.4 + port: 9090 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + dns: + - 8.8.8.8 + - 8.8.4.4 + - 2001:4860:4860::8888 + - 2001:4860:4860::8844 + mtu: 1400 + freeDiameter: + identity: smf.localdomain + realm: localdomain + listen_on: 127.0.0.4 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: pcrf.localdomain + address: 127.0.0.9 + +amf: + sbi: + server: + - address: 127.0.0.5 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.5 + metrics: + server: + - address: 127.0.0.5 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + pointer: 31 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : [ NIA2, NIA1, NIA0 ] + ciphering_order : [ NEA0, NEA1, NEA2 ] + network_name: + full: Open5GS + amf_name: open5gs-amf0 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + +# amf #2 +amf: + sbi: + server: + - address: 127.0.0.50 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + ngap: + server: + - address: 127.0.0.50 + metrics: + server: + - address: 127.0.0.50 + port: 9090 + guami: + - plmn_id: + mcc: 999 + mnc: 70 + amf_id: + region: 2 + set: 1 + pointer: 30 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + plmn_support: + - plmn_id: + mcc: 999 + mnc: 70 + s_nssai: + - sst: 1 + security: + integrity_order : [ NIA2, NIA1, NIA0 ] + ciphering_order : [ NEA0, NEA1, NEA2 ] + network_name: + full: Open5GS + amf_name: open5gs-amf1 + time: + t3512: + value: 540 # 9 mintues * 60 = 540 seconds + +upf: + pfcp: + server: + - address: 127.0.0.7 + gtpu: + server: + - address: 127.0.0.7 + session: + - subnet: 10.45.0.0/16 + gateway: 10.45.0.1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 + metrics: + server: + - address: 127.0.0.7 + port: 9090 + +nrf: + sbi: + server: + - address: 127.0.0.10 + port: 7777 + +scp: + sbi: + server: + - address: 127.0.0.200 + port: 7777 + client: + nrf: + - uri: http://127.0.0.10:7777 + +ausf: + sbi: + server: + - address: 127.0.0.11 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udm: + hnet: + - id: 1 + scheme: 1 + key: @build_configs_dir@/open5gs/hnet/curve25519-1.key + - id: 2 + scheme: 2 + key: @build_configs_dir@/open5gs/hnet/secp256r1-2.key + sbi: + server: + - address: 127.0.0.12 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +pcf: + sbi: + server: + - address: 127.0.0.13 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + metrics: + server: + - address: 127.0.0.13 + port: 9090 + +nssf: + sbi: + server: + - address: 127.0.0.14 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + nsi: + - uri: http://127.0.0.10:7777 + s_nssai: + sst: 1 +bsf: + sbi: + server: + - address: 127.0.0.15 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 + +udr: + sbi: + server: + - address: 127.0.0.20 + port: 7777 + client: + scp: + - uri: http://127.0.0.200:7777 diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index a8964ebf75..9a374770a7 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -134,6 +134,30 @@ static int global_conf_validation(void) return OGS_OK; } +int ogs_app_count_nf_conf_sections(const char *conf_section) +{ + if (!strcmp(conf_section, "amf")) + global_conf.parameter.amf_count++; + else if (!strcmp(conf_section, "smf")) + global_conf.parameter.smf_count++; + else if (!strcmp(conf_section, "upf")) + global_conf.parameter.upf_count++; + else if (!strcmp(conf_section, "ausf")) + global_conf.parameter.ausf_count++; + else if (!strcmp(conf_section, "udm")) + global_conf.parameter.udm_count++; + else if (!strcmp(conf_section, "pcf")) + global_conf.parameter.pcf_count++; + else if (!strcmp(conf_section, "nssf")) + global_conf.parameter.nssf_count++; + else if (!strcmp(conf_section, "bsf")) + global_conf.parameter.bsf_count++; + else if (!strcmp(conf_section, "udr")) + global_conf.parameter.udr_count++; + + return OGS_OK; +} + int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent) { int rv; @@ -459,6 +483,7 @@ int ogs_app_parse_local_conf(const char *local) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -470,7 +495,8 @@ int ogs_app_parse_local_conf(const char *local) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if (!strcmp(root_key, local) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { diff --git a/lib/app/ogs-config.h b/lib/app/ogs-config.h index 3085943a2e..3280208ea7 100644 --- a/lib/app/ogs-config.h +++ b/lib/app/ogs-config.h @@ -52,6 +52,16 @@ typedef struct ogs_global_conf_s { int no_scp; int no_nrf; + int amf_count; + int smf_count; + int upf_count; + int ausf_count; + int udm_count; + int pcf_count; + int nssf_count; + int bsf_count; + int udr_count; + /* Network */ int no_ipv4; int no_ipv6; @@ -163,6 +173,7 @@ void ogs_app_config_final(void); ogs_app_global_conf_t *ogs_global_conf(void); ogs_app_local_conf_t *ogs_local_conf(void); +int ogs_app_count_nf_conf_sections(const char *conf_section); int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent); int ogs_app_parse_local_conf(const char *local); diff --git a/lib/app/ogs-context.h b/lib/app/ogs-context.h index a9e9787c2d..e0f3e0df9a 100644 --- a/lib/app/ogs-context.h +++ b/lib/app/ogs-context.h @@ -85,6 +85,8 @@ typedef struct ogs_app_context_s { uint64_t max_specs; } metrics; + int config_section_id; + } ogs_app_context_t; int ogs_app_context_init(void); diff --git a/lib/app/ogs-init.c b/lib/app/ogs-init.c index bb48229488..20f0872d31 100644 --- a/lib/app/ogs-init.c +++ b/lib/app/ogs-init.c @@ -35,6 +35,7 @@ int ogs_app_initialize( char *log_file; char *log_level; char *domain_mask; + char *config_section_id; } optarg; ogs_core_initialize(); @@ -50,7 +51,7 @@ int ogs_app_initialize( memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "c:l:e:m:")) != -1) { + while ((opt = ogs_getopt(&options, "c:l:e:m:k:")) != -1) { switch (opt) { case 'c': optarg.config_file = options.optarg; @@ -64,6 +65,9 @@ int ogs_app_initialize( case 'm': optarg.domain_mask = options.optarg; break; + case 'k': + optarg.config_section_id = options.optarg; + break; case '?': default: ogs_assert_if_reached(); @@ -124,7 +128,14 @@ int ogs_app_initialize( ogs_app()->db_uri = ogs_env_get("DB_URI"); /************************************************************************** - * Stage 6 : Print Banner + * Stage 6 : Setup configuration section ID for running multiple NF from + * same config file + */ + if (optarg.config_section_id) + ogs_app()->config_section_id = atoi(optarg.config_section_id); + + /************************************************************************** + * Stage 7 : Print Banner */ if (ogs_app()->version) { ogs_log_print(OGS_LOG_INFO, @@ -144,7 +155,7 @@ int ogs_app_initialize( } /************************************************************************** - * Stage 7 : Queue, Timer and Poll + * Stage 8 : Queue, Timer and Poll */ ogs_app()->queue = ogs_queue_create(ogs_app()->pool.event); ogs_assert(ogs_app()->queue); @@ -347,6 +358,12 @@ static int parse_config(void) ogs_error("ogs_global_conf_parse_config() failed"); return rv; } + } else { + rv = ogs_app_count_nf_conf_sections(root_key); + if (rv != OGS_OK) { + ogs_error("ogs_app_count_nf_conf_sections() failed"); + return rv; + } } } diff --git a/lib/core/abts.c b/lib/core/abts.c index 86f05a14cd..c32ffb5e70 100644 --- a/lib/core/abts.c +++ b/lib/core/abts.c @@ -513,6 +513,7 @@ static void show_help(const char *name) " -q : turn off status in test\n" " -x : exclute test-unit (e.g. -x sctp-test)\n" " -l : list test-unit\n" + " -k : use <id> config section\n" "\n", name); } @@ -523,6 +524,7 @@ int abts_main(int argc, const char *const argv[], const char **argv_out) ogs_getopt_t options; struct { char *config_file; + char *config_section; char *log_level; char *domain_mask; @@ -533,7 +535,7 @@ int abts_main(int argc, const char *const argv[], const char **argv_out) memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "hvxlqc:e:m:dt")) != -1) { + while ((opt = ogs_getopt(&options, "hvxlqc:e:m:dtk:")) != -1) { switch (opt) { case 'h': show_help(argv[0]); @@ -565,6 +567,9 @@ int abts_main(int argc, const char *const argv[], const char **argv_out) case 't': optarg.enable_trace = true; break; + case 'k': + optarg.config_section = options.optarg; + break; case '?': fprintf(stderr, "%s: %s\n", argv[0], options.errmsg); show_help(argv[0]); @@ -602,6 +607,10 @@ int abts_main(int argc, const char *const argv[], const char **argv_out) argv_out[i++] = "-m"; argv_out[i++] = optarg.domain_mask; } + if (optarg.config_section) { + argv_out[i++] = "-k"; + argv_out[i++] = optarg.config_section; + } argv_out[i] = NULL; diff --git a/lib/gtp/context.c b/lib/gtp/context.c index a1cf22dcc1..17620b4da7 100644 --- a/lib/gtp/context.c +++ b/lib/gtp/context.c @@ -77,6 +77,7 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if ((!strcmp(root_key, local)) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { diff --git a/lib/metrics/context.c b/lib/metrics/context.c index 158f8a1d03..5f5d14e01d 100644 --- a/lib/metrics/context.c +++ b/lib/metrics/context.c @@ -77,6 +77,7 @@ int ogs_metrics_context_parse_config(const char *local) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ int ogs_metrics_context_parse_config(const char *local) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index bbc58b001a..0572098751 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -219,6 +219,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -230,7 +231,8 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, local)) { + if ((!strcmp(root_key, local)) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 8d9a7ea12e..6b7005edff 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -213,6 +213,7 @@ int ogs_sbi_context_parse_config( int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -224,7 +225,8 @@ int ogs_sbi_context_parse_config( while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { @@ -349,11 +351,13 @@ int ogs_sbi_context_parse_config( } } + idx = 0; ogs_yaml_iter_init(&root_iter, document); while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (local && !strcmp(root_key, local)) { + if (local && !strcmp(root_key, local) && + idx++ == ogs_app()->config_section_id) { ogs_yaml_iter_t local_iter; ogs_yaml_iter_recurse(&root_iter, &local_iter); while (ogs_yaml_iter_next(&local_iter)) { diff --git a/src/amf/context.c b/src/amf/context.c index 75ee3a039a..ca6c7ba195 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -206,6 +206,7 @@ int amf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -217,7 +218,8 @@ int amf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "amf")) { + if ((!strcmp(root_key, "amf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t amf_iter; ogs_yaml_iter_recurse(&root_iter, &amf_iter); while (ogs_yaml_iter_next(&amf_iter)) { diff --git a/src/ausf/context.c b/src/ausf/context.c index 4b2bc8d179..6514cc4651 100644 --- a/src/ausf/context.c +++ b/src/ausf/context.c @@ -83,6 +83,7 @@ int ausf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -94,7 +95,8 @@ int ausf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "ausf")) { + if ((!strcmp(root_key, "ausf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t ausf_iter; ogs_yaml_iter_recurse(&root_iter, &ausf_iter); while (ogs_yaml_iter_next(&ausf_iter)) { diff --git a/src/bsf/context.c b/src/bsf/context.c index 21c419dfe0..da4744b942 100644 --- a/src/bsf/context.c +++ b/src/bsf/context.c @@ -82,6 +82,7 @@ int bsf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -93,7 +94,8 @@ int bsf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "bsf")) { + if ((!strcmp(root_key, "bsf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t bsf_iter; ogs_yaml_iter_recurse(&root_iter, &bsf_iter); while (ogs_yaml_iter_next(&bsf_iter)) { diff --git a/src/main.c b/src/main.c index 0f993a6a67..05cec90441 100644 --- a/src/main.c +++ b/src/main.c @@ -42,6 +42,7 @@ static void show_help(const char *name) " -D : start as a daemon\n" " -v : show version number and exit\n" " -h : show this message and exit\n" + " -k : use <id> config section\n" "\n", name); } @@ -104,6 +105,7 @@ int main(int argc, const char *const argv[]) ogs_getopt_t options; struct { char *config_file; + char *config_section; char *log_file; char *log_level; char *domain_mask; @@ -116,7 +118,7 @@ int main(int argc, const char *const argv[]) memset(&optarg, 0, sizeof(optarg)); ogs_getopt_init(&options, (char**)argv); - while ((opt = ogs_getopt(&options, "vhDc:l:e:m:dt")) != -1) { + while ((opt = ogs_getopt(&options, "vhDc:l:e:m:dtk:")) != -1) { switch (opt) { case 'v': show_version(); @@ -164,6 +166,9 @@ int main(int argc, const char *const argv[]) case 't': optarg.enable_trace = true; break; + case 'k': + optarg.config_section = options.optarg; + break; case '?': fprintf(stderr, "%s: %s\n", argv[0], options.errmsg); show_help(argv[0]); @@ -196,6 +201,10 @@ int main(int argc, const char *const argv[]) argv_out[i++] = "-m"; argv_out[i++] = optarg.domain_mask; } + if (optarg.config_section) { + argv_out[i++] = "-k"; + argv_out[i++] = optarg.config_section; + } argv_out[i] = NULL; diff --git a/src/nssf/context.c b/src/nssf/context.c index ae472b27f5..d2a0bc6362 100644 --- a/src/nssf/context.c +++ b/src/nssf/context.c @@ -77,6 +77,7 @@ int nssf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -88,7 +89,8 @@ int nssf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "nssf")) { + if ((!strcmp(root_key, "nssf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t nssf_iter; ogs_yaml_iter_recurse(&root_iter, &nssf_iter); while (ogs_yaml_iter_next(&nssf_iter)) { diff --git a/src/pcf/context.c b/src/pcf/context.c index 3deecdc425..c90855357a 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -275,6 +275,7 @@ int pcf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -286,7 +287,8 @@ int pcf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "pcf")) { + if ((!strcmp(root_key, "pcf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t pcf_iter; ogs_yaml_iter_recurse(&root_iter, &pcf_iter); while (ogs_yaml_iter_next(&pcf_iter)) { diff --git a/src/smf/context.c b/src/smf/context.c index a397e19ecc..59c3d98950 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -294,6 +294,7 @@ int smf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -305,7 +306,8 @@ int smf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "smf")) { + if ((!strcmp(root_key, "smf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t smf_iter; ogs_yaml_iter_recurse(&root_iter, &smf_iter); while (ogs_yaml_iter_next(&smf_iter)) { diff --git a/src/udm/context.c b/src/udm/context.c index a3de76a271..78f61c18f0 100644 --- a/src/udm/context.c +++ b/src/udm/context.c @@ -100,6 +100,7 @@ int udm_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -111,7 +112,8 @@ int udm_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "udm")) { + if ((!strcmp(root_key, "udm")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t udm_iter; ogs_yaml_iter_recurse(&root_iter, &udm_iter); while (ogs_yaml_iter_next(&udm_iter)) { diff --git a/src/udr/context.c b/src/udr/context.c index de1755d0e3..2ee74d1b9d 100644 --- a/src/udr/context.c +++ b/src/udr/context.c @@ -65,6 +65,7 @@ int udr_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -76,7 +77,8 @@ int udr_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "udr")) { + if ((!strcmp(root_key, "udr")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t udr_iter; ogs_yaml_iter_recurse(&root_iter, &udr_iter); while (ogs_yaml_iter_next(&udr_iter)) { diff --git a/src/upf/context.c b/src/upf/context.c index b5311874d4..7c286fa821 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -130,6 +130,7 @@ int upf_context_parse_config(void) int rv; yaml_document_t *document = NULL; ogs_yaml_iter_t root_iter; + int idx = 0; document = ogs_app()->document; ogs_assert(document); @@ -141,7 +142,8 @@ int upf_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); - if (!strcmp(root_key, "upf")) { + if ((!strcmp(root_key, "upf")) && + (idx++ == ogs_app()->config_section_id)) { ogs_yaml_iter_t upf_iter; ogs_yaml_iter_recurse(&root_iter, &upf_iter); while (ogs_yaml_iter_next(&upf_iter)) { diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 737fb9cbe1..540fcfa9e9 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -19,18 +19,55 @@ #include "test-app.h" +/* If want to increase this number, check and modify run_threads() function + * for static integer to string conversion */ +#define OGS_MAX_NF_INSTANCES 4 + static ogs_thread_t *nrf_thread = NULL; static ogs_thread_t *scp_thread = NULL; static ogs_thread_t *sepp_thread = NULL; -static ogs_thread_t *upf_thread = NULL; -static ogs_thread_t *smf_thread = NULL; -static ogs_thread_t *amf_thread = NULL; -static ogs_thread_t *ausf_thread = NULL; -static ogs_thread_t *udm_thread = NULL; -static ogs_thread_t *pcf_thread = NULL; -static ogs_thread_t *nssf_thread = NULL; -static ogs_thread_t *bsf_thread = NULL; -static ogs_thread_t *udr_thread = NULL; +static ogs_thread_t *upf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *smf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *amf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *ausf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *udm_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *pcf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *nssf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *bsf_threads[OGS_MAX_NF_INSTANCES] = { NULL }; +static ogs_thread_t *udr_threads[OGS_MAX_NF_INSTANCES] = { NULL }; + + +static void run_threads(const char *nf_name, int count, + const char *argv_out[], int argv_out_idx, ogs_thread_t *threads[]) +{ + int i; + + threads[0] = test_child_create(nf_name, argv_out); + + for (i = 1; i < count; i++) { + const char *idx_string = NULL;; + + switch (i) { + case 1: idx_string = "1"; break; + case 2: idx_string = "2"; break; + case 3: idx_string = "3"; break; + default: + idx_string = ogs_msprintf("%d", i); + ogs_warn("Missing static conversion of integer to string"); + break; + } + ogs_assert(idx_string); + + argv_out[argv_out_idx + 0] = "-k"; + argv_out[argv_out_idx + 1] = idx_string; + argv_out[argv_out_idx + 2] = NULL; + + threads[i] = test_child_create(nf_name, argv_out); + } + + // reset argv_out and remove the added "-k" parameter + argv_out[argv_out_idx] = NULL; +} int app_initialize(const char *const argv[]) { @@ -60,25 +97,32 @@ int app_initialize(const char *const argv[]) sepp_thread = test_child_create("sepp", argv_out); if (ogs_global_conf()->parameter.no_upf == 0) - upf_thread = test_child_create("upf", argv_out); + run_threads("upf", ogs_global_conf()->parameter.upf_count, + argv_out, i, upf_threads); if (ogs_global_conf()->parameter.no_smf == 0) - smf_thread = test_child_create("smf", argv_out); - + run_threads("smf", ogs_global_conf()->parameter.smf_count, + argv_out, i, smf_threads); if (ogs_global_conf()->parameter.no_amf == 0) - amf_thread = test_child_create("amf", argv_out); - + run_threads("amf", ogs_global_conf()->parameter.amf_count, + argv_out, i, amf_threads); if (ogs_global_conf()->parameter.no_ausf == 0) - ausf_thread = test_child_create("ausf", argv_out); + run_threads("ausf", ogs_global_conf()->parameter.ausf_count, + argv_out, i, ausf_threads); if (ogs_global_conf()->parameter.no_udm == 0) - udm_thread = test_child_create("udm", argv_out); + run_threads("udm", ogs_global_conf()->parameter.udm_count, + argv_out, i, udm_threads); if (ogs_global_conf()->parameter.no_pcf == 0) - pcf_thread = test_child_create("pcf", argv_out); + run_threads("pcf", ogs_global_conf()->parameter.pcf_count, + argv_out, i, pcf_threads); if (ogs_global_conf()->parameter.no_nssf == 0) - nssf_thread = test_child_create("nssf", argv_out); + run_threads("nssf", ogs_global_conf()->parameter.nssf_count, + argv_out, i, nssf_threads); if (ogs_global_conf()->parameter.no_bsf == 0) - bsf_thread = test_child_create("bsf", argv_out); + run_threads("bsf", ogs_global_conf()->parameter.bsf_count, + argv_out, i, bsf_threads); if (ogs_global_conf()->parameter.no_udr == 0) - udr_thread = test_child_create("udr", argv_out); + run_threads("udr", ogs_global_conf()->parameter.udr_count, + argv_out, i, udr_threads); /* * Wait for all sockets listening @@ -92,17 +136,28 @@ int app_initialize(const char *const argv[]) void app_terminate(void) { - if (amf_thread) ogs_thread_destroy(amf_thread); - - if (smf_thread) ogs_thread_destroy(smf_thread); - if (upf_thread) ogs_thread_destroy(upf_thread); - - if (udr_thread) ogs_thread_destroy(udr_thread); - if (nssf_thread) ogs_thread_destroy(nssf_thread); - if (bsf_thread) ogs_thread_destroy(bsf_thread); - if (pcf_thread) ogs_thread_destroy(pcf_thread); - if (udm_thread) ogs_thread_destroy(udm_thread); - if (ausf_thread) ogs_thread_destroy(ausf_thread); + int i; + + for (i = 0; i < OGS_MAX_NF_INSTANCES; i++) { + if (amf_threads[i]) + ogs_thread_destroy(amf_threads[i]); + if (smf_threads[i]) + ogs_thread_destroy(smf_threads[i]); + if (upf_threads[i]) + ogs_thread_destroy(upf_threads[i]); + if (udr_threads[i]) + ogs_thread_destroy(udr_threads[i]); + if (nssf_threads[i]) + ogs_thread_destroy(nssf_threads[i]); + if (bsf_threads[i]) + ogs_thread_destroy(bsf_threads[i]); + if (pcf_threads[i]) + ogs_thread_destroy(pcf_threads[i]); + if (udm_threads[i]) + ogs_thread_destroy(udm_threads[i]); + if (ausf_threads[i]) + ogs_thread_destroy(ausf_threads[i]); + } if (sepp_thread) ogs_thread_destroy(sepp_thread); if (scp_thread) ogs_thread_destroy(scp_thread); diff --git a/tests/transfer/abts-main.c b/tests/transfer/abts-main.c new file mode 100644 index 0000000000..1dc1ae77b9 --- /dev/null +++ b/tests/transfer/abts-main.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-app.h" + +abts_suite * test_ue_context_transfer(abts_suite *suite); + +const struct testlist { + abts_suite *(*func)(abts_suite *suite); +} alltests[] = { + {test_ue_context_transfer}, + {NULL}, +}; + +static void terminate(void) +{ + ogs_msleep(50); + + test_child_terminate(); + app_terminate(); + + test_5gc_final(); + ogs_app_terminate(); +} + +static void initialize(const char *const argv[]) +{ + int rv; + + rv = ogs_app_initialize(NULL, NULL, argv); + ogs_assert(rv == OGS_OK); + test_5gc_init(); + +// matej uredi + +ogs_error("MAtej pred boštjanovo funkcijo"); + + rv = app_initialize(argv); +// rv = app_initialize_transfer(argv); + ogs_assert(rv == OGS_OK); +} + +int main(int argc, const char *const argv[]) +{ + int i; + abts_suite *suite = NULL; + + atexit(terminate); + + // matej uredi + //test_app_run_transfer(argc, argv, "transfer.yaml", initialize); + test_app_run(argc, argv, "transfer.yaml", initialize); + + for (i = 0; alltests[i].func; i++) + suite = alltests[i].func(suite); + + return abts_report(suite); +} diff --git a/tests/transfer/meson.build b/tests/transfer/meson.build new file mode 100644 index 0000000000..7b9efa060a --- /dev/null +++ b/tests/transfer/meson.build @@ -0,0 +1,28 @@ +# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + +# This file is part of Open5GS. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +testapp_transfer_sources = files(''' + abts-main.c + ue-context-transfer-test.c +'''.split()) + +testapp_transfer_exe = executable('transfer', + sources : testapp_transfer_sources, + c_args : testunit_core_cc_flags, + dependencies : libtest5gc_dep) + +test('transfer', testapp_transfer_exe, is_parallel : false, suite: '5gc') From 8c293bc7102fa72e92fca29b8ae316cf30d21dfd Mon Sep 17 00:00:00 2001 From: Matej Gradisar <gradisar@iskratel.si> Date: Thu, 9 May 2024 13:13:41 +0200 Subject: [PATCH 208/323] [AMF] Registation status update and tests --- configs/meson.build | 1 + configs/sample.yaml.in | 44 - configs/transfer.yaml.in | 64 + lib/app/ogs-app.h | 1 + lib/sbi/message.c | 33 + lib/sbi/message.h | 3 + lib/sbi/ogs-sbi.h | 2 + src/amf/amf-sm.c | 17 + src/amf/context.c | 35 +- src/amf/context.h | 7 + src/amf/gmm-handler.c | 12 + src/amf/gmm-sm.c | 202 +- src/amf/namf-build.c | 54 +- src/amf/namf-build.h | 2 + src/amf/namf-handler.c | 149 +- src/amf/namf-handler.h | 4 + src/amf/nausf-build.c | 7 + tests/app/app-init.c | 5 +- tests/common/application.c | 9 +- tests/common/application.h | 3 + tests/common/context.c | 15 +- tests/common/context.h | 2 + tests/common/sctp.c | 25 +- tests/common/sctp.h | 2 +- tests/handover/5gc-n2-test.c | 20 +- tests/handover/5gc-xn-test.c | 4 +- tests/meson.build | 1 + tests/registration/auth-test.c | 4 +- tests/registration/crash-test.c | 10 +- tests/registration/dereg-test.c | 12 +- tests/registration/ecc-test.c | 8 +- tests/registration/gmm-status-test.c | 2 +- tests/registration/guti-test.c | 10 +- tests/registration/identity-test.c | 4 +- tests/registration/idle-test.c | 12 +- tests/registration/multi-ue-test.c | 2 +- tests/registration/reset-test.c | 6 +- tests/registration/simple-test.c | 2 +- tests/registration/ue-context-test.c | 10 +- tests/slice/different-dnn-test.c | 2 +- tests/slice/paging-test.c | 18 +- tests/slice/same-dnn-test.c | 4 +- tests/transfer/abts-main.c | 8 - tests/transfer/ue-context-transfer-test.c | 3117 +++++++++++++++++++++ tests/vonr/af-test.c | 16 +- tests/vonr/qos-flow-test.c | 4 +- tests/vonr/session-test.c | 14 +- tests/vonr/simple-test.c | 2 +- tests/vonr/video-test.c | 2 +- 49 files changed, 3823 insertions(+), 169 deletions(-) create mode 100644 tests/transfer/ue-context-transfer-test.c diff --git a/configs/meson.build b/configs/meson.build index 570b49542a..dd31e810e9 100644 --- a/configs/meson.build +++ b/configs/meson.build @@ -39,6 +39,7 @@ example_conf = ''' slice.yaml srsenb.yaml non3gpp.yaml + transfer.yaml '''.split() foreach file : example_conf diff --git a/configs/sample.yaml.in b/configs/sample.yaml.in index 8b9734ac10..12f3f68594 100644 --- a/configs/sample.yaml.in +++ b/configs/sample.yaml.in @@ -189,50 +189,6 @@ amf: t3512: value: 540 # 9 mintues * 60 = 540 seconds -# amf #2 -amf: - sbi: - server: - - address: 127.0.0.50 - port: 7777 - client: - scp: - - uri: http://127.0.0.200:7777 - ngap: - server: - - address: 127.0.0.50 - metrics: - server: - - address: 127.0.0.50 - port: 9090 - guami: - - plmn_id: - mcc: 999 - mnc: 70 - amf_id: - region: 2 - set: 1 - tai: - - plmn_id: - mcc: 999 - mnc: 70 - tac: 1 - plmn_support: - - plmn_id: - mcc: 999 - mnc: 70 - s_nssai: - - sst: 1 - security: - integrity_order : [ NIA2, NIA1, NIA0 ] - ciphering_order : [ NEA0, NEA1, NEA2 ] - network_name: - full: Open5GS - amf_name: open5gs-amf1 - time: - t3512: - value: 540 # 9 mintues * 60 = 540 seconds - sgwu: pfcp: server: diff --git a/configs/transfer.yaml.in b/configs/transfer.yaml.in index 56336d534e..f185e9633e 100644 --- a/configs/transfer.yaml.in +++ b/configs/transfer.yaml.in @@ -28,6 +28,70 @@ global: no_pcrf: true no_hss: true +mme: + freeDiameter: + identity: mme.localdomain + realm: localdomain + listen_on: 127.0.0.2 + no_fwd: true + load_extension: + - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx + conf: 0x8888 + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx + - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx + connect: + - identity: hss.localdomain + address: 127.0.0.8 + + s1ap: + server: + - address: 127.0.0.2 + gtpc: + server: + - address: 127.0.0.2 + client: + sgwc: + - address: 127.0.0.3 + smf: + - address: 127.0.0.4 + metrics: + server: + - address: 127.0.0.2 + port: 9090 + gummei: + - plmn_id: + mcc: 999 + mnc: 70 + mme_gid: 2 + mme_code: 1 + tai: + - plmn_id: + mcc: 999 + mnc: 70 + tac: 1 + security: + integrity_order : [ EIA2, EIA1, EIA0 ] + ciphering_order : [ EEA0, EEA1, EEA2 ] + network_name: + full: Open5GS + time: + t3412: + value: 540 + +sgwc: + gtpc: + server: + - address: 127.0.0.3 + pfcp: + server: + - address: 127.0.0.3 + client: + sgwu: + - address: 127.0.0.6 smf: sbi: diff --git a/lib/app/ogs-app.h b/lib/app/ogs-app.h index 87b10862ed..dbe2fecb4b 100644 --- a/lib/app/ogs-app.h +++ b/lib/app/ogs-app.h @@ -41,6 +41,7 @@ extern "C" { #endif int app_initialize(const char *const argv[]); +int app_initialize_transfer(const char *const argv[]); void app_terminate(void); int mme_initialize(void); diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 63488c4509..20b2b540e7 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -193,6 +193,10 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message) OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData); if (message->UeContextTransferRspData) OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData); + if (message->UeRegStatusUpdateReqData) + OpenAPI_ue_reg_status_update_req_data_free(message->UeRegStatusUpdateReqData); + if (message->UeRegStatusUpdateRspData) + OpenAPI_ue_reg_status_update_rsp_data_free(message->UeRegStatusUpdateRspData); /* HTTP Part */ for (i = 0; i < message->num_of_part; i++) { @@ -1372,6 +1376,14 @@ static char *build_json(ogs_sbi_message_t *message) item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON( message->UeContextTransferRspData); ogs_assert(item); + } else if (message->UeRegStatusUpdateReqData) { + item = OpenAPI_ue_reg_status_update_req_data_convertToJSON( + message->UeRegStatusUpdateReqData); + ogs_assert(item); + } else if (message->UeRegStatusUpdateRspData) { + item = OpenAPI_ue_reg_status_update_rsp_data_convertToJSON( + message->UeRegStatusUpdateRspData); + ogs_assert(item); } if (item) { @@ -2135,6 +2147,27 @@ static int parse_json(ogs_sbi_message_t *message, } break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (message->res_status == 0) { + message->UeRegStatusUpdateReqData = + OpenAPI_ue_reg_status_update_req_data_parseFromJSON(item); + if (!message->UeRegStatusUpdateReqData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) { + message->UeRegStatusUpdateRspData = + OpenAPI_ue_reg_status_update_rsp_data_parseFromJSON(item); + if (!message->UeRegStatusUpdateRspData) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else { + ogs_error("HTTP ERROR Status : %d", + message->res_status); + } + break; + DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name [%s]", diff --git a/lib/sbi/message.h b/lib/sbi/message.h index c27bce6d62..c41d01e8a9 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -125,6 +125,7 @@ extern "C" { #define OGS_SBI_RESOURCE_NAME_UE_CONTEXTS "ue-contexts" #define OGS_SBI_RESOURCE_NAME_N1_N2_MESSAGES "n1-n2-messages" #define OGS_SBI_RESOURCE_NAME_TRANSFER "transfer" +#define OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE "transfer-update" #define OGS_SBI_RESOURCE_NAME_SM_CONTEXT_STATUS "sm-context-status" #define OGS_SBI_RESOURCE_NAME_AM_POLICY_NOTIFY "am-policy-notify" @@ -558,6 +559,8 @@ typedef struct ogs_sbi_message_s { OpenAPI_sec_negotiate_rsp_data_t *SecNegotiateRspData; OpenAPI_ue_context_transfer_req_data_t *UeContextTransferReqData; OpenAPI_ue_context_transfer_rsp_data_t *UeContextTransferRspData; + OpenAPI_ue_reg_status_update_req_data_t *UeRegStatusUpdateReqData; + OpenAPI_ue_reg_status_update_rsp_data_t *UeRegStatusUpdateRspData; ogs_sbi_links_t *links; diff --git a/lib/sbi/ogs-sbi.h b/lib/sbi/ogs-sbi.h index 23cc63e798..14adc28c38 100644 --- a/lib/sbi/ogs-sbi.h +++ b/lib/sbi/ogs-sbi.h @@ -86,6 +86,8 @@ #include "model/ue_authentication_ctx.h" #include "model/ue_context_transfer_req_data.h" #include "model/ue_context_transfer_rsp_data.h" +#include "model/ue_reg_status_update_req_data.h" +#include "model/ue_reg_status_update_rsp_data.h" #include "custom/links.h" diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 16612f329e..f3b0a421d4 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -209,6 +209,23 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + SWITCH(sbi_message.h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + amf_namf_comm_handle_registration_status_update_request( + stream, &sbi_message); + break; + DEFAULT + ogs_error("Invalid HTTP method [%s]", + sbi_message.h.method); + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_FORBIDDEN, &sbi_message, + "Invalid HTTP method", sbi_message.h.method, + NULL)); + END + break; + DEFAULT ogs_error("Invalid resource name [%s]", sbi_message.h.resource.component[2]); diff --git a/src/amf/context.c b/src/amf/context.c index ca6c7ba195..8de96f3cb0 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1511,7 +1511,7 @@ void amf_ue_confirm_guti(amf_ue_t *amf_ue) * by performing the generic UE configuration update procedure. */ - /* Copying from Current to Next Guti */ + /* Copying from Next to Current Guti */ amf_ue->current.m_tmsi = amf_ue->next.m_tmsi; memcpy(&amf_ue->current.guti, &amf_ue->next.guti, sizeof(ogs_nas_5gs_guti_t)); @@ -1624,6 +1624,7 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue) OGS_SBI_NPCF_AM_POLICY_CONTROL_UE_AMBR_AUTHORIZATION); amf_ue->rat_restrictions = OpenAPI_list_create(); + amf_ue->to_release_session_list = OpenAPI_list_create(); ogs_list_init(&amf_ue->sess_list); @@ -1663,6 +1664,7 @@ void amf_ue_remove(amf_ue_t *amf_ue) AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); OpenAPI_list_free(amf_ue->rat_restrictions); + OpenAPI_list_free(amf_ue->to_release_session_list); /* Remove all session context */ amf_sess_remove_all(amf_ue); @@ -3024,3 +3026,34 @@ bool amf_ue_is_rat_restricted(amf_ue_t *amf_ue) } return false; } + +void amf_ue_save_to_release_session_list(amf_ue_t *amf_ue) +{ + amf_sess_t *sess = NULL; + + OpenAPI_list_clear(amf_ue->to_release_session_list); + + ogs_list_for_each(&amf_ue->sess_list, sess) { + bool supported_s_nssai = false; + int i; + for (i = 0; i < amf_self()->num_of_plmn_support; i++) { + int j; + for (j = 0; j < amf_self()->plmn_support[i].num_of_s_nssai; j++) { + if (memcmp(&sess->s_nssai, + &amf_self()->plmn_support[i].s_nssai[j], + sizeof(ogs_s_nssai_t)) == 0) { + supported_s_nssai = true; + break; + } + } + if (supported_s_nssai) + break; + } + if (!supported_s_nssai) { + double *psi = ogs_calloc(1, sizeof(*psi)); + ogs_assert(psi); + *psi = (double)sess->psi; + OpenAPI_list_add(amf_ue->to_release_session_list, psi); + } + } +} diff --git a/src/amf/context.h b/src/amf/context.h index a70063e4c8..1ce8d84459 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -259,6 +259,8 @@ struct amf_ue_s { /* UE identity */ #define AMF_UE_HAVE_SUCI(__aMF) \ ((__aMF) && ((__aMF)->suci)) +#define AMF_UE_HAVE_SUPI(__aMF) \ + ((__aMF) && ((__aMF)->supi)) char *suci; /* TS33.501 : SUCI */ char *supi; /* TS33.501 : SUPI */ ogs_nas_5gs_mobile_identity_suci_t nas_mobile_identity_suci; @@ -280,7 +282,11 @@ struct amf_ue_s { ogs_nas_5gs_guti_t guti; } current, next; + /* UE context transfer and Registration status update */ ogs_nas_5gs_guti_t old_guti; + OpenAPI_ue_context_transfer_status_e transfer_status; + bool send_registration_status_update; + OpenAPI_list_t *to_release_session_list; /* UE Info */ ogs_guami_t *guami; @@ -996,6 +1002,7 @@ void amf_clear_subscribed_info(amf_ue_t *amf_ue); bool amf_update_allowed_nssai(amf_ue_t *amf_ue); bool amf_ue_is_rat_restricted(amf_ue_t *amf_ue); int amf_instance_get_load(void); +void amf_ue_save_to_release_session_list(amf_ue_t *amf_ue); #ifdef __cplusplus } diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 44a9caed39..8cc32a56e5 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -554,6 +554,10 @@ bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, ogs_assert(amf_ue); ogs_assert(registration_request); + + if (&registration_request->mobile_identity == NULL) + return false; + mobile_identity = &registration_request->mobile_identity; mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; @@ -1648,3 +1652,11 @@ static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id) return OGS_5GMM_CAUSE_PLMN_NOT_ALLOWED; } + +int amf_namf_comm_handle_registration_status_update_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) { + + /* Nothing to do */ + + return OGS_OK; +} diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 0aefc8bef6..763ace269e 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -563,14 +563,13 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) amf_ue->suci, sbi_message->res_status); } - if (r != OGS_OK) { - if (!AMF_UE_HAVE_SUCI(amf_ue)) { - CLEAR_AMF_UE_TIMER(amf_ue->t3570); - r = nas_5gs_send_identity_request(amf_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - } + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(amf_ue))) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; } xact_count = amf_sess_xact_count(amf_ue); @@ -1251,6 +1250,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (gmm_registration_request_from_old_amf(amf_ue, &nas_message->gmm.registration_request) == true) { + /* Send UE context transfer to old AMF */ ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_guami_t guami; @@ -1274,6 +1274,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, amf_ue, state, nas_message); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + amf_ue->send_registration_status_update = true; break; } @@ -1918,6 +1919,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) ran_ue_t *ran_ue = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); ogs_assert(e); @@ -1998,6 +2000,38 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) break; } + if (amf_ue->send_registration_status_update == true) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; + int state = e->h.sbi.state; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + memcpy(&guami.plmn_id, &amf_ue->home_plmn_id, + sizeof(ogs_plmn_id_t)); + memcpy(&guami.amf_id, &amf_ue->old_guti.amf_id, + sizeof(ogs_amf_id_t)); + + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); + amf_ue->transfer_status = + OpenAPI_ue_context_transfer_status_TRANSFERRED; + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_registration_status_update, + amf_ue, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + amf_ue->send_registration_status_update = false; + break; + } + ogs_kdf_kgnb_and_kn3iwf( amf_ue->kamf, amf_ue->ul_count.i32, amf_ue->nas.access_type, amf_ue->kgnb); @@ -2078,6 +2112,68 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) break; } break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + } + r = amf_namf_comm_handle_registration_status_update_response(sbi_message, amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + /* Continue with registration */ + ogs_kdf_kgnb_and_kn3iwf( + amf_ue->kamf, amf_ue->ul_count.i32, + amf_ue->nas.access_type, amf_ue->kgnb); + ogs_kdf_nh_gnb(amf_ue->kamf, amf_ue->kgnb, amf_ue->nh); + amf_ue->nhcc = 1; + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + amf_nudm_uecm_build_registration, amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + if (amf_ue->nas.message_type == OGS_NAS_5GS_REGISTRATION_REQUEST) { + OGS_FSM_TRAN(s, &gmm_state_initial_context_setup); + } else if (amf_ue->nas.message_type == + OGS_NAS_5GS_SERVICE_REQUEST) { + OGS_FSM_TRAN(s, &gmm_state_registered); + } else { + ogs_fatal("Invalid OGS_NAS_5GS[%d]", amf_ue->nas.message_type); + ogs_assert_if_reached(); + } + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid service name [%s]", sbi_message->h.service.name); + ogs_assert_if_reached(); + END + break; + case AMF_EVENT_5GMM_TIMER: switch (e->h.timer_id) { case AMF_TIMER_T3560: @@ -2508,6 +2604,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) ran_ue_t *ran_ue = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_sbi_message_t *sbi_message = NULL; ogs_assert(s); ogs_assert(e); @@ -2530,6 +2627,38 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); CLEAR_AMF_UE_ALL_TIMERS(amf_ue); + if (amf_ue->send_registration_status_update == true) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ + ogs_sbi_discovery_option_t *discovery_option = NULL; + ogs_guami_t guami; + int state = e->h.sbi.state; + + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + + memcpy(&guami.plmn_id, &amf_ue->home_plmn_id, + sizeof(ogs_plmn_id_t)); + memcpy(&guami.amf_id, &amf_ue->old_guti.amf_id, + sizeof(ogs_amf_id_t)); + + ogs_sbi_discovery_option_set_guami(discovery_option, &guami); + amf_ue->transfer_status = + OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED; + + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, + amf_namf_comm_build_registration_status_update, + amf_ue, state, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + amf_ue->send_registration_status_update = false; + break; + } + xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( @@ -2667,6 +2796,63 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) ogs_error("Unknown message [%d]", nas_message->gmm.h.message_type); } break; + case OGS_EVENT_SBI_CLIENT: + sbi_message = e->h.sbi.message; + ogs_assert(sbi_message); + + ran_ue_t *ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + ogs_assert(ran_ue); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + } + r = amf_namf_comm_handle_registration_status_update_response(sbi_message, amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + + /* Continue with release command */ + xact_count = amf_sess_xact_count(amf_ue); + amf_sbi_send_release_all_sessions( + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = ngap_send_ran_ue_context_release_command( + ran_ue_find_by_id(amf_ue->ran_ue_id), + NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release, + NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid service name [%s]", sbi_message->h.service.name); + ogs_assert_if_reached(); + + END + break; default: ogs_error("Unknown event[%s]", amf_event_get_name(e)); diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c index ca6c46c9d8..6fcea6f1cf 100644 --- a/src/amf/namf-build.c +++ b/src/amf/namf-build.c @@ -31,7 +31,6 @@ static char* ogs_guti_to_string(ogs_nas_5gs_guti_t *nas_guti) memset(&plmn_id, 0, sizeof(plmn_id)); ogs_nas_to_plmn_id(&plmn_id, &nas_guti->nas_plmn_id); - amf_id = ogs_amf_id_to_string(&nas_guti->amf_id); tmsi = ogs_uint32_to_0string(nas_guti->m_tmsi); @@ -98,3 +97,56 @@ ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( return request; } + +ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( + amf_ue_t *amf_ue, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + OpenAPI_ue_reg_status_update_req_data_t UeRegStatusUpdateReqData; + char *ue_context_id = NULL; + + ogs_assert(amf_ue); + + ue_context_id = ogs_guti_to_string(&amf_ue->old_guti); + ogs_assert(ue_context_id); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NAMF_COMM; + message.h.api.version = (char *)OGS_SBI_API_V1; + message.h.resource.component[0] = + (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXTS; + message.h.resource.component[1] = ue_context_id; + message.h.resource.component[2] = + (char *)OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE; + message.UeRegStatusUpdateReqData = &UeRegStatusUpdateReqData; + + memset(&UeRegStatusUpdateReqData, 0, sizeof(UeRegStatusUpdateReqData)); + + UeRegStatusUpdateReqData.transfer_status = amf_ue->transfer_status; + /* + * TS 29.518 + * 5.2.2.2.2 Registration Status Update + * If any network slice(s) become no longer available and there are PDU + * Session(s) associated with them, the target AMF shall include these + * PDU session(s) in the toReleaseSessionList attribute in the payload. + */ + if (amf_ue->transfer_status == + OpenAPI_ue_context_transfer_status_TRANSFERRED && + amf_ue->to_release_session_list->count) { + UeRegStatusUpdateReqData.to_release_session_list = + amf_ue->to_release_session_list; + } + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + if (ue_context_id) + ogs_free(ue_context_id); + + OpenAPI_list_clear(amf_ue->to_release_session_list); + + return request; +} diff --git a/src/amf/namf-build.h b/src/amf/namf-build.h index 92cd716dcc..3f6aa8d7db 100644 --- a/src/amf/namf-build.h +++ b/src/amf/namf-build.h @@ -28,6 +28,8 @@ extern "C" { ogs_sbi_request_t *amf_namf_comm_build_ue_context_transfer( amf_ue_t *amf_ue, void *data); +ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( + amf_ue_t *amf_ue, void *data); #ifdef __cplusplus } diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index 07174dd647..c944234c3d 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1093,7 +1093,6 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_sbi_response_t *response = NULL; ogs_sbi_message_t sendmsg; amf_ue_t *amf_ue = NULL; - ran_ue_t *ran_ue = NULL; OpenAPI_ambr_t *UeAmbr = NULL; OpenAPI_list_t *MmContextList = NULL; @@ -1137,7 +1136,7 @@ int amf_namf_comm_handle_ue_context_transfer_request( amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); if (!amf_ue) { status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("CONTEXT_NOT_FOUND"); + strerror = ogs_msprintf("Context not found"); goto cleanup; } @@ -1212,7 +1211,11 @@ int amf_namf_comm_handle_ue_context_transfer_request( if (recvmsg->UeContextTransferReqData->reason == OpenAPI_transfer_reason_MOBI_REG) { SessionContextList = - amf_namf_comm_encode_ue_session_context_list(amf_ue); + amf_namf_comm_encode_ue_session_context_list(amf_ue); + if (SessionContextList->count == 0) { + OpenAPI_list_free(SessionContextList); + SessionContextList = NULL; + } UeContext.session_context_list = SessionContextList; } @@ -1245,13 +1248,19 @@ int amf_namf_comm_handle_ue_context_transfer_request( } /* - * Context TRANSFERRED !!! - * So, we removed UE context. + * Ue context is transfered, but we must keep the UE context until the + * registartion status update is received. + * + * TS 23.502 + * 4.2.2.2.2 General Registration + * + * 10. [Conditional] new AMF to old AMF: Namf_Communication_RegistrationStatusUpdate + * (PDU Session ID(s) to be released due to slice not supported). + * If the authentication/security procedure fails, then the Registration shall be + * rejected and the new AMF invokes the Namf_Communication_RegistrationStatusUpdate + * service operation with a reject indication towards the old AMF. The old AMF continues + * as if the UE context transfer service operation was never received. */ - ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); - if (ran_ue) - ran_ue_remove(ran_ue); - amf_ue_remove(amf_ue); return OGS_OK; @@ -1352,10 +1361,13 @@ int amf_namf_comm_handle_ue_context_transfer_response( amf_namf_comm_decode_ue_mm_context_list( amf_ue, UeContext->mm_context_list); - if (UeContext->session_context_list) + if (UeContext->session_context_list) { amf_namf_comm_decode_ue_session_context_list( amf_ue, UeContext->session_context_list); - + /* Save a list of sessions to be released on old AMF */ + if (UeContext->mm_context_list) + amf_ue_save_to_release_session_list(amf_ue); + } /* TODO ueRadioCapability */ return OGS_OK; @@ -1802,3 +1814,118 @@ static void amf_namf_comm_decode_ue_session_context_list( ogs_sbi_header_free(&header); } } + +int amf_namf_comm_handle_registration_status_update_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { + + ogs_sbi_response_t *response = NULL; + ogs_sbi_message_t sendmsg; + amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; + amf_sess_t *sess = NULL; + + OpenAPI_ue_reg_status_update_req_data_t *UeRegStatusUpdateReqData = + recvmsg->UeRegStatusUpdateReqData; + OpenAPI_ue_reg_status_update_rsp_data_t UeRegStatusUpdateRspData; + + int status = 0; + char *strerror = NULL; + char *ue_context_id = NULL; + + ogs_assert(stream); + ogs_assert(recvmsg); + + ue_context_id = recvmsg->h.resource.component[1]; + + if (!ue_context_id) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("No UE context ID"); + goto cleanup; + } + amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + if (!amf_ue) { + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + strerror = ogs_msprintf("Context not found"); + goto cleanup; + } + + memset(&UeRegStatusUpdateRspData, 0, sizeof(UeRegStatusUpdateRspData)); + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.UeRegStatusUpdateRspData = &UeRegStatusUpdateRspData; + + if (UeRegStatusUpdateReqData->transfer_status == + OpenAPI_ue_context_transfer_status_TRANSFERRED) { + /* + * TS 29.518 + * 5.2.2.2.2 Registration Status Update + * Once the update is received, the source AMF shall: + * - remove the individual ueContext resource and release any PDU session(s) in the + * toReleaseSessionList attribute, if the transferStatus attribute included in the + * POST request body is set to "TRANSFERRED" and if the source AMF transferred the + * complete UE Context including all MM contexts and PDU Session Contexts. + */ + UeRegStatusUpdateRspData.reg_status_transfer_complete = 1; + + ran_ue = ran_ue_find_by_id(amf_ue->ran_ue_id); + + if (ran_ue) { + if (UeRegStatusUpdateReqData->to_release_session_list) { + OpenAPI_lnode_t *node = NULL; + OpenAPI_list_for_each(UeRegStatusUpdateReqData->to_release_session_list, node) { + /* A double must be read */ + uint8_t psi = *(double *)node->data; + sess = amf_sess_find_by_psi(amf_ue, psi); + if (SESSION_CONTEXT_IN_SMF(sess)) { + amf_sbi_send_release_session(ran_ue, sess, AMF_RELEASE_SM_CONTEXT_NO_STATE); + } else { + ogs_error("[%s] No Session Context PSI[%d]", + amf_ue->supi, psi); + UeRegStatusUpdateRspData.reg_status_transfer_complete = 0; + } + } + } + } + + /* Clear UE context */ + CLEAR_NG_CONTEXT(amf_ue); + AMF_UE_CLEAR_PAGING_INFO(amf_ue); + AMF_UE_CLEAR_N2_TRANSFER(amf_ue, pdu_session_resource_setup_request); + AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); + CLEAR_AMF_UE_ALL_TIMERS(amf_ue); + OGS_ASN_CLEAR_DATA(&amf_ue->ueRadioCapability); + + } else if (UeRegStatusUpdateReqData->transfer_status == + OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED) { + /* + * TS 23.502 + * 4.2.2.2.2 + * If the authentication/security procedure fails, then the Registration shall be rejected and + * the new AMF invokes the Namf_Communication_RegistrationStatusUpdate service operation with + * a reject indication towards the old AMF. The old AMF continues as if the UE context transfer + * service operation was never received. + */ + UeRegStatusUpdateRspData.reg_status_transfer_complete = 0; + + } else { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("Transfer status not supported: [%d]", + UeRegStatusUpdateReqData->transfer_status); + goto cleanup; + } + + status = OGS_SBI_HTTP_STATUS_OK; + response = ogs_sbi_build_response(&sendmsg, status); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + return OGS_OK; + +cleanup: + ogs_assert(strerror); + ogs_error("%s", strerror); + + ogs_assert(true == ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); + ogs_free(strerror); + + return OGS_ERROR; +} diff --git a/src/amf/namf-handler.h b/src/amf/namf-handler.h index 19bcd203ce..d5fd1c7200 100644 --- a/src/amf/namf-handler.h +++ b/src/amf/namf-handler.h @@ -38,6 +38,10 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); int amf_namf_comm_handle_ue_context_transfer_response( ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue); +int amf_namf_comm_handle_registration_status_update_request( + ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg); +int amf_namf_comm_handle_registration_status_update_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue); #ifdef __cplusplus } diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index 5330744bc9..4b4481cba6 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -45,6 +45,13 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate( OGS_SBI_CONTENT_PROBLEM_TYPE); memset(&AuthenticationInfo, 0, sizeof(AuthenticationInfo)); + ogs_assert(amf_ue->suci || amf_ue->supi); + + if (amf_ue->suci) { + AuthenticationInfo.supi_or_suci = amf_ue->suci; + } else { + AuthenticationInfo.supi_or_suci = amf_ue->supi; + } if (amf_ue->suci) AuthenticationInfo.supi_or_suci = amf_ue->suci; diff --git a/tests/app/app-init.c b/tests/app/app-init.c index a23b031717..70108e9981 100644 --- a/tests/app/app-init.c +++ b/tests/app/app-init.c @@ -36,6 +36,7 @@ static ogs_thread_t *pcf_thread = NULL; static ogs_thread_t *nssf_thread = NULL; static ogs_thread_t *bsf_thread = NULL; static ogs_thread_t *udr_thread = NULL; +static ogs_thread_t *old_amf_thread = NULL; int app_initialize(const char *const argv[]) { @@ -103,7 +104,7 @@ int app_initialize(const char *const argv[]) */ ogs_msleep(5000); - return OGS_OK;; + return OGS_OK; } void app_terminate(void) @@ -130,6 +131,8 @@ void app_terminate(void) if (sepp_thread) ogs_thread_destroy(sepp_thread); if (scp_thread) ogs_thread_destroy(scp_thread); if (nrf_thread) ogs_thread_destroy(nrf_thread); + + if (old_amf_thread) ogs_thread_destroy(old_amf_thread); } void test_app_init(void) diff --git a/tests/common/application.c b/tests/common/application.c index 4ef3a0a002..e05d7ca956 100644 --- a/tests/common/application.c +++ b/tests/common/application.c @@ -77,7 +77,7 @@ void test_app_run(int argc, const char *const argv[], ogs_assert(rv == OGS_OK); } -#define MAX_CHILD_PROCESS 16 +#define MAX_CHILD_PROCESS 17 #define OGS_ARG_MAX 256 static ogs_proc_t process[MAX_CHILD_PROCESS]; @@ -92,6 +92,12 @@ static void child_main(void *data) int ret = 0, out_return_code = 0; current = &process[process_num++]; + + if (process_num > MAX_CHILD_PROCESS) { + ogs_fatal("Process limit reached"); + ogs_assert_if_reached(); + } + ret = ogs_proc_create(commandLine, ogs_proc_option_combined_stdout_stderr| ogs_proc_option_inherit_environment, @@ -132,6 +138,7 @@ ogs_thread_t *test_child_create(const char *name, const char *const argv[]) commandLine[0] = command; child = ogs_thread_create(child_main, commandLine); + ogs_msleep(50); return child; diff --git a/tests/common/application.h b/tests/common/application.h index 2d8502ea63..f4164e6e5e 100644 --- a/tests/common/application.h +++ b/tests/common/application.h @@ -30,8 +30,11 @@ extern "C" { void test_app_run(int argc, const char *const argv[], const char *name, void (*init)(const char * const argv[])); +void test_app_run_transfer(int argc, const char *const argv[], + const char *name, void (*init)(const char * const argv[])); void test_child_terminate(void); ogs_thread_t *test_child_create(const char *name, const char *const argv[]); +ogs_thread_t *test_child_create_old_amf(const char *name, const char *const argv[]); #ifdef __cplusplus } diff --git a/tests/common/context.c b/tests/common/context.c index 8bae36a72d..8307c212ca 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -104,9 +104,19 @@ static int test_context_validation(void) if (snode) test_self()->s1ap_addr6 = snode->addr; snode = ogs_list_first(&test_self()->ngap_list); - if (snode) test_self()->ngap_addr = snode->addr; + + if (snode) { + test_self()->ngap_addr = snode->addr; + snode = ogs_list_next(snode); + } + if (snode) test_self()->ngap2_addr = snode->addr; + snode = ogs_list_first(&test_self()->ngap_list6); - if (snode) test_self()->ngap_addr6 = snode->addr; + if (snode) { + test_self()->ngap_addr6 = snode->addr; + snode = ogs_list_next(snode); + } + if (snode) test_self()->ngap2_addr6 = snode->addr; if (test_self()->e_served_tai[index].list2.num) { memcpy(&test_self()->e_tai, @@ -175,6 +185,7 @@ int test_context_parse_config(void) while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); ogs_assert(root_key); + if (!strcmp(root_key, "amf")) { ogs_yaml_iter_t amf_iter; ogs_yaml_iter_recurse(&root_iter, &amf_iter); diff --git a/tests/common/context.h b/tests/common/context.h index 8befe4e129..4fc63cf806 100644 --- a/tests/common/context.h +++ b/tests/common/context.h @@ -48,7 +48,9 @@ typedef struct test_context_s { ogs_list_t ngap_list; /* AMF NGAP IPv4 Server List */ ogs_list_t ngap_list6; /* AMF NGAP IPv6 Server List */ ogs_sockaddr_t *ngap_addr; /* AMF NGAP IPv4 Address */ + ogs_sockaddr_t *ngap2_addr; /* OLD AMF NGAP IPv4 Address */ ogs_sockaddr_t *ngap_addr6; /* AMF NGAP IPv6 Address */ + ogs_sockaddr_t *ngap2_addr6; /* OLD AMF NGAP IPv6 Address */ uint16_t s1ap_port; /* Default S1AP Port */ ogs_list_t s1ap_list; /* MME S1AP IPv4 Server List */ diff --git a/tests/common/sctp.c b/tests/common/sctp.c index 658f4966ba..a08bcca7ca 100644 --- a/tests/common/sctp.c +++ b/tests/common/sctp.c @@ -91,19 +91,30 @@ ogs_socknode_t *tests1ap_client(int family) return node; } -ogs_socknode_t *testngap_client(int family) +ogs_socknode_t *testngap_client(int index, int family) { int rv; ogs_sockaddr_t *addr = NULL; ogs_socknode_t *node = NULL; ogs_sock_t *sock = NULL; - if (family == AF_INET6) - ogs_assert(OGS_OK == - ogs_copyaddrinfo(&addr, test_self()->ngap_addr6)); - else - ogs_assert(OGS_OK == - ogs_copyaddrinfo(&addr, test_self()->ngap_addr)); + if (index == 1) { + if (family == AF_INET6) + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap_addr6)); + else + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap_addr)); + + } else if (index == 2) { + if (family == AF_INET6) + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap2_addr6)); + else + ogs_assert(OGS_OK == + ogs_copyaddrinfo(&addr, test_self()->ngap2_addr)); + } else + ogs_assert_if_reached(); ogs_assert(addr); diff --git a/tests/common/sctp.h b/tests/common/sctp.h index 01858030f3..e596bd86d3 100644 --- a/tests/common/sctp.h +++ b/tests/common/sctp.h @@ -29,7 +29,7 @@ extern ogs_sockaddr_t ogs_test_sctp_last_addr; ogs_socknode_t *testsctp_server(const char *ipstr, int port); ogs_socknode_t *testsctp_client(const char *ipstr, int port); ogs_socknode_t *tests1ap_client(int family); -ogs_socknode_t *testngap_client(int family); +ogs_socknode_t *testngap_client(int index, int family); int testsctp_send(ogs_socknode_t *node, ogs_pkbuf_t *pkbuf, int ppid, uint16_t stream_no, int type); diff --git a/tests/handover/5gc-n2-test.c b/tests/handover/5gc-n2-test.c index 0a59f98d71..8b7f4323c3 100644 --- a/tests/handover/5gc-n2-test.c +++ b/tests/handover/5gc-n2-test.c @@ -70,10 +70,10 @@ static void failure_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -501,10 +501,10 @@ static void direct_complete_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -1115,10 +1115,10 @@ static void direct_cancel_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -1529,10 +1529,10 @@ static void indirect_complete_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ @@ -2182,10 +2182,10 @@ static void indirect_cancel_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ diff --git a/tests/handover/5gc-xn-test.c b/tests/handover/5gc-xn-test.c index 1dcf35514a..330639e32b 100644 --- a/tests/handover/5gc-xn-test.c +++ b/tests/handover/5gc-xn-test.c @@ -70,10 +70,10 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* Two gNB connects to AMF */ - ngap1 = testngap_client(AF_INET); + ngap1 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap1); - ngap2 = testngap_client(AF_INET); + ngap2 = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap2); /* Two gNB connects to UPF */ diff --git a/tests/meson.build b/tests/meson.build index 60acfd4efd..3e084574a9 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -33,3 +33,4 @@ subdir('csfb') subdir('310014') subdir('handover') subdir('non3gpp') +subdir('transfer') diff --git a/tests/registration/auth-test.c b/tests/registration/auth-test.c index b131d42ddb..b359baa6e5 100644 --- a/tests/registration/auth-test.c +++ b/tests/registration/auth-test.c @@ -64,7 +64,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -254,7 +254,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/crash-test.c b/tests/registration/crash-test.c index 8c5871f457..c559f824db 100644 --- a/tests/registration/crash-test.c +++ b/tests/registration/crash-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -426,7 +426,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -787,7 +787,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1045,7 +1045,7 @@ static void test4_issues2842_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1409,7 +1409,7 @@ static void test5_func(abts_case *tc, void *data) ogs_pkbuf_t *recvbuf; ogs_ngap_message_t message; - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); sendbuf = testngap_build_ng_setup_request(0x4000, 22); diff --git a/tests/registration/dereg-test.c b/tests/registration/dereg-test.c index a12ec8474a..dc6e479a77 100644 --- a/tests/registration/dereg-test.c +++ b/tests/registration/dereg-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -306,7 +306,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -513,7 +513,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -963,7 +963,7 @@ static void test4_func(abts_case *tc, void *data) ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1254,7 +1254,7 @@ static void test5_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1630,7 +1630,7 @@ static void test6_issues2917_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/ecc-test.c b/tests/registration/ecc-test.c index e28e3bf99b..0afa96faf0 100644 --- a/tests/registration/ecc-test.c +++ b/tests/registration/ecc-test.c @@ -71,7 +71,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -276,7 +276,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -496,7 +496,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -702,7 +702,7 @@ static void test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/gmm-status-test.c b/tests/registration/gmm-status-test.c index dfffcc5552..7c8019e58a 100644 --- a/tests/registration/gmm-status-test.c +++ b/tests/registration/gmm-status-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index 54065d16c3..4f1b1e12e8 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -539,8 +539,8 @@ static void test2_func(abts_case *tc, void *data) test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; - /* gNB connects to AMF(default configuration) */ - ngap = testngap_client(AF_INET); + /* gNB connects to AMF */ + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -997,7 +997,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1269,7 +1269,7 @@ static void test4_issues2839_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index e80bb5836e..07d2e783e5 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -401,7 +401,7 @@ static void pull_3122_v270_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/idle-test.c b/tests/registration/idle-test.c index 0836c1714f..fad9dade36 100644 --- a/tests/registration/idle-test.c +++ b/tests/registration/idle-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -456,7 +456,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -699,7 +699,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1052,7 +1052,7 @@ static void test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1503,7 +1503,7 @@ static void test5_func(abts_case *tc, void *data) ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1857,7 +1857,7 @@ static void test6_func(abts_case *tc, void *data) ogs_assert(sess); /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/multi-ue-test.c b/tests/registration/multi-ue-test.c index 93968ef992..795e211390 100644 --- a/tests/registration/multi-ue-test.c +++ b/tests/registration/multi-ue-test.c @@ -42,7 +42,7 @@ static void test1_func(abts_case *tc, void *data) bson_t *doc = NULL; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/reset-test.c b/tests/registration/reset-test.c index 5247b56d67..aeab6ad5b2 100644 --- a/tests/registration/reset-test.c +++ b/tests/registration/reset-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -372,7 +372,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -632,7 +632,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/simple-test.c b/tests/registration/simple-test.c index 5acbcd5541..ea7aedcbab 100644 --- a/tests/registration/simple-test.c +++ b/tests/registration/simple-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/registration/ue-context-test.c b/tests/registration/ue-context-test.c index e20a112e08..03956cb6b9 100644 --- a/tests/registration/ue-context-test.c +++ b/tests/registration/ue-context-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -221,7 +221,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -534,7 +534,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -977,7 +977,7 @@ static void test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1347,7 +1347,7 @@ static void test5_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/slice/different-dnn-test.c b/tests/slice/different-dnn-test.c index b67abfb92f..0ccef73ff3 100644 --- a/tests/slice/different-dnn-test.c +++ b/tests/slice/different-dnn-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/slice/paging-test.c b/tests/slice/paging-test.c index 782b361f13..e810675eaf 100644 --- a/tests/slice/paging-test.c +++ b/tests/slice/paging-test.c @@ -65,7 +65,7 @@ static void cm_idle_paging_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -626,7 +626,7 @@ static void cm_connected_paging_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -980,7 +980,7 @@ static void cm_idle_error_indication_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1322,7 +1322,7 @@ static void cm_connected_error_indication_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1596,7 +1596,7 @@ static void cm_context_setup_is_not_established_error_indication_func( test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1953,7 +1953,7 @@ static void vonr_qos_flow_test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2350,7 +2350,7 @@ static void vonr_session_test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2841,7 +2841,7 @@ static void registration_ue_context_test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3234,7 +3234,7 @@ static void registration_idle_test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/slice/same-dnn-test.c b/tests/slice/same-dnn-test.c index 07d637fdae..64263bf6c2 100644 --- a/tests/slice/same-dnn-test.c +++ b/tests/slice/same-dnn-test.c @@ -65,7 +65,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -366,7 +366,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/transfer/abts-main.c b/tests/transfer/abts-main.c index 1dc1ae77b9..15162bd983 100644 --- a/tests/transfer/abts-main.c +++ b/tests/transfer/abts-main.c @@ -47,12 +47,7 @@ static void initialize(const char *const argv[]) ogs_assert(rv == OGS_OK); test_5gc_init(); -// matej uredi - -ogs_error("MAtej pred boštjanovo funkcijo"); - rv = app_initialize(argv); -// rv = app_initialize_transfer(argv); ogs_assert(rv == OGS_OK); } @@ -62,9 +57,6 @@ int main(int argc, const char *const argv[]) abts_suite *suite = NULL; atexit(terminate); - - // matej uredi - //test_app_run_transfer(argc, argv, "transfer.yaml", initialize); test_app_run(argc, argv, "transfer.yaml", initialize); for (i = 0; alltests[i].func; i++) diff --git a/tests/transfer/ue-context-transfer-test.c b/tests/transfer/ue-context-transfer-test.c new file mode 100644 index 0000000000..11feddae51 --- /dev/null +++ b/tests/transfer/ue-context-transfer-test.c @@ -0,0 +1,3117 @@ +/* + * Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-common.h" + +static void test1_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; /* ngap1 - Old AMF ; ngap2 - Target AMF */ + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, deregister, + * register to Target AMF with empty 5G GUTI, identity request and response, + * NO UE context transfer, NO Registration status update, + * PDU session establishment, session release, deregister */ + + #define NUM_OF_TEST_UE_1 1 + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue[NUM_OF_TEST_UE_1]; + test_ue_t *test_ue_target[NUM_OF_TEST_UE_1]; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Source gNB */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Target gNB */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output[i]); + ogs_assert(test_ue[i]); + + test_ue[i]->nr_cgi.cell_id = 0x40001; + + test_ue[i]->nas.registration.tsc = 0; + test_ue[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue[i]->nas.registration.follow_on_request = 1; + test_ue[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue[i]->ran_ue_ngap_id = test_ue[i-1]->ran_ue_ngap_id; + else + test_ue[i]->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue[i], doc)); + + /* Send Registration request */ + test_ue[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue[i]->registration_request_param.gmm_capability = 1; + test_ue[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue[i]->registration_request_param.requested_nssai = 1; + test_ue[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + /* Stay registered on Old AMF */ +#if 0 + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); +#endif + + ogs_msleep(100); + + /* Register to Target AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue_target[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_target[i]); + ogs_assert(test_ue_target[i]); + + test_ue_target[i]->nr_cgi.cell_id = 0x40000; + + test_ue_target[i]->nas.registration.tsc = 0; + test_ue_target[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_target[i]->nas.registration.follow_on_request = 1; + test_ue_target[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_target[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_target[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_target[i]->ran_ue_ngap_id = test_ue_target[i-1]->ran_ue_ngap_id; + else + test_ue_target[i]->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + // sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + sess = test_sess_add_by_dnn_and_psi(test_ue_target[i], "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_target[i], doc)); + + /* Send Registration request */ + test_ue_target[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_target[i]->registration_request_param.gmm_capability = 1; + test_ue_target[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue_target[i]->registration_request_param.requested_nssai = 1; + test_ue_target[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue_target[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_target[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_target[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue_target[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_target[i], 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_target[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_target[i])); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); + +} + +static void test2_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_1 1 + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, deregister, + * register to Target AMF with Old AMF's 5G GUTI, + * UE context transfer, Registration status update + * PDU session establishment, session release, deregister */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue[NUM_OF_TEST_UE_1]; + test_ue_t *test_ue_target[NUM_OF_TEST_UE_1]; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output[i]); + ogs_assert(test_ue[i]); + + test_ue[i]->nr_cgi.cell_id = 0x40001; + + test_ue[i]->nas.registration.tsc = 0; + test_ue[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue[i]->nas.registration.follow_on_request = 1; + test_ue[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue[i]->ran_ue_ngap_id = test_ue[i-1]->ran_ue_ngap_id; + else + test_ue[i]->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue[i], doc)); + + /* Send Registration request - with SUCI */ + // test_ue[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue[i]->registration_request_param.gmm_capability = 1; + test_ue[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue[i]->registration_request_param.requested_nssai = 1; + test_ue[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue_target[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_target[i]); + ogs_assert(test_ue_target[i]); + + test_ue_target[i]->nr_cgi.cell_id = 0x40000; + + test_ue_target[i]->nas.registration.tsc = 0; + test_ue_target[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_target[i]->nas.registration.follow_on_request = 1; + test_ue_target[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_target[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_target[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_target[i]->ran_ue_ngap_id = test_ue_target[i-1]->ran_ue_ngap_id; + else + test_ue_target[i]->ran_ue_ngap_id = 0; + + /* pdu_id == 6 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_target[i], "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_target[i], doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_target[i]->nas_5gs_guti = test_ue[i]->nas_5gs_guti; + + /* Send Registration request */ + test_ue_target[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_target[i]->registration_request_param.gmm_capability = 1; + test_ue_target[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue_target[i]->registration_request_param.requested_nssai = 1; + test_ue_target[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue_target[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_target[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_target[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue_target[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_target[i], 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_target[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_target[i])); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test23_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i,j; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_3 3 + + /* Test: same test as the previous one, now 3 UEs are registered, one after another */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue[NUM_OF_TEST_UE_3]; + test_ue_t *test_ue_target[NUM_OF_TEST_UE_3]; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + for (j = 0; j < 3; j++) { + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + const char *scheme_output[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output[i]); + ogs_assert(test_ue[i]); + + test_ue[i]->nr_cgi.cell_id = 0x40001; + + test_ue[i]->nas.registration.tsc = 0; + test_ue[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue[i]->nas.registration.follow_on_request = 1; + test_ue[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + if (i > 0) + test_ue[i]->ran_ue_ngap_id = test_ue[i-1]->ran_ue_ngap_id; + else + test_ue[i]->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue[i], doc)); + + /* Send Registration request - with SUCI */ + // test_ue[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue[i]->registration_request_param.gmm_capability = 1; + test_ue[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue[i]->registration_request_param.requested_nssai = 1; + test_ue[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + const char *scheme_output_target[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue_target[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_target[i]); + ogs_assert(test_ue_target[i]); + + test_ue_target[i]->nr_cgi.cell_id = 0x40000; + + test_ue_target[i]->nas.registration.tsc = 0; + test_ue_target[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_target[i]->nas.registration.follow_on_request = 1; + test_ue_target[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_target[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_target[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + if (i > 0) + test_ue_target[i]->ran_ue_ngap_id = test_ue_target[i-1]->ran_ue_ngap_id; + else + test_ue_target[i]->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_target[i], "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_target[i], doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_target[i]->nas_5gs_guti = test_ue[i]->nas_5gs_guti; + + /* Send Registration request */ + test_ue_target[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_target[i]->registration_request_param.gmm_capability = 1; + test_ue_target[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue_target[i]->registration_request_param.requested_nssai = 1; + test_ue_target[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue_target[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_target[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_target[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue_target[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_target[i], 6); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_target[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_target[i])); + } + + for (i = 0; i < NUM_OF_TEST_UE_3; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test3_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + /* Test: 1 UE, Old AMF, Target AMF, + * register to Old AMF, PDU session establishment, session release, (stay registered) + * register to Target AMF with Old AMF's 5G GUTI, + * UE context transfer, Registration status update + * PDU session establishment, session release, deregister */ + + #define NUM_OF_TEST_UE_1 1 + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue[NUM_OF_TEST_UE_1]; + test_ue_t *test_ue_target[NUM_OF_TEST_UE_1]; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output[i]); + ogs_assert(test_ue[i]); + + test_ue[i]->nr_cgi.cell_id = 0x40001; + + test_ue[i]->nas.registration.tsc = 0; + test_ue[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue[i]->nas.registration.follow_on_request = 1; + test_ue[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue[i]->ran_ue_ngap_id = test_ue[i-1]->ran_ue_ngap_id; + else + test_ue[i]->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue[i], doc)); + + /* Send Registration request - with SUCI */ + // test_ue[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue[i]->registration_request_param.gmm_capability = 1; + test_ue[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue[i]->registration_request_param.requested_nssai = 1; + test_ue[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + /* Stay registered on Old AMF, with active session ? + * - This scenario should be made with "Inter NG-RAN node N2 based handover" beforehand, + * but then the UE context transfer is skipped during the registartion + * TS 23.502, 4.9.1.3.3, step 12 + */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + +#if 0 + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); +#endif + + ogs_msleep(100); + + /* Register to Target AMF */ + + /* Make the same subscriber from scratch and give him the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue_target[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_target[i]); + ogs_assert(test_ue_target[i]); + + /* Different cell id */ + test_ue_target[i]->nr_cgi.cell_id = 0x40000; + + test_ue_target[i]->nas.registration.tsc = 0; + test_ue_target[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_target[i]->nas.registration.follow_on_request = 1; + /* Mobility registration update */ + test_ue_target[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; + + test_ue_target[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_target[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_target[i]->ran_ue_ngap_id = test_ue_target[i-1]->ran_ue_ngap_id; + else + test_ue_target[i]->ran_ue_ngap_id = 0; + + /* pdu_id == 5 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_target[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_target[i], doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_target[i]->nas_5gs_guti = test_ue[i]->nas_5gs_guti; + + /* Send Registration request */ + test_ue_target[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_target[i]->registration_request_param.gmm_capability = 1; + test_ue_target[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue_target[i]->registration_request_param.requested_nssai = 1; + test_ue_target[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue_target[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_target[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue_target[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue_target[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue_target[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue_target[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_target[i])); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +static void test4_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap1, *ngap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *recvbuf_target; + ogs_ngap_message_t message; + int i; + + uint8_t tmp[OGS_HUGE_LEN]; + char *_gtp_payload = "34ff0024" + "0000000100000085 010002004500001c 0c0b000040015a7a 0a2d00010a2d0002" + "00000964cd7c291f"; + + #define NUM_OF_TEST_UE_1 1 + + /* Test: 1 UE, Old AMF, Target AMF, register to Old AMF, register to Target AMF + * with Old AMF's 5G GUTI - AUTH FAIL, + * UE context transfer, Registration status update - NOT TRANSFERRED + * The old AMF continues + * as if the UE context transfer service operation was never received */ + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue[NUM_OF_TEST_UE_1]; + test_ue_t *test_ue_target[NUM_OF_TEST_UE_1]; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* First gNB connects to Target AMF */ + ngap2 = testngap_client(2, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap2); + + /* Second gNB connects to Old AMF */ + ngap1 = testngap_client(1, AF_INET); + ABTS_PTR_NOTNULL(tc, ngap1); + + /* Two gNB connects to UPF */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* NG-Setup Reqeust/Response for Target gNB - with Target AMF */ + sendbuf = testngap_build_ng_setup_request(0x4000, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* NG-Setup Reqeust/Response for Source gNB - with Old AMF */ + sendbuf = testngap_build_ng_setup_request(0x4001, 28); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf_target = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue, recvbuf_target); + + + /* Register to Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output[i]); + ogs_assert(test_ue[i]); + + test_ue[i]->nr_cgi.cell_id = 0x40001; + + test_ue[i]->nas.registration.tsc = 0; + test_ue[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue[i]->nas.registration.follow_on_request = 1; + test_ue[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue[i]->ran_ue_ngap_id = test_ue[i-1]->ran_ue_ngap_id; + else + test_ue[i]->ran_ue_ngap_id = 0; + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue[i], "internet", 5); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue[i], doc)); + + /* Send Registration request - with SUCI */ + // test_ue[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue[i]->registration_request_param.gmm_capability = 1; + test_ue[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue[i]->registration_request_param.requested_nssai = 1; + test_ue[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_response(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue[i], nasbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue[i]->ngap_procedure_code); + + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue[i], false); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + + sess->ul_nas_transport_param.request_type = + OGS_NAS_5GS_REQUEST_TYPE_INITIAL; + sess->ul_nas_transport_param.dnn = 1; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceSetup, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send PDU session release request */ + sess = test_sess_find_by_psi(test_ue[i], 5); + ogs_assert(sess); + + /* Send PDU Session release request */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive PDUSessionResourceReleaseCommand + + * DL NAS transport + + * PDU session release command */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_PDUSessionResourceRelease, + test_ue[i]->ngap_procedure_code); + + /* Send PDUSessionResourceReleaseResponse */ + sendbuf = testngap_build_pdu_session_resource_release_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UplinkNASTransport + + * UL NAS trasnport + + * PDU session resource release complete */ + sess->ul_nas_transport_param.request_type = 0; + sess->ul_nas_transport_param.dnn = 0; + sess->ul_nas_transport_param.s_nssai = 0; + + sess->pdu_session_establishment_param.ssc_mode = 0; + sess->pdu_session_establishment_param.epco = 0; + + gsmbuf = testgsm_build_pdu_session_release_complete(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /* Send De-registration request */ + gmmbuf = testgmm_build_de_registration_request(test_ue[i], 1, true, true); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + /* Register to Target AMF */ + + /* Make the same UE from scratch and give it the 5G GUTI from Old AMF */ + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + const char *scheme_output_target[] = { + "0000000001", + "0000000002", + "0000000003", + "0000000004", + "0000000005", + }; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue_target[i] = test_ue_add_by_suci( + &mobile_identity_suci, scheme_output_target[i]); + ogs_assert(test_ue_target[i]); + + test_ue_target[i]->nr_cgi.cell_id = 0x40000; + + test_ue_target[i]->nas.registration.tsc = 0; + test_ue_target[i]->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue_target[i]->nas.registration.follow_on_request = 1; + test_ue_target[i]->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue_target[i]->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue_target[i]->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + if (i > 0) + test_ue_target[i]->ran_ue_ngap_id = test_ue_target[i-1]->ran_ue_ngap_id; + else + test_ue_target[i]->ran_ue_ngap_id = 0; + + /* pdu_id == 6 */ + + /* Send PDU session establishment request */ + sess = test_sess_add_by_dnn_and_psi(test_ue_target[i], "internet", 6); + ogs_assert(sess); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue_target[i], doc)); + + /* Set the 5G GUTI to Old AMF's 5G GUTI */ + test_ue_target[i]->nas_5gs_guti = test_ue[i]->nas_5gs_guti; + + /* Send Registration request */ + test_ue_target[i]->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue_target[i]->registration_request_param.gmm_capability = 1; + test_ue_target[i]->registration_request_param.s1_ue_network_capability = 1; + test_ue_target[i]->registration_request_param.requested_nssai = 1; + test_ue_target[i]->registration_request_param.last_visited_registered_tai = 1; + test_ue_target[i]->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue_target[i], NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue_target[i], gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + +#if 0 + /* Receive Identity request */ + recvbuf_target = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf_target); + testngap_recv(test_ue_target[i], recvbuf_target); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); +#endif + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_target[i], recvbuf); + + /* Send Authentication failure - SYNCH failure */ + gmmbuf = testgmm_build_authentication_failure( + test_ue_target[i], OGS_5GMM_CAUSE_SYNCH_FAILURE, 0x11223344); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication request */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_target[i], recvbuf); + + /* Send Authentication failure - MAC failure */ + gmmbuf = testgmm_build_authentication_failure( + test_ue_target[i], OGS_5GMM_CAUSE_MAC_FAILURE, 0); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue_target[i], gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication reject */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_target[i], recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue_target[i], recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue_target[i]->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue_target[i]); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + } + + ogs_msleep(300); + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue_target[i])); + } + + for (i = 0; i < NUM_OF_TEST_UE_1; i++) { + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue[i])); + } + + /* Clear Test UE Context */ + test_ue_remove_all(); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu2); + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu1); + + /* gNB disonncect from Target AMF */ + testgnb_ngap_close(ngap2); + /* gNB disonncect from Old AMF */ + testgnb_ngap_close(ngap1); +} + +abts_suite *test_ue_context_transfer(abts_suite *suite) +{ + suite = ADD_SUITE(suite) + + abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, test2_func, NULL); + abts_run_test(suite, test23_func, NULL); + abts_run_test(suite, test3_func, NULL); + abts_run_test(suite, test4_func, NULL); + + return suite; +} diff --git a/tests/vonr/af-test.c b/tests/vonr/af-test.c index 14e1ff0bd2..72bd68e0b6 100644 --- a/tests/vonr/af-test.c +++ b/tests/vonr/af-test.c @@ -74,7 +74,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -754,7 +754,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1229,7 +1229,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1684,7 +1684,7 @@ static void test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2310,7 +2310,7 @@ static void test5_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3027,7 +3027,7 @@ static void test6_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -3564,7 +3564,7 @@ static void test7_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -4017,7 +4017,7 @@ static void test8_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/vonr/qos-flow-test.c b/tests/vonr/qos-flow-test.c index 087c28703c..d6cba41e7d 100644 --- a/tests/vonr/qos-flow-test.c +++ b/tests/vonr/qos-flow-test.c @@ -70,7 +70,7 @@ static void uni_directional_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -462,7 +462,7 @@ static void bi_directional_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/vonr/session-test.c b/tests/vonr/session-test.c index 11836241da..92cee87964 100644 --- a/tests/vonr/session-test.c +++ b/tests/vonr/session-test.c @@ -70,7 +70,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -549,7 +549,7 @@ static void test2_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -978,7 +978,7 @@ static void test3_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1393,7 +1393,7 @@ static void test4_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -1736,7 +1736,7 @@ static void test5_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2014,7 +2014,7 @@ static void test6_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ @@ -2352,7 +2352,7 @@ static void test7_issues2729_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/vonr/simple-test.c b/tests/vonr/simple-test.c index 506a894114..aa41acdba6 100644 --- a/tests/vonr/simple-test.c +++ b/tests/vonr/simple-test.c @@ -74,7 +74,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ diff --git a/tests/vonr/video-test.c b/tests/vonr/video-test.c index 64270b483b..7145d8d41e 100644 --- a/tests/vonr/video-test.c +++ b/tests/vonr/video-test.c @@ -74,7 +74,7 @@ static void test1_func(abts_case *tc, void *data) test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; /* gNB connects to AMF */ - ngap = testngap_client(AF_INET); + ngap = testngap_client(1, AF_INET); ABTS_PTR_NOTNULL(tc, ngap); /* gNB connects to UPF */ From 1a344aeb65dda084e0e2c8c730c8b9a280865296 Mon Sep 17 00:00:00 2001 From: Matej Gradisar <gradisar@iskratel.si> Date: Thu, 29 Aug 2024 09:41:20 +0200 Subject: [PATCH 209/323] [Tests] Delete unnecessary code --- lib/app/ogs-app.h | 1 - src/amf/gmm-handler.c | 3 --- src/amf/namf-build.c | 2 -- src/amf/nausf-build.c | 6 ------ tests/app/5gc-init.c | 2 +- tests/common/application.h | 3 --- 6 files changed, 1 insertion(+), 16 deletions(-) diff --git a/lib/app/ogs-app.h b/lib/app/ogs-app.h index dbe2fecb4b..87b10862ed 100644 --- a/lib/app/ogs-app.h +++ b/lib/app/ogs-app.h @@ -41,7 +41,6 @@ extern "C" { #endif int app_initialize(const char *const argv[]); -int app_initialize_transfer(const char *const argv[]); void app_terminate(void); int mme_initialize(void); diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 8cc32a56e5..6adba0a680 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -555,9 +555,6 @@ bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, ogs_assert(amf_ue); ogs_assert(registration_request); - if (&registration_request->mobile_identity == NULL) - return false; - mobile_identity = &registration_request->mobile_identity; mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c index 6fcea6f1cf..eb3cbb547a 100644 --- a/src/amf/namf-build.c +++ b/src/amf/namf-build.c @@ -146,7 +146,5 @@ ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( if (ue_context_id) ogs_free(ue_context_id); - OpenAPI_list_clear(amf_ue->to_release_session_list); - return request; } diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index 4b4481cba6..d8fb2f58d5 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -47,12 +47,6 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate( memset(&AuthenticationInfo, 0, sizeof(AuthenticationInfo)); ogs_assert(amf_ue->suci || amf_ue->supi); - if (amf_ue->suci) { - AuthenticationInfo.supi_or_suci = amf_ue->suci; - } else { - AuthenticationInfo.supi_or_suci = amf_ue->supi; - } - if (amf_ue->suci) AuthenticationInfo.supi_or_suci = amf_ue->suci; else diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 540fcfa9e9..724656e746 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -131,7 +131,7 @@ int app_initialize(const char *const argv[]) */ ogs_msleep(1000); - return OGS_OK;; + return OGS_OK; } void app_terminate(void) diff --git a/tests/common/application.h b/tests/common/application.h index f4164e6e5e..2d8502ea63 100644 --- a/tests/common/application.h +++ b/tests/common/application.h @@ -30,11 +30,8 @@ extern "C" { void test_app_run(int argc, const char *const argv[], const char *name, void (*init)(const char * const argv[])); -void test_app_run_transfer(int argc, const char *const argv[], - const char *name, void (*init)(const char * const argv[])); void test_child_terminate(void); ogs_thread_t *test_child_create(const char *name, const char *const argv[]); -ogs_thread_t *test_child_create_old_amf(const char *name, const char *const argv[]); #ifdef __cplusplus } From dab131d3757708d5d289c8aac9045e88d03d1c60 Mon Sep 17 00:00:00 2001 From: Matej Gradisar <gradisar@iskratel.si> Date: Thu, 29 Aug 2024 16:28:09 +0200 Subject: [PATCH 210/323] [AMF] Add UE context transfer and Registration status update states --- configs/transfer.yaml.in | 65 -------------------------------------- src/amf/context.h | 10 +++++- src/amf/gmm-handler.c | 9 ------ src/amf/gmm-sm.c | 62 +++++++++++++++++++++++------------- src/amf/namf-handler.c | 45 +++++++++++++++++++------- src/amf/nausf-build.c | 1 - tests/app/app-init.c | 3 -- tests/common/application.c | 2 +- 8 files changed, 83 insertions(+), 114 deletions(-) diff --git a/configs/transfer.yaml.in b/configs/transfer.yaml.in index f185e9633e..d91c0bdbcf 100644 --- a/configs/transfer.yaml.in +++ b/configs/transfer.yaml.in @@ -28,71 +28,6 @@ global: no_pcrf: true no_hss: true -mme: - freeDiameter: - identity: mme.localdomain - realm: localdomain - listen_on: 127.0.0.2 - no_fwd: true - load_extension: - - module: @build_subprojects_freeDiameter_extensions_dir@/dbg_msg_dumps.fdx - conf: 0x8888 - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_rfc5777.fdx - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_mip6i.fdx - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nasreq.fdx - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_nas_mipv6.fdx - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca.fdx - - module: @build_subprojects_freeDiameter_extensions_dir@/dict_dcca_3gpp/dict_dcca_3gpp.fdx - connect: - - identity: hss.localdomain - address: 127.0.0.8 - - s1ap: - server: - - address: 127.0.0.2 - gtpc: - server: - - address: 127.0.0.2 - client: - sgwc: - - address: 127.0.0.3 - smf: - - address: 127.0.0.4 - metrics: - server: - - address: 127.0.0.2 - port: 9090 - gummei: - - plmn_id: - mcc: 999 - mnc: 70 - mme_gid: 2 - mme_code: 1 - tai: - - plmn_id: - mcc: 999 - mnc: 70 - tac: 1 - security: - integrity_order : [ EIA2, EIA1, EIA0 ] - ciphering_order : [ EEA0, EEA1, EEA2 ] - network_name: - full: Open5GS - time: - t3412: - value: 540 - -sgwc: - gtpc: - server: - - address: 127.0.0.3 - pfcp: - server: - - address: 127.0.0.3 - client: - sgwu: - - address: 127.0.0.6 - smf: sbi: server: diff --git a/src/amf/context.h b/src/amf/context.h index 1ce8d84459..bb3704abba 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -45,6 +45,14 @@ typedef struct amf_ue_s amf_ue_t; typedef uint32_t amf_m_tmsi_t; +typedef enum { + UE_CONTEXT_INITIAL_STATE = 0, + UE_CONTEXT_TRANSFER_OLD_AMF_STATE, + UE_CONTEXT_TRANSFER_NEW_AMF_STATE, + REGISTRATION_STATUS_UPDATE_OLD_AMF_STATE, + REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE, +} amf_ue_context_transfer_state_t; + typedef struct amf_context_s { /* Served GUAMI */ int num_of_served_guami; @@ -285,7 +293,7 @@ struct amf_ue_s { /* UE context transfer and Registration status update */ ogs_nas_5gs_guti_t old_guti; OpenAPI_ue_context_transfer_status_e transfer_status; - bool send_registration_status_update; + amf_ue_context_transfer_state_t amf_ue_context_transfer_state; OpenAPI_list_t *to_release_session_list; /* UE Info */ diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 6adba0a680..44a9caed39 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -554,7 +554,6 @@ bool gmm_registration_request_from_old_amf(amf_ue_t *amf_ue, ogs_assert(amf_ue); ogs_assert(registration_request); - mobile_identity = &registration_request->mobile_identity; mobile_identity_header = (ogs_nas_5gs_mobile_identity_header_t *)mobile_identity->buffer; @@ -1649,11 +1648,3 @@ static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id) return OGS_5GMM_CAUSE_PLMN_NOT_ALLOWED; } - -int amf_namf_comm_handle_registration_status_update_response( - ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) { - - /* Nothing to do */ - - return OGS_OK; -} diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 763ace269e..2698491257 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -552,24 +552,29 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) r = OGS_ERROR; if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_TRANSFER_NEW_AMF_STATE; r = amf_namf_comm_handle_ue_context_transfer_response( sbi_message, amf_ue); if (r != OGS_OK) { ogs_error("failed to handle " "UE_CONTEXT_TRANSFER response"); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; } } else { ogs_error("[%s] HTTP response error [%d]", amf_ue->suci, sbi_message->res_status); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; } - if (!(AMF_UE_HAVE_SUCI(amf_ue) || - AMF_UE_HAVE_SUPI(amf_ue))) { - CLEAR_AMF_UE_TIMER(amf_ue->t3570); - r = nas_5gs_send_identity_request(amf_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; + if (r != OGS_OK) { + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(amf_ue))) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } } xact_count = amf_sess_xact_count(amf_ue); @@ -1254,6 +1259,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_guami_t guami; + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + discovery_option = ogs_sbi_discovery_option_new(); ogs_assert(discovery_option); @@ -1274,7 +1281,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, amf_ue, state, nas_message); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - amf_ue->send_registration_status_update = true; break; } @@ -2000,12 +2006,12 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) break; } - if (amf_ue->send_registration_status_update == true) { - /* - * UE context transfer message has been sent - * to old AMF after Registration request. - * Now Registrations status update needs to be sent. - */ + if (amf_ue->amf_ue_context_transfer_state == UE_CONTEXT_TRANSFER_NEW_AMF_STATE) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_guami_t guami; int state = e->h.sbi.state; @@ -2028,7 +2034,8 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) amf_ue, state, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - amf_ue->send_registration_status_update = false; + + amf_ue->amf_ue_context_transfer_state = REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE; break; } @@ -2122,6 +2129,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (amf_ue->amf_ue_context_transfer_state != REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE) { + ogs_error("UE context transfer state not correct"); + } if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); @@ -2130,6 +2140,8 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + /* Continue with registration */ ogs_kdf_kgnb_and_kn3iwf( amf_ue->kamf, amf_ue->ul_count.i32, @@ -2627,12 +2639,12 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue); CLEAR_AMF_UE_ALL_TIMERS(amf_ue); - if (amf_ue->send_registration_status_update == true) { - /* - * UE context transfer message has been sent - * to old AMF after Registration request. - * Now Registrations status update needs to be sent. - */ + if (amf_ue->amf_ue_context_transfer_state == UE_CONTEXT_TRANSFER_NEW_AMF_STATE) { + /* + * UE context transfer message has been sent + * to old AMF after Registration request. + * Now Registrations status update needs to be sent. + */ ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_guami_t guami; int state = e->h.sbi.state; @@ -2655,7 +2667,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) amf_ue, state, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - amf_ue->send_registration_status_update = false; + + amf_ue->amf_ue_context_transfer_state = REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE; break; } @@ -2809,6 +2822,9 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER_UPDATE) + if (amf_ue->amf_ue_context_transfer_state != REGISTRATION_STATUS_UPDATE_NEW_AMF_STATE) { + ogs_error("UE context transfer state not correct"); + } if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); @@ -2817,6 +2833,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + /* Continue with release command */ xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index c944234c3d..4f9defeae1 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -1110,7 +1110,6 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_sbi_nf_instance_t *pcf_nf_instance = NULL; - char *ue_context_id = NULL; char *encoded_gmm_capability = NULL; int status = OGS_SBI_HTTP_STATUS_OK; char hxkamf_string[OGS_KEYSTRLEN(OGS_SHA256_DIGEST_SIZE)]; @@ -1126,20 +1125,24 @@ int amf_namf_comm_handle_ue_context_transfer_request( memset(&sendmsg, 0, sizeof(sendmsg)); sendmsg.UeContextTransferRspData = &UeContextTransferRspData; - ue_context_id = recvmsg->h.resource.component[1]; - if (!ue_context_id) { + if (!recvmsg->h.resource.component[1]) { status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; strerror = ogs_msprintf("No UE context ID"); goto cleanup; } - amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + amf_ue = amf_ue_find_by_ue_context_id(recvmsg->h.resource.component[1]); if (!amf_ue) { status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("Context not found"); + strerror = ogs_msprintf("Cannot find Context ID [%s]", + recvmsg->h.resource.component[1]); goto cleanup; } + if (amf_ue->amf_ue_context_transfer_state != UE_CONTEXT_INITIAL_STATE) { + ogs_warn("Incorrect UE context transfer state"); + } + if (amf_ue->supi) { UeContext.supi = amf_ue->supi; if (amf_ue->auth_result != @@ -1211,7 +1214,7 @@ int amf_namf_comm_handle_ue_context_transfer_request( if (recvmsg->UeContextTransferReqData->reason == OpenAPI_transfer_reason_MOBI_REG) { SessionContextList = - amf_namf_comm_encode_ue_session_context_list(amf_ue); + amf_namf_comm_encode_ue_session_context_list(amf_ue); if (SessionContextList->count == 0) { OpenAPI_list_free(SessionContextList); SessionContextList = NULL; @@ -1225,6 +1228,8 @@ int amf_namf_comm_handle_ue_context_transfer_request( ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_TRANSFER_OLD_AMF_STATE; + if (encoded_gmm_capability) ogs_free(encoded_gmm_capability); @@ -1830,22 +1835,26 @@ int amf_namf_comm_handle_registration_status_update_request( int status = 0; char *strerror = NULL; - char *ue_context_id = NULL; ogs_assert(stream); ogs_assert(recvmsg); - ue_context_id = recvmsg->h.resource.component[1]; - - if (!ue_context_id) { + if (!recvmsg->h.resource.component[1]) { status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; strerror = ogs_msprintf("No UE context ID"); goto cleanup; } - amf_ue = amf_ue_find_by_ue_context_id(ue_context_id); + amf_ue = amf_ue_find_by_ue_context_id(recvmsg->h.resource.component[1]); if (!amf_ue) { status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - strerror = ogs_msprintf("Context not found"); + strerror = ogs_msprintf("Cannot find Context ID [%s]", + recvmsg->h.resource.component[1]); + goto cleanup; + } + + if (amf_ue->amf_ue_context_transfer_state != UE_CONTEXT_TRANSFER_OLD_AMF_STATE) { + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + strerror = ogs_msprintf("Incorrect UE context transfer state"); goto cleanup; } @@ -1918,6 +1927,8 @@ int amf_namf_comm_handle_registration_status_update_request( ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + return OGS_OK; cleanup: @@ -1927,5 +1938,15 @@ int amf_namf_comm_handle_registration_status_update_request( ogs_assert(true == ogs_sbi_server_send_error(stream, status, NULL, strerror, NULL, NULL)); ogs_free(strerror); + amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; + return OGS_ERROR; } + +int amf_namf_comm_handle_registration_status_update_response( + ogs_sbi_message_t *recvmsg, amf_ue_t *amf_ue) { + + /* Nothing to do */ + + return OGS_OK; +} diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index d8fb2f58d5..5330744bc9 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -45,7 +45,6 @@ ogs_sbi_request_t *amf_nausf_auth_build_authenticate( OGS_SBI_CONTENT_PROBLEM_TYPE); memset(&AuthenticationInfo, 0, sizeof(AuthenticationInfo)); - ogs_assert(amf_ue->suci || amf_ue->supi); if (amf_ue->suci) AuthenticationInfo.supi_or_suci = amf_ue->suci; diff --git a/tests/app/app-init.c b/tests/app/app-init.c index 70108e9981..f642cb8b60 100644 --- a/tests/app/app-init.c +++ b/tests/app/app-init.c @@ -36,7 +36,6 @@ static ogs_thread_t *pcf_thread = NULL; static ogs_thread_t *nssf_thread = NULL; static ogs_thread_t *bsf_thread = NULL; static ogs_thread_t *udr_thread = NULL; -static ogs_thread_t *old_amf_thread = NULL; int app_initialize(const char *const argv[]) { @@ -131,8 +130,6 @@ void app_terminate(void) if (sepp_thread) ogs_thread_destroy(sepp_thread); if (scp_thread) ogs_thread_destroy(scp_thread); if (nrf_thread) ogs_thread_destroy(nrf_thread); - - if (old_amf_thread) ogs_thread_destroy(old_amf_thread); } void test_app_init(void) diff --git a/tests/common/application.c b/tests/common/application.c index e05d7ca956..8817e1749e 100644 --- a/tests/common/application.c +++ b/tests/common/application.c @@ -77,7 +77,7 @@ void test_app_run(int argc, const char *const argv[], ogs_assert(rv == OGS_OK); } -#define MAX_CHILD_PROCESS 17 +#define MAX_CHILD_PROCESS 32 #define OGS_ARG_MAX 256 static ogs_proc_t process[MAX_CHILD_PROCESS]; From b530221dead3a721ee5a44c40129d6973f4af105 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 3 Sep 2024 22:11:02 +0900 Subject: [PATCH 211/323] [AMF] Follow-up on #3409 --- src/amf/context.h | 1 - src/amf/gmm-sm.c | 10 ++++------ src/amf/namf-build.c | 16 ++++++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/amf/context.h b/src/amf/context.h index bb3704abba..b35165cad8 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -292,7 +292,6 @@ struct amf_ue_s { /* UE context transfer and Registration status update */ ogs_nas_5gs_guti_t old_guti; - OpenAPI_ue_context_transfer_status_e transfer_status; amf_ue_context_transfer_state_t amf_ue_context_transfer_state; OpenAPI_list_t *to_release_session_list; diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 2698491257..f17cae690f 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -2025,13 +2025,12 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) sizeof(ogs_amf_id_t)); ogs_sbi_discovery_option_set_guami(discovery_option, &guami); - amf_ue->transfer_status = - OpenAPI_ue_context_transfer_status_TRANSFERRED; r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, amf_namf_comm_build_registration_status_update, - amf_ue, state, NULL); + amf_ue, state, + (void *)OpenAPI_ue_context_transfer_status_TRANSFERRED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2658,13 +2657,12 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) sizeof(ogs_amf_id_t)); ogs_sbi_discovery_option_set_guami(discovery_option, &guami); - amf_ue->transfer_status = - OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED; r = amf_ue_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NAMF_COMM, discovery_option, amf_namf_comm_build_registration_status_update, - amf_ue, state, NULL); + amf_ue, state, + (void *)OpenAPI_ue_context_transfer_status_NOT_TRANSFERRED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c index eb3cbb547a..63bb8864aa 100644 --- a/src/amf/namf-build.c +++ b/src/amf/namf-build.c @@ -108,6 +108,7 @@ ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( char *ue_context_id = NULL; ogs_assert(amf_ue); + ogs_assert(data); ue_context_id = ogs_guti_to_string(&amf_ue->old_guti); ogs_assert(ue_context_id); @@ -125,7 +126,8 @@ ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( memset(&UeRegStatusUpdateReqData, 0, sizeof(UeRegStatusUpdateReqData)); - UeRegStatusUpdateReqData.transfer_status = amf_ue->transfer_status; + UeRegStatusUpdateReqData.transfer_status = + (OpenAPI_ue_context_transfer_status_e)data; /* * TS 29.518 * 5.2.2.2.2 Registration Status Update @@ -133,11 +135,13 @@ ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( * Session(s) associated with them, the target AMF shall include these * PDU session(s) in the toReleaseSessionList attribute in the payload. */ - if (amf_ue->transfer_status == - OpenAPI_ue_context_transfer_status_TRANSFERRED && - amf_ue->to_release_session_list->count) { - UeRegStatusUpdateReqData.to_release_session_list = - amf_ue->to_release_session_list; + if (UeRegStatusUpdateReqData.transfer_status == + OpenAPI_ue_context_transfer_status_TRANSFERRED) { + ogs_assert(amf_ue->to_release_session_list); /* For safety */ + if (amf_ue->to_release_session_list->count) { + UeRegStatusUpdateReqData.to_release_session_list = + amf_ue->to_release_session_list; + } } request = ogs_sbi_build_request(&message); From 34c922a857b2501f055480079118d48dd231f9a6 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 17:26:04 +0200 Subject: [PATCH 212/323] diameter: logger: Use typedef for ogs_diam_logger_t Same as done mostly everywhere in open5gs types. --- lib/diameter/common/logger.c | 6 +++--- lib/diameter/common/logger.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/diameter/common/logger.c b/lib/diameter/common/logger.c index a3309da955..f5577550d4 100644 --- a/lib/diameter/common/logger.c +++ b/lib/diameter/common/logger.c @@ -19,7 +19,7 @@ #include "ogs-diameter-common.h" -static struct ogs_diam_logger_t self; +static ogs_diam_logger_t self; static struct fd_hook_hdl *logger_hdl = NULL; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; @@ -36,7 +36,7 @@ int ogs_diam_logger_init(int mode) { uint32_t mask_peers = HOOK_MASK( HOOK_PEER_CONNECT_SUCCESS ); - memset(&self, 0, sizeof(struct ogs_diam_logger_t)); + memset(&self, 0, sizeof(ogs_diam_logger_t)); self.mode = mode; self.duration = 60; /* 60 seconds */ @@ -57,7 +57,7 @@ void ogs_diam_logger_final() if (logger_hdl) { CHECK_FCT_DO( fd_hook_unregister( logger_hdl ), ); } } -struct ogs_diam_logger_t* ogs_diam_logger_self() +ogs_diam_logger_t* ogs_diam_logger_self() { return &self; } diff --git a/lib/diameter/common/logger.h b/lib/diameter/common/logger.h index 5764bff755..53eb194ff4 100644 --- a/lib/diameter/common/logger.h +++ b/lib/diameter/common/logger.h @@ -28,7 +28,7 @@ extern "C" { #endif -struct ogs_diam_logger_t { +typedef struct ogs_diam_logger_s { #define FD_MODE_SERVER 0x1 #define FD_MODE_CLIENT 0x2 @@ -46,12 +46,12 @@ struct ogs_diam_logger_t { } stats; pthread_mutex_t stats_lock; -}; +} ogs_diam_logger_t; int ogs_diam_logger_init(int mode); void ogs_diam_logger_final(void); -struct ogs_diam_logger_t* ogs_diam_logger_self(void); +ogs_diam_logger_t* ogs_diam_logger_self(void); int ogs_diam_logger_stats_start(void); From 9e87c6b1c6b1455a935e8dba031ecc836fc35d2e Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 17:58:53 +0200 Subject: [PATCH 213/323] cosmetic: diameter: Fix trailing whitespace --- lib/diameter/common/config.c | 4 ++-- lib/diameter/common/init.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/diameter/common/config.c b/lib/diameter/common/config.c index 09705f71c7..efdf8245d5 100644 --- a/lib/diameter/common/config.c +++ b/lib/diameter/common/config.c @@ -105,7 +105,7 @@ static int diam_config_apply(ogs_diam_config_t *fd_config) fd_config->conn[i].addr, errno, strerror(errno)); return OGS_ERROR; } - + CHECK_FCT_DO( fd_ep_add_merge( &fddpi.pi_endpoints, ai->ai_addr, ai->ai_addrlen, EP_FL_CONF | (disc ?: EP_ACCEPTALL) ), return OGS_ERROR); @@ -197,7 +197,7 @@ int ogs_diam_config_init(ogs_diam_config_t *fd_config) /* Display configuration */ b = fd_conf_dump(&buf, &len, NULL); - LOG_SPLIT(FD_LOG_NOTICE, NULL, + LOG_SPLIT(FD_LOG_NOTICE, NULL, b ?: (char*)"<Error during configuration dump...>", NULL); free(buf); diff --git a/lib/diameter/common/init.c b/lib/diameter/common/init.c index 834380b52d..781fd58853 100644 --- a/lib/diameter/common/init.c +++ b/lib/diameter/common/init.c @@ -36,14 +36,14 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config) if (ret != 0) { ogs_error("fd_log_handler_register() failed"); return ret; - } + } ret = fd_core_initialize(); if (ret != 0) { ogs_error("fd_core_initialize() failed"); return ret; - } - + } + /* Parse the configuration file */ if (conffile) { CHECK_FCT_DO( fd_core_parseconf(conffile), goto error ); @@ -118,12 +118,12 @@ static void diam_log_func(int printlevel, const char *format, va_list ap) ogs_log_printf(level, OGS_LOG_DOMAIN, 0, NULL, 0, NULL, 0, __VA_ARGS__) switch(printlevel) { - case FD_LOG_ANNOYING: + case FD_LOG_ANNOYING: diam_log_printf(OGS_LOG_TRACE, "[%d] %s\n", printlevel, buffer); - break; + break; case FD_LOG_DEBUG: diam_log_printf(OGS_LOG_TRACE, "[%d] %s\n", printlevel, buffer); - break; + break; case FD_LOG_INFO: diam_log_printf(OGS_LOG_TRACE, "[%d] %s\n", printlevel, buffer); break; From b5d1e8ac617d4d9ef2f9ebf63fb092aeccd5fe8b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 17:51:57 +0200 Subject: [PATCH 214/323] diameter: split stats and logger modules Those 2 modules actually share nothing in common, so they can be totally separated, making it easy to improve diameter stats in follo-up patches. --- lib/diameter/common/init.c | 8 +- lib/diameter/common/logger.c | 88 +------------ lib/diameter/common/logger.h | 26 +--- lib/diameter/common/meson.build | 2 + lib/diameter/common/ogs-diameter-common.h | 1 + lib/diameter/common/stats.c | 116 +++++++++++++++++ lib/diameter/common/stats.h | 62 ++++++++++ src/hss/hss-cx-path.c | 24 ++-- src/hss/hss-s6a-path.c | 30 ++--- src/hss/hss-swx-path.c | 12 +- src/mme/mme-fd-path.c | 124 +++++++++---------- src/pcrf/pcrf-gx-path.c | 42 +++---- src/pcrf/pcrf-rx-path.c | 18 +-- src/smf/gx-path.c | 42 +++---- src/smf/gy-path.c | 42 +++---- src/smf/s6b-path.c | 72 +++++------ tests/non3gpp/diameter-s6b-path.c | 12 +- tests/non3gpp/diameter-swx-path.c | 72 +++++------ tests/volte/diameter-cx-path.c | 144 +++++++++++----------- tests/volte/diameter-rx-path.c | 90 +++++++------- 20 files changed, 551 insertions(+), 476 deletions(-) create mode 100644 lib/diameter/common/stats.c create mode 100644 lib/diameter/common/stats.h diff --git a/lib/diameter/common/init.c b/lib/diameter/common/init.c index 781fd58853..a4aa8d93d0 100644 --- a/lib/diameter/common/init.c +++ b/lib/diameter/common/init.c @@ -55,7 +55,10 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config) CHECK_FCT( ogs_diam_message_init() ); /* Initialize FD logger */ - CHECK_FCT_DO( ogs_diam_logger_init(mode), goto error ); + CHECK_FCT_DO( ogs_diam_logger_init(), goto error ); + + /* Initialize FD stats */ + CHECK_FCT_DO( ogs_diam_stats_init(mode), goto error ); return 0; error: @@ -72,7 +75,7 @@ int ogs_diam_start(void) CHECK_FCT_DO( fd_core_waitstartcomplete(), goto error ); - CHECK_FCT( ogs_diam_logger_stats_start() ); + CHECK_FCT( ogs_diam_stats_start() ); return 0; error: @@ -84,6 +87,7 @@ int ogs_diam_start(void) void ogs_diam_final() { + ogs_diam_stats_final(); ogs_diam_logger_final(); CHECK_FCT_DO( fd_core_shutdown(), ogs_error("fd_core_shutdown() failed") ); diff --git a/lib/diameter/common/logger.c b/lib/diameter/common/logger.c index f5577550d4..73be6c5bdb 100644 --- a/lib/diameter/common/logger.c +++ b/lib/diameter/common/logger.c @@ -19,57 +19,30 @@ #include "ogs-diameter-common.h" -static ogs_diam_logger_t self; - static struct fd_hook_hdl *logger_hdl = NULL; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; -static pthread_t fd_stats_th = (pthread_t)NULL; static ogs_diam_logger_user_handler user_handler = NULL; static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata); -static void * diam_stats_worker(void * arg); -int ogs_diam_logger_init(int mode) +int ogs_diam_logger_init() { uint32_t mask_peers = HOOK_MASK( HOOK_PEER_CONNECT_SUCCESS ); - memset(&self, 0, sizeof(ogs_diam_logger_t)); - - self.mode = mode; - self.duration = 60; /* 60 seconds */ - CHECK_FCT( fd_hook_register( mask_peers, ogs_diam_logger_cb, NULL, NULL, &logger_hdl) ); - CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); - return 0; } void ogs_diam_logger_final() { - CHECK_FCT_DO( fd_thr_term(&fd_stats_th), ); - CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), ); - if (logger_hdl) { CHECK_FCT_DO( fd_hook_unregister( logger_hdl ), ); } } -ogs_diam_logger_t* ogs_diam_logger_self() -{ - return &self; -} - -int ogs_diam_logger_stats_start() -{ - /* Start the statistics thread */ - CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) ); - - return 0; -} - void ogs_diam_logger_register(ogs_diam_logger_user_handler instance) { user_handler = instance; @@ -116,62 +89,3 @@ static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg, CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), ); } -/* Function to display statistics periodically */ -static void * diam_stats_worker(void * arg) -{ - struct timespec start, now; - struct fd_stats copy; - - /* Get the start time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), ); - - /* Now, loop until canceled */ - while (1) { - /* Display statistics every XX seconds */ - sleep(self.duration); - - /* Now, get the current stats */ - CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); - memcpy(&copy, &self.stats, sizeof(struct fd_stats)); - CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); - - /* Get the current execution time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); - - /* Now, display everything */ - ogs_trace("------- fd statistics ---------"); - if (now.tv_nsec >= start.tv_nsec) - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - start.tv_sec), - (long)(now.tv_nsec - start.tv_nsec) / 1000); - } - else - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - 1 - start.tv_sec), - (long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000); - } - - if (self.mode & FD_MODE_SERVER) { - ogs_trace(" Server: %llu message(s) echoed", - copy.nb_echoed); - } - if (self.mode & FD_MODE_CLIENT) { - ogs_trace(" Client:"); - ogs_trace(" %llu message(s) sent", copy.nb_sent); - ogs_trace(" %llu error(s) received", copy.nb_errs); - ogs_trace(" %llu answer(s) received", copy.nb_recv); - ogs_trace(" fastest: %ld.%06ld sec.", - copy.shortest / 1000000, copy.shortest % 1000000); - ogs_trace(" slowest: %ld.%06ld sec.", - copy.longest / 1000000, copy.longest % 1000000); - ogs_trace(" Average: %ld.%06ld sec.", - copy.avg / 1000000, copy.avg % 1000000); - } - ogs_trace("-------------------------------------"); - } - - return NULL; /* never called */ -} - diff --git a/lib/diameter/common/logger.h b/lib/diameter/common/logger.h index 53eb194ff4..9a1af6bde6 100644 --- a/lib/diameter/common/logger.h +++ b/lib/diameter/common/logger.h @@ -28,33 +28,9 @@ extern "C" { #endif -typedef struct ogs_diam_logger_s { - -#define FD_MODE_SERVER 0x1 -#define FD_MODE_CLIENT 0x2 - int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ - - int duration; /* default 10 */ - struct fd_stats { - unsigned long long nb_echoed; /* server */ - unsigned long long nb_sent; /* client */ - unsigned long long nb_recv; /* client */ - unsigned long long nb_errs; /* client */ - unsigned long shortest; /* fastest answer, in microseconds */ - unsigned long longest; /* slowest answer, in microseconds */ - unsigned long avg; /* average answer time, in microseconds */ - } stats; - - pthread_mutex_t stats_lock; -} ogs_diam_logger_t; - -int ogs_diam_logger_init(int mode); +int ogs_diam_logger_init(void); void ogs_diam_logger_final(void); -ogs_diam_logger_t* ogs_diam_logger_self(void); - -int ogs_diam_logger_stats_start(void); - typedef void (*ogs_diam_logger_user_handler)( enum fd_hook_type type, struct msg *msg, struct peer_hdr *peer, void *other, struct fd_hook_permsgdata *pmd, void *regdata); diff --git a/lib/diameter/common/meson.build b/lib/diameter/common/meson.build index 38528db722..afe2f2b2ab 100644 --- a/lib/diameter/common/meson.build +++ b/lib/diameter/common/meson.build @@ -20,12 +20,14 @@ libdiameter_common_sources = files(''' message.h logger.h + stats.h base.h libapp_sip.c dict.c message.c logger.c + stats.c config.c util.c init.c diff --git a/lib/diameter/common/ogs-diameter-common.h b/lib/diameter/common/ogs-diameter-common.h index b05bf0f5f0..2aa605f977 100644 --- a/lib/diameter/common/ogs-diameter-common.h +++ b/lib/diameter/common/ogs-diameter-common.h @@ -43,6 +43,7 @@ #include "diameter/common/message.h" #include "diameter/common/logger.h" +#include "diameter/common/stats.h" #include "diameter/common/base.h" #undef OGS_DIAMETER_INSIDE diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c new file mode 100644 index 0000000000..14c8fb6256 --- /dev/null +++ b/lib/diameter/common/stats.c @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "ogs-diameter-common.h" + +static ogs_diam_stats_t self; +static pthread_t fd_stats_th = (pthread_t)NULL; + +static void * diam_stats_worker(void * arg); + +int ogs_diam_stats_init(int mode) +{ + memset(&self, 0, sizeof(ogs_diam_stats_t)); + + self.mode = mode; + self.duration = 60; /* 60 seconds */ + + CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); + + return 0; +} + +void ogs_diam_stats_final() +{ + CHECK_FCT_DO( fd_thr_term(&fd_stats_th), ); + CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), ); +} + +ogs_diam_stats_t* ogs_diam_stats_self() +{ + return &self; +} + +int ogs_diam_stats_start() +{ + /* Start the statistics thread */ + CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) ); + + return 0; +} + +/* Function to display statistics periodically */ +static void * diam_stats_worker(void * arg) +{ + struct timespec start, now; + struct fd_stats copy; + + /* Get the start time */ + CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), ); + + /* Now, loop until canceled */ + while (1) { + /* Display statistics every XX seconds */ + sleep(self.duration); + + /* Now, get the current stats */ + CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); + memcpy(&copy, &self.stats, sizeof(struct fd_stats)); + CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); + + /* Get the current execution time */ + CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); + + /* Now, display everything */ + ogs_trace("------- fd statistics ---------"); + if (now.tv_nsec >= start.tv_nsec) + { + ogs_trace(" Executing for: %d.%06ld sec", + (int)(now.tv_sec - start.tv_sec), + (long)(now.tv_nsec - start.tv_nsec) / 1000); + } + else + { + ogs_trace(" Executing for: %d.%06ld sec", + (int)(now.tv_sec - 1 - start.tv_sec), + (long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000); + } + + if (self.mode & FD_MODE_SERVER) { + ogs_trace(" Server: %llu message(s) echoed", + copy.nb_echoed); + } + if (self.mode & FD_MODE_CLIENT) { + ogs_trace(" Client:"); + ogs_trace(" %llu message(s) sent", copy.nb_sent); + ogs_trace(" %llu error(s) received", copy.nb_errs); + ogs_trace(" %llu answer(s) received", copy.nb_recv); + ogs_trace(" fastest: %ld.%06ld sec.", + copy.shortest / 1000000, copy.shortest % 1000000); + ogs_trace(" slowest: %ld.%06ld sec.", + copy.longest / 1000000, copy.longest % 1000000); + ogs_trace(" Average: %ld.%06ld sec.", + copy.avg / 1000000, copy.avg % 1000000); + } + ogs_trace("-------------------------------------"); + } + + return NULL; /* never called */ +} + diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h new file mode 100644 index 0000000000..dc8e2928cb --- /dev/null +++ b/lib/diameter/common/stats.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(OGS_DIAMETER_INSIDE) && !defined(OGS_DIAMETER_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_DIAM_STATS_H +#define OGS_DIAM_STATS_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ogs_diam_stats_s { + +#define FD_MODE_SERVER 0x1 +#define FD_MODE_CLIENT 0x2 + int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ + + int duration; /* default 10 */ + struct fd_stats { + unsigned long long nb_echoed; /* server */ + unsigned long long nb_sent; /* client */ + unsigned long long nb_recv; /* client */ + unsigned long long nb_errs; /* client */ + unsigned long shortest; /* fastest answer, in microseconds */ + unsigned long longest; /* slowest answer, in microseconds */ + unsigned long avg; /* average answer time, in microseconds */ + } stats; + + pthread_mutex_t stats_lock; +} ogs_diam_stats_t; + +int ogs_diam_stats_init(int mode); +void ogs_diam_stats_final(void); + +ogs_diam_stats_t* ogs_diam_stats_self(void); + +int ogs_diam_stats_start(void); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_DIAM_STATS_H */ diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index ad9ac4d562..a2ab075e67 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -166,9 +166,9 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ogs_debug("User-Authorization-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(user_name); ogs_free(public_identity); @@ -555,9 +555,9 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ogs_debug("Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); if (authentication_scheme) ogs_free(authentication_scheme); @@ -815,9 +815,9 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ogs_debug("Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); if (user_data) ogs_free(user_data); @@ -936,9 +936,9 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ogs_debug("Location-Info-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(public_identity); diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 385f8f0408..b2d9b3a1f3 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -265,9 +265,9 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_debug("Authentication-Information-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return 0; @@ -971,9 +971,9 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_debug("Update-Location-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_subscription_data_free(&subscription_data); @@ -1128,9 +1128,9 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ogs_debug("Purge-UE-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_subscription_data_free(&subscription_data); @@ -1284,9 +1284,9 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } @@ -1485,9 +1485,9 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_subscription_data_free(&subscription_data); diff --git a/src/hss/hss-swx-path.c b/src/hss/hss-swx-path.c index 84512010ab..be8d4a9767 100644 --- a/src/hss/hss-swx-path.c +++ b/src/hss/hss-swx-path.c @@ -334,9 +334,9 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp, ogs_debug("Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); if (authentication_scheme) ogs_free(authentication_scheme); @@ -857,9 +857,9 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp, ogs_debug("Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_subscription_data_free(&subscription_data); ogs_free(user_name); diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index bcad1ce375..ed7e1133c6 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -858,9 +858,9 @@ static void _mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } void mme_s6a_send_air(enb_ue_t *enb_ue, mme_ue_t *mme_ue, @@ -1118,30 +1118,30 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1315,9 +1315,9 @@ void mme_s6a_send_ulr(enb_ue_t *enb_ue, mme_ue_t *mme_ue) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* MME received Update Location Answer from HSS */ @@ -1543,31 +1543,31 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = - (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = + (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1676,9 +1676,9 @@ void mme_s6a_send_pur(enb_ue_t *enb_ue, mme_ue_t *mme_ue) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* MME received Purge UE Answer from HSS */ @@ -1855,31 +1855,31 @@ static void mme_s6a_pua_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = - (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = + (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1991,9 +1991,9 @@ static int mme_ogs_diam_s6a_clr_cb( struct msg **msg, struct avp *avp, ogs_debug("Cancel-Location-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); e = mme_event_new(MME_EVENT_S6A_MESSAGE); ogs_assert(e); @@ -2284,9 +2284,9 @@ static int mme_ogs_diam_s6a_idr_cb( struct msg **msg, struct avp *avp, ogs_debug("Insert-Subscriber-Data-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); int rv; e = mme_event_new(MME_EVENT_S6A_MESSAGE); diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index a42e662736..99022fbed5 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -621,9 +621,9 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, ogs_debug("[Credit-Control-Answer]"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); OGS_SESSION_DATA_FREE(&gx_message.session_data); @@ -1013,9 +1013,9 @@ int pcrf_gx_send_rar( ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Set no error */ rx_message->result_code = ER_DIAMETER_SUCCESS; @@ -1121,30 +1121,30 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index 32ba39f69f..4c8db63d5b 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -413,9 +413,9 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ogs_debug("[PCRF] AA-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_ims_data_free(&rx_message.ims_data); @@ -561,9 +561,9 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return OGS_OK; } @@ -746,9 +746,9 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, ogs_debug("[PCRF] Session-Termination-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); diff --git a/src/smf/gx-path.c b/src/smf/gx-path.c index 69c5e97840..d66b7991cc 100644 --- a/src/smf/gx-path.c +++ b/src/smf/gx-path.c @@ -728,9 +728,9 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* 3GPP TS 29.212 5b.6.5 Credit-Control-Answer */ @@ -1089,30 +1089,30 @@ static void smf_gx_cca_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1355,9 +1355,9 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp, ogs_debug("Re-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return 0; diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index 791ab40eb6..b5848405b3 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -959,9 +959,9 @@ void smf_gy_send_ccr(smf_sess_t *sess, ogs_pool_id_t xact_id, /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } static void smf_gy_cca_cb(void *data, struct msg **msg) @@ -1217,30 +1217,30 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1367,9 +1367,9 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp, ogs_debug("Re-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); return 0; diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index 092970913b..53d87b2cee 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -329,9 +329,9 @@ void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(user_name); ogs_free(visited_network_identifier); @@ -460,30 +460,30 @@ static void smf_s6b_aaa_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -628,9 +628,9 @@ void smf_s6b_send_str(smf_sess_t *sess, ogs_gtp_xact_t *xact, uint32_t cause) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(user_name); } @@ -762,30 +762,30 @@ static void smf_s6b_sta_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) diff --git a/tests/non3gpp/diameter-s6b-path.c b/tests/non3gpp/diameter-s6b-path.c index 1472ca8491..9ed55f2a40 100644 --- a/tests/non3gpp/diameter-s6b-path.c +++ b/tests/non3gpp/diameter-s6b-path.c @@ -178,9 +178,9 @@ static int test_s6b_aar_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); return 0; @@ -278,9 +278,9 @@ static int test_s6b_str_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); return 0; diff --git a/tests/non3gpp/diameter-swx-path.c b/tests/non3gpp/diameter-swx-path.c index c371cbe31d..548e3af666 100644 --- a/tests/non3gpp/diameter-swx-path.c +++ b/tests/non3gpp/diameter-swx-path.c @@ -273,9 +273,9 @@ static void test_swx_send_mar(struct sess_state *sess_data) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Multimedia-Auth-Answer messages */ @@ -358,30 +358,30 @@ static void test_swx_maa_cb(void *data, struct msg **msg) ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -525,9 +525,9 @@ static void test_swx_send_sar(struct sess_state *sess_data) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Server-Assignment-Answer messages */ @@ -618,30 +618,30 @@ static void test_swx_saa_cb(void *data, struct msg **msg) ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) diff --git a/tests/volte/diameter-cx-path.c b/tests/volte/diameter-cx-path.c index 8ee4bc8271..5b19d9118f 100644 --- a/tests/volte/diameter-cx-path.c +++ b/tests/volte/diameter-cx-path.c @@ -210,9 +210,9 @@ void test_cx_send_uar(test_ue_t *test_ue, int id_type) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming User-Authorization-Answer messages */ @@ -300,30 +300,30 @@ static void test_cx_uaa_cb(void *data, struct msg **msg) ogs_assert(!err && exp_err); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -531,9 +531,9 @@ static void test_cx_send_mar(struct sess_state *sess_data) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Multimedia-Auth-Answer messages */ @@ -621,30 +621,30 @@ static void test_cx_maa_cb(void *data, struct msg **msg) ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -814,9 +814,9 @@ static void test_cx_send_sar(struct sess_state *sess_data) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } /* Callback for incoming Server-Assignment-Answer messages */ @@ -904,30 +904,30 @@ static void test_cx_saa_cb(void *data, struct msg **msg) ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1056,9 +1056,9 @@ static void test_cx_send_lir(struct sess_state *sess_data) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_free(public_identity); } @@ -1148,30 +1148,30 @@ static void test_cx_lia_cb(void *data, struct msg **msg) ogs_assert(err && !exp_err && result_code == ER_DIAMETER_SUCCESS); /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) diff --git a/tests/volte/diameter-rx-path.c b/tests/volte/diameter-rx-path.c index a8fcb021c9..840bebee31 100644 --- a/tests/volte/diameter-rx-path.c +++ b/tests/volte/diameter-rx-path.c @@ -561,9 +561,9 @@ void test_rx_send_aar_audio(uint8_t **rx_sid, ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1239,9 +1239,9 @@ void test_rx_send_aar_video(uint8_t **rx_sid, test_sess_t *sess, int id_type) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1646,9 +1646,9 @@ void test_rx_send_aar_ctrl(uint8_t **rx_sid, test_sess_t *sess, int id_type) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Free string memory */ ogs_free(sip_uri); @@ -1745,30 +1745,30 @@ static void pcscf_rx_aaa_cb(void *data, struct msg **msg) out: /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) @@ -1866,9 +1866,9 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_echoed++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); test_rx_send_str(sid); @@ -1977,9 +1977,9 @@ void test_rx_send_str(uint8_t *rx_sid) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); - ogs_diam_logger_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); + ogs_diam_stats_self()->stats.nb_sent++; + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); } static void pcscf_rx_sta_cb(void *data, struct msg **msg) @@ -2073,30 +2073,30 @@ static void pcscf_rx_sta_cb(void *data, struct msg **msg) out: /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_logger_self()->stats.nb_recv) { + if (ogs_diam_stats_self()->stats.nb_recv) { /* Ponderate in the avg */ - ogs_diam_logger_self()->stats.avg = (ogs_diam_logger_self()->stats.avg * - ogs_diam_logger_self()->stats.nb_recv + dur) / - (ogs_diam_logger_self()->stats.nb_recv + 1); + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); /* Min, max */ - if (dur < ogs_diam_logger_self()->stats.shortest) - ogs_diam_logger_self()->stats.shortest = dur; - if (dur > ogs_diam_logger_self()->stats.longest) - ogs_diam_logger_self()->stats.longest = dur; + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; } else { - ogs_diam_logger_self()->stats.shortest = dur; - ogs_diam_logger_self()->stats.longest = dur; - ogs_diam_logger_self()->stats.avg = dur; + ogs_diam_stats_self()->stats.shortest = dur; + ogs_diam_stats_self()->stats.longest = dur; + ogs_diam_stats_self()->stats.avg = dur; } if (error) - ogs_diam_logger_self()->stats.nb_errs++; + ogs_diam_stats_self()->stats.nb_errs++; else - ogs_diam_logger_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0); + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) From 9cabb279c018640d55ed1a75222f49a55472126c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 18:33:47 +0200 Subject: [PATCH 215/323] diameter: stats: Integrate into main loop There's no real need for a separate thread, it all can run with a timer. Furthermore, this will ease submitting events towards app so that they can update diameter metrics. --- lib/diameter/common/meson.build | 4 +- lib/diameter/common/stats.c | 111 +++++++++++++++----------------- lib/diameter/common/stats.h | 8 ++- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/lib/diameter/common/meson.build b/lib/diameter/common/meson.build index afe2f2b2ab..10925c9e25 100644 --- a/lib/diameter/common/meson.build +++ b/lib/diameter/common/meson.build @@ -53,10 +53,10 @@ libdiameter_common = library('ogsdiameter-common', version : libogslib_version, c_args : libdiameter_common_cc_flags, include_directories : [libdiameter_common_inc, libinc], - dependencies : [libcore_dep, libfdcore_dep], + dependencies : [libcore_dep, libfdcore_dep, libapp_dep], install : true) libdiameter_common_dep = declare_dependency( link_with : libdiameter_common, include_directories : [libdiameter_common_inc, libinc], - dependencies : [libcore_dep, libfdcore_dep]) + dependencies : [libcore_dep, libfdcore_dep, libapp_dep]) diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index 14c8fb6256..35bcfdb820 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -18,18 +18,21 @@ */ #include "ogs-diameter-common.h" +#include "ogs-app.h" static ogs_diam_stats_t self; -static pthread_t fd_stats_th = (pthread_t)NULL; -static void * diam_stats_worker(void * arg); +static void diam_stats_timer_cb(void *data); int ogs_diam_stats_init(int mode) { memset(&self, 0, sizeof(ogs_diam_stats_t)); self.mode = mode; - self.duration = 60; /* 60 seconds */ + self.poll.t_interval = ogs_time_from_sec(60); /* 60 seconds */ + self.poll.timer = ogs_timer_add(ogs_app()->timer_mgr, + diam_stats_timer_cb, 0); + ogs_assert(self.poll.timer); CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); @@ -38,8 +41,9 @@ int ogs_diam_stats_init(int mode) void ogs_diam_stats_final() { - CHECK_FCT_DO( fd_thr_term(&fd_stats_th), ); - CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), ); + if (self.poll.timer) + ogs_timer_delete(self.poll.timer); + self.poll.timer = NULL; } ogs_diam_stats_t* ogs_diam_stats_self() @@ -49,68 +53,59 @@ ogs_diam_stats_t* ogs_diam_stats_self() int ogs_diam_stats_start() { - /* Start the statistics thread */ - CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) ); + /* Get the start time */ + CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &self.poll.ts_start), ); + /* Start the statistics timer */ + ogs_timer_start(self.poll.timer, self.poll.t_interval); return 0; } /* Function to display statistics periodically */ -static void * diam_stats_worker(void * arg) +static void diam_stats_timer_cb(void *data) { - struct timespec start, now; + struct timespec now; struct fd_stats copy; - /* Get the start time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), ); - - /* Now, loop until canceled */ - while (1) { - /* Display statistics every XX seconds */ - sleep(self.duration); - - /* Now, get the current stats */ - CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); - memcpy(&copy, &self.stats, sizeof(struct fd_stats)); - CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); - - /* Get the current execution time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); - - /* Now, display everything */ - ogs_trace("------- fd statistics ---------"); - if (now.tv_nsec >= start.tv_nsec) - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - start.tv_sec), - (long)(now.tv_nsec - start.tv_nsec) / 1000); - } - else - { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - 1 - start.tv_sec), - (long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000); - } - - if (self.mode & FD_MODE_SERVER) { - ogs_trace(" Server: %llu message(s) echoed", - copy.nb_echoed); - } - if (self.mode & FD_MODE_CLIENT) { - ogs_trace(" Client:"); - ogs_trace(" %llu message(s) sent", copy.nb_sent); - ogs_trace(" %llu error(s) received", copy.nb_errs); - ogs_trace(" %llu answer(s) received", copy.nb_recv); - ogs_trace(" fastest: %ld.%06ld sec.", - copy.shortest / 1000000, copy.shortest % 1000000); - ogs_trace(" slowest: %ld.%06ld sec.", - copy.longest / 1000000, copy.longest % 1000000); - ogs_trace(" Average: %ld.%06ld sec.", - copy.avg / 1000000, copy.avg % 1000000); - } - ogs_trace("-------------------------------------"); + /* Now, get the current stats */ + CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); + memcpy(&copy, &self.stats, sizeof(struct fd_stats)); + CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); + + /* Get the current execution time */ + CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); + + /* Now, display everything */ + ogs_trace("------- fd statistics ---------"); + if (now.tv_nsec >= self.poll.ts_start.tv_nsec) { + ogs_trace(" Executing for: %d.%06ld sec", + (int)(now.tv_sec - self.poll.ts_start.tv_sec), + (long)(now.tv_nsec - self.poll.ts_start.tv_nsec) / 1000); + } else { + ogs_trace(" Executing for: %d.%06ld sec", + (int)(now.tv_sec - 1 - self.poll.ts_start.tv_sec), + (long)(now.tv_nsec + 1000000000 - self.poll.ts_start.tv_nsec) / 1000); + } + + if (self.mode & FD_MODE_SERVER) { + ogs_trace(" Server: %llu message(s) echoed", + copy.nb_echoed); + } + if (self.mode & FD_MODE_CLIENT) { + ogs_trace(" Client:"); + ogs_trace(" %llu message(s) sent", copy.nb_sent); + ogs_trace(" %llu error(s) received", copy.nb_errs); + ogs_trace(" %llu answer(s) received", copy.nb_recv); + ogs_trace(" fastest: %ld.%06ld sec.", + copy.shortest / 1000000, copy.shortest % 1000000); + ogs_trace(" slowest: %ld.%06ld sec.", + copy.longest / 1000000, copy.longest % 1000000); + ogs_trace(" Average: %ld.%06ld sec.", + copy.avg / 1000000, copy.avg % 1000000); } + ogs_trace("-------------------------------------"); - return NULL; /* never called */ + /* Re-schedule timer: */ + ogs_timer_start(self.poll.timer, self.poll.t_interval); } diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index dc8e2928cb..7dfb63b020 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -28,13 +28,19 @@ extern "C" { #endif +#include <sys/time.h> + typedef struct ogs_diam_stats_s { #define FD_MODE_SERVER 0x1 #define FD_MODE_CLIENT 0x2 int mode; /* default FD_MODE_SERVER | FD_MODE_CLIENT */ - int duration; /* default 10 */ + struct poll { + ogs_timer_t *timer; + struct timespec ts_start; + ogs_time_t t_interval; /* in usecs */ + } poll; struct fd_stats { unsigned long long nb_echoed; /* server */ unsigned long long nb_sent; /* client */ From 7fb0690950a50a423843dfd571d934532ff0061c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 18:35:10 +0200 Subject: [PATCH 216/323] diameter: stats: use monotonic clock & avoid drift We simply want to trigger the event at fixed intervals, we don't really need the wall time. --- lib/diameter/common/stats.c | 33 ++++++++++++++++++++------------- lib/diameter/common/stats.h | 3 ++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index 35bcfdb820..dcb145af51 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -54,8 +54,9 @@ ogs_diam_stats_t* ogs_diam_stats_self() int ogs_diam_stats_start() { /* Get the start time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &self.poll.ts_start), ); + self.poll.t_start = ogs_get_monotonic_time(); /* Start the statistics timer */ + self.poll.t_prev = self.poll.t_start; ogs_timer_start(self.poll.timer, self.poll.t_interval); return 0; @@ -64,7 +65,7 @@ int ogs_diam_stats_start() /* Function to display statistics periodically */ static void diam_stats_timer_cb(void *data) { - struct timespec now; + ogs_time_t now, since_start, since_prev, next_run; struct fd_stats copy; /* Now, get the current stats */ @@ -73,19 +74,14 @@ static void diam_stats_timer_cb(void *data) CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); /* Get the current execution time */ - CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), ); + now = ogs_get_monotonic_time(); + since_start = now - self.poll.t_start; /* Now, display everything */ ogs_trace("------- fd statistics ---------"); - if (now.tv_nsec >= self.poll.ts_start.tv_nsec) { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - self.poll.ts_start.tv_sec), - (long)(now.tv_nsec - self.poll.ts_start.tv_nsec) / 1000); - } else { - ogs_trace(" Executing for: %d.%06ld sec", - (int)(now.tv_sec - 1 - self.poll.ts_start.tv_sec), - (long)(now.tv_nsec + 1000000000 - self.poll.ts_start.tv_nsec) / 1000); - } + ogs_trace(" Executing for: %llu.%06llu sec", + (unsigned long long)ogs_time_sec(since_start), + (unsigned long long)ogs_time_usec(since_start)); if (self.mode & FD_MODE_SERVER) { ogs_trace(" Server: %llu message(s) echoed", @@ -106,6 +102,17 @@ static void diam_stats_timer_cb(void *data) ogs_trace("-------------------------------------"); /* Re-schedule timer: */ - ogs_timer_start(self.poll.timer, self.poll.t_interval); + since_prev = now - self.poll.t_prev; + /* Avoid increasing drift: */ + if (since_prev > self.poll.t_interval) { + if (since_prev - self.poll.t_interval >= self.poll.t_interval) + next_run = 1; /* 0 not accepted by ogs_timer_start() */ + else + next_run = self.poll.t_interval - (since_prev - self.poll.t_interval); + } else { + next_run = self.poll.t_interval; + } + self.poll.t_prev = now; + ogs_timer_start(self.poll.timer, next_run); } diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index 7dfb63b020..a3e446ded0 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -38,7 +38,8 @@ typedef struct ogs_diam_stats_s { struct poll { ogs_timer_t *timer; - struct timespec ts_start; + ogs_time_t t_start; /* in usecs */ + ogs_time_t t_prev; /* in usecs */ ogs_time_t t_interval; /* in usecs */ } poll; struct fd_stats { From 36d2fb3ebb9cecc40d2da46982f0123683ae47fd Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 19:35:27 +0200 Subject: [PATCH 217/323] diameter: stats: Move stats struct outside of context --- lib/diameter/common/stats.c | 10 +++++----- lib/diameter/common/stats.h | 24 +++++++++++++----------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index dcb145af51..e0be97d464 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -20,13 +20,13 @@ #include "ogs-diameter-common.h" #include "ogs-app.h" -static ogs_diam_stats_t self; +static ogs_diam_stats_ctx_t self; static void diam_stats_timer_cb(void *data); int ogs_diam_stats_init(int mode) { - memset(&self, 0, sizeof(ogs_diam_stats_t)); + memset(&self, 0, sizeof(ogs_diam_stats_ctx_t)); self.mode = mode; self.poll.t_interval = ogs_time_from_sec(60); /* 60 seconds */ @@ -46,7 +46,7 @@ void ogs_diam_stats_final() self.poll.timer = NULL; } -ogs_diam_stats_t* ogs_diam_stats_self() +ogs_diam_stats_ctx_t* ogs_diam_stats_self() { return &self; } @@ -66,11 +66,11 @@ int ogs_diam_stats_start() static void diam_stats_timer_cb(void *data) { ogs_time_t now, since_start, since_prev, next_run; - struct fd_stats copy; + ogs_diam_stats_t copy; /* Now, get the current stats */ CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); - memcpy(&copy, &self.stats, sizeof(struct fd_stats)); + memcpy(&copy, &self.stats, sizeof(ogs_diam_stats_t)); CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); /* Get the current execution time */ diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index a3e446ded0..ef3f679fb9 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -31,6 +31,16 @@ extern "C" { #include <sys/time.h> typedef struct ogs_diam_stats_s { + unsigned long long nb_echoed; /* server */ + unsigned long long nb_sent; /* client */ + unsigned long long nb_recv; /* client */ + unsigned long long nb_errs; /* client */ + unsigned long shortest; /* fastest answer, in microseconds */ + unsigned long longest; /* slowest answer, in microseconds */ + unsigned long avg; /* average answer time, in microseconds */ +} ogs_diam_stats_t; + +typedef struct ogs_diam_stats_ctx_s { #define FD_MODE_SERVER 0x1 #define FD_MODE_CLIENT 0x2 @@ -42,23 +52,15 @@ typedef struct ogs_diam_stats_s { ogs_time_t t_prev; /* in usecs */ ogs_time_t t_interval; /* in usecs */ } poll; - struct fd_stats { - unsigned long long nb_echoed; /* server */ - unsigned long long nb_sent; /* client */ - unsigned long long nb_recv; /* client */ - unsigned long long nb_errs; /* client */ - unsigned long shortest; /* fastest answer, in microseconds */ - unsigned long longest; /* slowest answer, in microseconds */ - unsigned long avg; /* average answer time, in microseconds */ - } stats; + ogs_diam_stats_t stats; pthread_mutex_t stats_lock; -} ogs_diam_stats_t; +} ogs_diam_stats_ctx_t; int ogs_diam_stats_init(int mode); void ogs_diam_stats_final(void); -ogs_diam_stats_t* ogs_diam_stats_self(void); +ogs_diam_stats_ctx_t* ogs_diam_stats_self(void); int ogs_diam_stats_start(void); From 91674ffa8a107022dfea14a49be1d74a24abaec6 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 19:26:20 +0200 Subject: [PATCH 218/323] diameter: stats: Split logging to helper function --- lib/diameter/common/stats.c | 49 ++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index e0be97d464..d3bdb7a4cd 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -62,6 +62,32 @@ int ogs_diam_stats_start() return 0; } +static void ogs_diam_stats_log(const ogs_diam_stats_t *stats, ogs_time_t elapsed) +{ + ogs_trace("------- fd statistics ---------"); + ogs_trace(" Executing for: %llu.%06llu sec", + (unsigned long long)ogs_time_sec(elapsed), + (unsigned long long)ogs_time_usec(elapsed)); + + if (self.mode & FD_MODE_SERVER) { + ogs_trace(" Server: %llu message(s) echoed", + stats->nb_echoed); + } + if (self.mode & FD_MODE_CLIENT) { + ogs_trace(" Client:"); + ogs_trace(" %llu message(s) sent", stats->nb_sent); + ogs_trace(" %llu error(s) received", stats->nb_errs); + ogs_trace(" %llu answer(s) received", stats->nb_recv); + ogs_trace(" fastest: %ld.%06ld sec.", + stats->shortest / 1000000, stats->shortest % 1000000); + ogs_trace(" slowest: %ld.%06ld sec.", + stats->longest / 1000000, stats->longest % 1000000); + ogs_trace(" Average: %ld.%06ld sec.", + stats->avg / 1000000, stats->avg % 1000000); + } + ogs_trace("-------------------------------------"); +} + /* Function to display statistics periodically */ static void diam_stats_timer_cb(void *data) { @@ -78,28 +104,7 @@ static void diam_stats_timer_cb(void *data) since_start = now - self.poll.t_start; /* Now, display everything */ - ogs_trace("------- fd statistics ---------"); - ogs_trace(" Executing for: %llu.%06llu sec", - (unsigned long long)ogs_time_sec(since_start), - (unsigned long long)ogs_time_usec(since_start)); - - if (self.mode & FD_MODE_SERVER) { - ogs_trace(" Server: %llu message(s) echoed", - copy.nb_echoed); - } - if (self.mode & FD_MODE_CLIENT) { - ogs_trace(" Client:"); - ogs_trace(" %llu message(s) sent", copy.nb_sent); - ogs_trace(" %llu error(s) received", copy.nb_errs); - ogs_trace(" %llu answer(s) received", copy.nb_recv); - ogs_trace(" fastest: %ld.%06ld sec.", - copy.shortest / 1000000, copy.shortest % 1000000); - ogs_trace(" slowest: %ld.%06ld sec.", - copy.longest / 1000000, copy.longest % 1000000); - ogs_trace(" Average: %ld.%06ld sec.", - copy.avg / 1000000, copy.avg % 1000000); - } - ogs_trace("-------------------------------------"); + ogs_diam_stats_log(&copy, since_start); /* Re-schedule timer: */ since_prev = now - self.poll.t_prev; From 4308ba7f375f81c9b42b8f4770ab7a703aacf378 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 3 Sep 2024 13:07:51 +0200 Subject: [PATCH 219/323] [HSS] Improve diameter based interface debug logs This way it's immediate to know whether stuff happens o nthe rx or the tx path when looking at logs or even at the code. --- src/hss/hss-cx-path.c | 16 ++++++++-------- src/hss/hss-s6a-path.c | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index a2ab075e67..4bfd34d847 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -66,7 +66,7 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("User-Authorization-Request"); + ogs_debug("Rx User-Authorization-Request"); /* Create answer header */ qry = *msg; @@ -163,7 +163,7 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("User-Authorization-Answer"); + ogs_debug("Tx User-Authorization-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -250,7 +250,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Multimedia-Auth-Request"); + ogs_debug("Rx Multimedia-Auth-Request"); /* Create answer header */ qry = *msg; @@ -552,7 +552,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Multimedia-Auth-Answer"); + ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -627,7 +627,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Server-Assignment-Request"); + ogs_debug("Rx Server-Assignment-Request"); /* Create answer header */ qry = *msg; @@ -812,7 +812,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Server-Assignment-Answer"); + ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -875,7 +875,7 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Location-Info-Request"); + ogs_debug("Rx Location-Info-Request"); /* Create answer header */ qry = *msg; @@ -933,7 +933,7 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Location-Info-Answer"); + ogs_debug("Tx Location-Info-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index b2d9b3a1f3..645a41d0f3 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -101,7 +101,7 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Authentication-Information-Request"); + ogs_debug("Rx Authentication-Information-Request"); /* Create answer header */ qry = *msg; @@ -262,7 +262,7 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Authentication-Information-Answer"); + ogs_debug("Tx Authentication-Information-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -771,7 +771,7 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Update-Location-Request"); + ogs_debug("Rx Update-Location-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -968,7 +968,7 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Update-Location-Answer"); + ogs_debug("Tx Update-Location-Answer"); /* Add this value to the stats */ ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -1039,7 +1039,7 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Purge-UE-Request"); + ogs_debug("Rx Purge-UE-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1125,7 +1125,7 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Purge-UE-Answer"); + ogs_debug("Tx Purge-UE-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -1174,7 +1174,7 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, struct sess_state *sess_data = NULL, *svg; struct session *session = NULL; - ogs_debug("[HSS] Cancel-Location-Request"); + ogs_debug("[HSS] Tx Cancel-Location-Request"); /* Create the random value to store with the session */ sess_data = ogs_calloc(1, sizeof(*sess_data)); @@ -1299,7 +1299,7 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Cancel-Location-Answer"); + ogs_debug("[HSS] Rx Cancel-Location-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); @@ -1348,7 +1348,7 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ogs_subscription_data_t subscription_data; - ogs_debug("[HSS] Insert-Subscriber-Data-Request"); + ogs_debug("[HSS] Tx Insert-Subscriber-Data-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -1503,7 +1503,7 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg) struct session *session; int new; - ogs_debug("[HSS] Insert-Subscriber-Data-Answer"); + ogs_debug("[HSS] Rx Insert-Subscriber-Data-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); From 902a602a2bebb241c133060ded56f6d20b16b784 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 3 Sep 2024 14:05:36 +0200 Subject: [PATCH 220/323] diameter: Support configuring stats interval through config file --- lib/diameter/common/base.h | 10 ++++++++++ lib/diameter/common/init.c | 4 +++- lib/diameter/common/ogs-diameter-common.h | 2 +- lib/diameter/common/stats.c | 8 ++++++-- lib/diameter/common/stats.h | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/diameter/common/base.h b/lib/diameter/common/base.h index 2cf8600ed3..2389dc717b 100644 --- a/lib/diameter/common/base.h +++ b/lib/diameter/common/base.h @@ -28,6 +28,12 @@ extern "C" { #endif +/* Configuration for ogs_diam_stats_ctx_t: */ +typedef struct ogs_diam_config_stats_s { + /* Frequency at which freeDiameter thread stats are updated to the app. 0 = default 60 seconds. */ + unsigned int interval_sec; +} ogs_diam_config_stats_t; + /* This is default diameter configuration if there is no config file * The Configuration : No TLS, Only TCP */ typedef struct ogs_diam_config_s { @@ -70,6 +76,10 @@ typedef struct ogs_diam_config_s { int tc_timer; /* TcTimer value to use for this peer, use default if 0 */ } conn[MAX_NUM_OF_FD_CONN]; int num_of_conn; + + /* Configure ogs_diam_stats_ctx_t: */ + ogs_diam_config_stats_t stats; + } ogs_diam_config_t; int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config); diff --git a/lib/diameter/common/init.c b/lib/diameter/common/init.c index a4aa8d93d0..738770104f 100644 --- a/lib/diameter/common/init.c +++ b/lib/diameter/common/init.c @@ -28,6 +28,8 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config) { int ret; + ogs_assert(fd_config); + gnutls_global_set_log_level(0); gnutls_global_set_log_function(diam_gnutls_log_func); @@ -58,7 +60,7 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config) CHECK_FCT_DO( ogs_diam_logger_init(), goto error ); /* Initialize FD stats */ - CHECK_FCT_DO( ogs_diam_stats_init(mode), goto error ); + CHECK_FCT_DO( ogs_diam_stats_init(mode, &fd_config->stats), goto error ); return 0; error: diff --git a/lib/diameter/common/ogs-diameter-common.h b/lib/diameter/common/ogs-diameter-common.h index 2aa605f977..69f61c95b7 100644 --- a/lib/diameter/common/ogs-diameter-common.h +++ b/lib/diameter/common/ogs-diameter-common.h @@ -43,8 +43,8 @@ #include "diameter/common/message.h" #include "diameter/common/logger.h" -#include "diameter/common/stats.h" #include "diameter/common/base.h" +#include "diameter/common/stats.h" #undef OGS_DIAMETER_INSIDE diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index d3bdb7a4cd..80d20b1e42 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -24,12 +24,15 @@ static ogs_diam_stats_ctx_t self; static void diam_stats_timer_cb(void *data); -int ogs_diam_stats_init(int mode) +int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config) { + ogs_assert(config); memset(&self, 0, sizeof(ogs_diam_stats_ctx_t)); self.mode = mode; - self.poll.t_interval = ogs_time_from_sec(60); /* 60 seconds */ + self.poll.t_interval = config->interval_sec > 0 ? + ogs_time_from_sec(config->interval_sec) : + ogs_time_from_sec(60); /* default 60 seconds */ self.poll.timer = ogs_timer_add(ogs_app()->timer_mgr, diam_stats_timer_cb, 0); ogs_assert(self.poll.timer); @@ -58,6 +61,7 @@ int ogs_diam_stats_start() /* Start the statistics timer */ self.poll.t_prev = self.poll.t_start; ogs_timer_start(self.poll.timer, self.poll.t_interval); + ogs_info("Polling freeDiameter stats every %lld seconds", (long long)self.poll.t_interval); return 0; } diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index ef3f679fb9..adc1d20381 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -57,7 +57,7 @@ typedef struct ogs_diam_stats_ctx_s { pthread_mutex_t stats_lock; } ogs_diam_stats_ctx_t; -int ogs_diam_stats_init(int mode); +int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config); void ogs_diam_stats_final(void); ogs_diam_stats_ctx_t* ogs_diam_stats_self(void); From a37a2099fc39d8d3c42a62b7d6fa072167cbea26 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 2 Sep 2024 20:18:40 +0200 Subject: [PATCH 221/323] diameter: Support updating app with private metrics --- lib/diameter/common/base.h | 3 +++ lib/diameter/common/stats.c | 30 ++++++++++++++++++++++++++++++ lib/diameter/common/stats.h | 9 +++++++++ 3 files changed, 42 insertions(+) diff --git a/lib/diameter/common/base.h b/lib/diameter/common/base.h index 2389dc717b..a44dece729 100644 --- a/lib/diameter/common/base.h +++ b/lib/diameter/common/base.h @@ -32,6 +32,9 @@ extern "C" { typedef struct ogs_diam_config_stats_s { /* Frequency at which freeDiameter thread stats are updated to the app. 0 = default 60 seconds. */ unsigned int interval_sec; + /* Size of struct to allocate for diameters private statistics, see ogs_diam_stats_ctx_t. + * Defaults to 0, no priv_stats allocated. */ + size_t priv_stats_size; } ogs_diam_config_stats_t; /* This is default diameter configuration if there is no config file diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index 80d20b1e42..f684a5dca5 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -36,6 +36,12 @@ int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config) self.poll.timer = ogs_timer_add(ogs_app()->timer_mgr, diam_stats_timer_cb, 0); ogs_assert(self.poll.timer); + if (config->priv_stats_size > 0) { + self.priv_stats_size = config->priv_stats_size; + self.priv_stats = ogs_calloc(1, self.priv_stats_size); + self.priv_stats_copy = ogs_calloc(1, self.priv_stats_size); + ogs_assert(self.priv_stats); + } CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) ); @@ -47,6 +53,13 @@ void ogs_diam_stats_final() if (self.poll.timer) ogs_timer_delete(self.poll.timer); self.poll.timer = NULL; + if (self.priv_stats) { + ogs_free(self.priv_stats); + ogs_free(self.priv_stats_copy); + self.priv_stats = NULL; + self.priv_stats_copy = NULL; + self.priv_stats_size = 0; + } } ogs_diam_stats_ctx_t* ogs_diam_stats_self() @@ -66,6 +79,16 @@ int ogs_diam_stats_start() return 0; } +void ogs_diam_stats_update_cb_register(ogs_diam_stats_update_cb cb) +{ + self.update_cb = cb; +} + +void ogs_diam_stats_update_cb_unregister(void) +{ + self.update_cb = NULL; +} + static void ogs_diam_stats_log(const ogs_diam_stats_t *stats, ogs_time_t elapsed) { ogs_trace("------- fd statistics ---------"); @@ -101,6 +124,8 @@ static void diam_stats_timer_cb(void *data) /* Now, get the current stats */ CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), ); memcpy(&copy, &self.stats, sizeof(ogs_diam_stats_t)); + if (self.priv_stats_copy) + memcpy(self.priv_stats_copy, self.priv_stats, self.priv_stats_size); CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), ); /* Get the current execution time */ @@ -110,7 +135,12 @@ static void diam_stats_timer_cb(void *data) /* Now, display everything */ ogs_diam_stats_log(&copy, since_start); + /* Trigger user callback: */ + if (self.update_cb) + self.update_cb(&copy, self.priv_stats_copy); + /* Re-schedule timer: */ + now = ogs_get_monotonic_time(); since_prev = now - self.poll.t_prev; /* Avoid increasing drift: */ if (since_prev > self.poll.t_interval) { diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index adc1d20381..6501b969f8 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -40,6 +40,8 @@ typedef struct ogs_diam_stats_s { unsigned long avg; /* average answer time, in microseconds */ } ogs_diam_stats_t; +typedef void (*ogs_diam_stats_update_cb)(const ogs_diam_stats_t *stats, const void *priv_stats); + typedef struct ogs_diam_stats_ctx_s { #define FD_MODE_SERVER 0x1 @@ -53,6 +55,10 @@ typedef struct ogs_diam_stats_ctx_s { ogs_time_t t_interval; /* in usecs */ } poll; ogs_diam_stats_t stats; + void *priv_stats; /* if !NULL, allocated struct of size "priv_stats_size" */ + size_t priv_stats_size; + void *priv_stats_copy; /* buffer where priv_state are copied and passed to update_cb */ + ogs_diam_stats_update_cb update_cb; pthread_mutex_t stats_lock; } ogs_diam_stats_ctx_t; @@ -64,6 +70,9 @@ ogs_diam_stats_ctx_t* ogs_diam_stats_self(void); int ogs_diam_stats_start(void); +void ogs_diam_stats_update_cb_register(ogs_diam_stats_update_cb cb); +void ogs_diam_stats_update_cb_unregister(void); + #ifdef __cplusplus } #endif From 9db907a56ee5c7908964271f0bb8d72bdff7a6f7 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 3 Sep 2024 13:30:26 +0200 Subject: [PATCH 222/323] [HSS] First diameter metric This commit showcases how to add diameter based metrics to an app. Follow-up commits will add further metrics for different diameter based interfaces. --- lib/diameter/common/stats.h | 8 ++++++++ src/hss/hss-context.c | 5 +++++ src/hss/hss-cx-path.c | 3 +++ src/hss/hss-fd-path.c | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/lib/diameter/common/stats.h b/lib/diameter/common/stats.h index 6501b969f8..281b22ffc1 100644 --- a/lib/diameter/common/stats.h +++ b/lib/diameter/common/stats.h @@ -67,6 +67,14 @@ int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config); void ogs_diam_stats_final(void); ogs_diam_stats_ctx_t* ogs_diam_stats_self(void); +#define OGS_DIAM_STATS_ADD(field, val) ogs_diam_stats_self()->stats.field += val +#define OGS_DIAM_STATS_INC(field) OGS_DIAM_STATS_ADD(field, 1) + +#define OGS_DIAM_STATS_MTX(code) \ + ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); \ + { code } \ + ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + int ogs_diam_stats_start(void); diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index a9c42bd6e3..d42c26655e 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -20,6 +20,7 @@ #include "ogs-dbi.h" #include "hss-context.h" #include "hss-event.h" +#include "hss-fd-path.h" #include "hss-s6a-path.h" @@ -144,6 +145,7 @@ static int hss_context_prepare(void) { self.diam_config->cnf_port = DIAMETER_PORT; self.diam_config->cnf_port_tls = DIAMETER_SECURE_PORT; + self.diam_config->stats.priv_stats_size = sizeof(hss_diam_stats_t); return OGS_OK; } @@ -338,6 +340,9 @@ int hss_context_parse_config(void) ogs_warn("unknown key `%s`", fd_key); } } + } else if (!strcmp(hss_key, "diameter_stats_interval")) { + const char *v = ogs_yaml_iter_value(&hss_iter); + if (v) self.diam_config->stats.interval_sec = atoi(v); } else if (!strcmp(hss_key, "sms_over_ims")) { self.sms_over_ims = ogs_yaml_iter_value(&hss_iter); diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index 4bfd34d847..46c789ba51 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -39,6 +39,9 @@ static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_unknown); + ) return ENOTSUP; } diff --git a/src/hss/hss-fd-path.c b/src/hss/hss-fd-path.c index a1021185ec..2576b6ebd1 100644 --- a/src/hss/hss-fd-path.c +++ b/src/hss/hss-fd-path.c @@ -22,6 +22,24 @@ #include "hss-context.h" #include "hss-fd-path.h" +static hss_diam_stats_t prev_st; + +static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void *priv_stats) +{ + const hss_diam_stats_t *st = (const hss_diam_stats_t *)priv_stats; + + ogs_debug("%s(): Update HSS diameter metrics", __func__); + + #define METRIC_ADD(metric_name, field) \ + { \ + int diff = st->field - prev_st.field; \ + if (diff > 0) hss_metrics_inst_global_add(metric_name, diff); \ + } + + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, cx.rx_unknown); + + memcpy(&prev_st, st, sizeof(*st)); +} int hss_fd_init(void) { int rv; @@ -37,6 +55,8 @@ int hss_fd_init(void) rv = hss_swx_init(); ogs_assert(rv == OGS_OK); + ogs_diam_stats_update_cb_register(hsss_diam_stats_update_cb); + rv = ogs_diam_start(); ogs_assert(rv == 0); From 7293b5f3e4482485f97543035f2445b64eccb1f7 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 3 Sep 2024 13:31:23 +0200 Subject: [PATCH 223/323] [HSS] Initial support for Cx diameter metrics --- src/hss/hss-cx-path.c | 52 ++++++++++++++++++++++++++-------- src/hss/hss-fd-path.c | 13 +++++++++ src/hss/hss-fd-path.h | 23 +++++++++++++++ src/hss/metrics.c | 66 +++++++++++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 13 +++++++++ 5 files changed, 155 insertions(+), 12 deletions(-) diff --git a/src/hss/hss-cx-path.c b/src/hss/hss-cx-path.c index 46c789ba51..18dbdc60ee 100644 --- a/src/hss/hss-cx-path.c +++ b/src/hss/hss-cx-path.c @@ -169,9 +169,11 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx User-Authorization-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_uaa); + ) ogs_free(user_name); ogs_free(public_identity); @@ -201,6 +203,11 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_uar_error); + ) + ogs_free(user_name); ogs_free(public_identity); ogs_free(visited_network_identifier); @@ -558,9 +565,11 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_maa); + ) if (authentication_scheme) ogs_free(authentication_scheme); @@ -596,6 +605,11 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp, if (authentication_scheme) ogs_free(authentication_scheme); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_mar_error); + ) + ogs_free(user_name); ogs_free(public_identity); ogs_free(server_name); @@ -818,9 +832,11 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(cx.tx_saa); + ) if (user_data) ogs_free(user_data); @@ -852,6 +868,11 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(cx.rx_sar_error); + ) + if (user_data) ogs_free(user_data); ogs_free(user_name); @@ -939,9 +960,11 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Location-Info-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir); + HSS_DIAM_PRIV_STATS_INC(cx.tx_lia); + ) ogs_free(public_identity); @@ -969,6 +992,11 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir); + HSS_DIAM_PRIV_STATS_INC(cx.rx_lir_error); + ) + ogs_free(public_identity); return 0; diff --git a/src/hss/hss-fd-path.c b/src/hss/hss-fd-path.c index 2576b6ebd1..af0b33350b 100644 --- a/src/hss/hss-fd-path.c +++ b/src/hss/hss-fd-path.c @@ -37,9 +37,22 @@ static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void } METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, cx.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_MAR, cx.rx_mar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR, cx.rx_mar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_SAR, cx.rx_sar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR, cx.rx_sar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UAR, cx.rx_uar); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR, cx.rx_uar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_LIR, cx.rx_lir); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR, cx.rx_lir_error); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_MAA, cx.tx_maa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_SAA, cx.tx_saa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_UAA, cx.tx_uaa); + METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_LIA, cx.tx_lia); memcpy(&prev_st, st, sizeof(*st)); } + int hss_fd_init(void) { int rv; diff --git a/src/hss/hss-fd-path.h b/src/hss/hss-fd-path.h index 3f88c35e72..d185cd913e 100644 --- a/src/hss/hss-fd-path.h +++ b/src/hss/hss-fd-path.h @@ -24,6 +24,29 @@ extern "C" { #endif +typedef struct hss_diam_stats_cx_s { + unsigned long long rx_unknown; + unsigned long long rx_mar; + unsigned long long rx_mar_error; + unsigned long long rx_sar; + unsigned long long rx_sar_error; + unsigned long long rx_uar; + unsigned long long rx_uar_error; + unsigned long long rx_lir; + unsigned long long rx_lir_error; + unsigned long long tx_maa; + unsigned long long tx_saa; + unsigned long long tx_uaa; + unsigned long long tx_lia; +} hss_diam_stats_cx_t; + +typedef struct hss_diam_stats_s { + hss_diam_stats_cx_t cx; +} hss_diam_stats_t; + +#define HSS_DIAM_PRIV_STATS_ADD(field, val) ((hss_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val +#define HSS_DIAM_PRIV_STATS_INC(field) HSS_DIAM_PRIV_STATS_ADD(field, 1) + int hss_fd_init(void); void hss_fd_final(void); diff --git a/src/hss/metrics.c b/src/hss/metrics.c index b14426095f..2302a024ef 100644 --- a/src/hss/metrics.c +++ b/src/hss/metrics.c @@ -49,6 +49,72 @@ static int hss_metrics_init_spec(ogs_metrics_context_t *ctx, ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { +/* Global Counters: */ +[HSS_METR_GLOB_CTR_CX_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_unknown", + .description = "Received Cx unknown messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_MAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_mar", + .description = "Received Cx MAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_mar_error", + .description = "Received Cx MAR messages failed", +}, +[HSS_METR_GLOB_CTR_CX_RX_SAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_sar", + .description = "Received Cx SAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_sar_error", + .description = "Received Cx SAR messages failed", +}, +[HSS_METR_GLOB_CTR_CX_RX_UAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_uar", + .description = "Received Cx UAR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_uar_error", + .description = "Received Cx UAR messages failed", +}, +[HSS_METR_GLOB_CTR_CX_RX_LIR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_lir", + .description = "Transmitted Cx LIR messages", +}, +[HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_rx_lir_error", + .description = "Transmitted Cx LIR messages failed", +}, +[HSS_METR_GLOB_CTR_CX_TX_MAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_maa", + .description = "Transmitted Cx MAA messages", +}, +[HSS_METR_GLOB_CTR_CX_TX_SAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_saa", + .description = "Transmitted Cx SAA messages", +}, +[HSS_METR_GLOB_CTR_CX_TX_UAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_uaa", + .description = "Transmitted Cx UAA messages", +}, +[HSS_METR_GLOB_CTR_CX_TX_LIA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "cx_tx_lia", + .description = "Transmitted Cx LIA messages", +}, /* Global Gauges: */ [HSS_METR_GLOB_GAUGE_IMSI] = { .type = OGS_METRICS_METRIC_TYPE_GAUGE, diff --git a/src/hss/metrics.h b/src/hss/metrics.h index c0b36a33f9..e775343383 100644 --- a/src/hss/metrics.h +++ b/src/hss/metrics.h @@ -9,6 +9,19 @@ extern "C" { /* GLOBAL */ typedef enum hss_metric_type_global_s { + HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, + HSS_METR_GLOB_CTR_CX_RX_MAR, + HSS_METR_GLOB_CTR_CX_RX_MAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_SAR, + HSS_METR_GLOB_CTR_CX_RX_SAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_UAR, + HSS_METR_GLOB_CTR_CX_RX_UAR_ERROR, + HSS_METR_GLOB_CTR_CX_RX_LIR, + HSS_METR_GLOB_CTR_CX_RX_LIR_ERROR, + HSS_METR_GLOB_CTR_CX_TX_MAA, + HSS_METR_GLOB_CTR_CX_TX_SAA, + HSS_METR_GLOB_CTR_CX_TX_UAA, + HSS_METR_GLOB_CTR_CX_TX_LIA, HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU, From b2f56b964133bbe2f6ab07ead4cb62524528fcf7 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Tue, 3 Sep 2024 19:23:02 +0200 Subject: [PATCH 224/323] [HSS] Initial support for S6a diameter metrics --- src/hss/hss-fd-path.c | 17 ++++++++ src/hss/hss-fd-path.h | 20 +++++++++ src/hss/hss-s6a-path.c | 98 +++++++++++++++++++++++++++++++----------- src/hss/metrics.c | 82 +++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 18 ++++++++ 5 files changed, 210 insertions(+), 25 deletions(-) diff --git a/src/hss/hss-fd-path.c b/src/hss/hss-fd-path.c index af0b33350b..9c4204bd39 100644 --- a/src/hss/hss-fd-path.c +++ b/src/hss/hss-fd-path.c @@ -50,6 +50,23 @@ static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_UAA, cx.tx_uaa); METRIC_ADD(HSS_METR_GLOB_CTR_CX_TX_LIA, cx.tx_lia); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN, s6a.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_AIR, s6a.rx_air); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR, s6a.rx_air_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_CLA, s6a.rx_cla); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR, s6a.rx_cla_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_IDA, s6a.rx_ida); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR, s6a.rx_ida_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_PUR, s6a.rx_pur); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR, s6a.rx_pur_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_ULR, s6a.rx_ulr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR, s6a.rx_ulr_error); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_AIA, s6a.tx_aia); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_CLR, s6a.tx_clr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_IDR, s6a.tx_idr); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_PUA, s6a.tx_pua); + METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_ULA, s6a.tx_ula); + memcpy(&prev_st, st, sizeof(*st)); } diff --git a/src/hss/hss-fd-path.h b/src/hss/hss-fd-path.h index d185cd913e..458dd09af8 100644 --- a/src/hss/hss-fd-path.h +++ b/src/hss/hss-fd-path.h @@ -40,8 +40,28 @@ typedef struct hss_diam_stats_cx_s { unsigned long long tx_lia; } hss_diam_stats_cx_t; +typedef struct hss_diam_stats_s6a_s { + unsigned long long rx_unknown; + unsigned long long rx_air; + unsigned long long rx_air_error; + unsigned long long rx_cla; + unsigned long long rx_cla_error; + unsigned long long rx_ida; + unsigned long long rx_ida_error; + unsigned long long rx_pur; + unsigned long long rx_pur_error; + unsigned long long rx_ulr; + unsigned long long rx_ulr_error; + unsigned long long tx_aia; + unsigned long long tx_clr; + unsigned long long tx_idr; + unsigned long long tx_pua; + unsigned long long tx_ula; +} hss_diam_stats_s6a_t; + typedef struct hss_diam_stats_s { hss_diam_stats_cx_t cx; + hss_diam_stats_s6a_t s6a; } hss_diam_stats_t; #define HSS_DIAM_PRIV_STATS_ADD(field, val) ((hss_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 645a41d0f3..e078f943a6 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -63,6 +63,9 @@ static int hss_ogs_diam_s6a_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_unknown); + ) return ENOTSUP; } @@ -265,9 +268,11 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Authentication-Information-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_aia); + ) return 0; @@ -292,6 +297,11 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_air_error); + ) + return 0; } @@ -971,9 +981,11 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Update-Location-Answer"); /* Add this value to the stats */ - ogs_assert( pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert( pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_ula); + ) ogs_subscription_data_free(&subscription_data); @@ -1007,6 +1019,11 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ulr_error); + ) + ogs_subscription_data_free(&subscription_data); if (imsi_bcd) @@ -1128,9 +1145,11 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Purge-UE-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_pua); + ) ogs_subscription_data_free(&subscription_data); @@ -1157,6 +1176,12 @@ static int hss_ogs_diam_s6a_pur_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_pur_error); + ) + ogs_subscription_data_free(&subscription_data); return 0; @@ -1284,9 +1309,10 @@ void hss_s6a_send_clr(char *imsi_bcd, char *mme_host, char *mme_realm, ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_clr); + ) } @@ -1305,25 +1331,25 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); if (ret != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } if (new != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if (!sess_data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if ((void *)sess_data != data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } ret = fd_msg_free(*msg); @@ -1331,7 +1357,17 @@ static void hss_s6a_cla_cb(void *data, struct msg **msg) *msg = NULL; state_cleanup(sess_data, NULL, NULL); + + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla); + ) return; + +out: + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_cla_error); + ) } /* HSS Sends Insert Subscriber Data Request to MME */ @@ -1485,9 +1521,10 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdata_mask) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + HSS_DIAM_PRIV_STATS_INC(s6a.tx_idr); + ) ogs_subscription_data_free(&subscription_data); @@ -1509,25 +1546,25 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg) ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); if (ret != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } if (new != 0) { ogs_error("fd_msg_sess_get() failed"); - return; + goto out; } ret = fd_sess_state_retrieve(hss_s6a_reg, session, &sess_data); if (ret != 0) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if (!sess_data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } if ((void *)sess_data != data) { ogs_error("fd_sess_state_retrieve() failed"); - return; + goto out; } ret = fd_msg_free(*msg); @@ -1535,6 +1572,17 @@ static void hss_s6a_ida_cb(void *data, struct msg **msg) *msg = NULL; state_cleanup(sess_data, NULL, NULL); + + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida); + ) + return; + +out: + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida); + HSS_DIAM_PRIV_STATS_INC(s6a.rx_ida_error); + ) return; } diff --git a/src/hss/metrics.c b/src/hss/metrics.c index 2302a024ef..65e3c9e9ad 100644 --- a/src/hss/metrics.c +++ b/src/hss/metrics.c @@ -50,6 +50,7 @@ ogs_metrics_spec_t *hss_metrics_spec_global[_HSS_METR_GLOB_MAX]; ogs_metrics_inst_t *hss_metrics_inst_global[_HSS_METR_GLOB_MAX]; hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { /* Global Counters: */ +/* Global Counters: Cx */ [HSS_METR_GLOB_CTR_CX_RX_UNKNOWN] = { .type = OGS_METRICS_METRIC_TYPE_COUNTER, .name = "cx_rx_unknown", @@ -115,6 +116,87 @@ hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { .name = "cx_tx_lia", .description = "Transmitted Cx LIA messages", }, +/* Global Counters: S6a */ +[HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_unknown", + .description = "Received S6a unknown messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_AIR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_air", + .description = "Received S6a AIR messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_air_error", + .description = "Received S6a AIR messages failed", +}, +[HSS_METR_GLOB_CTR_S6a_RX_CLA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_cla", + .description = "Received S6a CLA messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_cla_error", + .description = "Received S6a CLA messages failed", +}, +[HSS_METR_GLOB_CTR_S6a_RX_IDA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ida", + .description = "Received S6a IDA messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ida_error", + .description = "Received S6a IDA messages failed", +}, +[HSS_METR_GLOB_CTR_S6a_RX_PUR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_pur", + .description = "Transmitted S6a PUR messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_pur_error", + .description = "Transmitted S6a PUR messages failed", +}, +[HSS_METR_GLOB_CTR_S6a_RX_ULR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ulr", + .description = "Transmitted S6a ULR messages", +}, +[HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_rx_ulr_error", + .description = "Transmitted S6a ULR messages failed", +}, +[HSS_METR_GLOB_CTR_S6a_TX_AIA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_aia", + .description = "Transmitted S6a AIA messages", +}, +[HSS_METR_GLOB_CTR_S6a_TX_CLR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_clr", + .description = "Transmitted S6a CLR messages", +}, +[HSS_METR_GLOB_CTR_S6a_TX_IDR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_idr", + .description = "Transmitted S6a IDR messages", +}, +[HSS_METR_GLOB_CTR_S6a_TX_PUA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_pua", + .description = "Transmitted S6a PUA messages", +}, +[HSS_METR_GLOB_CTR_S6a_TX_ULA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "s6a_tx_ula", + .description = "Transmitted S6a ULA messages", +}, /* Global Gauges: */ [HSS_METR_GLOB_GAUGE_IMSI] = { .type = OGS_METRICS_METRIC_TYPE_GAUGE, diff --git a/src/hss/metrics.h b/src/hss/metrics.h index e775343383..f86b535371 100644 --- a/src/hss/metrics.h +++ b/src/hss/metrics.h @@ -22,6 +22,24 @@ typedef enum hss_metric_type_global_s { HSS_METR_GLOB_CTR_CX_TX_SAA, HSS_METR_GLOB_CTR_CX_TX_UAA, HSS_METR_GLOB_CTR_CX_TX_LIA, + + HSS_METR_GLOB_CTR_S6a_RX_UNKNOWN, + HSS_METR_GLOB_CTR_S6a_RX_AIR, + HSS_METR_GLOB_CTR_S6a_RX_AIR_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_CLA, + HSS_METR_GLOB_CTR_S6a_RX_CLA_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_IDA, + HSS_METR_GLOB_CTR_S6a_RX_IDA_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_PUR, + HSS_METR_GLOB_CTR_S6a_RX_PUR_ERROR, + HSS_METR_GLOB_CTR_S6a_RX_ULR, + HSS_METR_GLOB_CTR_S6a_RX_ULR_ERROR, + HSS_METR_GLOB_CTR_S6a_TX_AIA, + HSS_METR_GLOB_CTR_S6a_TX_CLR, + HSS_METR_GLOB_CTR_S6a_TX_IDR, + HSS_METR_GLOB_CTR_S6a_TX_PUA, + HSS_METR_GLOB_CTR_S6a_TX_ULA, + HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU, From 5b66e3159a87522769db272554cd6c20d8dbe841 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 13:51:48 +0200 Subject: [PATCH 225/323] [HSS] Improve SWx diameter debug logs --- src/hss/hss-swx-path.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hss/hss-swx-path.c b/src/hss/hss-swx-path.c index be8d4a9767..24086fc811 100644 --- a/src/hss/hss-swx-path.c +++ b/src/hss/hss-swx-path.c @@ -80,7 +80,7 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Multimedia-Auth-Request"); + ogs_debug("Rx Multimedia-Auth-Request"); /* Create answer header */ qry = *msg; @@ -331,7 +331,7 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Multimedia-Auth-Answer"); + ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -408,7 +408,7 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp, ogs_assert(msg); - ogs_debug("Server-Assignment-Request"); + ogs_debug("Rx Server-Assignment-Request"); memset(&subscription_data, 0, sizeof(ogs_subscription_data_t)); @@ -854,7 +854,7 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("Server-Assignment-Answer"); + ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); From 3e154f957190b1a70862c8bd37f48449a1083ffd Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 14:04:00 +0200 Subject: [PATCH 226/323] [HSS] Initial support for SWx diameter metrics --- src/hss/hss-fd-path.c | 8 ++++++++ src/hss/hss-fd-path.h | 11 +++++++++++ src/hss/hss-swx-path.c | 29 +++++++++++++++++++++++------ src/hss/metrics.c | 36 ++++++++++++++++++++++++++++++++++++ src/hss/metrics.h | 8 ++++++++ 5 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/hss/hss-fd-path.c b/src/hss/hss-fd-path.c index 9c4204bd39..ffac26c700 100644 --- a/src/hss/hss-fd-path.c +++ b/src/hss/hss-fd-path.c @@ -67,6 +67,14 @@ static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_PUA, s6a.tx_pua); METRIC_ADD(HSS_METR_GLOB_CTR_S6a_TX_ULA, s6a.tx_ula); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN, swx.rx_unknown); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_MAR, swx.rx_mar); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR, swx.rx_mar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_SAR, swx.rx_sar); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR, swx.rx_sar_error); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_TX_MAA, swx.tx_maa); + METRIC_ADD(HSS_METR_GLOB_CTR_SWx_TX_SAA, swx.tx_saa); + memcpy(&prev_st, st, sizeof(*st)); } diff --git a/src/hss/hss-fd-path.h b/src/hss/hss-fd-path.h index 458dd09af8..5fa8f0a1ce 100644 --- a/src/hss/hss-fd-path.h +++ b/src/hss/hss-fd-path.h @@ -59,9 +59,20 @@ typedef struct hss_diam_stats_s6a_s { unsigned long long tx_ula; } hss_diam_stats_s6a_t; +typedef struct hss_diam_stats_swx_s { + unsigned long long rx_unknown; + unsigned long long rx_mar; + unsigned long long rx_mar_error; + unsigned long long rx_sar; + unsigned long long rx_sar_error; + unsigned long long tx_maa; + unsigned long long tx_saa; +} hss_diam_stats_swx_t; + typedef struct hss_diam_stats_s { hss_diam_stats_cx_t cx; hss_diam_stats_s6a_t s6a; + hss_diam_stats_swx_t swx; } hss_diam_stats_t; #define HSS_DIAM_PRIV_STATS_ADD(field, val) ((hss_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val diff --git a/src/hss/hss-swx-path.c b/src/hss/hss-swx-path.c index 24086fc811..d9490e32a8 100644 --- a/src/hss/hss-swx-path.c +++ b/src/hss/hss-swx-path.c @@ -35,6 +35,9 @@ static int hss_ogs_diam_swx_fb_cb(struct msg **msg, struct avp *avp, { /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_unknown); + ) return ENOTSUP; } @@ -334,9 +337,11 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Multimedia-Auth-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(swx.tx_maa); + ) if (authentication_scheme) ogs_free(authentication_scheme); @@ -377,6 +382,11 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar); + HSS_DIAM_PRIV_STATS_INC(swx.rx_mar_error); + ) + if (authentication_scheme) ogs_free(authentication_scheme); @@ -857,9 +867,11 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Server-Assignment-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(swx.tx_saa); + ) ogs_subscription_data_free(&subscription_data); ogs_free(user_name); @@ -898,6 +910,11 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar); + HSS_DIAM_PRIV_STATS_INC(swx.rx_sar_error); + ) + ogs_subscription_data_free(&subscription_data); ogs_free(user_name); diff --git a/src/hss/metrics.c b/src/hss/metrics.c index 65e3c9e9ad..63f3c69cd0 100644 --- a/src/hss/metrics.c +++ b/src/hss/metrics.c @@ -197,6 +197,42 @@ hss_metrics_spec_def_t hss_metrics_spec_def_global[_HSS_METR_GLOB_MAX] = { .name = "s6a_tx_ula", .description = "Transmitted S6a ULA messages", }, +/* Global Counters: SWx */ +[HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_unknown", + .description = "Received SWx unknown messages", +}, +[HSS_METR_GLOB_CTR_SWx_RX_MAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_mar", + .description = "Received SWx MAR messages", +}, +[HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_mar_error", + .description = "Received SWx MAR messages failed", +}, +[HSS_METR_GLOB_CTR_SWx_RX_SAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_sar", + .description = "Received SWx SAR messages", +}, +[HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_rx_sar_error", + .description = "Received SWx SAR messages failed", +}, +[HSS_METR_GLOB_CTR_SWx_TX_MAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_tx_maa", + .description = "Transmitted SWx MAA messages", +}, +[HSS_METR_GLOB_CTR_SWx_TX_SAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "swx_tx_saa", + .description = "Transmitted SWx SAA messages", +}, /* Global Gauges: */ [HSS_METR_GLOB_GAUGE_IMSI] = { .type = OGS_METRICS_METRIC_TYPE_GAUGE, diff --git a/src/hss/metrics.h b/src/hss/metrics.h index f86b535371..e03dcad651 100644 --- a/src/hss/metrics.h +++ b/src/hss/metrics.h @@ -40,6 +40,14 @@ typedef enum hss_metric_type_global_s { HSS_METR_GLOB_CTR_S6a_TX_PUA, HSS_METR_GLOB_CTR_S6a_TX_ULA, + HSS_METR_GLOB_CTR_SWx_RX_UNKNOWN, + HSS_METR_GLOB_CTR_SWx_RX_MAR, + HSS_METR_GLOB_CTR_SWx_RX_MAR_ERROR, + HSS_METR_GLOB_CTR_SWx_RX_SAR, + HSS_METR_GLOB_CTR_SWx_RX_SAR_ERROR, + HSS_METR_GLOB_CTR_SWx_TX_MAA, + HSS_METR_GLOB_CTR_SWx_TX_SAA, + HSS_METR_GLOB_GAUGE_IMSI, HSS_METR_GLOB_GAUGE_IMPI, HSS_METR_GLOB_GAUGE_IMPU, From 219cda9b4fac47a99744ca398b7291a4080f5960 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 4 Sep 2024 22:00:29 +0900 Subject: [PATCH 227/323] [MME/AMF] Fixed problem in MacOSX machine 1. transfer needs 192.168.x.50 2. Compilation error in namf-build.c in MaxOSX 3. enb_ue can be NULL in esm-sm.c --- misc/netconf.sh | 4 ++++ src/amf/namf-build.c | 3 +-- src/mme/esm-sm.c | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/misc/netconf.sh b/misc/netconf.sh index d6a16b56ea..7a0999eab1 100755 --- a/misc/netconf.sh +++ b/misc/netconf.sh @@ -45,6 +45,7 @@ else ifconfig lo0 alias 127.0.0.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.0.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.0.202 netmask 255.255.255.255 @@ -70,6 +71,7 @@ else ifconfig lo0 alias 127.0.1.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.1.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.1.202 netmask 255.255.255.255 @@ -95,6 +97,7 @@ else ifconfig lo0 alias 127.0.2.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.2.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.2.202 netmask 255.255.255.255 @@ -120,6 +123,7 @@ else ifconfig lo0 alias 127.0.3.18 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.19 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.20 netmask 255.255.255.255 + ifconfig lo0 alias 127.0.3.50 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.200 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.201 netmask 255.255.255.255 ifconfig lo0 alias 127.0.3.202 netmask 255.255.255.255 diff --git a/src/amf/namf-build.c b/src/amf/namf-build.c index 63bb8864aa..f4721f3066 100644 --- a/src/amf/namf-build.c +++ b/src/amf/namf-build.c @@ -126,8 +126,7 @@ ogs_sbi_request_t *amf_namf_comm_build_registration_status_update( memset(&UeRegStatusUpdateReqData, 0, sizeof(UeRegStatusUpdateReqData)); - UeRegStatusUpdateReqData.transfer_status = - (OpenAPI_ue_context_transfer_status_e)data; + UeRegStatusUpdateReqData.transfer_status = OGS_POINTER_TO_UINT(data); /* * TS 29.518 * 5.2.2.2.2 Registration Status Update diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 290bfb536d..d4575ded36 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -309,13 +309,13 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_assert(message); enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_assert(enb_ue); switch (message->esm.h.message_type) { case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("PDN Connectivity request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + ogs_assert(enb_ue); rv = esm_handle_pdn_connectivity_request( enb_ue, bearer, &message->esm.pdn_connectivity_request, e->create_action); @@ -330,6 +330,8 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("PDN disconnect request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + + ogs_assert(enb_ue); if (MME_HAVE_SGW_S1U_PATH(sess)) { sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -371,6 +373,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("Bearer resource allocation request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + ogs_assert(enb_ue); esm_handle_bearer_resource_allocation_request( enb_ue, bearer, message); break; @@ -378,6 +381,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("Bearer resource modification request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", mme_ue->imsi_bcd, sess->pti, bearer->ebi); + ogs_assert(enb_ue); esm_handle_bearer_resource_modification_request( enb_ue, bearer, message); break; From 34220b94cf7133f794d5f24f0a647d691f693994 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 20:44:54 +0200 Subject: [PATCH 228/323] diameter: stats: Fix unit typo in log --- lib/diameter/common/stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diameter/common/stats.c b/lib/diameter/common/stats.c index f684a5dca5..c4dbf7e4ff 100644 --- a/lib/diameter/common/stats.c +++ b/lib/diameter/common/stats.c @@ -74,7 +74,7 @@ int ogs_diam_stats_start() /* Start the statistics timer */ self.poll.t_prev = self.poll.t_start; ogs_timer_start(self.poll.timer, self.poll.t_interval); - ogs_info("Polling freeDiameter stats every %lld seconds", (long long)self.poll.t_interval); + ogs_info("Polling freeDiameter stats every %lld usecs", (long long)self.poll.t_interval); return 0; } From 95e885bfba66add950c6b576a8a266fc20fdabaf Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 19:47:49 +0200 Subject: [PATCH 229/323] [PCRF] cosmetic: Fix trailing whitespace --- src/pcrf/pcrf-rx-path.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index 4c8db63d5b..de7a365e8d 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -39,9 +39,9 @@ static OGS_POOL(sess_state_pool, struct sess_state); static ogs_thread_mutex_t sess_state_mutex; static struct session_handler *pcrf_rx_reg = NULL; -static struct disp_hdl *hdl_rx_fb = NULL; -static struct disp_hdl *hdl_rx_aar = NULL; -static struct disp_hdl *hdl_rx_str = NULL; +static struct disp_hdl *hdl_rx_fb = NULL; +static struct disp_hdl *hdl_rx_aar = NULL; +static struct disp_hdl *hdl_rx_str = NULL; static void pcrf_rx_asa_cb(void *data, struct msg **msg); @@ -91,7 +91,7 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque) ogs_thread_mutex_unlock(&sess_state_mutex); } -static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, +static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { /* This CB should never be called */ @@ -100,7 +100,7 @@ static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, return ENOTSUP; } -static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, +static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { int rv; @@ -418,7 +418,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); ogs_ims_data_free(&rx_message.ims_data); - + return 0; out: @@ -438,7 +438,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ret = ogs_diam_message_experimental_rescode_set(ans, result_code); ogs_assert(ret == 0); } - + ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); @@ -504,7 +504,7 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) /* Update State */ sess_data->state = SESSION_ABORTED; sess_data->abort_cause = abort_cause; - + /* Set Origin-Host & Origin-Realm */ ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); @@ -547,15 +547,15 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); ogs_assert(ret == 0); - /* Keep a pointer to the session data for debug purpose, + /* Keep a pointer to the session data for debug purpose, * in real life we would not need it */ svg = sess_data; - + /* Store this value in the session */ ret = fd_sess_state_store(pcrf_rx_reg, session, &sess_data); ogs_assert(ret == 0); ogs_assert(sess_data == NULL); - + /* Send the request */ ret = fd_msg_send(&req, pcrf_rx_asa_cb, svg); ogs_assert(ret == 0); @@ -584,7 +584,7 @@ static void pcrf_rx_asa_cb(void *data, struct msg **msg) ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); ogs_assert(ret == 0); ogs_assert(new == 0); - + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -646,7 +646,7 @@ static void pcrf_rx_asa_cb(void *data, struct msg **msg) return; } -static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, +static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { int rv; @@ -752,7 +752,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); - + return 0; out: @@ -773,7 +773,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, (char *)"DIAMETER_MISSING_AVP", NULL, NULL, 1); ogs_assert(ret == 0); } - + ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); ogs_debug("[PCRF] Session-Termination-Answer"); From 7bf057ce00238800dde220be85713351e7eb9437 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 19:49:25 +0200 Subject: [PATCH 230/323] [PCRF] Improve diameter logging --- src/pcrf/pcrf-gx-path.c | 8 ++++---- src/pcrf/pcrf-rx-path.c | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index 99022fbed5..f6ddd1a1b9 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -235,7 +235,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, uint32_t cc_request_number = 0; uint32_t result_code = OGS_DIAM_MISSING_AVP; - ogs_debug("[Credit-Control-Request]"); + ogs_debug("Rx Credit-Control-Request"); ogs_assert(msg); @@ -618,7 +618,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("[Credit-Control-Answer]"); + ogs_debug("Tx Credit-Control-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -689,7 +689,7 @@ int pcrf_gx_send_rar( ogs_assert(rx_sid); ogs_assert(rx_message); - ogs_debug("[PCRF] Re-Auth-Request"); + ogs_debug("[PCRF] Tx Re-Auth-Request"); /* Initialize Message */ memset(&gx_message, 0, sizeof(ogs_diam_gx_message_t)); @@ -1049,7 +1049,7 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) uint32_t result_code; - ogs_debug("[PCRF] Re-Auth-Answer"); + ogs_debug("[PCRF] Rx Re-Auth-Answer"); ret = clock_gettime(CLOCK_REALTIME, &ts); ogs_assert(ret == 0); diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index de7a365e8d..5b4559ba30 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -122,7 +122,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, os0_t gx_sid = NULL; uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE; - ogs_debug("[PCRF] AA-Request"); + ogs_debug("[PCRF] Rx AA-Request"); ogs_assert(msg); ogs_assert(sess); @@ -410,7 +410,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("[PCRF] AA-Answer"); + ogs_debug("[PCRF] Tx AA-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -462,7 +462,7 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) ogs_assert(rx_sid); - ogs_debug("[PCRF] Abort-Session-Request"); + ogs_debug("[PCRF] Tx Abort-Session-Request"); /* Retrieve session by Session-Id */ sidlen = strlen((char *)rx_sid); @@ -578,7 +578,7 @@ static void pcrf_rx_asa_cb(void *data, struct msg **msg) int new; int result_code = 0; - ogs_debug("[PCRF] Abort-Session-Answer"); + ogs_debug("[PCRF] Rx Abort-Session-Answer"); /* Search the session, retrieve its data */ ret = fd_msg_sess_get(fd_g_config->cnf_dict, *msg, &session, &new); @@ -661,7 +661,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE; - ogs_debug("[PCRF] Session-Termination-Request"); + ogs_debug("[PCRF] Rx Session-Termination-Request"); ogs_assert(msg); ogs_assert(sess); @@ -743,7 +743,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("[PCRF] Session-Termination-Answer"); + ogs_debug("[PCRF] Tx Session-Termination-Answer"); /* Add this value to the stats */ ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); @@ -776,7 +776,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); - ogs_debug("[PCRF] Session-Termination-Answer"); + ogs_debug("[PCRF] Tx Session-Termination-Answer"); if (sess_data) state_cleanup(sess_data, NULL, NULL); From 787e55550183a661943d84ab67239c92f0be698c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 21:28:27 +0200 Subject: [PATCH 231/323] [PCRF] Enable ogs_app pollset This will be needed once metrics are included. --- src/pcrf/pcrf-init.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/pcrf/pcrf-init.c b/src/pcrf/pcrf-init.c index 2635f87808..9821908a8a 100644 --- a/src/pcrf/pcrf-init.c +++ b/src/pcrf/pcrf-init.c @@ -20,6 +20,9 @@ #include "pcrf-context.h" #include "pcrf-fd-path.h" +static ogs_thread_t *thread; +static void pcrf_main(void *data); + static int initialized = 0; int pcrf_initialize(void) @@ -47,6 +50,9 @@ int pcrf_initialize(void) rv = pcrf_fd_init(); if (rv != OGS_OK) return OGS_ERROR; + thread = ogs_thread_create(pcrf_main, NULL); + if (!thread) return OGS_ERROR; + initialized = 1; return OGS_OK; @@ -66,3 +72,24 @@ void pcrf_terminate(void) return; } + +static void pcrf_main(void *data) +{ + for ( ;; ) { + ogs_pollset_poll(ogs_app()->pollset, + ogs_timer_mgr_next(ogs_app()->timer_mgr)); + + /* + * After ogs_pollset_poll(), ogs_timer_mgr_expire() must be called. + * + * The reason is why ogs_timer_mgr_next() can get the corrent value + * when ogs_timer_stop() is called internally in ogs_timer_mgr_expire(). + * + * You should not use event-queue before ogs_timer_mgr_expire(). + * In this case, ogs_timer_mgr_expire() does not work + * because 'if rv == OGS_DONE' statement is exiting and + * not calling ogs_timer_mgr_expire(). + */ + ogs_timer_mgr_expire(ogs_app()->timer_mgr); + } +} From 778d0cbc596a53529b2b32f0126ca4d23618061a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 5 Sep 2024 21:26:27 +0900 Subject: [PATCH 232/323] [PCRF/HSS] Enable Metrics (#3442) --- configs/open5gs/hss.yaml.in | 4 ++++ configs/open5gs/pcrf.yaml.in | 4 ++++ src/pcrf/meson.build | 14 ++++++++++-- src/pcrf/pcrf-context.c | 2 ++ src/pcrf/pcrf-init.c | 41 ++++++++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/configs/open5gs/hss.yaml.in b/configs/open5gs/hss.yaml.in index 2816bb8187..861e8163c2 100644 --- a/configs/open5gs/hss.yaml.in +++ b/configs/open5gs/hss.yaml.in @@ -11,5 +11,9 @@ global: hss: freeDiameter: @sysconfdir@/freeDiameter/hss.conf + metrics: + server: + - address: 127.0.0.8 + port: 9090 # sms_over_ims: "sip:smsc.mnc001.mcc001.3gppnetwork.org:7060;transport=tcp" # use_mongodb_change_stream: true diff --git a/configs/open5gs/pcrf.yaml.in b/configs/open5gs/pcrf.yaml.in index 7ffa36990e..2fca942c2e 100644 --- a/configs/open5gs/pcrf.yaml.in +++ b/configs/open5gs/pcrf.yaml.in @@ -10,6 +10,10 @@ global: # peer: 64 pcrf: freeDiameter: @sysconfdir@/freeDiameter/pcrf.conf + metrics: + server: + - address: 127.0.0.9 + port: 9090 ################################################################################ # Locally configured policy diff --git a/src/pcrf/meson.build b/src/pcrf/meson.build index e265e87307..6f00db9857 100644 --- a/src/pcrf/meson.build +++ b/src/pcrf/meson.build @@ -18,17 +18,26 @@ libpcrf_sources = files(''' pcrf-context.h pcrf-fd-path.h + pcrf-event.h + pcrf-sm.h + metrics.h pcrf-init.c pcrf-context.c + pcrf-event.c + pcrf-sm.c + pcrf-fd-path.c pcrf-gx-path.c pcrf-rx-path.c + + metrics.c '''.split()) libpcrf = static_library('pcrf', sources : libpcrf_sources, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libdbi_dep, libdiameter_rx_dep, libdiameter_gx_dep], @@ -36,7 +45,8 @@ libpcrf = static_library('pcrf', libpcrf_dep = declare_dependency( link_with : libpcrf, - dependencies : [libapp_dep, + dependencies : [libmetrics_dep, + libapp_dep, libdbi_dep, libdiameter_rx_dep, libdiameter_gx_dep]) diff --git a/src/pcrf/pcrf-context.c b/src/pcrf/pcrf-context.c index e6523a97f0..99fb209b8a 100644 --- a/src/pcrf/pcrf-context.c +++ b/src/pcrf/pcrf-context.c @@ -342,6 +342,8 @@ int pcrf_context_parse_config(void) ogs_error("parse_session_conf() failed"); return rv; } + } else if (!strcmp(pcrf_key, "metrics")) { + /* handle config in metrics library */ } else ogs_warn("unknown key `%s`", pcrf_key); } diff --git a/src/pcrf/pcrf-init.c b/src/pcrf/pcrf-init.c index 9821908a8a..925d31efd8 100644 --- a/src/pcrf/pcrf-init.c +++ b/src/pcrf/pcrf-init.c @@ -19,6 +19,8 @@ #include "pcrf-context.h" #include "pcrf-fd-path.h" +#include "pcrf-sm.h" +#include "metrics.h" static ogs_thread_t *thread; static void pcrf_main(void *data); @@ -33,15 +35,23 @@ int pcrf_initialize(void) rv = ogs_app_parse_local_conf(APP_NAME); if (rv != OGS_OK) return rv; + pcrf_metrics_init(); + pcrf_context_init(); + pcrf_event_init(); rv = ogs_log_config_domain( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; + rv = ogs_metrics_context_parse_config(APP_NAME); + if (rv != OGS_OK) return rv; + rv = pcrf_context_parse_config(); if (rv != OGS_OK) return rv; + ogs_metrics_context_open(ogs_metrics_self()); + if (ogs_app()->db_uri) { rv = ogs_dbi_init(ogs_app()->db_uri); if (rv != OGS_OK) return rv; @@ -62,6 +72,10 @@ void pcrf_terminate(void) { if (!initialized) return; + pcrf_event_term(); + ogs_thread_destroy(thread); + ogs_metrics_context_close(ogs_metrics_self()); + pcrf_fd_final(); if (ogs_app()->db_uri) { @@ -69,12 +83,19 @@ void pcrf_terminate(void) } pcrf_context_final(); + pcrf_event_final(); + pcrf_metrics_final(); return; } static void pcrf_main(void *data) { + ogs_fsm_t pcrf_sm; + int rv; + + ogs_fsm_init(&pcrf_sm, pcrf_state_initial, pcrf_state_final, 0); + for ( ;; ) { ogs_pollset_poll(ogs_app()->pollset, ogs_timer_mgr_next(ogs_app()->timer_mgr)); @@ -91,5 +112,25 @@ static void pcrf_main(void *data) * not calling ogs_timer_mgr_expire(). */ ogs_timer_mgr_expire(ogs_app()->timer_mgr); + + for ( ;; ) { + pcrf_event_t *e = NULL; + + rv = ogs_queue_trypop(ogs_app()->queue, (void**)&e); + ogs_assert(rv != OGS_ERROR); + + if (rv == OGS_DONE) + goto done; + + if (rv == OGS_RETRY) + break; + + ogs_assert(e); + ogs_fsm_dispatch(&pcrf_sm, e); + pcrf_event_free(e); + } } +done: + + ogs_fsm_fini(&pcrf_sm, 0); } From 3d3f18e342fc2d7c3a8e35c575f468077cfd706c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 5 Sep 2024 21:28:30 +0900 Subject: [PATCH 233/323] [PCRF/HSS] Added missing files for enabling metrics (#3442) --- src/pcrf/metrics.c | 11 +++++++ src/pcrf/metrics.h | 17 ++++++++++ src/pcrf/pcrf-event.c | 76 +++++++++++++++++++++++++++++++++++++++++++ src/pcrf/pcrf-event.h | 57 ++++++++++++++++++++++++++++++++ src/pcrf/pcrf-sm.c | 55 +++++++++++++++++++++++++++++++ src/pcrf/pcrf-sm.h | 42 ++++++++++++++++++++++++ 6 files changed, 258 insertions(+) create mode 100644 src/pcrf/metrics.c create mode 100644 src/pcrf/metrics.h create mode 100644 src/pcrf/pcrf-event.c create mode 100644 src/pcrf/pcrf-event.h create mode 100644 src/pcrf/pcrf-sm.c create mode 100644 src/pcrf/pcrf-sm.h diff --git a/src/pcrf/metrics.c b/src/pcrf/metrics.c new file mode 100644 index 0000000000..d8cea6c2d4 --- /dev/null +++ b/src/pcrf/metrics.c @@ -0,0 +1,11 @@ +#include "metrics.h" + +void pcrf_metrics_init(void) +{ + ogs_metrics_context_init(); +} + +void pcrf_metrics_final(void) +{ + ogs_metrics_context_final(); +} diff --git a/src/pcrf/metrics.h b/src/pcrf/metrics.h new file mode 100644 index 0000000000..2cbe719975 --- /dev/null +++ b/src/pcrf/metrics.h @@ -0,0 +1,17 @@ +#ifndef PCRF_METRICS_H +#define PCRF_METRICS_H + +#include "ogs-metrics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void pcrf_metrics_init(void); +void pcrf_metrics_final(void); + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_METRICS_H */ diff --git a/src/pcrf/pcrf-event.c b/src/pcrf/pcrf-event.c new file mode 100644 index 0000000000..6a0bd6cb41 --- /dev/null +++ b/src/pcrf/pcrf-event.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "pcrf-event.h" +#include "ogs-app.h" + +static OGS_POOL(pool, pcrf_event_t); + +void pcrf_event_init(void) +{ + ogs_pool_init(&pool, ogs_app()->pool.event); +} + +void pcrf_event_term(void) +{ + ogs_queue_term(ogs_app()->queue); + ogs_pollset_notify(ogs_app()->pollset); +} + +void pcrf_event_final(void) +{ + ogs_pool_final(&pool); +} + +pcrf_event_t *pcrf_event_new(pcrf_event_e id) +{ + pcrf_event_t *e = NULL; + + ogs_pool_alloc(&pool, &e); + ogs_assert(e); + memset(e, 0, sizeof(*e)); + + e->id = id; + + return e; +} + +void pcrf_event_free(pcrf_event_t *e) +{ + ogs_assert(e); + ogs_pool_free(&pool, e); +} + +const char *pcrf_event_get_name(pcrf_event_t *e) +{ + if (e == NULL) + return OGS_FSM_NAME_INIT_SIG; + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + return OGS_FSM_NAME_ENTRY_SIG; + case OGS_FSM_EXIT_SIG: + return OGS_FSM_NAME_EXIT_SIG; + + default: + break; + } + + return "UNKNOWN_EVENT"; +} diff --git a/src/pcrf/pcrf-event.h b/src/pcrf/pcrf-event.h new file mode 100644 index 0000000000..6615248593 --- /dev/null +++ b/src/pcrf/pcrf-event.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef PCRF_EVENT_H +#define PCRF_EVENT_H + +#include "ogs-proto.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PCRF_EVT_BASE = OGS_MAX_NUM_OF_PROTO_EVENT, + + PCRF_EVT_TOP, +} pcrf_event_e; + +typedef struct pcrf_event_s { + int id; + int timer_id; + + struct { + void *document; + } dbi; +} pcrf_event_t; + +void pcrf_event_init(void); +void pcrf_event_term(void); +void pcrf_event_final(void); + +pcrf_event_t *pcrf_event_new(pcrf_event_e id); +void pcrf_event_free(pcrf_event_t *e); + +const char *pcrf_event_get_name(pcrf_event_t *e); + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_EVENT_H */ diff --git a/src/pcrf/pcrf-sm.c b/src/pcrf/pcrf-sm.c new file mode 100644 index 0000000000..0736589bb3 --- /dev/null +++ b/src/pcrf/pcrf-sm.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "pcrf-sm.h" +#include "pcrf-context.h" +#include "pcrf-event.h" + +void pcrf_state_initial(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); +} + +void pcrf_state_final(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); +} + +void pcrf_state_operational(ogs_fsm_t *s, pcrf_event_t *e) +{ + pcrf_sm_debug(e); + + ogs_assert(s); + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + break; + + case OGS_FSM_EXIT_SIG: + break; + + default: + ogs_error("No handler for event %s", pcrf_event_get_name(e)); + break; + } +} diff --git a/src/pcrf/pcrf-sm.h b/src/pcrf/pcrf-sm.h new file mode 100644 index 0000000000..36e3a090ef --- /dev/null +++ b/src/pcrf/pcrf-sm.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef PCRF_SM_H +#define PCRF_SM_H + +#include "pcrf-event.h" +#include "ogs-proto.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void pcrf_state_initial(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_final(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_operational(ogs_fsm_t *s, pcrf_event_t *e); +void pcrf_state_exception(ogs_fsm_t *s, pcrf_event_t *e); + +#define pcrf_sm_debug(__pe) \ + ogs_debug("%s(): %s", __func__, pcrf_event_get_name(__pe)) + +#ifdef __cplusplus +} +#endif + +#endif /* PCRF_SM_H */ From 0c348cac6843e39d67c29ec3089437441e070ae1 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 17:55:16 +0200 Subject: [PATCH 234/323] [PCRF] Initial metrics support This commit doesn't add any PCRF specific metrics, only all the boilerplate code to instantiate libmetrics and hence have the generic prometheus metrics available. --- src/pcrf/metrics.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ src/pcrf/metrics.h | 19 +++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/pcrf/metrics.c b/src/pcrf/metrics.c index d8cea6c2d4..6499bbc700 100644 --- a/src/pcrf/metrics.c +++ b/src/pcrf/metrics.c @@ -1,8 +1,76 @@ +#include "ogs-app.h" +#include "pcrf-context.h" + #include "metrics.h" +typedef struct pcrf_metrics_spec_def_s { + unsigned int type; + const char *name; + const char *description; + int initial_val; + unsigned int num_labels; + const char **labels; +} pcrf_metrics_spec_def_t; + +/* Helper generic functions: */ +static int pcrf_metrics_init_inst(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, + unsigned int len, unsigned int num_labels, const char **labels) +{ + unsigned int i; + for (i = 0; i < len; i++) + inst[i] = ogs_metrics_inst_new(specs[i], num_labels, labels); + return OGS_OK; +} + +static int pcrf_metrics_free_inst(ogs_metrics_inst_t **inst, + unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) + ogs_metrics_inst_free(inst[i]); + memset(inst, 0, sizeof(inst[0]) * len); + return OGS_OK; +} + +static int pcrf_metrics_init_spec(ogs_metrics_context_t *ctx, + ogs_metrics_spec_t **dst, pcrf_metrics_spec_def_t *src, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) { + dst[i] = ogs_metrics_spec_new(ctx, src[i].type, + src[i].name, src[i].description, + src[i].initial_val, src[i].num_labels, src[i].labels, + NULL); + } + return OGS_OK; +} + +/* GLOBAL */ +ogs_metrics_spec_t *pcrf_metrics_spec_global[_PCRF_METR_GLOB_MAX]; +ogs_metrics_inst_t *pcrf_metrics_inst_global[_PCRF_METR_GLOB_MAX]; +pcrf_metrics_spec_def_t pcrf_metrics_spec_def_global[_PCRF_METR_GLOB_MAX] = { +/* Global Counters: */ +/* Global Gauges: */ +}; +int pcrf_metrics_init_inst_global(void) +{ + return pcrf_metrics_init_inst(pcrf_metrics_inst_global, pcrf_metrics_spec_global, + _PCRF_METR_GLOB_MAX, 0, NULL); +} +int pcrf_metrics_free_inst_global(void) +{ + return pcrf_metrics_free_inst(pcrf_metrics_inst_global, _PCRF_METR_GLOB_MAX); +} + void pcrf_metrics_init(void) { + ogs_metrics_context_t *ctx = ogs_metrics_self(); ogs_metrics_context_init(); + + pcrf_metrics_init_spec(ctx, pcrf_metrics_spec_global, pcrf_metrics_spec_def_global, + _PCRF_METR_GLOB_MAX); + + pcrf_metrics_init_inst_global(); } void pcrf_metrics_final(void) diff --git a/src/pcrf/metrics.h b/src/pcrf/metrics.h index 2cbe719975..e437d5bdff 100644 --- a/src/pcrf/metrics.h +++ b/src/pcrf/metrics.h @@ -7,6 +7,25 @@ extern "C" { #endif +/* GLOBAL */ +typedef enum pcrf_metric_type_global_s { + /* TODO: add PCRF specific metrics here. */ + _PCRF_METR_GLOB_MAX, +} pcrf_metric_type_global_t; +extern ogs_metrics_inst_t *pcrf_metrics_inst_global[_PCRF_METR_GLOB_MAX]; + +int pcrf_metrics_init_inst_global(void); +int pcrf_metrics_free_inst_global(void); + +static inline void pcrf_metrics_inst_global_set(pcrf_metric_type_global_t t, int val) +{ ogs_metrics_inst_set(pcrf_metrics_inst_global[t], val); } +static inline void pcrf_metrics_inst_global_add(pcrf_metric_type_global_t t, int val) +{ ogs_metrics_inst_add(pcrf_metrics_inst_global[t], val); } +static inline void pcrf_metrics_inst_global_inc(pcrf_metric_type_global_t t) +{ ogs_metrics_inst_inc(pcrf_metrics_inst_global[t]); } +static inline void pcrf_metrics_inst_global_dec(pcrf_metric_type_global_t t) +{ ogs_metrics_inst_dec(pcrf_metrics_inst_global[t]); } + void pcrf_metrics_init(void); void pcrf_metrics_final(void); From 6d80d4322a6daf4420c39f2edb1d1d8585a577a0 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Wed, 4 Sep 2024 19:46:26 +0200 Subject: [PATCH 235/323] [PCRF] Support retrieving metrics from freeDiameter thread --- src/pcrf/metrics.c | 82 +++++++++++++++++++++++++++++++++++++++++ src/pcrf/metrics.h | 19 +++++++++- src/pcrf/pcrf-context.c | 5 +++ src/pcrf/pcrf-context.h | 1 + src/pcrf/pcrf-fd-path.c | 37 +++++++++++++++++++ src/pcrf/pcrf-fd-path.h | 30 +++++++++++++++ src/pcrf/pcrf-gx-path.c | 72 ++++++++++++++++++++++-------------- src/pcrf/pcrf-rx-path.c | 42 ++++++++++++++++----- 8 files changed, 251 insertions(+), 37 deletions(-) diff --git a/src/pcrf/metrics.c b/src/pcrf/metrics.c index 6499bbc700..d4820483fc 100644 --- a/src/pcrf/metrics.c +++ b/src/pcrf/metrics.c @@ -50,6 +50,88 @@ ogs_metrics_spec_t *pcrf_metrics_spec_global[_PCRF_METR_GLOB_MAX]; ogs_metrics_inst_t *pcrf_metrics_inst_global[_PCRF_METR_GLOB_MAX]; pcrf_metrics_spec_def_t pcrf_metrics_spec_def_global[_PCRF_METR_GLOB_MAX] = { /* Global Counters: */ +/* Global Counters: Gx */ +[PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_unknown", + .description = "Received Gx unknown messages", +}, +[PCRF_METR_GLOB_CTR_Gx_RX_CCR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_ccr", + .description = "Received Gx CCR messages", +}, +[PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_ccr_error", + .description = "Received Gx CCR messages failed", +}, +[PCRF_METR_GLOB_CTR_Gx_RX_RAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_rx_raa", + .description = "Received Gx RAA messages", +}, +[PCRF_METR_GLOB_CTR_Gx_TX_CCA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_cca", + .description = "Received Gx RAA messages failed", +}, +[PCRF_METR_GLOB_CTR_Gx_TX_RAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_rar", + .description = "Transmitted Gx RAR messages", +}, +[PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "gx_tx_rar_error", + .description = "Failed to transmit Gx RAR messages", +}, +/* Global Counters: Rx */ +[PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_unknown", + .description = "Received Rx unknown messages", +}, +[PCRF_METR_GLOB_CTR_Rx_RX_AAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_aar", + .description = "Received Rx AAR messages", +}, +[PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_aar_error", + .description = "Received Rx AAR messages failed", +}, +[PCRF_METR_GLOB_CTR_Rx_RX_ASA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_asa", + .description = "Received Rx ASA messages", +}, +[PCRF_METR_GLOB_CTR_Rx_RX_STR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_asa_error", + .description = "Received Rx ASA messages failed", +}, +[PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_rx_str_error", + .description = "Received Rx STR messages failed", +}, +[PCRF_METR_GLOB_CTR_Rx_TX_AAA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_aaa", + .description = "Transmitted Rx AAA messages", +}, +[PCRF_METR_GLOB_CTR_Rx_TX_SAR] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_sar", + .description = "Transmitted Rx SAR messages", +}, +[PCRF_METR_GLOB_CTR_Rx_TX_STA] = { + .type = OGS_METRICS_METRIC_TYPE_COUNTER, + .name = "rx_tx_sta", + .description = "Transmitted Rx STA messages", +}, /* Global Gauges: */ }; int pcrf_metrics_init_inst_global(void) diff --git a/src/pcrf/metrics.h b/src/pcrf/metrics.h index e437d5bdff..f6205456eb 100644 --- a/src/pcrf/metrics.h +++ b/src/pcrf/metrics.h @@ -9,7 +9,24 @@ extern "C" { /* GLOBAL */ typedef enum pcrf_metric_type_global_s { - /* TODO: add PCRF specific metrics here. */ + PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN, + PCRF_METR_GLOB_CTR_Gx_RX_CCR, + PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR, + PCRF_METR_GLOB_CTR_Gx_RX_RAA, + PCRF_METR_GLOB_CTR_Gx_TX_CCA, + PCRF_METR_GLOB_CTR_Gx_TX_RAR, + PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR, + + PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN, + PCRF_METR_GLOB_CTR_Rx_RX_AAR, + PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR, + PCRF_METR_GLOB_CTR_Rx_RX_ASA, + PCRF_METR_GLOB_CTR_Rx_RX_STR, + PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR, + PCRF_METR_GLOB_CTR_Rx_TX_AAA, + PCRF_METR_GLOB_CTR_Rx_TX_SAR, + PCRF_METR_GLOB_CTR_Rx_TX_STA, + _PCRF_METR_GLOB_MAX, } pcrf_metric_type_global_t; extern ogs_metrics_inst_t *pcrf_metrics_inst_global[_PCRF_METR_GLOB_MAX]; diff --git a/src/pcrf/pcrf-context.c b/src/pcrf/pcrf-context.c index 99fb209b8a..3d70edaf6e 100644 --- a/src/pcrf/pcrf-context.c +++ b/src/pcrf/pcrf-context.c @@ -19,6 +19,7 @@ #include "ogs-dbi.h" #include "pcrf-context.h" +#include "pcrf-fd-path.h" static pcrf_context_t self; static ogs_diam_config_t g_diam_conf; @@ -72,6 +73,7 @@ static int pcrf_context_prepare(void) { self.diam_config->cnf_port = DIAMETER_PORT; self.diam_config->cnf_port_tls = DIAMETER_SECURE_PORT; + self.diam_config->stats.priv_stats_size = sizeof(pcrf_diam_stats_t); return OGS_OK; } @@ -342,6 +344,9 @@ int pcrf_context_parse_config(void) ogs_error("parse_session_conf() failed"); return rv; } + } else if (!strcmp(pcrf_key, "diameter_stats_interval")) { + const char *v = ogs_yaml_iter_value(&pcrf_iter); + if (v) self.diam_config->stats.interval_sec = atoi(v); } else if (!strcmp(pcrf_key, "metrics")) { /* handle config in metrics library */ } else diff --git a/src/pcrf/pcrf-context.h b/src/pcrf/pcrf-context.h index 3ee31c36af..026297e43a 100644 --- a/src/pcrf/pcrf-context.h +++ b/src/pcrf/pcrf-context.h @@ -24,6 +24,7 @@ #include "ogs-diameter-rx.h" #include "ogs-dbi.h" #include "ogs-app.h" +#include "metrics.h" #ifdef __cplusplus extern "C" { diff --git a/src/pcrf/pcrf-fd-path.c b/src/pcrf/pcrf-fd-path.c index 05010f1eea..a72d0820b2 100644 --- a/src/pcrf/pcrf-fd-path.c +++ b/src/pcrf/pcrf-fd-path.c @@ -20,6 +20,41 @@ #include "pcrf-context.h" #include "pcrf-fd-path.h" +static pcrf_diam_stats_t prev_st; + +static void pcrf_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void *priv_stats) +{ + const pcrf_diam_stats_t *st = (const pcrf_diam_stats_t *)priv_stats; + + ogs_debug("%s(): Update PCRF diameter metrics", __func__); + + #define METRIC_ADD(metric_name, field) \ + { \ + int diff = st->field - prev_st.field; \ + if (diff > 0) pcrf_metrics_inst_global_add(metric_name, diff); \ + } + + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_UNKNOWN, gx.rx_unknown); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_CCR, gx.rx_ccr); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_CCR_ERROR, gx.rx_ccr_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_RX_RAA, gx.rx_raa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_CCA, gx.tx_cca); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_RAR, gx.tx_rar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Gx_TX_RAR_ERROR, gx.tx_rar_error); + + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_UNKNOWN, rx.rx_unknown); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_AAR, rx.rx_aar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_AAR_ERROR, rx.rx_aar_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_ASA, rx.rx_asa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_STR, rx.rx_str); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_RX_STR_ERROR, rx.rx_str_error); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_AAA, rx.tx_aaa); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_SAR, rx.tx_sar); + METRIC_ADD(PCRF_METR_GLOB_CTR_Rx_TX_STA, rx.tx_sta); + + memcpy(&prev_st, st, sizeof(*st)); +} + int pcrf_fd_init(void) { int rv; @@ -33,6 +68,8 @@ int pcrf_fd_init(void) rv = pcrf_rx_init(); ogs_assert(rv == OGS_OK); + ogs_diam_stats_update_cb_register(pcrf_diam_stats_update_cb); + rv = ogs_diam_start(); ogs_assert(rv == 0); diff --git a/src/pcrf/pcrf-fd-path.h b/src/pcrf/pcrf-fd-path.h index 5a808da250..01d4a8849a 100644 --- a/src/pcrf/pcrf-fd-path.h +++ b/src/pcrf/pcrf-fd-path.h @@ -27,6 +27,36 @@ extern "C" { struct sess_state; typedef struct ogs_diam_rx_message_s ogs_diam_rx_message_t; +typedef struct pcrf_diam_stats_gx_s { + unsigned long long rx_unknown; + unsigned long long rx_ccr; + unsigned long long rx_ccr_error; + unsigned long long rx_raa; + unsigned long long tx_cca; + unsigned long long tx_rar; + unsigned long long tx_rar_error; +} pcrf_diam_stats_gx_t; + +typedef struct pcrf_diam_stats_rx_s { + unsigned long long rx_unknown; + unsigned long long rx_aar; + unsigned long long rx_aar_error; + unsigned long long rx_asa; + unsigned long long rx_str; + unsigned long long rx_str_error; + unsigned long long tx_aaa; + unsigned long long tx_sar; + unsigned long long tx_sta; +} pcrf_diam_stats_rx_t; + +typedef struct pcrf_diam_stats_s { + pcrf_diam_stats_gx_t gx; + pcrf_diam_stats_rx_t rx; +} pcrf_diam_stats_t; + +#define PCRF_DIAM_PRIV_STATS_ADD(field, val) ((pcrf_diam_stats_t *)ogs_diam_stats_self()->priv_stats)->field += val +#define PCRF_DIAM_PRIV_STATS_INC(field) PCRF_DIAM_PRIV_STATS_ADD(field, 1) + int pcrf_fd_init(void); void pcrf_fd_final(void); diff --git a/src/pcrf/pcrf-gx-path.c b/src/pcrf/pcrf-gx-path.c index f6ddd1a1b9..54b414a702 100644 --- a/src/pcrf/pcrf-gx-path.c +++ b/src/pcrf/pcrf-gx-path.c @@ -214,6 +214,10 @@ static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp, /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(gx.rx_unknown); + ) + return ENOTSUP; } @@ -621,9 +625,11 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, ogs_debug("Tx Credit-Control-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) ==0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_cca); + ) OGS_SESSION_DATA_FREE(&gx_message.session_data); @@ -662,6 +668,11 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_ccr_error); + ) + OGS_SESSION_DATA_FREE(&gx_message.session_data); return 0; @@ -1013,9 +1024,10 @@ int pcrf_gx_send_rar( ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_rar); + ) /* Set no error */ rx_message->result_code = ER_DIAMETER_SUCCESS; @@ -1029,6 +1041,11 @@ int pcrf_gx_send_rar( ret = fd_sess_state_store(pcrf_gx_reg, session, &sess_data); ogs_assert(sess_data == NULL); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(gx.tx_rar_error); + ) + OGS_SESSION_DATA_FREE(&gx_message.session_data); return OGS_ERROR; @@ -1121,30 +1138,31 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg) } /* Free the message */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + - ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); - if (ogs_diam_stats_self()->stats.nb_recv) { - /* Ponderate in the avg */ - ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * - ogs_diam_stats_self()->stats.nb_recv + dur) / - (ogs_diam_stats_self()->stats.nb_recv + 1); - /* Min, max */ - if (dur < ogs_diam_stats_self()->stats.shortest) + OGS_DIAM_STATS_MTX( + dur = ((ts.tv_sec - sess_data->ts.tv_sec) * 1000000) + + ((ts.tv_nsec - sess_data->ts.tv_nsec) / 1000); + if (ogs_diam_stats_self()->stats.nb_recv) { + /* Ponderate in the avg */ + ogs_diam_stats_self()->stats.avg = (ogs_diam_stats_self()->stats.avg * + ogs_diam_stats_self()->stats.nb_recv + dur) / + (ogs_diam_stats_self()->stats.nb_recv + 1); + /* Min, max */ + if (dur < ogs_diam_stats_self()->stats.shortest) + ogs_diam_stats_self()->stats.shortest = dur; + if (dur > ogs_diam_stats_self()->stats.longest) + ogs_diam_stats_self()->stats.longest = dur; + } else { ogs_diam_stats_self()->stats.shortest = dur; - if (dur > ogs_diam_stats_self()->stats.longest) ogs_diam_stats_self()->stats.longest = dur; - } else { - ogs_diam_stats_self()->stats.shortest = dur; - ogs_diam_stats_self()->stats.longest = dur; - ogs_diam_stats_self()->stats.avg = dur; - } - if (error) - ogs_diam_stats_self()->stats.nb_errs++; - else - ogs_diam_stats_self()->stats.nb_recv++; + ogs_diam_stats_self()->stats.avg = dur; + } + if (error) + ogs_diam_stats_self()->stats.nb_errs++; + else + ogs_diam_stats_self()->stats.nb_recv++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + PCRF_DIAM_PRIV_STATS_INC(gx.rx_raa); + ) /* Display how long it took */ if (ts.tv_nsec > sess_data->ts.tv_nsec) diff --git a/src/pcrf/pcrf-rx-path.c b/src/pcrf/pcrf-rx-path.c index 5b4559ba30..dd691ccf12 100644 --- a/src/pcrf/pcrf-rx-path.c +++ b/src/pcrf/pcrf-rx-path.c @@ -97,6 +97,10 @@ static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp, /* This CB should never be called */ ogs_warn("Unexpected message received!"); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_unknown); + ) + return ENOTSUP; } @@ -413,9 +417,11 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ogs_debug("[PCRF] Tx AA-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_aaa); + ) ogs_ims_data_free(&rx_message.ims_data); @@ -442,6 +448,11 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp, ret = fd_msg_send(msg, NULL, NULL); ogs_assert(ret == 0); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_aar_error); + ) + state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); @@ -561,9 +572,10 @@ int pcrf_rx_send_asr(uint8_t *rx_sid, uint32_t abort_cause) ogs_assert(ret == 0); /* Increment the counter */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_sent++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_sent); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sar); + ) return OGS_OK; } @@ -639,6 +651,10 @@ static void pcrf_rx_asa_cb(void *data, struct msg **msg) ogs_error("ERROR DIAMETER Result Code(%d)", result_code); } + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_asa); + ) + ret = fd_msg_free(*msg); ogs_assert(ret == 0); *msg = NULL; @@ -746,9 +762,11 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, ogs_debug("[PCRF] Tx Session-Termination-Answer"); /* Add this value to the stats */ - ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); - ogs_diam_stats_self()->stats.nb_echoed++; - ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0); + OGS_DIAM_STATS_MTX( + OGS_DIAM_STATS_INC(nb_echoed); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sta); + ) state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); @@ -778,6 +796,12 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp, ogs_assert(ret == 0); ogs_debug("[PCRF] Tx Session-Termination-Answer"); + OGS_DIAM_STATS_MTX( + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str); + PCRF_DIAM_PRIV_STATS_INC(rx.rx_str_error); + PCRF_DIAM_PRIV_STATS_INC(rx.tx_sta); + ) + if (sess_data) state_cleanup(sess_data, NULL, NULL); ogs_ims_data_free(&rx_message.ims_data); From af85bc0a66bfa25fe6c088047edc5b0fd43ff5e6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 7 Oct 2024 22:03:41 +0900 Subject: [PATCH 236/323] [MME] Incorrectly being retrieved from the PLMN-ID (#3480) The issue was that the PLMN-ID of the TAI was incorrectly being retrieved from the PLMN-ID of the EUTRAN_CGI. As a result, when the PLMN-IDs of the TAI and EUTRAN_CGI were improperly set, the MME would crash. All issues have now been resolved. --- src/mme/s1ap-handler.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index e250ee5e02..3ce728382c 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -584,7 +584,6 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); @@ -744,7 +743,6 @@ void s1ap_handle_uplink_nas_transport( ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&tai.plmn_id, pLMNidentity->buf, sizeof(tai.plmn_id)); memcpy(&tai.tac, tAC->buf, sizeof(tai.tac)); tai.tac = be16toh(tai.tac); @@ -773,6 +771,10 @@ void s1ap_handle_uplink_nas_transport( sizeof(enb_ue->saved.e_cgi.cell_id)); enb_ue->saved.e_cgi.cell_id = (be32toh(enb_ue->saved.e_cgi.cell_id) >> 4); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); @@ -2472,11 +2474,6 @@ void s1ap_handle_path_switch_request( return; } - pLMNidentity = &EUTRAN_CGI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - cell_ID = &EUTRAN_CGI->cell_ID; - ogs_assert(cell_ID); - if (!TAI) { ogs_error("No TAI"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -2490,7 +2487,6 @@ void s1ap_handle_path_switch_request( ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); tAC = &TAI->tAC; ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - memcpy(&tai.plmn_id, pLMNidentity->buf, sizeof(tai.plmn_id)); memcpy(&tai.tac, tAC->buf, sizeof(tai.tac)); tai.tac = be16toh(tai.tac); @@ -2556,11 +2552,19 @@ void s1ap_handle_path_switch_request( ogs_info(" NEW ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&enb_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.tai.plmn_id)); memcpy(&enb_ue->saved.tai.tac, tAC->buf, sizeof(enb_ue->saved.tai.tac)); enb_ue->saved.tai.tac = be16toh(enb_ue->saved.tai.tac); + pLMNidentity = &EUTRAN_CGI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + cell_ID = &EUTRAN_CGI->cell_ID; + ogs_assert(cell_ID); memcpy(&enb_ue->saved.e_cgi.plmn_id, pLMNidentity->buf, sizeof(enb_ue->saved.e_cgi.plmn_id)); memcpy(&enb_ue->saved.e_cgi.cell_id, cell_ID->buf, @@ -3700,11 +3704,6 @@ void s1ap_handle_handover_notification( return; } - pLMNidentity = &EUTRAN_CGI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - cell_ID = &EUTRAN_CGI->cell_ID; - ogs_assert(cell_ID); - if (!TAI) { ogs_error("No TAI"); r = s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, @@ -3714,11 +3713,6 @@ void s1ap_handle_handover_notification( return; } - pLMNidentity = &TAI->pLMNidentity; - ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); - tAC = &TAI->tAC; - ogs_assert(tAC && tAC->size == sizeof(uint16_t)); - source_ue = enb_ue_find_by_id(target_ue->source_ue_id); if (!source_ue) { ogs_error("No Source UE"); @@ -3744,12 +3738,20 @@ void s1ap_handle_handover_notification( ogs_debug("Mobile Reachable timer stopped for IMSI[%s]", mme_ue->imsi_bcd); CLEAR_MME_UE_TIMER(mme_ue->t_mobile_reachable); + pLMNidentity = &TAI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + tAC = &TAI->tAC; + ogs_assert(tAC && tAC->size == sizeof(uint16_t)); memcpy(&target_ue->saved.tai.plmn_id, pLMNidentity->buf, sizeof(target_ue->saved.tai.plmn_id)); memcpy(&target_ue->saved.tai.tac, tAC->buf, sizeof(target_ue->saved.tai.tac)); target_ue->saved.tai.tac = be16toh(target_ue->saved.tai.tac); + pLMNidentity = &EUTRAN_CGI->pLMNidentity; + ogs_assert(pLMNidentity && pLMNidentity->size == sizeof(ogs_plmn_id_t)); + cell_ID = &EUTRAN_CGI->cell_ID; + ogs_assert(cell_ID); memcpy(&target_ue->saved.e_cgi.plmn_id, pLMNidentity->buf, sizeof(target_ue->saved.e_cgi.plmn_id)); memcpy(&target_ue->saved.e_cgi.cell_id, cell_ID->buf, From 55e5fc92dd28f0b1ba4e2928d73a0f89b31954b6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 11 Oct 2024 14:47:28 +0900 Subject: [PATCH 237/323] [SMF] Fixed interface-type in the Create Bearer Request (#3484) I wanted to let you know that I have modified the SMF configuration to send S2b PGW GTP-U instead of S5/S8 PGW GTP-U in WLAN. This adjustment should ensure that the correct interface type is used, as per the specifications. --- src/smf/s5c-build.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/smf/s5c-build.c b/src/smf/s5c-build.c index 88e3323c6e..05c6201e3d 100644 --- a/src/smf/s5c-build.c +++ b/src/smf/s5c-build.c @@ -433,7 +433,17 @@ ogs_pkbuf_t *smf_s5c_build_create_bearer_request( /* Data Plane(UL) : PGW-S5U */ memset(&pgw_s5u_teid, 0, sizeof(ogs_gtp2_f_teid_t)); - pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S5_S8_PGW_GTP_U; + switch (sess->gtp_rat_type) { + case OGS_GTP2_RAT_TYPE_EUTRAN: + pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S5_S8_PGW_GTP_U; + break; + case OGS_GTP2_RAT_TYPE_WLAN: + pgw_s5u_teid.interface_type = OGS_GTP2_F_TEID_S2B_U_PGW_GTP_U; + break; + default: + ogs_error("Unknown RAT Type [%d]", sess->gtp_rat_type); + ogs_assert_if_reached(); + } pgw_s5u_teid.teid = htobe32(bearer->pgw_s5u_teid); ogs_assert(bearer->pgw_s5u_addr || bearer->pgw_s5u_addr6); rv = ogs_gtp2_sockaddr_to_f_teid( From 606788361cb2255961f856de17d71c6b2fc86847 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 11 Oct 2024 14:55:45 +0900 Subject: [PATCH 238/323] [SMF] Fixed incorrect prefix length in GTPv2 PAA IE (#3495) I have modified the PAA's IPv6 prefix length from 8 to 64. This adjustment ensures that the prefix length now correctly reflects the standard /64 notation, in accordance with the specifications. --- src/smf/context.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/smf/context.c b/src/smf/context.c index 59c3d98950..bd0ba90667 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1608,7 +1608,7 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) subnet6 = sess->ipv6->subnet; ogs_assert(subnet6); - sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + sess->paa.len = OGS_IPV6_DEFAULT_PREFIX_LEN; memcpy(sess->paa.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv6_hash, sess->ipv6->addr, OGS_IPV6_DEFAULT_PREFIX_LEN >> 3, sess); @@ -1637,7 +1637,7 @@ uint8_t smf_sess_set_ue_ip(smf_sess_t *sess) ogs_assert(subnet6); sess->paa.both.addr = sess->ipv4->addr[0]; - sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN >> 3; + sess->paa.both.len = OGS_IPV6_DEFAULT_PREFIX_LEN; memcpy(sess->paa.both.addr6, sess->ipv6->addr, OGS_IPV6_LEN); ogs_hash_set(smf_self()->ipv4_hash, sess->ipv4->addr, OGS_IPV4_LEN, sess); From f82fc85cc21fa9e85b40020ba46594d04c905327 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 15 Oct 2024 17:54:31 +0900 Subject: [PATCH 239/323] [SMF] Fix Packet Filter Identifier handling in SMF (#3505) Decrement the Packet Filter Identifier by 1 before sending it to the UE during GSM message construction. This correction ensures proper synchronization between the UE and SMF, allowing `smf_pf_find_by_identifier()` to accurately locate the corresponding `pf` context without adjusting the identifier during the search. This fix aligns the 5GC implementation with the EPC behavior, where the identifier was correctly decremented before transmission to the UE, preventing mismatches and synchronization issues. --- src/smf/gsm-build.c | 4 ++-- src/smf/gsm-handler.c | 2 +- tests/app/5gc-init.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 05153a0d51..a8dc3a878f 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -113,7 +113,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_BIDIRECTIONAL; - qos_rule[0].pf[0].identifier = 1; + qos_rule[0].pf[0].identifier = 0; qos_rule[0].pf[0].content.length = 1; qos_rule[0].pf[0].content.num_of_component = 1; qos_rule[0].pf[0].content.component[0].type = OGS_PACKET_FILTER_MATCH_ALL; @@ -299,7 +299,7 @@ static void encode_qos_rule_packet_filter( ogs_list_for_each_entry(&qos_flow->pf_to_add_list, pf, to_add_node) { ogs_assert(i < OGS_MAX_NUM_OF_FLOW_IN_NAS); qos_rule->pf[i].direction = pf->direction; - qos_rule->pf[i].identifier = pf->identifier; + qos_rule->pf[i].identifier = pf->identifier-1; ogs_pf_content_from_ipfw_rule( pf->direction, &qos_rule->pf[i].content, &pf->ipfw_rule, diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 621f3e2981..4563f6b2ed 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -410,7 +410,7 @@ int gsm_handle_pdu_session_modification_request( if (pf) { qos_flow->pf_to_delete [qos_flow->num_of_pf_to_delete++] = - qos_rule[i].pf[j].identifier; + qos_rule[i].pf[j].identifier-1; smf_pf_remove(pf); } } diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 724656e746..eaefa3518b 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -129,7 +129,7 @@ int app_initialize(const char *const argv[]) * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(1000); + ogs_msleep(2000); return OGS_OK; } From 063fa42a2818ac1c9725edd091e016692f52a86f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 16 Oct 2024 09:32:16 +0900 Subject: [PATCH 240/323] Revert "[SMF] Fix Packet Filter Identifier handling in SMF (#3505)" This reverts commit f82fc85cc21fa9e85b40020ba46594d04c905327. --- src/smf/gsm-build.c | 4 ++-- src/smf/gsm-handler.c | 2 +- tests/app/5gc-init.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index a8dc3a878f..05153a0d51 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -113,7 +113,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_BIDIRECTIONAL; - qos_rule[0].pf[0].identifier = 0; + qos_rule[0].pf[0].identifier = 1; qos_rule[0].pf[0].content.length = 1; qos_rule[0].pf[0].content.num_of_component = 1; qos_rule[0].pf[0].content.component[0].type = OGS_PACKET_FILTER_MATCH_ALL; @@ -299,7 +299,7 @@ static void encode_qos_rule_packet_filter( ogs_list_for_each_entry(&qos_flow->pf_to_add_list, pf, to_add_node) { ogs_assert(i < OGS_MAX_NUM_OF_FLOW_IN_NAS); qos_rule->pf[i].direction = pf->direction; - qos_rule->pf[i].identifier = pf->identifier-1; + qos_rule->pf[i].identifier = pf->identifier; ogs_pf_content_from_ipfw_rule( pf->direction, &qos_rule->pf[i].content, &pf->ipfw_rule, diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 4563f6b2ed..621f3e2981 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -410,7 +410,7 @@ int gsm_handle_pdu_session_modification_request( if (pf) { qos_flow->pf_to_delete [qos_flow->num_of_pf_to_delete++] = - qos_rule[i].pf[j].identifier-1; + qos_rule[i].pf[j].identifier; smf_pf_remove(pf); } } diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index eaefa3518b..724656e746 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -129,7 +129,7 @@ int app_initialize(const char *const argv[]) * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(2000); + ogs_msleep(1000); return OGS_OK; } From 5dc3905c39fd6ccd6d82f769e2c0d6f208caf0cf Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 16 Oct 2024 17:21:22 +0900 Subject: [PATCH 241/323] [SMF] Fix Packet Filter Identifier handling and limit maximum number (#3505) - **Correct Packet Filter Identifier Handling:** Remove the addition of +1 when searching for the packet filter context using `smf_pf_find_by_identifier()` in the 5G Core SMF. According to 3GPP TS24.008 Section 10.5.6.12 and TS24.501 Section 9.11.4.13, the Packet Filter Identifier should range from 1 to 15 (or 0 to 15) depending on the operation and should be used directly as received from the UE. - **Adjust Maximum Number of Packet Filter Identifiers:** Change the maximum number of Packet Filter Identifiers from **16** to **15** in the SMF to comply with the 3GPP specifications. The standards specify that the number of packet filters shall be greater than 0 and less than or equal to 15 for certain operations. **Background:** In the current 5GC implementation, the SMF incorrectly adds +1 to the identifier received from the UE and allows up to 16 identifiers, leading to mismatches and potential communication issues. These discrepancies cause the SMF to fail in correctly locating the packet filter context, resulting in improper QoS rule enforcement. **Changes Made:** - **For Packet Filter Identifier Handling:** - Updated the SMF code to use the identifier received from the UE directly without modification: ```c // Corrected code for 5GC: pf = smf_pf_find_by_identifier( qos_flow, qos_rule[i].pf[j].identifier); ``` - **For Maximum Number of Packet Filter Identifiers:** - Adjusted the code to enforce a maximum of 15 packet filters as per the specifications. **Impact:** - **Compliance:** - Ensures that the 5GC implementation of Open5GS adheres to the 3GPP TS24.008 and TS24.501 specifications regarding Packet Filter Identifier handling and limits. - **Functionality:** - Corrects the mapping and management of packet filters between the UE and SMF in 5GC, preventing potential communication issues and misconfigurations. - **EPC Implementation:** - The EPC implementation remains unaffected by these changes. EPC correctly handles the Packet Filter Identifier by decrementing it by 1 before sending it to the UE and adding +1 when searching for the packet filter context. **Conclusion:** By making these adjustments, we ensure proper synchronization between the UE and SMF in the 5G Core and maintain compliance with the 3GPP specifications. This fix resolves the mismatches caused by incorrect identifier handling and enforces the correct limit on the number of packet filters, enhancing the reliability and standards compliance of the 5GC implementation without impacting the existing correct behavior in EPC. --- lib/proto/types.h | 22 +++++++++++++++++----- src/smf/gsm-handler.c | 6 +++--- tests/app/5gc-init.c | 2 +- tests/common/gsm-build.c | 12 ++++++------ 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 12c7ab4a9d..36ac15c1de 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -50,17 +50,29 @@ extern "C" { * coded as 0. For all other operations, the number of packet filters * shall be greater than 0 and less than or equal to 15. * - * The array of TLV messages is limited to 16. - * So, Flow(PDI.SDF_Filter) in PDR is limited to 16. + * TS24.501 + * 9.11.4.13 QoS rules + * Table 9.11.4.13.1: QoS rules information element * - * Therefore, we defined the maximum number of flows as 16. + * For the "delete existing QoS rule" operation and for the "modify existing + * QoS rule without modifying packet filters" operation, the number of packet + * filters shall be coded as 0. For the "create new QoS rule" operation + * and the "modify existing QoS rule and replace all packet filters" operation, + * the number of packet filters shall be greater than or equal to 0 + * and less than or equal to 15. For all other operations, the number of packet + * filters shall be greater than 0 and less than or equal to 15. + * + * The array of TLV messages is limited to 15. + * So, Flow(PDI.SDF_Filter) in PDR is limited to 15. + * + * Therefore, we defined the maximum number of flows as 15. */ -#define OGS_MAX_NUM_OF_FLOW_IN_PDR 16 +#define OGS_MAX_NUM_OF_FLOW_IN_PDR 15 #define OGS_MAX_NUM_OF_FLOW_IN_GTP OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_NAS OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_PCC_RULE OGS_MAX_NUM_OF_FLOW_IN_PDR #define OGS_MAX_NUM_OF_FLOW_IN_MEDIA_SUB_COMPONENT OGS_MAX_NUM_OF_FLOW_IN_PDR -#define OGS_MAX_NUM_OF_FLOW_IN_BEARER 16 +#define OGS_MAX_NUM_OF_FLOW_IN_BEARER 15 #define OGS_MAX_NUM_OF_GTPU_RESOURCE 4 #define OGS_MAX_NUM_OF_FRAMED_ROUTES_IN_PDI 8 diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 621f3e2981..1e64370dd9 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -257,7 +257,7 @@ int gsm_handle_pdu_session_modification_request( j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { pf = smf_pf_find_by_identifier( - qos_flow, qos_rule[i].pf[j].identifier+1); + qos_flow, qos_rule[i].pf[j].identifier); if (pf) { ogs_assert( reconfigure_packet_filter(pf, &qos_rule[i], i) > 0); @@ -329,7 +329,7 @@ int gsm_handle_pdu_session_modification_request( j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { pf = smf_pf_find_by_identifier( - qos_flow, qos_rule[i].pf[j].identifier+1); + qos_flow, qos_rule[i].pf[j].identifier); if (!pf) pf = smf_pf_add(qos_flow); ogs_assert(pf); @@ -406,7 +406,7 @@ int gsm_handle_pdu_session_modification_request( j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { pf = smf_pf_find_by_identifier( - qos_flow, qos_rule[i].pf[j].identifier+1); + qos_flow, qos_rule[i].pf[j].identifier); if (pf) { qos_flow->pf_to_delete [qos_flow->num_of_pf_to_delete++] = diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 724656e746..eaefa3518b 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -129,7 +129,7 @@ int app_initialize(const char *const argv[]) * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(1000); + ogs_msleep(2000); return OGS_OK; } diff --git a/tests/common/gsm-build.c b/tests/common/gsm-build.c index d0d9971b84..54310b15b7 100644 --- a/tests/common/gsm-build.c +++ b/tests/common/gsm-build.c @@ -159,7 +159,7 @@ ogs_pkbuf_t *testgsm_build_pdu_session_modification_request( qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_UPLINK; - qos_rule[0].pf[0].identifier = 4; + qos_rule[0].pf[0].identifier = 5; qos_rule[0].pf[0].content.length = 18; qos_rule[0].pf[0].content.num_of_component = 1; @@ -180,7 +180,7 @@ ogs_pkbuf_t *testgsm_build_pdu_session_modification_request( qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_DOWNLINK; - qos_rule[0].pf[0].identifier = 0; + qos_rule[0].pf[0].identifier = 1; qos_rule[0].pf[0].content.length = 9; qos_rule[0].pf[0].content.num_of_component = 1; @@ -198,10 +198,10 @@ ogs_pkbuf_t *testgsm_build_pdu_session_modification_request( qos_rule[0].DQR_bit = 0; qos_rule[0].num_of_packet_filter = 4; - qos_rule[0].pf[0].identifier = 0; - qos_rule[0].pf[1].identifier = 1; - qos_rule[0].pf[2].identifier = 2; - qos_rule[0].pf[3].identifier = 3; + qos_rule[0].pf[0].identifier = 1; + qos_rule[0].pf[1].identifier = 2; + qos_rule[0].pf[2].identifier = 3; + qos_rule[0].pf[3].identifier = 4; } else { ogs_fatal("Unknown qos_rule_code[%d]", qos_rule_code); From a50c313b814de6815c040817b32381fa0d402197 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 17 Oct 2024 15:52:35 +0900 Subject: [PATCH 242/323] [SMF] Update QoS Rule Handling (#3513) 1. Set packet filter identifier values to 0 when the UE requests to: - Create new QoS rule - Modify existing QoS rule and replace all packet filters - Modify existing QoS rule and add packet filters - As specified in TS24.501, section 9.11.4.13, Table 9.11.4.13.1. 2. Revise QoS rule modification logic: - Instead of replacing packet filters based on their identifiers (EPC approach), update the implementation to delete all existing packet filters within the QoS rule and add new ones. - This ensures that when modifying an existing QoS rule to replace all packet filters, the packet filters are correctly reset and updated per 5G Core requirements. --- lib/nas/5gs/types.h | 2 +- src/smf/gsm-handler.c | 81 +++++----------------------------------- src/smf/n4-handler.c | 2 +- tests/common/gsm-build.c | 6 +-- tests/vonr/af-test.c | 2 +- 5 files changed, 15 insertions(+), 78 deletions(-) diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index cc35611dbc..49e3285041 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -1020,7 +1020,7 @@ typedef struct ogs_nas_qos_rule_s { #define OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE 1 #define OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE 2 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS 3 -#define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS 4 +#define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS 4 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS 5 #define OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_WITHOUT_MODIFYING_PACKET_FILTERS 6 ED3(uint8_t code:3;, diff --git a/src/smf/gsm-handler.c b/src/smf/gsm-handler.c index 1e64370dd9..66b9638dbe 100644 --- a/src/smf/gsm-handler.c +++ b/src/smf/gsm-handler.c @@ -251,87 +251,21 @@ int gsm_handle_pdu_session_modification_request( pfcp_flags |= OGS_PFCP_MODIFY_REMOVE; qos_flow_find_or_add(&sess->qos_flow_to_modify_list, qos_flow, to_modify_node); - } else if (qos_rule[i].code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS) { - for (j = 0; j < qos_rule[i].num_of_packet_filter && - j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - - pf = smf_pf_find_by_identifier( - qos_flow, qos_rule[i].pf[j].identifier); - if (pf) { - ogs_assert( - reconfigure_packet_filter(pf, &qos_rule[i], i) > 0); - /* - * Refer to lib/ipfw/ogs-ipfw.h - * Issue #338 - * - * <DOWNLINK/BI-DIRECTIONAL> - * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> - * - * <UPLINK> - * TFT : Local <UE_IP> <UE_PORT> REMOTE <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - */ - if (pf->direction == OGS_FLOW_DOWNLINK_ONLY) - ogs_ipfw_rule_swap(&pf->ipfw_rule); - - if (pf->flow_description) - ogs_free(pf->flow_description); - - /* - * Issue #338 - * - * <DOWNLINK/BI-DIRECTIONAL> - * RULE : Source <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> Destination <UE_IP> <UE_PORT> - * --> - * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * - * <UPLINK> - * RULE : Source <UE_IP> <UE_PORT> Destination <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> - * --> - * GX : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - * PFCP : permit out from <P-CSCF_RTP_IP> <P-CSCF_RTP_PORT> to <UE_IP> <UE_PORT> - */ - if (pf->direction == OGS_FLOW_UPLINK_ONLY) { - ogs_ipfw_rule_t tmp; - ogs_ipfw_copy_and_swap(&tmp, &pf->ipfw_rule); - pf->flow_description = - ogs_ipfw_encode_flow_description(&tmp); - ogs_assert(pf->flow_description); - } else { - pf->flow_description = - ogs_ipfw_encode_flow_description( - &pf->ipfw_rule); - ogs_assert(pf->flow_description); - } - - pfcp_flags |= OGS_PFCP_MODIFY_TFT_REPLACE; - qos_flow_find_or_add(&sess->qos_flow_to_modify_list, - qos_flow, to_modify_node); - - ogs_list_add( - &qos_flow->pf_to_add_list, &pf->to_add_node); - } - } } else if (qos_rule[i].code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE || qos_rule[i].code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) { + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS || + qos_rule[i].code == + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { - if (qos_rule[i].code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE) + if (qos_rule[i].code == OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE || + qos_rule[i].code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) smf_pf_remove_all(qos_flow); for (j = 0; j < qos_rule[i].num_of_packet_filter && j < OGS_MAX_NUM_OF_FLOW_IN_NAS; j++) { - pf = smf_pf_find_by_identifier( - qos_flow, qos_rule[i].pf[j].identifier); - if (!pf) - pf = smf_pf_add(qos_flow); + pf = smf_pf_add(qos_flow); ogs_assert(pf); ogs_assert( @@ -389,6 +323,9 @@ int gsm_handle_pdu_session_modification_request( } else if (qos_rule[i].code == OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) { pfcp_flags |= OGS_PFCP_MODIFY_TFT_ADD; + } else if (qos_rule[i].code == + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { + pfcp_flags |= OGS_PFCP_MODIFY_TFT_REPLACE; } else ogs_assert_if_reached(); diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 2f5fcb419d..6b6f4f44d3 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -602,7 +602,7 @@ void smf_5gc_n4_handle_session_modification_response( } else if (flags & OGS_PFCP_MODIFY_TFT_ADD) { qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS; } else if (flags & OGS_PFCP_MODIFY_TFT_REPLACE) { - qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS; + qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS; } else if (flags & OGS_PFCP_MODIFY_TFT_DELETE) { qos_rule_code = OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS; } diff --git a/tests/common/gsm-build.c b/tests/common/gsm-build.c index 54310b15b7..c5d7e0f1fe 100644 --- a/tests/common/gsm-build.c +++ b/tests/common/gsm-build.c @@ -159,7 +159,7 @@ ogs_pkbuf_t *testgsm_build_pdu_session_modification_request( qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_UPLINK; - qos_rule[0].pf[0].identifier = 5; + qos_rule[0].pf[0].identifier = 0; qos_rule[0].pf[0].content.length = 18; qos_rule[0].pf[0].content.num_of_component = 1; @@ -175,12 +175,12 @@ ogs_pkbuf_t *testgsm_build_pdu_session_modification_request( qos_rule[0].pf[0].content.component[0].ipv6.prefixlen = 120; } else if (qos_rule_code == - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS) { + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS) { qos_rule[0].DQR_bit = 0; qos_rule[0].num_of_packet_filter = 1; qos_rule[0].pf[0].direction = OGS_NAS_QOS_DIRECTION_DOWNLINK; - qos_rule[0].pf[0].identifier = 1; + qos_rule[0].pf[0].identifier = 0; qos_rule[0].pf[0].content.length = 9; qos_rule[0].pf[0].content.num_of_component = 1; diff --git a/tests/vonr/af-test.c b/tests/vonr/af-test.c index 72bd68e0b6..5f49fe8bd2 100644 --- a/tests/vonr/af-test.c +++ b/tests/vonr/af-test.c @@ -498,7 +498,7 @@ static void test1_func(abts_case *tc, void *data) gsmbuf = testgsm_build_pdu_session_modification_request( qos_flow, 0, - OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_PACKET_FILTERS, + OGS_NAS_QOS_CODE_MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS, 0); ABTS_PTR_NOTNULL(tc, gsmbuf); gmmbuf = testgmm_build_ul_nas_transport(sess, From e3790b45b4bc0b261e0946cf93755099a9525cfd Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 17 Oct 2024 23:28:08 +0900 Subject: [PATCH 243/323] [PFCP] Fix memory free issue causing crash (#3497) This commit fixes an issue where the system would crash due to improper memory release after receiving crafted PFCP packets from UEs. --- src/sgwc/pfcp-path.c | 2 +- src/sgwu/pfcp-path.c | 2 +- src/upf/pfcp-path.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index 0c7a8caba5..b0b12aaddc 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -108,7 +108,7 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) if (!node) { ogs_error("No memory: ogs_pfcp_node_add() failed"); ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); + sgwc_event_free(e); return; } diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index c3827a6801..73def6adb0 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -108,7 +108,7 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) if (!node) { ogs_error("No memory: ogs_pfcp_node_add() failed"); ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); + sgwu_event_free(e); return; } diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index c16762640d..ea4591dce6 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -111,7 +111,7 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) if (!node) { ogs_error("No memory: ogs_pfcp_node_add() failed"); ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); + upf_event_free(e); return; } From 0e441cf710bae0f11014c8e6945cfdf4567f3100 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 18 Oct 2024 14:22:21 +0900 Subject: [PATCH 244/323] [MME] TAI and E_CGI IEs in SGs (#3518) Added UE's current TAI and E-CGI to SGsAP-LOCATION-UPDATE-REQUEST message as per TS 29.118 5.2.2.2.1 --- src/mme/sgsap-build.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/mme/sgsap-build.c b/src/mme/sgsap-build.c index 22fed9bbde..18317f5828 100644 --- a/src/mme/sgsap-build.c +++ b/src/mme/sgsap-build.c @@ -34,6 +34,8 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue) served_gummei_t *served_gummei = &mme_self()->served_gummei[0]; char eps_update_type; ogs_nas_lai_t lai; + ogs_eps_tai_t tai; + ogs_e_cgi_t e_cgi; ogs_assert(mme_ue); csmap = mme_ue->csmap; @@ -59,6 +61,20 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue) ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_LAI_TYPE, SGSAP_IE_LAI_LEN, 0, &lai); + /* + * TS 29.118 5.2.2.2.1 + * The MME shall add the UE's current TAI and E-CGI + * to the SGsAP-LOCATION-UPDATE-REQUEST message. + */ + memcpy(&tai, &mme_ue->tai, sizeof(ogs_eps_tai_t)); + tai.tac = htobe16(tai.tac); + ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_TAI_TYPE, + SGSAP_IE_TAI_LEN, 0, &tai); + memcpy(&e_cgi, &mme_ue->e_cgi, sizeof(ogs_e_cgi_t)); + e_cgi.cell_id = htobe32(e_cgi.cell_id); + ogs_tlv_add(root, OGS_TLV_MODE_T1_L1, SGSAP_IE_E_CGI_TYPE, + SGSAP_IE_E_CGI_LEN, 0, &e_cgi); + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); if (!pkbuf) { ogs_error("ogs_pkbuf_alloc() failed"); From 151275d708fc9b9b0c3af60ab40960168f9fd0a1 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 20 Oct 2024 18:39:59 +0900 Subject: [PATCH 245/323] [PFCP] Fix SGW-U/UPF Bugs and Improve Header Handling 1. Fix SGW-U/UPF bug by comparing QFI only when PDI's QFI is present Resolved an issue where the QoS Flow Identifier in the GTP-U Extension Header was incorrectly compared regardless of the presence of PDI's QFI. Updated the implementation to perform the comparison only when PDI's QFI is present. 2. Add Outer Header Removal settings to SGW's PDR where necessary Addressed the absence of Outer Header Removal in the SGW's PDR by adding it to all required locations, ensuring proper header handling. 3. Remove unnecessary GTP-U Extension Header Removals Eliminated all instances of GTP-U Extension Header Removal since they should only be used during handover from 5GS to EPS. This cleanup prevents improper header removals in other scenarios. 4. Delete unnecessary usage of Network Interface and UE IP Address Removed all redundant references to Network Interface and UE IP Address, streamlining the codebase and reducing potential confusion. 5. Change precedence so that Control has higher priority than Data Adjusted the precedence settings to ensure that Control messages are given higher priority over Data, enhancing the system's efficiency and responsiveness. --- lib/pfcp/build.c | 94 +++++++++++++++++++----------------------- lib/pfcp/build.h | 3 +- lib/pfcp/context.h | 8 ++-- lib/pfcp/xact.h | 32 +++++++------- src/sgwc/context.h | 3 ++ src/sgwc/s11-handler.c | 88 ++++++++++++++++++++++++++++++++++++++- src/sgwc/s5c-handler.c | 54 +++++++++++++++++++++++- src/sgwc/sxa-build.c | 16 +++++++ src/sgwu/gtp-path.c | 3 +- src/smf/context.c | 44 ++++++++++++++++---- src/smf/n4-build.c | 4 +- src/smf/npcf-handler.c | 7 ++++ src/upf/gtp-path.c | 3 +- 13 files changed, 271 insertions(+), 88 deletions(-) diff --git a/lib/pfcp/build.c b/lib/pfcp/build.c index b2830abc28..59c56fe6c5 100644 --- a/lib/pfcp/build.c +++ b/lib/pfcp/build.c @@ -476,7 +476,8 @@ bool ogs_pfcp_build_created_pdr( } void ogs_pfcp_build_update_pdr( - ogs_pfcp_tlv_update_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr) + ogs_pfcp_tlv_update_pdr_t *message, int i, + ogs_pfcp_pdr_t *pdr, uint64_t modify_flags) { ogs_pfcp_sdf_filter_t pfcp_sdf_filter[OGS_MAX_NUM_OF_FLOW_IN_PDR]; int j = 0; @@ -485,64 +486,55 @@ void ogs_pfcp_build_update_pdr( ogs_assert(message); ogs_assert(pdr); + ogs_assert(modify_flags & + (OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD| + OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE| + OGS_PFCP_MODIFY_EPC_TFT_UPDATE| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL)); + message->presence = 1; message->pdr_id.presence = 1; message->pdr_id.u16 = pdr->id; - message->pdi.presence = 1; - message->pdi.source_interface.presence = 1; - message->pdi.source_interface.u8 = pdr->src_if; + if (modify_flags & + (OGS_PFCP_MODIFY_TFT_NEW|OGS_PFCP_MODIFY_TFT_ADD| + OGS_PFCP_MODIFY_TFT_REPLACE|OGS_PFCP_MODIFY_TFT_DELETE| + OGS_PFCP_MODIFY_EPC_TFT_UPDATE)) { + message->pdi.presence = 1; + message->pdi.source_interface.presence = 1; + message->pdi.source_interface.u8 = pdr->src_if; + + memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); + for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { + ogs_assert(pdr->flow[j].fd || pdr->flow[j].bid); + + if (pdr->flow[j].fd) { + pfcp_sdf_filter[j].fd = 1; + pfcp_sdf_filter[j].flow_description_len = + strlen(pdr->flow[j].description); + pfcp_sdf_filter[j].flow_description = pdr->flow[j].description; + } + if (pdr->flow[j].bid) { + pfcp_sdf_filter[j].bid = 1; + pfcp_sdf_filter[j].sdf_filter_id = pdr->flow[j].sdf_filter_id; + } - if (pdr->dnn) { - message->pdi.network_instance.presence = 1; - message->pdi.network_instance.len = ogs_fqdn_build( - pdrbuf[i].dnn, pdr->dnn, strlen(pdr->dnn)); - message->pdi.network_instance.data = pdrbuf[i].dnn; - } + len = sizeof(ogs_pfcp_sdf_filter_t) + + pfcp_sdf_filter[j].flow_description_len; - memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); - for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { - ogs_assert(pdr->flow[j].fd || pdr->flow[j].bid); - - if (pdr->flow[j].fd) { - pfcp_sdf_filter[j].fd = 1; - pfcp_sdf_filter[j].flow_description_len = - strlen(pdr->flow[j].description); - pfcp_sdf_filter[j].flow_description = pdr->flow[j].description; + message->pdi.sdf_filter[j].presence = 1; + pdrbuf[i].sdf_filter[j] = ogs_calloc(1, len); + ogs_assert(pdrbuf[i].sdf_filter[j]); + ogs_pfcp_build_sdf_filter(&message->pdi.sdf_filter[j], + &pfcp_sdf_filter[j], pdrbuf[i].sdf_filter[j], len); } - if (pdr->flow[j].bid) { - pfcp_sdf_filter[j].bid = 1; - pfcp_sdf_filter[j].sdf_filter_id = pdr->flow[j].sdf_filter_id; - } - - len = sizeof(ogs_pfcp_sdf_filter_t) + - pfcp_sdf_filter[j].flow_description_len; - - message->pdi.sdf_filter[j].presence = 1; - pdrbuf[i].sdf_filter[j] = ogs_calloc(1, len); - ogs_assert(pdrbuf[i].sdf_filter[j]); - ogs_pfcp_build_sdf_filter(&message->pdi.sdf_filter[j], - &pfcp_sdf_filter[j], pdrbuf[i].sdf_filter[j], len); } - - if (pdr->ue_ip_addr_len) { - message->pdi.ue_ip_address.presence = 1; - message->pdi.ue_ip_address.data = &pdr->ue_ip_addr; - message->pdi.ue_ip_address.len = pdr->ue_ip_addr_len; - } - - if (pdr->f_teid_len) { - memcpy(&pdrbuf[i].f_teid, &pdr->f_teid, pdr->f_teid_len); - pdrbuf[i].f_teid.teid = htobe32(pdr->f_teid.teid); - - message->pdi.local_f_teid.presence = 1; - message->pdi.local_f_teid.data = &pdrbuf[i].f_teid; - message->pdi.local_f_teid.len = pdr->f_teid_len; - } - - if (pdr->qfi) { - message->pdi.qfi.presence = 1; - message->pdi.qfi.u8 = pdr->qfi; + if (modify_flags & OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL) { + if (pdr->outer_header_removal_len) { + message->outer_header_removal.presence = 1; + message->outer_header_removal.data = &pdr->outer_header_removal; + message->outer_header_removal.len = pdr->outer_header_removal_len; + } } } diff --git a/lib/pfcp/build.h b/lib/pfcp/build.h index eb83f2f61d..538d93e2f2 100644 --- a/lib/pfcp/build.h +++ b/lib/pfcp/build.h @@ -43,7 +43,8 @@ void ogs_pfcp_build_create_pdr( bool ogs_pfcp_build_created_pdr( ogs_pfcp_tlv_created_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr); void ogs_pfcp_build_update_pdr( - ogs_pfcp_tlv_update_pdr_t *message, int i, ogs_pfcp_pdr_t *pdr); + ogs_pfcp_tlv_update_pdr_t *message, int i, + ogs_pfcp_pdr_t *pdr, uint64_t modify_flags); void ogs_pfcp_build_create_far( ogs_pfcp_tlv_create_far_t *message, int i, ogs_pfcp_far_t *far); diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 956a701aa4..0114572937 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -28,10 +28,10 @@ extern "C" { #endif -#define OGS_PFCP_DEFAULT_PDR_PRECEDENCE 255 -#define OGS_PFCP_INDIRECT_PDR_PRECEDENCE 1 -#define OGS_PFCP_UP2CP_PDR_PRECEDENCE 1 -#define OGS_PFCP_CP2UP_PDR_PRECEDENCE 1000 +#define OGS_PFCP_DEFAULT_PDR_PRECEDENCE 65535 +#define OGS_PFCP_INDIRECT_PDR_PRECEDENCE 4096 +#define OGS_PFCP_UP2CP_PDR_PRECEDENCE 255 +#define OGS_PFCP_CP2UP_PDR_PRECEDENCE 255 #define OGS_PFCP_DEFAULT_CHOOSE_ID 5 #define OGS_PFCP_INDIRECT_DATA_FORWARDING_CHOOSE_ID 10 diff --git a/lib/pfcp/xact.h b/lib/pfcp/xact.h index a10d1b5b64..d41aedf96c 100644 --- a/lib/pfcp/xact.h +++ b/lib/pfcp/xact.h @@ -100,21 +100,23 @@ typedef struct ogs_pfcp_xact_s { #define OGS_PFCP_MODIFY_QOS_CREATE ((uint64_t)1<<14) #define OGS_PFCP_MODIFY_QOS_MODIFY ((uint64_t)1<<15) #define OGS_PFCP_MODIFY_QOS_DELETE ((uint64_t)1<<16) -#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<17) -#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<18) -#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<19) -#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<20) -#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<21) -#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<22) -#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<23) -#define OGS_PFCP_MODIFY_URR ((uint64_t)1<<24) /* type of trigger */ -#define OGS_PFCP_MODIFY_URR_MEAS_METHOD ((uint64_t)1<<25) -#define OGS_PFCP_MODIFY_URR_REPORT_TRIGGER ((uint64_t)1<<26) -#define OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME ((uint64_t)1<<27) -#define OGS_PFCP_MODIFY_URR_VOLUME_QUOTA ((uint64_t)1<<28) -#define OGS_PFCP_MODIFY_URR_TIME_QUOTA ((uint64_t)1<<29) -#define OGS_PFCP_MODIFY_URR_VOLUME_THRESH ((uint64_t)1<<30) -#define OGS_PFCP_MODIFY_URR_TIME_THRESH ((uint64_t)1<<31) +#define OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL ((uint64_t)1<<17) +#define OGS_PFCP_MODIFY_ACTIVATE ((uint64_t)1<<18) +#define OGS_PFCP_MODIFY_DEACTIVATE ((uint64_t)1<<19) +#define OGS_PFCP_MODIFY_END_MARKER ((uint64_t)1<<20) +#define OGS_PFCP_MODIFY_ERROR_INDICATION ((uint64_t)1<<21) +#define OGS_PFCP_MODIFY_XN_HANDOVER ((uint64_t)1<<22) +#define OGS_PFCP_MODIFY_N2_HANDOVER ((uint64_t)1<<23) +#define OGS_PFCP_MODIFY_HANDOVER_CANCEL ((uint64_t)1<<24) +#define OGS_PFCP_MODIFY_HOME_ROUTED_ROAMING ((uint64_t)1<<25) +#define OGS_PFCP_MODIFY_URR ((uint64_t)1<<26) /* type of trigger */ +#define OGS_PFCP_MODIFY_URR_MEAS_METHOD ((uint64_t)1<<27) +#define OGS_PFCP_MODIFY_URR_REPORT_TRIGGER ((uint64_t)1<<28) +#define OGS_PFCP_MODIFY_URR_QUOTA_VALIDITY_TIME ((uint64_t)1<<29) +#define OGS_PFCP_MODIFY_URR_VOLUME_QUOTA ((uint64_t)1<<30) +#define OGS_PFCP_MODIFY_URR_TIME_QUOTA ((uint64_t)1<<31) +#define OGS_PFCP_MODIFY_URR_VOLUME_THRESH ((uint64_t)1<<32) +#define OGS_PFCP_MODIFY_URR_TIME_THRESH ((uint64_t)1<<33) uint64_t modify_flags; #define OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED 1 diff --git a/src/sgwc/context.h b/src/sgwc/context.h index 0831159d5e..f028af6817 100644 --- a/src/sgwc/context.h +++ b/src/sgwc/context.h @@ -89,6 +89,9 @@ typedef struct sgwc_sess_s { /* APN Configuration */ ogs_session_t session; + /* PDN Address Allocation (PAA) */ + ogs_paa_t paa; + ogs_list_t bearer_list; /* Related Context */ diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index aa700b7609..e10de621bc 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -428,6 +428,7 @@ void sgwc_s11_handle_modify_bearer_request( sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *dl_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_ip_t remote_ip; ogs_ip_t zero_ip; @@ -515,8 +516,10 @@ void sgwc_s11_handle_modify_bearer_request( ogs_assert(current_xact); current_xact->assoc_xact_id = s11_xact->id; - current_xact->modify_flags = OGS_PFCP_MODIFY_SESSION| - OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE; + current_xact->modify_flags = + OGS_PFCP_MODIFY_SESSION|OGS_PFCP_MODIFY_DL_ONLY| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL| + OGS_PFCP_MODIFY_ACTIVATE; if (gtpbuf) { current_xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); ogs_assert(current_xact->gtpbuf); @@ -553,6 +556,24 @@ void sgwc_s11_handle_modify_bearer_request( memcpy(&dl_tunnel->remote_ip, &remote_ip, sizeof(ogs_ip_t)); + pdr = dl_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); + ogs_assert_if_reached(); + } + far = dl_tunnel->far; ogs_assert(far); @@ -745,6 +766,7 @@ void sgwc_s11_handle_create_bearer_response( sgwc_bearer_t *bearer = NULL; ogs_pool_id_t bearer_id = OGS_INVALID_POOL_ID; sgwc_tunnel_t *dl_tunnel = NULL, *ul_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp_xact_t *s5c_xact = NULL; @@ -912,6 +934,25 @@ void sgwc_s11_handle_create_bearer_response( ogs_assert(OGS_OK == ogs_gtp2_f_teid_to_ip(enb_s1u_teid, &dl_tunnel->remote_ip)); + pdr = dl_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); + ogs_assert_if_reached(); + } + far = dl_tunnel->far; ogs_assert(far); @@ -1341,6 +1382,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( sgwc_sess_t *sess = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_create_indirect_data_forwarding_tunnel_request_t *req = NULL; @@ -1393,6 +1435,8 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( bearer = sgwc_bearer_find_by_ue_ebi(sgwc_ue, req->bearer_contexts[i].eps_bearer_id.u8); ogs_assert(bearer); + sess = sgwc_sess_find_by_id(bearer->sess_id); + ogs_assert(sess); if (req->bearer_contexts[i].s1_u_enodeb_f_teid.presence) { req_teid = req->bearer_contexts[i].s1_u_enodeb_f_teid.data; @@ -1413,6 +1457,26 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( return; } + pdr = tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", + sess->session.session_type); + ogs_assert_if_reached(); + } + far = tunnel->far; ogs_assert(far); @@ -1448,6 +1512,26 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request( return; } + pdr = tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", + sess->session.session_type); + ogs_assert_if_reached(); + } + far = tunnel->far; ogs_assert(far); diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index 92cf4ac5e5..8fa74ff2d0 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -76,6 +76,7 @@ void sgwc_s5c_handle_create_session_response( sgwc_ue_t *sgwc_ue = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *ul_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_f_teid_t *pgw_s5c_teid = NULL; @@ -145,6 +146,17 @@ void sgwc_s5c_handle_create_session_response( if (rsp->pdn_address_allocation.presence == 0) { ogs_error("No PDN Address Allocation [Cause:%d]", session_cause); cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; + } else { + memcpy(&sess->paa, rsp->pdn_address_allocation.data, + rsp->pdn_address_allocation.len); + sess->session.session_type = sess->paa.session_type; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + } else { + ogs_error("Unknown session-type [%d]", sess->session.session_type); + cause_value = OGS_GTP2_CAUSE_PREFERRED_PDN_TYPE_NOT_SUPPORTED; + } } if (rsp->cause.presence == 0) { @@ -253,6 +265,24 @@ void sgwc_s5c_handle_create_session_response( return; } + pdr = ul_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); + ogs_assert_if_reached(); + } + far = ul_tunnel->far; ogs_assert(far); @@ -286,7 +316,9 @@ void sgwc_s5c_handle_create_session_response( ogs_assert(OGS_OK == sgwc_pfcp_send_session_modification_request( sess, s11_xact->id, gtpbuf, - OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE)); + OGS_PFCP_MODIFY_UL_ONLY| + OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL| + OGS_PFCP_MODIFY_ACTIVATE)); } void sgwc_s5c_handle_modify_bearer_response( @@ -536,6 +568,7 @@ void sgwc_s5c_handle_create_bearer_request( sgwc_ue_t *sgwc_ue = NULL; sgwc_bearer_t *bearer = NULL; sgwc_tunnel_t *ul_tunnel = NULL; + ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; ogs_gtp2_create_bearer_request_t *req = NULL; @@ -630,6 +663,25 @@ void sgwc_s5c_handle_create_bearer_request( return; } + pdr = ul_tunnel->pdr; + ogs_assert(pdr); + + pdr->outer_header_removal_len = 1; + if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; + } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; + } else if (sess->session.session_type == + OGS_PDU_SESSION_TYPE_IPV4V6) { + pdr->outer_header_removal.description = + OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); + ogs_assert_if_reached(); + } + far = ul_tunnel->far; ogs_assert(far); diff --git a/src/sgwc/sxa-build.c b/src/sgwc/sxa-build.c index 41675e3e3b..7e7998f85a 100644 --- a/src/sgwc/sxa-build.c +++ b/src/sgwc/sxa-build.c @@ -131,6 +131,7 @@ ogs_pkbuf_t *sgwc_sxa_build_bearer_to_modify_list( int num_of_remove_far = 0; int num_of_create_pdr = 0; int num_of_create_far = 0; + int num_of_update_pdr = 0; int num_of_update_far = 0; uint64_t modify_flags = 0; @@ -259,10 +260,25 @@ ogs_pkbuf_t *sgwc_sxa_build_bearer_to_modify_list( ogs_assert_if_reached(); } + + if (modify_flags & OGS_PFCP_MODIFY_OUTER_HEADER_REMOVAL) { + /* Update PDR */ + pdr = tunnel->pdr; + if (pdr) { + ogs_pfcp_build_update_pdr( + &req->update_pdr[num_of_update_pdr], + num_of_update_pdr, pdr, modify_flags); + num_of_update_pdr++; + } else + ogs_assert_if_reached(); + } } } } + ogs_assert(num_of_remove_pdr + num_of_remove_far + num_of_create_pdr + + num_of_create_far + num_of_update_pdr + num_of_update_far); + pfcp_message->h.type = type; pkbuf = ogs_pfcp_build_msg(pfcp_message); ogs_expect(pkbuf); diff --git a/src/sgwu/gtp-path.c b/src/sgwu/gtp-path.c index ab229d3689..cb6e30e30c 100644 --- a/src/sgwu/gtp-path.c +++ b/src/sgwu/gtp-path.c @@ -236,8 +236,7 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) continue; /* Check if QFI */ - if (header_desc.qos_flow_identifier && - pdr->qfi != header_desc.qos_flow_identifier) + if (pdr->qfi && pdr->qfi != header_desc.qos_flow_identifier) continue; /* Check if Rule List in PDR */ diff --git a/src/smf/context.c b/src/smf/context.c index bd0ba90667..a08fcfa72e 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1965,7 +1965,7 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ul_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; - ul_pdr->outer_header_removal_len = 2; + ul_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; @@ -1975,10 +1975,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); ogs_assert_if_reached(); - ul_pdr->outer_header_removal.gtpu_extheader_deletion = - OGS_PFCP_PDU_SESSION_CONTAINER_TO_BE_DELETED; + } /* FAR */ dl_far = ogs_pfcp_far_add(&sess->pfcp); @@ -2077,8 +2077,10 @@ void smf_sess_create_indirect_data_forwarding(smf_sess_t *sess) } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); ogs_assert_if_reached(); + } far = ogs_pfcp_far_add(&sess->pfcp); ogs_assert(far); @@ -2245,9 +2247,15 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) ogs_assert(cp2up_pdr); sess->cp2up_pdr = cp2up_pdr; +#if 0 + /* + * DEPRECATED: + * In PDR, no need to distinguish the Network Instance from CP to UP. + */ ogs_assert(sess->session.name); cp2up_pdr->apn = ogs_strdup(sess->session.name); ogs_assert(cp2up_pdr->apn); +#endif cp2up_pdr->src_if = OGS_PFCP_INTERFACE_CP_FUNCTION; @@ -2261,8 +2269,10 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { cp2up_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); ogs_assert_if_reached(); + } up2cp_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(up2cp_pdr); @@ -2284,8 +2294,10 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { up2cp_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); ogs_assert_if_reached(); + } qos_flow = smf_default_bearer_in_sess(sess); ogs_assert(qos_flow); @@ -2302,14 +2314,27 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) sess->up2cp_far = up2cp_far; ogs_assert(sess->session.name); +#if 0 + /* + * DEPRECATED: + * In FAR, no need to distinguish the Network Instance from CP to UP. + */ up2cp_far->apn = ogs_strdup(sess->session.name); ogs_assert(up2cp_far->apn); +#endif up2cp_far->dst_if = OGS_PFCP_INTERFACE_CP_FUNCTION; ogs_pfcp_pdr_associate_far(up2cp_pdr, up2cp_far); up2cp_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; +#if 0 + /* + * MODIFIED the PDI matching for UP2CP + * to not distinguish the QoS Flow Identifier. + * + * When omitted, the UPF was also adjusted to not compare the QFI. + */ if (qos_flow->qer && qos_flow->qfi) { /* To match the PDI of UP2CP_PDR(from ff02::2/128 to assigned) * Router-Solicitation has QFI in the Extended Header */ @@ -2319,6 +2344,7 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) * it includes QFI in extension header */ ogs_pfcp_pdr_associate_qer(cp2up_pdr, qos_flow->qer); } +#endif } void smf_sess_delete_cp_up_data_forwarding(smf_sess_t *sess) @@ -2415,8 +2441,10 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { ul_pdr->outer_header_removal.description = OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else + } else { + ogs_error("Invalid session_type [%d]", sess->session.session_type); ogs_assert_if_reached(); + } /* FAR */ dl_far = ogs_pfcp_far_add(&sess->pfcp); diff --git a/src/smf/n4-build.c b/src/smf/n4-build.c index cc0d381d29..355bb2a8a1 100644 --- a/src/smf/n4-build.c +++ b/src/smf/n4-build.c @@ -489,13 +489,13 @@ ogs_pkbuf_t *smf_n4_build_qos_flow_to_modify_list( if (qos_flow->dl_pdr) { ogs_pfcp_build_update_pdr( &req->update_pdr[num_of_update_pdr], - num_of_update_pdr, qos_flow->dl_pdr); + num_of_update_pdr, qos_flow->dl_pdr, modify_flags); num_of_update_pdr++; } if (qos_flow->ul_pdr) { ogs_pfcp_build_update_pdr( &req->update_pdr[num_of_update_pdr], - num_of_update_pdr, qos_flow->ul_pdr); + num_of_update_pdr, qos_flow->ul_pdr, modify_flags); num_of_update_pdr++; } if (qos_flow->urr) { diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index e4057a5d85..fb0096a334 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -521,9 +521,16 @@ bool smf_npcf_smpolicycontrol_handle_create( &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; +#if 0 + /* DEPRECATED: + * + * The UE IP Address is unnecessary in the PDI of the UL PDR + * because the PDR can be found using the TEID. + */ ogs_assert(OGS_OK == ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); +#endif if (sess->session.ipv4_framed_routes && sess->pfcp_node->up_function_features.frrt) { diff --git a/src/upf/gtp-path.c b/src/upf/gtp-path.c index 7daa439e5a..878b94a6cf 100644 --- a/src/upf/gtp-path.c +++ b/src/upf/gtp-path.c @@ -450,8 +450,7 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) continue; /* Check if QFI */ - if (header_desc.qos_flow_identifier && - pdr->qfi != header_desc.qos_flow_identifier) + if (pdr->qfi && pdr->qfi != header_desc.qos_flow_identifier) continue; /* Check if Rule List in PDR */ From ce36143f5cf91be771e96fd501664485bfe2c0a6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 20 Oct 2024 22:52:30 +0900 Subject: [PATCH 246/323] [PFCP] Add Missing 3GPP Interface Type in PFCP Messages This field was previously omitted, which could lead to improper handling of interface-specific logic in certain scenarios. The addition of the 3GPP Interface Type ensures correct behavior in compliance with the 3GPP standards for PFCP message handling. --- lib/pfcp/build.c | 24 +++++++++++++++++ lib/pfcp/context.h | 7 +++++ lib/pfcp/handler.c | 24 +++++++++++++++++ lib/pfcp/message.c | 6 ++--- lib/pfcp/message.h | 4 +-- lib/pfcp/support/pfcp-tlv.py | 1 + lib/pfcp/types.h | 50 ++++++++++++++++++++++++++++++++++-- src/sgwc/context.c | 23 +++++++++++++++-- src/smf/context.c | 40 +++++++++++++++++++++++++++++ 9 files changed, 170 insertions(+), 9 deletions(-) diff --git a/lib/pfcp/build.c b/lib/pfcp/build.c index 59c56fe6c5..ec7086d804 100644 --- a/lib/pfcp/build.c +++ b/lib/pfcp/build.c @@ -355,6 +355,11 @@ void ogs_pfcp_build_create_pdr( message->pdi.source_interface.presence = 1; message->pdi.source_interface.u8 = pdr->src_if; + if (pdr->src_if_type_presence) { + message->pdi.source_interface_type.presence = 1; + message->pdi.source_interface_type.u8 = pdr->src_if_type; + } + if (pdr->dnn) { message->pdi.network_instance.presence = 1; message->pdi.network_instance.len = ogs_fqdn_build( @@ -504,6 +509,11 @@ void ogs_pfcp_build_update_pdr( message->pdi.source_interface.presence = 1; message->pdi.source_interface.u8 = pdr->src_if; + if (pdr->src_if_type_presence) { + message->pdi.source_interface_type.presence = 1; + message->pdi.source_interface_type.u8 = pdr->src_if_type; + } + memset(pfcp_sdf_filter, 0, sizeof(pfcp_sdf_filter)); for (j = 0; j < pdr->num_of_flow && j < OGS_MAX_NUM_OF_FLOW_IN_PDR; j++) { ogs_assert(pdr->flow[j].fd || pdr->flow[j].bid); @@ -566,6 +576,13 @@ void ogs_pfcp_build_create_far( message->forwarding_parameters.destination_interface.u8 = far->dst_if; + if (far->dst_if_type_presence) { + message->forwarding_parameters.destination_interface_type. + presence = 1; + message->forwarding_parameters.destination_interface_type. + u8 = far->dst_if_type; + } + if (far->dnn) { message->forwarding_parameters.network_instance.presence = 1; message->forwarding_parameters.network_instance.len = @@ -637,6 +654,13 @@ void ogs_pfcp_build_update_far_activate( message->update_forwarding_parameters. destination_interface.u8 = far->dst_if; + if (far->dst_if_type_presence) { + message->update_forwarding_parameters.destination_interface_type. + presence = 1; + message->update_forwarding_parameters.destination_interface_type. + u8 = far->dst_if_type; + } + if (far->dnn) { message->update_forwarding_parameters.network_instance.presence = 1; message->update_forwarding_parameters.network_instance.len = diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 0114572937..289bbd9896 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -156,6 +156,9 @@ typedef struct ogs_pfcp_pdr_s { ogs_pfcp_precedence_t precedence; ogs_pfcp_interface_t src_if; + bool src_if_type_presence; + ogs_pfcp_3gpp_interface_type_t src_if_type; + union { char *apn; char *dnn; @@ -238,6 +241,10 @@ typedef struct ogs_pfcp_far_s { ogs_pfcp_far_id_t id; ogs_pfcp_apply_action_t apply_action; ogs_pfcp_interface_t dst_if; + + bool dst_if_type_presence; + ogs_pfcp_3gpp_interface_type_t dst_if_type; + ogs_pfcp_outer_header_creation_t outer_header_creation; int outer_header_creation_len; diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 0da0814aa9..6228d1361c 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -413,6 +413,11 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess, pdr->src_if = message->pdi.source_interface.u8; + if (message->pdi.source_interface_type.presence) { + pdr->src_if_type_presence = true; + pdr->src_if_type = message->pdi.source_interface_type.u8; + } + ogs_pfcp_rule_remove_all(pdr); for (i = 0; i < OGS_MAX_NUM_OF_FLOW_IN_PDR; i++) { @@ -758,6 +763,11 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_update_pdr(ogs_pfcp_sess_t *sess, pdr->src_if = message->pdi.source_interface.u8; + if (message->pdi.source_interface_type.presence) { + pdr->src_if_type_presence = true; + pdr->src_if_type = message->pdi.source_interface_type.u8; + } + ogs_pfcp_rule_remove_all(pdr); for (i = 0; i < OGS_MAX_NUM_OF_FLOW_IN_PDR; i++) { @@ -971,6 +981,13 @@ ogs_pfcp_far_t *ogs_pfcp_handle_create_far(ogs_pfcp_sess_t *sess, message->forwarding_parameters.destination_interface.u8; } + if (message->forwarding_parameters.destination_interface_type. + presence) { + far->dst_if_type_presence = true; + far->dst_if_type = message->forwarding_parameters. + destination_interface_type.u8; + } + if (message->forwarding_parameters.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; @@ -1078,6 +1095,13 @@ ogs_pfcp_far_t *ogs_pfcp_handle_update_far(ogs_pfcp_sess_t *sess, message->update_forwarding_parameters.destination_interface.u8; } + if (message->update_forwarding_parameters.destination_interface_type. + presence) { + far->dst_if_type_presence = true; + far->dst_if_type = message->update_forwarding_parameters. + destination_interface_type.u8; + } + if (message->update_forwarding_parameters.network_instance.presence) { char dnn[OGS_MAX_DNN_LEN+1]; diff --git a/lib/pfcp/message.c b/lib/pfcp/message.c index 50941162d7..59c0060d29 100644 --- a/lib/pfcp/message.c +++ b/lib/pfcp/message.c @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.346970 by acetcom + * Created on: 2024-10-20 22:37:02.550243 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -1348,10 +1348,10 @@ ogs_tlv_desc_t ogs_pfcp_tlv_desc_apn_dnn = ogs_tlv_desc_t ogs_pfcp_tlv_desc__interface_type = { - OGS_TLV_VAR_STR, + OGS_TLV_UINT8, "3GPP Interface Type", OGS_PFCP__INTERFACE_TYPE_TYPE, - 0, + 1, 0, sizeof(ogs_pfcp_tlv__interface_type_t), { NULL } diff --git a/lib/pfcp/message.h b/lib/pfcp/message.h index c186cb988a..e24749d766 100644 --- a/lib/pfcp/message.h +++ b/lib/pfcp/message.h @@ -20,7 +20,7 @@ /******************************************************************************* * This file had been created by pfcp-tlv.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-19 23:36:01.327925 by acetcom + * Created on: 2024-10-20 22:37:02.530796 by acetcom * from 29244-h71-modified.docx ******************************************************************************/ @@ -885,7 +885,7 @@ typedef ogs_tlv_octet_t ogs_pfcp_tlv_time_stamp_t; typedef ogs_tlv_uint32_t ogs_pfcp_tlv_averaging_window_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_paging_policy_indicator_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_apn_dnn_t; -typedef ogs_tlv_octet_t ogs_pfcp_tlv__interface_type_t; +typedef ogs_tlv_uint8_t ogs_pfcp_tlv__interface_type_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_pfcpsrreq_flags_t; typedef ogs_tlv_uint8_t ogs_pfcp_tlv_pfcpaureq_flags_t; typedef ogs_tlv_octet_t ogs_pfcp_tlv_activation_time_t; diff --git a/lib/pfcp/support/pfcp-tlv.py b/lib/pfcp/support/pfcp-tlv.py index 671b81640c..0c4935a425 100644 --- a/lib/pfcp/support/pfcp-tlv.py +++ b/lib/pfcp/support/pfcp-tlv.py @@ -516,6 +516,7 @@ def write_cells_to_file(name, cells): type_list["Event Threshold"]["size"] = 4 # Type 149 type_list["Averaging Window"]["size"] = 4 # Type 157 type_list["Paging Policy Indicator"]["size"] = 1 # Type 158 +type_list["3GPP Interface Type"]["size"] = 1 # Type 160 type_list["PFCPSRReq-Flags"]["size"] = 1 # Type 161 type_list["PFCPAUReq-Flags"]["size"] = 1 # Type 162 type_list["Quota Validity Time"]["size"] = 4 # Type 181 diff --git a/lib/pfcp/types.h b/lib/pfcp/types.h index 895a7efd2c..433382f5d9 100644 --- a/lib/pfcp/types.h +++ b/lib/pfcp/types.h @@ -441,8 +441,6 @@ ED7(uint8_t spare:2;, #define OGS_PFCP_APPLY_ACTION_MBSU (1<<4) typedef uint16_t ogs_pfcp_apply_action_t; - - /* 8.2.58 CP Function Features */ typedef struct ogs_pfcp_cp_function_features_s { union { @@ -1651,6 +1649,54 @@ int16_t ogs_pfcp_build_user_id( ogs_tlv_octet_t *octet, ogs_pfcp_user_id_t *user_id, void *data, int data_len); +/* + * 8.2.118 3GPP Interface Type + * + * NOTE 1: If separation of roaming and non-roaming traffic is desired + * this value should only be used for the S5-U interface + * and "S8-U" (decimal 19) should be used for the S8-U interface. + * NOTE 2: If separation of roaming and non-roaming traffic is desired + * this value should only be used for the Gn-U interface + * and "Gp-U" (decimal 20) should be used for the Gp-U interface. + * NOTE 3: If separation of roaming and non-roaming traffic is desired, + * this value should only be used for N9 non-roaming interfaces + * and (decimal value "21") should be used for N9 roaming interfaces. + */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U 0 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U 1 /* NOTE 1 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S4_U 2 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S11_U 3 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S12 4 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_GN_GP_U 5 /* NOTE 2 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S2A_U 6 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S2B_U 7 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_ENB_GTP_U_FOR_DL_DATA_FORWARDING 8 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_ENB_GTP_U_FOR_UL_DATA_FORWARDING 9 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING 10 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS 11 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_TRUSTED_NON_3GPP_ACCESS 12 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_UNTRUSTED_NON_3GPP_ACCESS 13 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3_FOR_DATA_FORWARDING 14 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9 15 /* NOTE 3 */ +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGI 16 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N6 17 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N19 18 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_S8_U 19 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_GP_U 20 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9_FOR_ROAMING 21 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_IU_U 22 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N9_FOR_DATA_FORWARDING 23 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXA_U 24 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXB_U 25 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SXC_U 26 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N4_U 27 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING 28 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N6MB_NMB9 29 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N3MB 30 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_N19MB 31 +#define OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN 0xff +typedef uint8_t ogs_pfcp_3gpp_interface_type_t; + /* * 8.2.136 PFCPSEReq-Flags * diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 7d7e11de3e..3c19ad7bee 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -648,8 +648,12 @@ sgwc_tunnel_t *sgwc_tunnel_add( ogs_pfcp_pdr_t *pdr = NULL; ogs_pfcp_far_t *far = NULL; - uint8_t src_if = OGS_PFCP_INTERFACE_UNKNOWN; - uint8_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_interface_t src_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_interface_t dst_if = OGS_PFCP_INTERFACE_UNKNOWN; + ogs_pfcp_3gpp_interface_type_t src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN; + ogs_pfcp_3gpp_interface_type_t dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_UNKNOWN; ogs_assert(bearer); sess = sgwc_sess_find_by_id(bearer->sess_id); @@ -659,20 +663,28 @@ sgwc_tunnel_t *sgwc_tunnel_add( /* Downlink */ case OGS_GTP2_F_TEID_S5_S8_SGW_GTP_U: src_if = OGS_PFCP_INTERFACE_CORE; + src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U; dst_if = OGS_PFCP_INTERFACE_ACCESS; + dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U; break; /* Uplink */ case OGS_GTP2_F_TEID_S1_U_SGW_GTP_U: src_if = OGS_PFCP_INTERFACE_ACCESS; + src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S1_U; dst_if = OGS_PFCP_INTERFACE_CORE; + dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_S5_S8_U; break; /* Indirect */ case OGS_GTP2_F_TEID_SGW_GTP_U_FOR_DL_DATA_FORWARDING: case OGS_GTP2_F_TEID_SGW_GTP_U_FOR_UL_DATA_FORWARDING: src_if = OGS_PFCP_INTERFACE_ACCESS; + src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING; dst_if = OGS_PFCP_INTERFACE_ACCESS; + dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING; break; default: ogs_fatal("Invalid interface type = %d", interface_type); @@ -693,6 +705,9 @@ sgwc_tunnel_t *sgwc_tunnel_add( pdr->src_if = src_if; + pdr->src_if_type_presence = true; + pdr->src_if_type = src_if_type; + far = ogs_pfcp_far_add(&sess->pfcp); ogs_assert(far); @@ -701,6 +716,10 @@ sgwc_tunnel_t *sgwc_tunnel_add( ogs_assert(far->apn); far->dst_if = dst_if; + + far->dst_if_type_presence = true; + far->dst_if_type = dst_if_type; + ogs_pfcp_pdr_associate_far(pdr, far); far->apply_action = diff --git a/src/smf/context.c b/src/smf/context.c index a08fcfa72e..b2a0f26ab0 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1955,6 +1955,9 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) dl_pdr->src_if = OGS_PFCP_INTERFACE_CORE; + dl_pdr->src_if_type_presence = true; + dl_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ul_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(ul_pdr); qos_flow->ul_pdr = ul_pdr; @@ -1965,6 +1968,9 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ul_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + ul_pdr->src_if_type_presence = true; + ul_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ul_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { ul_pdr->outer_header_removal.description = @@ -1990,6 +1996,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ogs_assert(dl_far->apn); dl_far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + dl_far->dst_if_type_presence = true; + dl_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ogs_pfcp_pdr_associate_far(dl_pdr, dl_far); dl_far->apply_action = @@ -2005,6 +2015,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ogs_assert(ul_far->apn); ul_far->dst_if = OGS_PFCP_INTERFACE_CORE; + + ul_far->dst_if_type_presence = true; + ul_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ogs_pfcp_pdr_associate_far(ul_pdr, ul_far); ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; @@ -2067,6 +2081,10 @@ void smf_sess_create_indirect_data_forwarding(smf_sess_t *sess) pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + pdr->src_if_type_presence = true; + pdr->src_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_UL_DATA_FORWARDING; + pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { pdr->outer_header_removal.description = @@ -2090,6 +2108,11 @@ void smf_sess_create_indirect_data_forwarding(smf_sess_t *sess) ogs_assert(far->apn); far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + far->dst_if_type_presence = true; + far->dst_if_type = + OGS_PFCP_3GPP_INTERFACE_TYPE_SGW_UPF_GTP_U_FOR_DL_DATA_FORWARDING; + ogs_pfcp_pdr_associate_far(pdr, far); far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; @@ -2284,6 +2307,9 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) up2cp_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + up2cp_pdr->src_if_type_presence = true; + up2cp_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + up2cp_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { up2cp_pdr->outer_header_removal.description = @@ -2421,6 +2447,9 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) dl_pdr->src_if = OGS_PFCP_INTERFACE_CORE; + dl_pdr->src_if_type_presence = true; + dl_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ul_pdr = ogs_pfcp_pdr_add(&sess->pfcp); ogs_assert(ul_pdr); bearer->ul_pdr = ul_pdr; @@ -2431,6 +2460,9 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ul_pdr->src_if = OGS_PFCP_INTERFACE_ACCESS; + ul_pdr->src_if_type_presence = true; + ul_pdr->src_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ul_pdr->outer_header_removal_len = 1; if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { ul_pdr->outer_header_removal.description = @@ -2456,6 +2488,10 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ogs_assert(dl_far->apn); dl_far->dst_if = OGS_PFCP_INTERFACE_ACCESS; + + dl_far->dst_if_type_presence = true; + dl_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N3_3GPP_ACCESS; + ogs_pfcp_pdr_associate_far(dl_pdr, dl_far); dl_far->apply_action = @@ -2471,6 +2507,10 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ogs_assert(ul_far->apn); ul_far->dst_if = OGS_PFCP_INTERFACE_CORE; + + ul_far->dst_if_type_presence = true; + ul_far->dst_if_type = OGS_PFCP_3GPP_INTERFACE_TYPE_N6; + ogs_pfcp_pdr_associate_far(ul_pdr, ul_far); ul_far->apply_action = OGS_PFCP_APPLY_ACTION_FORW; From bc02e48d1ab3df1296ec6d4e5eb65cd95e804ca4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 31 Oct 2024 22:20:06 +0900 Subject: [PATCH 247/323] [ePDG] Add Node-Identifier IE support in GTPv2 S2b Create-Session-Request for SMF Diameter S6b Routing (#3507) Implement support for Node-Identifier IE in GTPv2 S2b Create-Session-Request to SMF for Diameter S6b integration This patch adds support for processing the Node-Identifier IE within GTPv2 Create-Session-Request messages sent via the S2b interface to the SMF. When the ePDG includes the Node-Identifier IE containing both host and realm of the AAA-Server, the SMF now uses this information to populate the Destination-Realm and Destination-Host AVPs in the Diameter S6b AAR message. This enables seamless integration and allows the SMF to route requests directly to the appropriate AAA-Server, enhancing interoperability in setups where the host and realm data are required by the Diameter network. --- lib/gtp/v2/types.c | 104 ++++++++++++++++++++++++++++++++++++-- lib/gtp/v2/types.h | 14 +++++ src/smf/context.c | 5 ++ src/smf/context.h | 6 +++ src/smf/s5c-handler.c | 28 ++++++++++ src/smf/s6b-path.c | 21 +++++++- tests/non3gpp/s2b-build.c | 13 +++++ 7 files changed, 186 insertions(+), 5 deletions(-) diff --git a/lib/gtp/v2/types.c b/lib/gtp/v2/types.c index 949588ef4d..ea8bee3d57 100644 --- a/lib/gtp/v2/types.c +++ b/lib/gtp/v2/types.c @@ -26,13 +26,15 @@ int16_t ogs_gtp2_parse_bearer_qos( ogs_gtp2_bearer_qos_t *bearer_qos, ogs_tlv_octet_t *octet) { - ogs_gtp2_bearer_qos_t *source = (ogs_gtp2_bearer_qos_t *)octet->data; + ogs_gtp2_bearer_qos_t *source = NULL; int16_t size = 0; ogs_assert(bearer_qos); ogs_assert(octet); ogs_assert(octet->len == GTP2_BEARER_QOS_LEN); + source = (ogs_gtp2_bearer_qos_t *)octet->data; + memset(bearer_qos, 0, sizeof(ogs_gtp2_bearer_qos_t)); bearer_qos->pre_emption_capability = source->pre_emption_capability; @@ -201,13 +203,15 @@ uint64_t ogs_gtp2_qos_to_kbps(uint8_t br, uint8_t extended, uint8_t extended2) int16_t ogs_gtp2_parse_flow_qos( ogs_gtp2_flow_qos_t *flow_qos, ogs_tlv_octet_t *octet) { - ogs_gtp2_flow_qos_t *source = (ogs_gtp2_flow_qos_t *)octet->data; + ogs_gtp2_flow_qos_t *source = NULL; int16_t size = 0; ogs_assert(flow_qos); ogs_assert(octet); ogs_assert(octet->len == GTP2_FLOW_QOS_LEN); + source = (ogs_gtp2_flow_qos_t *)octet->data; + memset(flow_qos, 0, sizeof(ogs_gtp2_flow_qos_t)); flow_qos->qci = source->qci; @@ -617,12 +621,14 @@ int16_t ogs_gtp2_build_tft( /* 8.21 User Location Information (ULI) */ int16_t ogs_gtp2_parse_uli(ogs_gtp2_uli_t *uli, ogs_tlv_octet_t *octet) { - ogs_gtp2_uli_t *source = (ogs_gtp2_uli_t *)octet->data; + ogs_gtp2_uli_t *source = NULL; int16_t size = 0; ogs_assert(uli); ogs_assert(octet); + source = (ogs_gtp2_uli_t *)octet->data; + memset(uli, 0, sizeof(ogs_gtp2_uli_t)); uli->flags = source->flags; @@ -796,3 +802,95 @@ int16_t ogs_gtp2_build_uli( return octet->len; } + +int16_t ogs_gtp2_parse_node_identifier( + ogs_gtp2_node_identifier_t *node_identifier, ogs_tlv_octet_t *octet) +{ + int16_t size = 0; + + ogs_assert(node_identifier); + ogs_assert(octet); + + memset(node_identifier, 0, sizeof(ogs_gtp2_node_identifier_t)); + + if (size + sizeof(node_identifier->name_len) > octet->len) { + ogs_error("Invalid TLV length [%d != %d]", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + memcpy(&node_identifier->name_len, + (unsigned char *)octet->data + size, + sizeof(node_identifier->name_len)); + size += sizeof(node_identifier->name_len); + + if (size + node_identifier->name_len > octet->len) { + ogs_error("Invalid TLV length [%d != %d]", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + node_identifier->name = (char *)octet->data + size; + size += node_identifier->name_len; + + if (size + sizeof(node_identifier->realm_len) > octet->len) { + ogs_error("Invalid TLV length [%d != %d]", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + memcpy(&node_identifier->realm_len, + (unsigned char *)octet->data + size, + sizeof(node_identifier->realm_len)); + size += sizeof(node_identifier->realm_len); + + if (size + node_identifier->realm_len > octet->len) { + ogs_error("Invalid TLV length [%d != %d]", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + return size; + } + node_identifier->realm = (char *)octet->data + size; + size += node_identifier->realm_len; + + if (size != octet->len) { + ogs_error("Invalid TLV length [%d != %d]", size, octet->len); + ogs_log_hexdump(OGS_LOG_ERROR, octet->data, octet->len); + } + + return size; +} +int16_t ogs_gtp2_build_node_identifier(ogs_tlv_octet_t *octet, + ogs_gtp2_node_identifier_t *node_identifier, void *data, int data_len) +{ + int16_t size = 0; + + ogs_assert(node_identifier); + ogs_assert(octet); + ogs_assert(data); + ogs_assert(data_len); + + octet->data = data; + + ogs_assert(size + sizeof(node_identifier->name_len) <= data_len); + memcpy((unsigned char *)octet->data + size, + &node_identifier->name_len, + sizeof(node_identifier->name_len)); + size += sizeof(node_identifier->name_len); + + ogs_assert(size + node_identifier->name_len <= data_len); + memcpy((unsigned char *)octet->data + size, + node_identifier->name, node_identifier->name_len); + size += node_identifier->name_len; + + ogs_assert(size + sizeof(node_identifier->realm_len) <= data_len); + memcpy((unsigned char *)octet->data + size, + &node_identifier->realm_len, + sizeof(node_identifier->realm_len)); + size += sizeof(node_identifier->realm_len); + + ogs_assert(size + node_identifier->realm_len <= data_len); + memcpy((unsigned char *)octet->data + size, + node_identifier->realm, node_identifier->realm_len); + size += node_identifier->realm_len; + + octet->len = size; + + return octet->len; +} diff --git a/lib/gtp/v2/types.h b/lib/gtp/v2/types.h index a1cc7d574f..486eddbfb0 100644 --- a/lib/gtp/v2/types.h +++ b/lib/gtp/v2/types.h @@ -571,6 +571,20 @@ ED5(uint8_t spare1:1;, uint8_t pre_emption_capability:1;) } __attribute__ ((packed)) ogs_gtp2_arp_t; +/* 8.107 Node Identifier */ +#define OGS_GTP2_MAX_NODE_IDENTIFIER_LEN (1+OGS_MAX_FQDN_LEN)*2 +typedef struct ogs_gtp2_node_identifier_s { + uint8_t name_len; + char *name; + uint8_t realm_len; + char *realm; +} ogs_gtp2_node_identifier_t; + +int16_t ogs_gtp2_parse_node_identifier( + ogs_gtp2_node_identifier_t *node_identifier, ogs_tlv_octet_t *octet); +int16_t ogs_gtp2_build_node_identifier(ogs_tlv_octet_t *octet, + ogs_gtp2_node_identifier_t *node_identifier, void *data, int data_len); + #ifdef __cplusplus } #endif diff --git a/src/smf/context.c b/src/smf/context.c index b2a0f26ab0..bb76b77c09 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1791,6 +1791,11 @@ void smf_sess_remove(smf_sess_t *sess) /* Free SBI object memory */ ogs_sbi_object_free(&sess->sbi); + if (sess->aaa_server_identifier.name) + ogs_free(sess->aaa_server_identifier.name); + if (sess->aaa_server_identifier.realm) + ogs_free(sess->aaa_server_identifier.realm); + smf_bearer_remove_all(sess); ogs_assert(sess->pfcp.bar); diff --git a/src/smf/context.h b/src/smf/context.h index 9b3f571edb..add0d89a80 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -486,6 +486,12 @@ typedef struct smf_sess_s { uint32_t id; } charging; + /* AAA Node Identifier */ + struct { + char *name; + char *realm; + } aaa_server_identifier; + /* Data Forwarding between the CP and UP functions */ ogs_pfcp_pdr_t *cp2up_pdr; ogs_pfcp_pdr_t *up2cp_pdr; diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index 7923c55feb..fbba768ccb 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -445,6 +445,34 @@ uint8_t smf_s5c_handle_create_session_request( smf_ue->imeisv, smf_ue->imeisv_len, smf_ue->imeisv_bcd); } + /* Set Node Identifier */ + if (req->_aaa_server_identifier.presence) { + ogs_gtp2_node_identifier_t node_identifier; + decoded = ogs_gtp2_parse_node_identifier( + &node_identifier, &req->_aaa_server_identifier); + if (req->_aaa_server_identifier.len == decoded) { + if (sess->aaa_server_identifier.name) + ogs_free(sess->aaa_server_identifier.name); + sess->aaa_server_identifier.name = ogs_memdup( + node_identifier.name, node_identifier.name_len+1); + ogs_assert(sess->aaa_server_identifier.name); + sess->aaa_server_identifier.name[node_identifier.name_len] = 0; + + if (sess->aaa_server_identifier.realm) + ogs_free(sess->aaa_server_identifier.realm); + sess->aaa_server_identifier.realm = ogs_memdup( + node_identifier.realm, node_identifier.realm_len+1); + ogs_assert(sess->aaa_server_identifier.realm); + sess->aaa_server_identifier.realm[node_identifier.realm_len] = 0; + } else { + ogs_error("Invalid AAA Server Identifier [%d != %d]", + req->_aaa_server_identifier.len, decoded); + ogs_log_hexdump(OGS_LOG_ERROR, + req->_aaa_server_identifier.data, + req->_aaa_server_identifier.len); + } + } + return OGS_GTP2_CAUSE_REQUEST_ACCEPTED; } diff --git a/src/smf/s6b-path.c b/src/smf/s6b-path.c index 53d87b2cee..8262096535 100644 --- a/src/smf/s6b-path.c +++ b/src/smf/s6b-path.c @@ -176,11 +176,28 @@ void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact) ret = fd_msg_add_origin(req, 0); ogs_assert(ret == 0); + /* Set the Destination-Host AVP */ + if (sess->aaa_server_identifier.name) { + ret = fd_msg_avp_new(ogs_diam_destination_host, 0, &avp); + ogs_assert(ret == 0); + val.os.data = (unsigned char *)sess->aaa_server_identifier.name; + val.os.len = strlen(sess->aaa_server_identifier.name); + ret = fd_msg_avp_setvalue(avp, &val); + ogs_assert(ret == 0); + ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); + ogs_assert(ret == 0); + } + /* Set the Destination-Realm AVP */ ret = fd_msg_avp_new(ogs_diam_destination_realm, 0, &avp); ogs_assert(ret == 0); - val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); - val.os.len = strlen(fd_g_config->cnf_diamrlm); + if (sess->aaa_server_identifier.realm) { + val.os.data = (unsigned char *)(sess->aaa_server_identifier.realm); + val.os.len = strlen(sess->aaa_server_identifier.realm); + } else { + val.os.data = (unsigned char *)(fd_g_config->cnf_diamrlm); + val.os.len = strlen(fd_g_config->cnf_diamrlm); + } ret = fd_msg_avp_setvalue(avp, &val); ogs_assert(ret == 0); ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp); diff --git a/tests/non3gpp/s2b-build.c b/tests/non3gpp/s2b-build.c index bbdb466723..0ca39b5c8b 100644 --- a/tests/non3gpp/s2b-build.c +++ b/tests/non3gpp/s2b-build.c @@ -46,6 +46,9 @@ ogs_pkbuf_t *test_s2b_build_create_session_request( ogs_gtp2_indication_t indication; + char node_identifier_buf[OGS_GTP2_MAX_NODE_IDENTIFIER_LEN]; + ogs_gtp2_node_identifier_t node_identifier; + ogs_assert(sess); test_ue = sess->test_ue; ogs_assert(test_ue); @@ -172,6 +175,16 @@ ogs_pkbuf_t *test_s2b_build_create_session_request( (uint8_t *)"\x80\x00\x0d\x00"; req->additional_protocol_configuration_options.len = 4; + memset(&node_identifier, 0, sizeof(ogs_gtp2_node_identifier_t)); + node_identifier.name = "aaa.localdomain"; + node_identifier.name_len = strlen(node_identifier.name); + node_identifier.realm = "localdomain"; + node_identifier.realm_len = strlen(node_identifier.realm); + req->_aaa_server_identifier.presence = 1; + ogs_gtp2_build_node_identifier( + &req->_aaa_server_identifier, &node_identifier, + node_identifier_buf, OGS_GTP2_MAX_NODE_IDENTIFIER_LEN); + gtp_message.h.type = type; return ogs_gtp2_build_msg(&gtp_message); } From 1f42ddace1ca7fa20ef136ba04e3d2f483dd08bb Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 1 Nov 2024 14:31:11 +0900 Subject: [PATCH 248/323] [SCP/SEPP] Fixed memory leak in specific exception handling scenarios The memory leaks occurring in specific exception handling scenarios have been resolved. For instance, when an HTTP2 connection closes, memory associated with objects like response messages was not being freed properly. This update addresses and fixes these issues. --- src/scp/sbi-path.c | 66 +++++++++++++++++++++------------------------ src/sepp/sbi-path.c | 14 +++++----- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index a9a43fe32d..fb4b54fdad 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -647,14 +647,13 @@ static int response_handler( scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "response_handler() failed", NULL, NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "response_handler() failed", NULL, NULL)); return OGS_ERROR; } @@ -673,6 +672,7 @@ static int response_handler( if (!stream) { ogs_error("STREAM has already been removed [%d]", stream_id); + ogs_sbi_response_free(response); return OGS_ERROR; } ogs_expect(true == ogs_sbi_server_send_response(stream, response)); @@ -727,14 +727,13 @@ static int nf_discover_handler( scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "nf_discover_handler() failed", NULL, NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "nf_discover_handler() failed", NULL, NULL)); return OGS_ERROR; } @@ -820,14 +819,13 @@ static int nf_discover_handler( scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, + NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, - NULL)); ogs_free(strerror); @@ -866,14 +864,13 @@ static int sepp_discover_handler( scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "sepp_discover_handler() failed", NULL, NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "sepp_discover_handler() failed", NULL, NULL)); return OGS_ERROR; } @@ -928,14 +925,13 @@ static int sepp_discover_handler( scp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, + NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, - NULL)); ogs_free(strerror); diff --git a/src/sepp/sbi-path.c b/src/sepp/sbi-path.c index 326c342000..36faa977a7 100644 --- a/src/sepp/sbi-path.c +++ b/src/sepp/sbi-path.c @@ -435,14 +435,13 @@ static int response_handler( sepp_assoc_remove(assoc); - if (!stream) { + if (stream) { + ogs_assert(true == + ogs_sbi_server_send_error(stream, + OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, + "response_handler() failed", NULL, NULL)); + } else ogs_error("STREAM has already been removed [%d]", stream_id); - return OGS_ERROR; - } - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL, - "response_handler() failed", NULL, NULL)); return OGS_ERROR; } @@ -453,6 +452,7 @@ static int response_handler( if (!stream) { ogs_error("STREAM has already been removed [%d]", stream_id); + ogs_sbi_response_free(response); return OGS_ERROR; } ogs_expect(true == ogs_sbi_server_send_response(stream, response)); From 2031f7d8a1ed9d969be9a5a14bf7d097deb5aaff Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 1 Nov 2024 15:32:46 +0900 Subject: [PATCH 249/323] [SBI] Make 'global' configuration optional instead of mandatory (#3466) Previously, the global configuration section was required for NF to start, which differed from earlier versions where it was optional. This commit modifies the implementation to make the global section optional again, allowing NF to start without explicitly defining global settings. This change restores the previous behavior and improves usability for users who do not need to customize global settings. --- lib/app/ogs-config.c | 5 +---- lib/app/ogs-config.h | 1 + lib/app/ogs-init.c | 5 +++++ lib/core/ogs-epoll.c | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index 9a374770a7..68287bc141 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -105,7 +105,7 @@ ogs_app_local_conf_t *ogs_local_conf(void) return &local_conf; } -static int global_conf_prepare(void) +int ogs_app_global_conf_prepare(void) { global_conf.sockopt.no_delay = true; @@ -165,9 +165,6 @@ int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent) ogs_assert(parent); - rv = global_conf_prepare(); - if (rv != OGS_OK) return rv; - ogs_yaml_iter_recurse(parent, &global_iter); while (ogs_yaml_iter_next(&global_iter)) { const char *global_key = ogs_yaml_iter_key(&global_iter); diff --git a/lib/app/ogs-config.h b/lib/app/ogs-config.h index 3280208ea7..2086d9b98b 100644 --- a/lib/app/ogs-config.h +++ b/lib/app/ogs-config.h @@ -174,6 +174,7 @@ ogs_app_global_conf_t *ogs_global_conf(void); ogs_app_local_conf_t *ogs_local_conf(void); int ogs_app_count_nf_conf_sections(const char *conf_section); +int ogs_app_global_conf_prepare(void); int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent); int ogs_app_parse_local_conf(const char *local); diff --git a/lib/app/ogs-init.c b/lib/app/ogs-init.c index 20f0872d31..7beb2b3df9 100644 --- a/lib/app/ogs-init.c +++ b/lib/app/ogs-init.c @@ -257,9 +257,14 @@ static int read_config(void) static int context_prepare(void) { + int rv; + #define USRSCTP_LOCAL_UDP_PORT 9899 ogs_app()->usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT; + rv = ogs_app_global_conf_prepare(); + if (rv != OGS_OK) return rv; + return OGS_OK; } diff --git a/lib/core/ogs-epoll.c b/lib/core/ogs-epoll.c index cc9569a68e..326ae2c0c5 100644 --- a/lib/core/ogs-epoll.c +++ b/lib/core/ogs-epoll.c @@ -75,7 +75,8 @@ static void epoll_init(ogs_pollset_t *pollset) context->epfd = epoll_create(pollset->capacity); if (context->epfd < 0) { - ogs_log_message(OGS_LOG_FATAL, ogs_errno, "epoll_create() failed"); + ogs_log_message(OGS_LOG_FATAL, ogs_errno, + "epoll_create() failed [%d]", pollset->capacity); ogs_assert_if_reached(); return; } From c888e2d62a38b72961c42a0ef50468531d3ae813 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 3 Nov 2024 21:47:29 +0900 Subject: [PATCH 250/323] [SBI] Fixed an issue in SCP TLS communication for Open5GS (#3541) Fixed an issue in SCP TLS communication for Open5GS where omitted port numbers in HTTP/HTTPS URIs (e.g., "https://scp.localdomain" implying port 443) were not handled correctly. Updated the code to ensure that during FQDN and port comparisons, cases where the port number is set to 0 are accounted for. This fix resolves the problem with indirect SBI communication over SCP using TLS allowing proper connectivity between network functions like BSF and NRF. --- lib/sbi/client.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/sbi/client.c b/lib/sbi/client.c index 16ec19515b..e402551515 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -250,9 +250,15 @@ ogs_sbi_client_t *ogs_sbi_client_find( if (fqdn) { if (!client->fqdn) continue; - if (strcmp(client->fqdn, fqdn) != 0 || - client->fqdn_port != fqdn_port) + if (strcmp(client->fqdn, fqdn) != 0) continue; + + if (fqdn_port) { + if (!client->fqdn_port) + continue; + if (client->fqdn_port != fqdn_port) + continue; + } } if (addr) { if (!client->addr) From ae2a3255a585991b20318acc44a6c0b5e6b9d455 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 30 Oct 2024 22:57:29 +0900 Subject: [PATCH 251/323] [CSFB] Fix Location Update for non-EPS (#3381) While experimenting with CSFB, it was observed that when the UE returns to E-UTRAN after a CS call, the UE performs a Tracking Area Update with a combined Tracking Area/Location Area update and IMSI attach. Currently, Open5GS's MME simply responds with a TAU Accept message but does not inform the MSC/VLR. As a result, no further MT (Mobile Terminated) CS/SMS services are possible in cases where the MSC/VLR only attempts paging on GERAN. However, some MSC/VLR implementations with fast fallback may still attempt paging on E-UTRAN, allowing MT CS/SMS services to function intermittently. According to 3GPP TS 29.118 Section 5.2.2 Procedures in the MME, specifically Section 5.2.2.2.1, if the timer Ts6-1 is not running, the MME shall start the location update for non-EPS services procedure upon receiving a combined Tracking Area Update Request indicating combined TA/LA updating with IMSI attach. However, SGs timers are not implemented in Open5GS, which is a separate issue. To comply with the specification and ensure that the MSC/VLR is informed when the UE becomes reachable via SGs, the following changes have been implemented: 1. Delay UEContextReleaseCommand: When the active_flag is set to 0, the UEContextReleaseCommand is now delayed until the MME receives the TAU Complete message from the UE. This ensures that the UE has acknowledged the new P-TMSI before the network releases the context, maintaining proper synchronization between the UE and the network. 2. Include Mobile Identity Only When P-TMSI Changes: The Mobile Identity is now included in the Attach/TAU Accept messages only when the MSC/VLR updates the P-TMSI. This ensures that the UE receives the Mobile Identity information solely when there is an actual change in the P-TMSI, preventing unnecessary or incorrect handling of TAU Complete messages. 3. Send SGsAP-REALLOCATION-COMPLETE Conditionally: The SGsAP-REALLOCATION-COMPLETE message is now sent to the MSC/VLR only upon receiving a Attach/TAU Complete message from the UE. This confirmation indicates that the UE has successfully updated its P-TMSI, ensuring that the MSC/VLR is accurately informed of the change. 4. Handle P-TMSI Confirmation: When the MSC/VLR updates the P-TMSI, Open5GS stores the new P-TMSI in the next field of the mme_ue structure. Upon receiving the TAU Complete message from the UE, indicating acknowledgment of the new P-TMSI, Open5GS confirms the update by transferring the P-TMSI from the next field to the current field. This ensures that the MME maintains an accurate and up-to-date record of the P-TMSI as confirmed by the UE. --- lib/asn1c/util/conv.c | 6 +- src/mme/emm-build.c | 37 +- src/mme/emm-sm.c | 196 ++++- src/mme/mme-context.c | 42 +- src/mme/mme-context.h | 25 +- src/mme/mme-path.c | 2 +- src/mme/mme-s6a-handler.c | 28 +- src/mme/nas-path.c | 18 +- src/mme/s1ap-build.c | 8 +- src/mme/sgsap-handler.c | 201 ++++- src/smf/ngap-build.c | 9 +- tests/app/5gc-init.c | 2 +- tests/common/sgsap-build.c | 8 + tests/csfb/abts-main.c | 2 + tests/csfb/meson.build | 1 + tests/csfb/tau-test.c | 1538 ++++++++++++++++++++++++++++++++++++ 16 files changed, 2025 insertions(+), 98 deletions(-) create mode 100644 tests/csfb/tau-test.c diff --git a/lib/asn1c/util/conv.c b/lib/asn1c/util/conv.c index 747eb5666f..2b30324dcf 100644 --- a/lib/asn1c/util/conv.c +++ b/lib/asn1c/util/conv.c @@ -205,8 +205,10 @@ int ogs_asn_ip_to_BIT_STRING(ogs_ip_t *ip, BIT_STRING_t *bit_string) bit_string->buf = CALLOC(bit_string->size, sizeof(uint8_t)); memcpy(bit_string->buf, &ip->addr6, OGS_IPV6_LEN); ogs_debug(" IPv6[%s]", OGS_INET_NTOP(&ip->addr6, buf)); - } else - ogs_assert_if_reached(); + } else { + ogs_error("No IPv4 or IPv6"); + return OGS_ERROR; + } return OGS_OK; } diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index 9747de6f59..4eba1d2330 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -163,7 +163,7 @@ ogs_pkbuf_t *emm_build_attach_accept( attach_accept->esm_message_container.buffer = esmbuf->data; attach_accept->esm_message_container.length = esmbuf->len; - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_PRESENT; ogs_debug(" [%s] GUTI[G:%d,C:%d,M_TMSI:0x%x]", @@ -207,9 +207,9 @@ ogs_pkbuf_t *emm_build_attach_accept( eps_network_feature_support->ims_voice_over_ps_session_in_s1_mode = 1; eps_network_feature_support->extended_protocol_configuration_options = 1; - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->next.p_tmsi); attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; @@ -224,7 +224,7 @@ ogs_pkbuf_t *emm_build_attach_accept( tmsi->spare = 0xf; tmsi->odd_even = 0; tmsi->type = OGS_NAS_MOBILE_IDENTITY_TMSI; - tmsi->tmsi = mme_ue->p_tmsi; + tmsi->tmsi = mme_ue->next.p_tmsi; ogs_debug(" P-TMSI: 0x%08x", tmsi->tmsi); } @@ -494,6 +494,10 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue) ogs_nas_eps_tracking_area_update_accept_t *tau_accept = &message.emm.tracking_area_update_accept; ogs_nas_eps_mobile_identity_t *nas_guti = &tau_accept->guti; + ogs_nas_location_area_identification_t *lai = + &tau_accept->location_area_identification; + ogs_nas_mobile_identity_t *ms_identity = &tau_accept->ms_identity; + ogs_nas_mobile_identity_tmsi_t *tmsi = &ms_identity->tmsi;; ogs_nas_gprs_timer_t *t3412_value = &tau_accept->t3412_value; ogs_nas_gprs_timer_t *t3402_value = &tau_accept->t3402_value; ogs_nas_gprs_timer_t *t3423_value = &tau_accept->t3423_value; @@ -530,7 +534,7 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue) OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT ; } - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { tau_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT; @@ -595,6 +599,27 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue) sess = mme_sess_next(sess); } + /* Location Area Identification & MS Identity */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(mme_ue->csmap); + ogs_assert(mme_ue->next.p_tmsi); + + tau_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; + lai->nas_plmn_id = mme_ue->csmap->lai.nas_plmn_id; + lai->lac = mme_ue->csmap->lai.lac; + ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]", + ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); + + tau_accept->presencemask |= + OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT; + ms_identity->length = 5; + tmsi->spare = 0xf; + tmsi->odd_even = 0; + tmsi->type = OGS_NAS_MOBILE_IDENTITY_TMSI; + tmsi->tmsi = mme_ue->next.p_tmsi; + ogs_debug(" P-TMSI: 0x%08x", tmsi->tmsi); + } + /* Set T3402 */ if (mme_self()->time.t3402.value) { rv = ogs_nas_gprs_timer_from_sec( diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 170317cfa6..e1045f1667 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -260,7 +260,7 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e) * the network, the network shall implicitly detach the UE. */ mme_ue->detach_type = MME_DETACH_TYPE_MME_IMPLICIT; - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); @@ -519,6 +519,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, rai.lai.lac, rai.rac); r = nas_eps_send_tau_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, &emm_state_exception); break; } @@ -637,9 +639,36 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, * 10. UplinkNASTransport + Tracking area update complete (Target) */ - if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { - ogs_debug(" Iniital UE Message"); - if (mme_ue->nas_eps.update.active_flag) { + /* Update CSMAP from Tracking area update request */ + mme_ue->csmap = mme_csmap_find_by_tai(&mme_ue->tai); + if (mme_ue->csmap && + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_PACKET_AND_CIRCUIT && + (mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING || + mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH)) { + + if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_INITIAL_UE_MESSAGE; + else if (e->s1ap_code == + S1AP_ProcedureCode_id_uplinkNASTransport) + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_UPLINK_NAS_TRANPORT; + else { + ogs_error("Invalid Procedure Code[%d]", (int)e->s1ap_code); + break; + } + + ogs_assert(OGS_OK == + sgsap_send_location_update_request(mme_ue)); + + } else { + + if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { + ogs_debug(" Iniital UE Message"); + if (mme_ue->nas_eps.update.active_flag) { /* * TS33.401 @@ -652,39 +681,52 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, * UP data or pending downlink signalling, radio bearers will be established * as part of the TAU procedure and a KeNB derivation is necessary. */ - ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, - mme_ue->kenb); - ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); - mme_ue->nhcc = 1; + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_InitialContextSetup); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (e->s1ap_code == + S1AP_ProcedureCode_id_uplinkNASTransport) { + ogs_debug(" Uplink NAS Transport"); r = nas_eps_send_tau_accept(mme_ue, S1AP_ProcedureCode_id_downlinkNASTransport); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_error("Invalid Procedure Code[%d]", (int)e->s1ap_code); + break; } - } else if (e->s1ap_code == - S1AP_ProcedureCode_id_uplinkNASTransport) { - ogs_debug(" Uplink NAS Transport"); - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_downlinkNASTransport); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code); - } - if (!mme_ue->nas_eps.update.active_flag) { - enb_ue->relcause.group = S1AP_Cause_PR_nas; - enb_ue->relcause.cause = S1AP_CauseNas_normal_release; - mme_send_release_access_bearer_or_ue_context_release(enb_ue); + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + mme_send_release_access_bearer_or_ue_context_release( + enb_ue); + } } - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_fatal("MME does not create new GUTI"); ogs_assert_if_reached(); OGS_FSM_TRAN(s, &emm_state_initial_context_setup); @@ -744,7 +786,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { ogs_debug(" Initial UE Message"); - if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (!MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); @@ -791,7 +833,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, S1AP_ProcedureCode_id_uplinkNASTransport) { ogs_debug(" Uplink NAS Transport"); - if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (!MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); r = nas_eps_send_service_reject(enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); @@ -874,7 +916,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { mme_send_delete_session_or_detach(enb_ue, mme_ue); @@ -932,8 +974,62 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, break; case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE: - ogs_error("[%s] Tracking area update complete in INVALID-STATE", - mme_ue->imsi_bcd); + ogs_info("[%s] Tracking area update complete", mme_ue->imsi_bcd); + + /* + * TS24.301 + * Section 4.4.4.3 + * Integrity checking of NAS signalling messages in the MME: + * + * Once the secure exchange of NAS messages has been established + * for the NAS signalling connection, the receiving EMM or ESM entity + * in the MME shall not process any NAS signalling messages + * unless they have been successfully integrity checked by the NAS. + * If any NAS signalling message, having not successfully passed + * the integrity check, is received, then the NAS in the MME shall + * discard that message. If any NAS signalling message is received, + * as not integrity protected even though the secure exchange + * of NAS messages has been established, then the NAS shall discard + * this message. + */ + h.type = e->nas_type; + if (h.integrity_protected == 0) { + ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); + break; + } + + if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { + ogs_error("[%s] No Security Context", mme_ue->imsi_bcd); + break; + } + + /* + * If the OLD ENB_UE is being maintained in MME-UE Context, + * it deletes the S1 Context after exchanging + * the UEContextReleaseCommand/Complete with the eNB + */ + CLEAR_S1_CONTEXT(mme_ue); + + CLEAR_MME_UE_TIMER(mme_ue->t3450); + + /* Confirm GUTI */ + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) + mme_ue_confirm_guti(mme_ue); + + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); + + ogs_assert(OGS_OK == + sgsap_send_tmsi_reallocation_complete(mme_ue)); + + if (!mme_ue->nas_eps.update.active_flag) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + mme_send_release_access_bearer_or_ue_context_release( + enb_ue); + } + } break; default: @@ -1117,7 +1213,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { mme_send_delete_session_or_detach(enb_ue, mme_ue); @@ -1283,7 +1379,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) mme_s6a_send_ulr(enb_ue, mme_ue); - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { OGS_FSM_TRAN(s, &emm_state_initial_context_setup); } else { ogs_fatal("MME always creates new GUTI"); @@ -1358,7 +1454,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { mme_send_delete_session_or_detach(enb_ue, mme_ue); @@ -1496,18 +1592,21 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) } /* Confirm GUTI */ - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) mme_ue_confirm_guti(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); ogs_assert(OGS_OK == sgsap_send_tmsi_reallocation_complete(mme_ue)); + } OGS_FSM_TRAN(s, &emm_state_registered); break; case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE: - ogs_debug("[%s] Tracking area update complete", mme_ue->imsi_bcd); + ogs_info("[%s] Tracking area update complete", mme_ue->imsi_bcd); /* * TS24.301 @@ -1546,9 +1645,24 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) CLEAR_MME_UE_TIMER(mme_ue->t3450); /* Confirm GUTI */ - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) mme_ue_confirm_guti(mme_ue); + /* Confirm P-TMSI */ + if (MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + mme_ue_confirm_p_tmsi(mme_ue); + + ogs_assert(OGS_OK == + sgsap_send_tmsi_reallocation_complete(mme_ue)); + + if (!mme_ue->nas_eps.update.active_flag) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + mme_send_release_access_bearer_or_ue_context_release( + enb_ue); + } + } + OGS_FSM_TRAN(s, &emm_state_registered); break; @@ -1613,7 +1727,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) */ CLEAR_S1_CONTEXT(mme_ue); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { mme_send_delete_session_or_detach(enb_ue, mme_ue); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index a0e9920f74..6f1d412f97 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -3300,7 +3300,7 @@ void mme_ue_new_guti(mme_ue_t *mme_ue) ogs_assert(served_gummei->num_of_mme_gid > 0); ogs_assert(served_gummei->num_of_mme_code > 0); - if (mme_ue->next.m_tmsi) { + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_warn("GUTI has already been allocated"); return; } @@ -3320,9 +3320,9 @@ void mme_ue_new_guti(mme_ue_t *mme_ue) void mme_ue_confirm_guti(mme_ue_t *mme_ue) { - ogs_assert(mme_ue->next.m_tmsi); + ogs_assert(MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)); - if (mme_ue->current.m_tmsi) { + if (MME_CURRENT_GUTI_IS_AVAILABLE(mme_ue)) { /* MME has a VALID GUTI * As such, we need to remove previous GUTI in hash table */ ogs_hash_set(self.guti_ue_hash, @@ -3348,6 +3348,37 @@ void mme_ue_confirm_guti(mme_ue_t *mme_ue) mme_ue->current.guti.m_tmsi); } +void mme_ue_set_p_tmsi( + mme_ue_t *mme_ue, + ogs_nas_mobile_identity_tmsi_t *nas_mobile_identity_tmsi) +{ + ogs_assert(mme_ue); + ogs_assert(nas_mobile_identity_tmsi); + + /* + * If the P-TMSI received from MSC/VLR is different from the current P-TMSI + * known by the MME, store this new P-TMSI as 'Next P-TMSI'. This value will + * be sent to the UE through the Attach Accept or TAU Accept message. + * + * When the UE sends an Attach Complete or TAU Complete message, + * the MME updates the 'Current P-TMSI' with the value in 'Next P-TMSI', + * thereby confirming and saving the new P-TMSI. + */ + mme_ue->next.p_tmsi = be32toh(nas_mobile_identity_tmsi->tmsi); + if (mme_ue->next.p_tmsi != INVALID_P_TMSI) { + if (mme_ue->current.p_tmsi == mme_ue->next.p_tmsi) + mme_ue->next.p_tmsi = INVALID_P_TMSI; + } +} +void mme_ue_confirm_p_tmsi(mme_ue_t *mme_ue) +{ + ogs_assert(mme_ue); + ogs_assert(mme_ue->next.p_tmsi); + + mme_ue->current.p_tmsi = mme_ue->next.p_tmsi; + mme_ue->next.p_tmsi = INVALID_P_TMSI; +} + static bool compare_ue_info(mme_sgw_t *node, enb_ue_t *enb_ue) { int i; @@ -3567,14 +3598,15 @@ void mme_ue_remove(mme_ue_t *mme_ue) ogs_hash_set(mme_self()->imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, NULL); - if (mme_ue->current.m_tmsi) { + if (MME_CURRENT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_hash_set(self.guti_ue_hash, &mme_ue->current.guti, sizeof(ogs_nas_eps_guti_t), NULL); ogs_assert(mme_m_tmsi_free(mme_ue->current.m_tmsi) == OGS_OK); } - if (mme_ue->next.m_tmsi) + if (MME_NEXT_GUTI_IS_AVAILABLE(mme_ue)) { ogs_assert(mme_m_tmsi_free(mme_ue->next.m_tmsi) == OGS_OK); + } /* Clear the saved PDN Connectivity Request */ OGS_NAS_CLEAR_DATA(&mme_ue->pdn_connectivity_request); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index b909418834..2300099e40 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -204,8 +204,6 @@ typedef struct mme_pgw_s { #define MME_SGSAP_IS_CONNECTED(__mME) \ ((__mME) && ((__mME)->csmap) && ((__mME)->csmap->vlr) && \ (OGS_FSM_CHECK(&(__mME)->csmap->vlr->sm, sgsap_state_connected))) -#define MME_P_TMSI_IS_AVAILABLE(__mME) \ - (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->p_tmsi) typedef struct mme_vlr_s { ogs_lnode_t lnode; @@ -363,6 +361,11 @@ struct mme_ue_s { ogs_nas_detach_type_t detach; } nas_eps; +#define MME_TAU_TYPE_INITIAL_UE_MESSAGE 1 +#define MME_TAU_TYPE_UPLINK_NAS_TRANPORT 2 +#define MME_TAU_TYPE_UNPROTECTED_INGERITY 3 + uint8_t tracking_area_update_request_type; + /* 1. MME initiated detach request to the UE. * (nas_eps.type = MME_EPS_TYPE_DETACH_REQUEST_TO_UE) * 2. If UE is IDLE, Paging sent to the UE @@ -403,7 +406,6 @@ struct mme_ue_s { int a_msisdn_len; char a_msisdn_bcd[OGS_MAX_MSISDN_BCD_LEN+1]; - mme_p_tmsi_t p_tmsi; struct { ogs_pool_id_t *mme_gn_teid_node; /* A node of MME-Gn-TEID */ uint32_t mme_gn_teid; /* MME-Gn-TEID is derived from NODE */ @@ -416,8 +418,15 @@ struct mme_ue_s { } gn; struct { +#define MME_NEXT_GUTI_IS_AVAILABLE(__mME) ((__mME)->next.m_tmsi) +#define MME_CURRENT_GUTI_IS_AVAILABLE(__mME) ((__mME)->current.m_tmsi) mme_m_tmsi_t *m_tmsi; ogs_nas_eps_guti_t guti; +#define MME_NEXT_P_TMSI_IS_AVAILABLE(__mME) \ + (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->next.p_tmsi) +#define MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) \ + (MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->current.p_tmsi) + mme_p_tmsi_t p_tmsi; } current, next; ogs_pool_id_t *mme_s11_teid_node; /* A node of MME-S11-TEID */ @@ -659,10 +668,10 @@ struct mme_ue_s { } while(0); #define CS_CALL_SERVICE_INDICATOR(__mME) \ - (MME_P_TMSI_IS_AVAILABLE(__mME) && \ + (MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) && \ ((__mME)->service_indicator) == SGSAP_CS_CALL_SERVICE_INDICATOR) #define SMS_SERVICE_INDICATOR(__mME) \ - (MME_P_TMSI_IS_AVAILABLE(__mME) && \ + (MME_CURRENT_P_TMSI_IS_AVAILABLE(__mME) && \ ((__mME)->service_indicator) == SGSAP_SMS_SERVICE_INDICATOR) uint8_t service_indicator; @@ -981,6 +990,12 @@ sgw_relocation_e sgw_ue_check_if_relocated(mme_ue_t *mme_ue); void mme_ue_new_guti(mme_ue_t *mme_ue); void mme_ue_confirm_guti(mme_ue_t *mme_ue); +#define INVALID_P_TMSI 0 +void mme_ue_set_p_tmsi( + mme_ue_t *mme_ue, + ogs_nas_mobile_identity_tmsi_t *nas_mobile_identity_tmsi); +void mme_ue_confirm_p_tmsi(mme_ue_t *mme_ue); + mme_ue_t *mme_ue_add(enb_ue_t *enb_ue); void mme_ue_remove(mme_ue_t *mme_ue); void mme_ue_remove_all(void); diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 0ed85d8041..e647375240 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -302,7 +302,7 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) r = nas_eps_send_detach_request(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index 3895830758..a2a2eb518d 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -123,10 +123,26 @@ uint8_t mme_s6a_handle_ula( return OGS_NAS_EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED; } - r = nas_eps_send_tau_accept(mme_ue, - S1AP_ProcedureCode_id_InitialContextSetup); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + /* Update CSMAP from Tracking area update request */ + mme_ue->csmap = mme_csmap_find_by_tai(&mme_ue->tai); + if (mme_ue->csmap && + mme_ue->network_access_mode == + OGS_NETWORK_ACCESS_MODE_PACKET_AND_CIRCUIT && + (mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING || + mme_ue->nas_eps.update.value == + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH)) { + + mme_ue->tracking_area_update_request_type = + MME_TAU_TYPE_UNPROTECTED_INGERITY; + ogs_assert(OGS_OK == sgsap_send_location_update_request(mme_ue)); + + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } } else { ogs_error("Invalid Type[%d]", mme_ue->nas_eps.type); return OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED; @@ -275,7 +291,7 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) r = nas_eps_send_detach_request(mme_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); @@ -304,7 +320,7 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) * There is no need to send NAS or S1AP message to the UE. * So, we don't have to check whether UE is IDLE or not. */ - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + if (MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); } else { enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index 31fcee1175..0ad9e8d2ed 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -857,17 +857,15 @@ int nas_eps_send_tau_accept( return OGS_ERROR; } - if (mme_ue->next.m_tmsi) { - CLEAR_MME_UE_TIMER(mme_ue->t3450); - mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf); - if (!mme_ue->t3450.pkbuf) { - ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed"); - ogs_pkbuf_free(emmbuf); - return OGS_ERROR; - } - ogs_timer_start(mme_ue->t3450.timer, - mme_timer_cfg(MME_TIMER_T3450)->duration); + CLEAR_MME_UE_TIMER(mme_ue->t3450); + mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf); + if (!mme_ue->t3450.pkbuf) { + ogs_error("ogs_pkbuf_copy(mme_ue->t3450.pkbuf) failed"); + ogs_pkbuf_free(emmbuf); + return OGS_ERROR; } + ogs_timer_start(mme_ue->t3450.timer, + mme_timer_cfg(MME_TIMER_T3450)->duration); if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) { ogs_pkbuf_t *s1apbuf = NULL; diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index d163264c05..012cf716f9 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -692,7 +692,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( ogs_log_hexdump(OGS_LOG_DEBUG, SecurityKey->buf, SecurityKey->size); if (mme_ue->nas_eps.type == MME_EPS_TYPE_EXTENDED_SERVICE_REQUEST && - MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { /* Set CS-Fallback */ S1AP_CSFallbackIndicator_t *CSFallbackIndicator = NULL; @@ -727,7 +727,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( ogs_s1ap_buffer_to_OCTET_STRING( &mme_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &LAI->pLMNidentity); ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->current.p_tmsi); ogs_asn_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC); } @@ -891,7 +891,7 @@ ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue) enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); if (mme_ue->nas_eps.type == MME_EPS_TYPE_EXTENDED_SERVICE_REQUEST && - MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + MME_CURRENT_P_TMSI_IS_AVAILABLE(mme_ue)) { ie = CALLOC(1, sizeof(S1AP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); @@ -919,7 +919,7 @@ ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue) ogs_s1ap_buffer_to_OCTET_STRING( &mme_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &LAI->pLMNidentity); ogs_assert(mme_ue->csmap); - ogs_assert(mme_ue->p_tmsi); + ogs_assert(mme_ue->current.p_tmsi); ogs_asn_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC); } else { diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index fcb4de23b7..96afdee9c6 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -101,6 +101,12 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) goto error; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("!enb_ue"); + goto error; + } + ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd); if (lai) { ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]", @@ -109,38 +115,125 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) if (nas_mobile_identity_tmsi) { if (nas_mobile_identity_tmsi->type == OGS_NAS_MOBILE_IDENTITY_TMSI) { - mme_ue->p_tmsi = be32toh(nas_mobile_identity_tmsi->tmsi); + mme_ue_set_p_tmsi(mme_ue, nas_mobile_identity_tmsi); } else { ogs_error("Not supported Identity type[%d]", nas_mobile_identity_tmsi->type); goto error; } - ogs_debug(" P-TMSI[0x%08x]", mme_ue->p_tmsi); + ogs_debug(" P-TMSI[0x%08x]", mme_ue->next.p_tmsi); } - r = nas_eps_send_attach_accept(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + r = nas_eps_send_attach_accept(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_INITIAL_UE_MESSAGE) { + ogs_debug(" Iniital UE Message"); + if (mme_ue->nas_eps.update.active_flag) { + +/* +* TS33.401 +* 7 Security procedures between UE and EPS access network elements +* 7.2 Handling of user-related keys in E-UTRAN +* 7.2.7 Key handling for the TAU procedure when registered in E-UTRAN +* +* If the "active flag" is set in the TAU request message or +* the MME chooses to establish radio bearers when there is pending downlink +* UP data or pending downlink signalling, radio bearers will be established +* as part of the TAU procedure and a KeNB derivation is necessary. +*/ + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; + + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UPLINK_NAS_TRANPORT) { + ogs_debug(" Uplink NAS Transport"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UNPROTECTED_INGERITY) { + ogs_debug(" Unprotected Integrity"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + } else { + ogs_error("Invalid TAU Type[%d]", + mme_ue->tracking_area_update_request_type); + return; + } + + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + mme_send_release_access_bearer_or_ue_context_release(enb_ue); + } + } else { + ogs_fatal("[%s] Invalid EPS-Type[%d]", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } return; error: - /* Clang scan-build SA: NULL pointer dereference: mme_ue=NULL if root=NULL. */ + /* Clang scan-build SA: + * NULL pointer dereference: mme_ue=NULL if root=NULL. */ if (!mme_ue) { ogs_error("!mme_ue"); return; - } + } enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - if (enb_ue) { + if (!enb_ue) { + ogs_error("ENB-S1 Context has already been removed"); + return; + } + + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { r = nas_eps_send_attach_reject( enb_ue, mme_ue, OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); - mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); - } else - ogs_error("ENB-S1 Context has already been removed"); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + r = nas_eps_send_tau_reject( + enb_ue, mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_fatal("[%s] Invalid EPS-Type[%d]", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } + mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); } void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) @@ -148,6 +241,7 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) int r; ogs_tlv_t *root = NULL, *iter = NULL; mme_ue_t *mme_ue = NULL; + enb_ue_t *enb_ue = NULL; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; @@ -215,15 +309,94 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("!enb_ue"); + goto error; + } + ogs_debug(" IMSI[%s] CAUSE[%d]", mme_ue->imsi_bcd, emm_cause); if (lai) { ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]", ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac); } - r = nas_eps_send_attach_accept(mme_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) { + r = nas_eps_send_attach_accept(mme_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) { + if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_INITIAL_UE_MESSAGE) { + ogs_debug(" Iniital UE Message"); + if (mme_ue->nas_eps.update.active_flag) { + +/* +* TS33.401 +* 7 Security procedures between UE and EPS access network elements +* 7.2 Handling of user-related keys in E-UTRAN +* 7.2.7 Key handling for the TAU procedure when registered in E-UTRAN +* +* If the "active flag" is set in the TAU request message or +* the MME chooses to establish radio bearers when there is pending downlink +* UP data or pending downlink signalling, radio bearers will be established +* as part of the TAU procedure and a KeNB derivation is necessary. +*/ + ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); + mme_ue->nhcc = 1; + + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UPLINK_NAS_TRANPORT) { + ogs_debug(" Uplink NAS Transport"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_downlinkNASTransport); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else if (mme_ue->tracking_area_update_request_type == + MME_TAU_TYPE_UNPROTECTED_INGERITY) { + ogs_debug(" Unprotected Integrity"); + r = nas_eps_send_tau_accept(mme_ue, + S1AP_ProcedureCode_id_InitialContextSetup); + ogs_expect(r == OGS_OK); + } else { + ogs_error("Invalid TAU Type[%d]", + mme_ue->tracking_area_update_request_type); + return; + } + + /* + * When active_flag is 0, check if the P-TMSI has been updated. + * If the P-TMSI has changed, wait to receive the TAU Complete message + * from the UE before sending the UEContextReleaseCommand. + * + * This ensures that the UE has acknowledged the new P-TMSI, + * allowing the TAU procedure to complete successfully + * and maintaining synchronization between the UE and the network. + */ + if (!mme_ue->nas_eps.update.active_flag && + !MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_fatal("NEXT = %d", MME_NEXT_P_TMSI_IS_AVAILABLE(mme_ue)); + enb_ue->relcause.group = S1AP_Cause_PR_nas; + enb_ue->relcause.cause = S1AP_CauseNas_normal_release; + mme_send_release_access_bearer_or_ue_context_release(enb_ue); + } + } else { + ogs_fatal("[%s] Invalid EPS-Type[%d]", + mme_ue->imsi_bcd, mme_ue->nas_eps.type); + ogs_assert_if_reached(); + } return; diff --git a/src/smf/ngap-build.c b/src/smf/ngap-build.c index 051cb6e8ae..75c2bd3422 100644 --- a/src/smf/ngap-build.c +++ b/src/smf/ngap-build.c @@ -85,7 +85,8 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request_transfer( ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->upf_n3_addr, sess->upf_n3_addr6, &upf_n3_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_n3_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_n3_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING(sess->upf_n3_teid, &gTPTunnel->gTP_TEID); if (sess->handover.data_forwarding_not_possible == true) { @@ -477,7 +478,8 @@ ogs_pkbuf_t *ngap_build_path_switch_request_ack_transfer(smf_sess_t *sess) ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->upf_n3_addr, sess->upf_n3_addr6, &upf_n3_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_n3_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_n3_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING(sess->upf_n3_teid, &gTPTunnel->gTP_TEID); #endif @@ -518,7 +520,8 @@ ogs_pkbuf_t *ngap_build_handover_command_transfer(smf_sess_t *sess) ogs_assert(OGS_OK == ogs_sockaddr_to_ip( sess->handover.upf_dl_addr, sess->handover.upf_dl_addr6, &upf_dl_ip)); - ogs_asn_ip_to_BIT_STRING(&upf_dl_ip, &gTPTunnel->transportLayerAddress); + ogs_assert(OGS_OK == ogs_asn_ip_to_BIT_STRING( + &upf_dl_ip, &gTPTunnel->transportLayerAddress)); ogs_asn_uint32_to_OCTET_STRING( sess->handover.upf_dl_teid, &gTPTunnel->gTP_TEID); diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index eaefa3518b..2d6a05d2cf 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -129,7 +129,7 @@ int app_initialize(const char *const argv[]) * * If freeDiameter is not used, it uses a delay of less than 4 seconds. */ - ogs_msleep(2000); + ogs_msleep(3000); return OGS_OK; } diff --git a/tests/common/sgsap-build.c b/tests/common/sgsap-build.c index f9ae5f1c7a..7cf020bcd2 100644 --- a/tests/common/sgsap-build.c +++ b/tests/common/sgsap-build.c @@ -26,13 +26,21 @@ ogs_pkbuf_t *test_sgsap_location_update_accept(int i) ogs_pkbuf_t *pkbuf = NULL; const char *payload[TEST_SGSAP_MAX_MESSAGE] = { "0a01089999073746 000006040509f107 09260e05f49ee88e 64", + "0a01089999073746 000006040509f107 09260e05f49ee88e 65", + "0a01089999073746 000006040509f107 09260e05f49ee88e 66", + "0a01087942120000 000030040527f412 c9580e05f437ab9c c5", "", + "", }; uint16_t len[TEST_SGSAP_MAX_MESSAGE] = { 25, 25, + 25, + + 25, + 0, 0, }; char hexbuf[OGS_HUGE_LEN]; diff --git a/tests/csfb/abts-main.c b/tests/csfb/abts-main.c index c9cd4e09be..ed271eb2ed 100644 --- a/tests/csfb/abts-main.c +++ b/tests/csfb/abts-main.c @@ -25,6 +25,7 @@ abts_suite *test_mo_active(abts_suite *suite); abts_suite *test_mt_active(abts_suite *suite); abts_suite *test_mo_sms(abts_suite *suite); abts_suite *test_mt_sms(abts_suite *suite); +abts_suite *test_tau(abts_suite *suite); abts_suite *test_crash(abts_suite *suite); const struct testlist { @@ -36,6 +37,7 @@ const struct testlist { {test_mt_active}, {test_mo_sms}, {test_mt_sms}, + {test_tau}, {test_crash}, {NULL}, }; diff --git a/tests/csfb/meson.build b/tests/csfb/meson.build index 30ba9d9592..f7038b62a1 100644 --- a/tests/csfb/meson.build +++ b/tests/csfb/meson.build @@ -23,6 +23,7 @@ testapp_csfb_sources = files(''' mt-active-test.c mo-sms-test.c mt-sms-test.c + tau-test.c crash-test.c '''.split()) diff --git a/tests/csfb/tau-test.c b/tests/csfb/tau-test.c new file mode 100644 index 0000000000..7c42303e3e --- /dev/null +++ b/tests/csfb/tau-test.c @@ -0,0 +1,1538 @@ +/* + * Copyright (C) 2024 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "test-common.h" + +extern ogs_socknode_t *sgsap; + +static void test_simple_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING, true, true); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UE Context Release Command */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupResponse + TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + +static void test_no_active_flag_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(2); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupRequest + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, false, + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH, + true, true); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UEContextReleaseCommand */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send TAU Complete */ + emmbuf = testemm_build_tau_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive UEContextReleaseCommand */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UEContextReleaseComplete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + +static void test_integrity_unprotected_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x54f6401; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* eNB connects to MME */ + s1ap = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap); + + /* eNB connects to SGW */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send S1-Setup Reqeust */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x54f64); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive S1-Setup Response */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.ms_network_feature_support = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + test_ue->tau_request_param.device_properties = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, + OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING_WITH_IMSI_ATTACH, + false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive OLD UE Context Release Command */ + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send OLD UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive InitialContextSetupResponse + TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send TAU Complete */ + emmbuf = testemm_build_tau_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send InitialContextSetupResponse */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from MME */ + testenb_s1ap_close(s1ap); + + /* eNB disonncect from SGW */ + test_gtpu_close(gtpu); + + test_ue_remove(test_ue); +} + +static void test_uplink_transport_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *s1ap1, *s1ap2; + ogs_socknode_t *gtpu1, *gtpu2; + ogs_pkbuf_t *emmbuf; + ogs_pkbuf_t *esmbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_pkbuf_t *pkbuf; + ogs_s1ap_message_t message; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *bearer = NULL; + + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "3746000006"); + ogs_assert(test_ue); + + test_ue->e_cgi.cell_id = 0x1234560; + test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + sess = test_sess_add_by_apn(test_ue, "internet", OGS_GTP2_RAT_TYPE_EUTRAN); + ogs_assert(sess); + + /* Two eNB connects to MME */ + s1ap1 = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap1); + + s1ap2 = tests1ap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, s1ap2); + + /* eNB connects to SGW */ + gtpu1 = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu1); + + gtpu2 = test_gtpu_server(2, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu2); + + /* S1-Setup Reqeust/Response for Source eNB */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x1f2); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /* S1-Setup Reqeust/Response for Target eNB */ + sendbuf = test_s1ap_build_s1_setup_request( + S1AP_ENB_ID_PR_macroENB_ID, 0x43); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(NULL, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_qos_flow(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request( + sess, false, OGS_NAS_EPS_PDN_TYPE_IPV4V6); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.guti = 1; + test_ue->attach_request_param.last_visited_registered_tai = 1; + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.additional_update_type = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + test_ue->attach_request_param.old_guti_type = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + test_ue->initial_ue_param.gummei_id = 1; + test_ue->initial_ue_param.gummei.mme_gid = 2; + test_ue->initial_ue_param.gummei.mme_code = 1; + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Identity Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Identity response */ + emmbuf = testemm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + emmbuf = testemm_build_authentication_response(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Security mode Command */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + test_ue->mobile_identity_imeisv_presence = true; + emmbuf = testemm_build_security_mode_complete(test_ue); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Initial Context Setup Request + + * Attach Accept + + * Activate Default Bearer Context Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive SGsAP-TMSI-REALLOCATION-COMPLETE */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive E-RAB Setup Request + + * Activate dedicated EPS bearer context request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send E-RAB Setup Response */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + sendbuf = test_s1ap_build_e_rab_setup_response(bearer); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Activate dedicated EPS bearer context accept */ + esmbuf = testesm_build_activate_dedicated_eps_bearer_context_accept(bearer); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send ENB configuration transfer */ + sendbuf = test_s1ap_build_enb_configuration_transfer(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME configuration transfer */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ENB configuration transfer */ + sendbuf = test_s1ap_build_enb_configuration_transfer(1); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME configuration transfer */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* DELAY is needed in dedicated EPS bearer */ + ogs_msleep(100); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x43, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb2_addr; + bearer->enb_s1u_addr6 = test_self()->gnb2_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + + /* Copy ICMP Packet */ + pkbuf = ogs_pkbuf_alloc(NULL, 200); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_GTPV1U_5GC_HEADER_LEN); + ogs_pkbuf_put(pkbuf, 200-OGS_GTPV1U_5GC_HEADER_LEN); + memset(pkbuf->data, 0, pkbuf->len); + memcpy(pkbuf->data, recvbuf->data + 8, recvbuf->len - 8); + + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U Packet with Indirect Data Forwarding */ + rv = test_gtpu_send_indirect_data_forwarding(gtpu1, bearer, pkbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = testgnb_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send eNB Status Transfer */ + sendbuf = test_s1ap_build_enb_status_transfer(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME Status Transfer */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Notify */ + test_ue->e_cgi.cell_id = 0xabcdef0; + sendbuf = test_s1ap_build_handover_notify(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send TAU Request */ + memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param)); + test_ue->tau_request_param.ue_network_capability = 1; + test_ue->tau_request_param.last_visited_registered_tai = 1; + test_ue->tau_request_param.drx_parameter = 1; + test_ue->tau_request_param.eps_bearer_context_status = 1; + test_ue->tau_request_param.ms_network_capability = 1; + test_ue->tau_request_param.tmsi_status = 1; + test_ue->tau_request_param.mobile_station_classmark_2 = 1; + test_ue->tau_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_tau_request( + test_ue, true, OGS_NAS_EPS_UPDATE_TYPE_COMBINED_TA_LA_UPDATING, + true, true); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive SGsAP-Location-Update-Request */ + recvbuf = testvlr_sgsap_read(sgsap); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send SGsAP-Location-Update-Accept */ + sendbuf = test_sgsap_location_update_accept(0); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testvlr_sgsap_send(sgsap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive TAU Accept */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UE Context Release Command */ + mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id; + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id; + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu2, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu2, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x1f2, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb1_addr; + bearer->enb_s1u_addr6 = test_self()->gnb1_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send eNB Status Transfer */ + sendbuf = test_s1ap_build_enb_status_transfer(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive MME Status Transfer */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Notify */ + test_ue->e_cgi.cell_id = 0x1234560; + sendbuf = test_s1ap_build_handover_notify(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive End Mark */ + recvbuf = test_gtpu_read(gtpu2); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Receive UE Context Release Command */ + mme_ue_s1ap_id = test_ue->mme_ue_s1ap_id; + enb_ue_s1ap_id = test_ue->enb_ue_s1ap_id; + + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + test_ue->mme_ue_s1ap_id = mme_ue_s1ap_id; + test_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send GTP-U ICMP Packet */ + bearer = test_bearer_find_by_ue_ebi(test_ue, 6); + ogs_assert(bearer); + rv = test_gtpu_send_ping(gtpu1, bearer, TEST_PING_IPV4); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive GTP-U ICMP Packet */ + recvbuf = test_gtpu_read(gtpu1); + ABTS_PTR_NOTNULL(tc, recvbuf); + ogs_pkbuf_free(recvbuf); + + /* Send Handover Required */ + sendbuf = test_s1ap_build_handover_required( + test_ue, S1AP_HandoverType_intralte, + S1AP_ENB_ID_PR_macroENB_ID, 0x43, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_time_critical_handover); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Request */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Request Ack */ + ogs_list_for_each(&sess->bearer_list, bearer) { + bearer->enb_s1u_addr = test_self()->gnb1_addr; + bearer->enb_s1u_addr6 = test_self()->gnb1_addr6; + } + sendbuf = test_s1ap_build_handover_request_ack(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Handover Command */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Handover Cancel */ + sendbuf = test_s1ap_build_handover_cancel(test_ue, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_tS1relocprep_expiry); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap1, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap2); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap2, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Recv HandoverCancelAcknowledge */ + recvbuf = testenb_s1ap_read(s1ap1); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + ogs_msleep(300); + + /********** Remove Subscriber in Database */ + ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue)); + + /* eNB disonncect from SGW */ + testgnb_gtpu_close(gtpu2); + testgnb_gtpu_close(gtpu1); + + /* Two eNB disonncect from MME */ + testenb_s1ap_close(s1ap1); + testenb_s1ap_close(s1ap2); + + test_ue_remove(test_ue); +} + +abts_suite *test_tau(abts_suite *suite) +{ + suite = ADD_SUITE(suite) + + abts_run_test(suite, test_simple_func, NULL); + abts_run_test(suite, test_no_active_flag_func, NULL); + abts_run_test(suite, test_integrity_unprotected_func, NULL); + abts_run_test(suite, test_uplink_transport_func, NULL); + + return suite; +} From 421126682e1d657f5a7f5e4a1ac2458c9227b6a5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 5 Nov 2024 16:49:04 +0900 Subject: [PATCH 252/323] [SMF] Change the Max Number of PCO from 16 to 32 --- lib/proto/types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/proto/types.h b/lib/proto/types.h index 36ac15c1de..43d6824605 100644 --- a/lib/proto/types.h +++ b/lib/proto/types.h @@ -699,7 +699,7 @@ typedef struct ogs_pco_id_s { void *data; } ogs_pco_id_t; -#define OGS_MAX_NUM_OF_PROTOCOL_OR_CONTAINER_ID 16 +#define OGS_MAX_NUM_OF_PROTOCOL_OR_CONTAINER_ID 32 typedef struct ogs_pco_s { ED3(uint8_t ext:1;, uint8_t spare:4;, From e227d579722078c3cae5718a3ace9ac17356df21 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 7 Nov 2024 10:39:11 +0900 Subject: [PATCH 253/323] [SBI] Enable Custom Info in User-Agent Header for HTTP/2 Requests (#3555) In accordance with TS29.500 Section 5.2.2.2 on mandatory HTTP standard headers, the User-Agent header in HTTP/2 requests is required to include the NF type of the HTTP/2 client. Additionally, it is specified that the content of the User-Agent header may be followed by a hyphen and custom information when needed, providing greater flexibility for identifying the originating NF type or adding other specific details. To accommodate this requirement, I modified the code to allow for additional information to be appended after the NF type in the User-Agent header, separated by a hyphen. This change ensures that the User-Agent header format can be customized as needed for indirect communication scenarios and requests originating from the SCP, improving compliance with the specification and enhancing the adaptability of the header format for HTTP/2 communications. --- src/scp/sbi-path.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index fb4b54fdad..5441eb9c47 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -186,7 +186,39 @@ static int request_handler(ogs_sbi_request_t *request, void *data) * and the field value. Field names are case-insensitive. */ if (!strcasecmp(key, OGS_SBI_USER_AGENT)) { - if (val) requester_nf_type = OpenAPI_nf_type_FromString(val); + /* + * TS29.500 + * 5.2 HTTP/2 Protocol + * 5.2.2.2 Mandatory to support HTTP standard headers + * + * Table 5.2.2.2-1 + * Mandatory to support HTTP request standard headers + * + * Name: User-Agent + * Reference: IETF RFC 7231 [11] + * Description: + * This header shall be mainly used to identify the NF type of the + * HTTP/2 client. This header should be included in every HTTP/2 + * request sent over any SBI; This header shall be included in + * every HTTP/2 request sent using indirect communication when + * target NF (re-)selection is to be performed at SCP. + * + * For Indirect communications, the User-Agent header in a + * request that is: + * - forwarded by the SCP (with or without delegated + * discovery) shall identify the NF type of the original NF + * that issued the request (i.e. the SCP shall forward the + * header received in the incoming request); + * - originated by the SCP towards the NRF (e.g. NF Discovery or + * Access Token Request) shall identify the SCP. + * + * The pattern of the content should start with the value of NF type + * (e.g. "UDM", see NOTE 1) or "SCP" (for a request originated by + * an SCP) and followed by a "-" and any other specific information + * if needed afterwards. + */ + char *v = strsep(&val, "-"); + if (v) requester_nf_type = OpenAPI_nf_type_FromString(v); } else if (!strcasecmp(key, OGS_SBI_CUSTOM_TARGET_APIROOT)) { headers.target_apiroot = val; } else if (!strcasecmp(key, OGS_SBI_CUSTOM_CALLBACK)) { From 51fd59e7cf6efa876ebfcd352bed6588e78635e4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 11 Nov 2024 16:09:45 +0900 Subject: [PATCH 254/323] [UDM] Prevent crash by limiting the number of TOKENs (#3564) we modified the ogs_supi_from_suci function to prevent the crash by limiting the number of tokens parsed --- lib/sbi/conv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index 353a6a07a1..35c2f316a4 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -103,7 +103,7 @@ char *ogs_supi_from_suci(char *suci) p = tmp; i = 0; - while((array[i++] = strsep(&p, "-"))) { + while((i < MAX_SUCI_TOKEN) && (array[i++] = strsep(&p, "-"))) { /* Empty Body */ } From 85bb717bf6877bf9308e5b1584db4e9b5c2c5e84 Mon Sep 17 00:00:00 2001 From: draga <rodrigo.asensio@um.es> Date: Tue, 12 Nov 2024 17:07:32 +0100 Subject: [PATCH 255/323] fixed function to compare with amf supported plmns --- src/amf/ngap-handler.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 15b350c527..1105b5f65d 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -38,14 +38,16 @@ static bool maximum_number_of_gnbs_is_reached(void) static bool gnb_plmn_id_is_foreign(amf_gnb_t *gnb) { - int i, j; - - for (i = 0; i < gnb->num_of_supported_ta_list; i++) { - for (j = 0; j < gnb->supported_ta_list[i].num_of_bplmn_list; j++) { - if (memcmp(&gnb->plmn_id, - &gnb->supported_ta_list[i].bplmn_list[j].plmn_id, - OGS_PLMN_ID_LEN) == 0) - return false; + int i, j, k; + for (k = 0; k < amf_self()->num_of_plmn_support; k++) { + for (i = 0; i < gnb->num_of_supported_ta_list; i++) { + for (j = 0; j < gnb->supported_ta_list[i].num_of_bplmn_list; j++) { + if (memcmp(&amf_self()->plmn_support[k].plmn_id, + &gnb->supported_ta_list[i].bplmn_list[j].plmn_id, + OGS_PLMN_ID_LEN) == 0){ + return false; + } + } } } From 1519f73f0fb2232d1fc10d986e45eca6a4994f64 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 13 Nov 2024 11:08:50 +0900 Subject: [PATCH 256/323] [AMF] for (k, i, j) -> for(i, j, k) (#3544, #3570) --- src/amf/ngap-handler.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 1105b5f65d..bbb316bf63 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -39,11 +39,11 @@ static bool maximum_number_of_gnbs_is_reached(void) static bool gnb_plmn_id_is_foreign(amf_gnb_t *gnb) { int i, j, k; - for (k = 0; k < amf_self()->num_of_plmn_support; k++) { - for (i = 0; i < gnb->num_of_supported_ta_list; i++) { - for (j = 0; j < gnb->supported_ta_list[i].num_of_bplmn_list; j++) { - if (memcmp(&amf_self()->plmn_support[k].plmn_id, - &gnb->supported_ta_list[i].bplmn_list[j].plmn_id, + for (i = 0; i < amf_self()->num_of_plmn_support; i++) { + for (j = 0; j < gnb->num_of_supported_ta_list; j++) { + for (k = 0; k < gnb->supported_ta_list[j].num_of_bplmn_list; k++) { + if (memcmp(&amf_self()->plmn_support[i].plmn_id, + &gnb->supported_ta_list[j].bplmn_list[k].plmn_id, OGS_PLMN_ID_LEN) == 0){ return false; } From dd7217acde5125f69942722415b68a738dc2229d Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 13 Nov 2024 11:17:06 +0900 Subject: [PATCH 257/323] [MME] Fix handling of unknown PLMN in S1 Setup Request (#3544, #3570) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` TS36.413 8.7.3 S1 Setup 8.7.3.4 Abnormal Conditions If the eNB initiates the procedure by sending a S1 SETUP REQUEST message including the PLMN Identity IEs and none of the PLMNs provided by the eNB is identified by the MME, then the MME shall reject the eNB S1 Setup Request procedure with the appropriate cause value, e.g., “Unknown PLMN” ``` Modified code to address abnormal conditions where the eNB initiates the S1 Setup Request with a PLMN Identity IE that is unrecognized by the MME. In this case, the MME now properly rejects the S1 Setup Request with the cause value "Unknown PLMN" in compliance with the 3GPP specification (8.7.3.4). --- src/mme/s1ap-handler.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 3ce728382c..618b42bb69 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -50,12 +50,17 @@ static bool maximum_number_of_enbs_is_reached(void) static bool enb_plmn_id_is_foreign(mme_enb_t *enb) { - int i; - - for (i = 0; i < enb->num_of_supported_ta_list; i++) { - if (memcmp(&enb->plmn_id, &enb->supported_ta_list[i].plmn_id, - OGS_PLMN_ID_LEN) == 0) - return false; + int i, j, k; + + for (i = 0; i < mme_self()->num_of_served_gummei; i++) { + for (j = 0; j < mme_self()->served_gummei[i].num_of_plmn_id; j++) { + for (k = 0; k < enb->num_of_supported_ta_list; k++) { + if (memcmp(&mme_self()->served_gummei[i].plmn_id[j], + &enb->supported_ta_list[k].plmn_id, + OGS_PLMN_ID_LEN) == 0) + return false; + } + } } return true; From 1fa8e5468e782e7139a27ec8be7e95b70c32d231 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 14 Nov 2024 16:23:55 +0900 Subject: [PATCH 258/323] [AMF/MME] Fix handover failing due to GNB/eNBID hash table handling (#3569) Resolved an issue where Handover was failing when attempting to handover from GNB-ID/eNB-ID 1 to GNB-ID/eNB-ID 0. The problem occurred because the hash table managing GNB_ID values would remove any entry with the default GNB-ID/eNB-ID of 0 before re-adding entries. Consequently, any GNB/eNB configured with a GNB-ID/eNB-ID of 0 would be inadvertently deleted whenever another GNB was added. This fix modifies the handling of the hash table to prevent the default GNB-ID/eNB-ID (0) from being removed unintentionally, allowing handovers between GNB-ID/eNB-ID 0 and other GNBs/eNBs to proceed without error. --- src/amf/context.c | 8 ++++++-- src/amf/context.h | 1 + src/mme/mme-context.c | 8 ++++++-- src/mme/mme-context.h | 1 + tests/handover/5gc-n2-test.c | 8 ++++---- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/amf/context.c b/src/amf/context.c index 8de96f3cb0..f3ab505534 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1258,7 +1258,8 @@ void amf_gnb_remove(amf_gnb_t *gnb) ogs_hash_set(self.gnb_addr_hash, gnb->sctp.addr, sizeof(ogs_sockaddr_t), NULL); - ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); + if (gnb->gnb_id_presence == true) + ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); ogs_sctp_flush_and_destroy(&gnb->sctp); @@ -1294,11 +1295,14 @@ int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id) { ogs_assert(gnb); - ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); + if (gnb->gnb_id_presence == true) + ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), NULL); gnb->gnb_id = gnb_id; ogs_hash_set(self.gnb_id_hash, &gnb->gnb_id, sizeof(gnb->gnb_id), gnb); + gnb->gnb_id_presence = true; + return OGS_OK; } diff --git a/src/amf/context.h b/src/amf/context.h index b35165cad8..48992481d9 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -139,6 +139,7 @@ typedef struct amf_gnb_s { ogs_fsm_t sm; /* A state machine */ + bool gnb_id_presence; uint32_t gnb_id; /* gNB_ID received from gNB */ ogs_plmn_id_t plmn_id; /* gNB PLMN-ID received from gNB */ ogs_sctp_sock_t sctp; /* SCTP socket */ diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 6f1d412f97..b27c9977e1 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2999,7 +2999,8 @@ int mme_enb_remove(mme_enb_t *enb) ogs_hash_set(self.enb_addr_hash, enb->sctp.addr, sizeof(ogs_sockaddr_t), NULL); - ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); + if (enb->enb_id_presence == true) + ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); /* * CHECK: @@ -3046,11 +3047,14 @@ int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id) { ogs_assert(enb); - ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); + if (enb->enb_id_presence == true) + ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL); enb->enb_id = enb_id; ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), enb); + enb->enb_id_presence = true; + return OGS_OK; } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 2300099e40..c58e945870 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -246,6 +246,7 @@ typedef struct mme_enb_s { ogs_fsm_t sm; /* A state machine */ + bool enb_id_presence; uint32_t enb_id; /* eNB_ID received from eNB */ ogs_plmn_id_t plmn_id; /* eNB PLMN-ID received from eNB */ ogs_sctp_sock_t sctp; /* SCTP socket */ diff --git a/tests/handover/5gc-n2-test.c b/tests/handover/5gc-n2-test.c index 8b7f4323c3..b8f355e3cb 100644 --- a/tests/handover/5gc-n2-test.c +++ b/tests/handover/5gc-n2-test.c @@ -515,7 +515,7 @@ static void direct_complete_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, gtpu2); /* NG-Setup Reqeust/Response for Source gNB */ - sendbuf = testngap_build_ng_setup_request(0x4000, 28); + sendbuf = testngap_build_ng_setup_request(0, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap1, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -769,7 +769,7 @@ static void direct_complete_func(abts_case *tc, void *data) /* Send UplinkRANConfigurationTransfer */ sendbuf = testngap_build_uplink_ran_configuration_transfer( - 0x4000, 28, 0x4001, 28); + 0, 28, 0x4001, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap1, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -781,7 +781,7 @@ static void direct_complete_func(abts_case *tc, void *data) /* Send UplinkRANConfigurationTransfer */ sendbuf = testngap_build_uplink_ran_configuration_transfer( - 0x4001, 28, 0x4000, 28); + 0x4001, 28, 0, 28); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap2, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -911,7 +911,7 @@ static void direct_complete_func(abts_case *tc, void *data) /* Send HandoverRequired */ sendbuf = testngap_build_handover_required( test_ue, NGAP_HandoverType_intra5gs, - 0x4000, 28, + 0, 28, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason, true); From 1c2098bf71aaf9b523177758d95613962c71d6a3 Mon Sep 17 00:00:00 2001 From: nick <nick.m.dodson@gmail.com> Date: Fri, 15 Nov 2024 17:53:19 -0500 Subject: [PATCH 259/323] fix indentation issue in srsenb.yaml and rename srslte.yaml to srsenb.yaml in guide02 docs --- configs/srsenb.yaml.in | 2 +- docs/_docs/guide/02-building-open5gs-from-sources.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/srsenb.yaml.in b/configs/srsenb.yaml.in index a30bbf520a..9f2185dcde 100644 --- a/configs/srsenb.yaml.in +++ b/configs/srsenb.yaml.in @@ -67,7 +67,7 @@ mme: tai: - plmn_id: mcc: 901 - mnc: 70 + mnc: 70 tac: 7 security: integrity_order : [ EIA2, EIA1, EIA0 ] diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index e22fdc7a55..c7b4fbe4c4 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -447,7 +447,7 @@ $ cp open5gs* /usr/bin/ For convenience, you can execute all NFs at once by using the following command. ```bash $ ./build/tests/app/5gc ## 5G Core Only with ./build/configs/sample.yaml -$ ./build/tests/app/epc -c ./build/configs/srslte.yaml ## EPC Only with ./build/configs/srslte.yaml +$ ./build/tests/app/epc -c ./build/configs/srsenb.yaml ## EPC Only with ./build/configs/srsenb.yaml $ ./build/tests/app/app ## Both 5G Core and EPC with ./build/configs/sample.yaml ``` From cfff6d28aaeb4c704a08b95a654143b034a10f8a Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 20 Aug 2024 09:44:59 +0200 Subject: [PATCH 260/323] [AMF] prevent null-dereferencing Break early in case resouce allocation fails. --- src/amf/amf-sm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index f3b0a421d4..f47ab4b4f1 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -845,6 +845,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) if (!gnb) { ogs_error("amf_gnb_add() failed"); ogs_free(addr); + break; } } else { ogs_free(addr); From 5ebb2eb76e3f3b2b27617fa4797e5c4d5f4d48ff Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 14 Nov 2024 12:21:15 +0100 Subject: [PATCH 261/323] [SMF] fix wrong return value (int -> bool) --- src/smf/npcf-handler.c | 4 ++-- src/smf/nsmf-handler.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index fb0096a334..4a8203c96b 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -344,7 +344,7 @@ bool smf_npcf_smpolicycontrol_handle_create( ogs_error("[%s:%d] Invalid URI [%s]", smf_ue->supi, sess->psi, header.uri); ogs_sbi_header_free(&header); - return OGS_ERROR; + return false; } client = ogs_sbi_client_find(scheme, fqdn, fqdn_port, addr, addr6); @@ -360,7 +360,7 @@ bool smf_npcf_smpolicycontrol_handle_create( ogs_freeaddrinfo(addr); ogs_freeaddrinfo(addr6); - return OGS_ERROR; + return false; } } diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 30bb0b9db5..907fe3332f 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -991,6 +991,6 @@ bool smf_nsmf_callback_handle_sdm_data_change_notify( ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - return OGS_OK; + return true; } From f03e2207619655ecd97e9a12ab8cee0ab86cc878 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 20 Nov 2024 10:52:28 +0900 Subject: [PATCH 262/323] [DOCS] Update link of Mesaurement of UPF Performance (#3553) --- docs/_pages/docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index 350ef50ffa..6409f7397c 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -20,7 +20,7 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - In the lab - [A Demonstration of 30 Gbps Load Testing for Accelerated UPF with Open5gs](https://nextepc.com/technology) - - [Measurement of UPF Performance](https://github.com/s5uishida/simple_measurement_of_upf_performance) + - [Measurement of UPF Performance](https://github.com/s5uishida/sample_config_misc_for_mobile_network#performance_measurement) - Troubleshooting - [Simple Issues](troubleshoot/01-simple-issues) From f5de72b996c8a4b903710cf3b75778062ff58a94 Mon Sep 17 00:00:00 2001 From: mitmitmitm <ois@oasd8i.at> Date: Thu, 21 Nov 2024 07:48:29 +0100 Subject: [PATCH 263/323] Support non-integer bitrate strings more accurately TS 29.571 - 5.5.2 Simple Data Types defines BitRate type as String representing a bit rate that shall be formatted as follows: Pattern: '^\d+(\.\d+)? (bps|Kbps|Mbps|Gbps|Tbps)$' Examples: "125 Mbps", "0.125 Gbps", "125000 Kbps" Taking the "0.125 Gbps" example, rather than round 0.125 down to 0, parse it as a double-float first before multiplying by 10^9, resulting in 1.25e8 (bps). --- lib/sbi/conv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index 35c2f316a4..acbcbf7e57 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -722,12 +722,12 @@ char *ogs_sbi_bitrate_to_string(uint64_t bitrate, int unit) uint64_t ogs_sbi_bitrate_from_string(char *str) { char *unit = NULL; - uint64_t bitrate = 0; + double bitrate = 0; ogs_assert(str); uint64_t mul = 1; unit = strrchr(str, ' '); - bitrate = atoll(str); + bitrate = atof(str); if (!unit) { ogs_error("No Unit [%s]", str); @@ -755,7 +755,7 @@ uint64_t ogs_sbi_bitrate_from_string(char *str) else bitrate *= mul; - return bitrate; + return (uint64_t) bitrate; } #define MAX_TIMESTR_LEN 128 From 0bbbd0166ef8cf6fa0dec6bbdc9ebf1571f85ca1 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 25 Nov 2024 16:47:03 +0900 Subject: [PATCH 264/323] Added use_upg_vpp parameter for UPG-VPP configuration (#3591) This commit introduces a new parameter in the global configuration to support UPG-VPP UPF. When the following setting is added: ``` global: parameter: use_upg_vpp: true ``` The SMF generates PFCP messages specifically tailored for UPG-VPP UPF. This allows seamless integration and operation with UPG-VPP by automatically adapting the message structure to its requirements. --- lib/app/ogs-config.c | 3 +++ lib/app/ogs-config.h | 1 + src/smf/context.c | 28 +++++++++------------------- src/smf/npcf-handler.c | 15 +++++---------- 4 files changed, 18 insertions(+), 29 deletions(-) diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index 68287bc141..cba7cf0fdd 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -247,6 +247,9 @@ int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent) } else if (!strcmp(parameter_key, "use_openair")) { global_conf.parameter.use_openair = ogs_yaml_iter_bool(&parameter_iter); + } else if (!strcmp(parameter_key, "use_upg_vpp")) { + global_conf.parameter.use_upg_vpp = + ogs_yaml_iter_bool(&parameter_iter); } else if (!strcmp(parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) { global_conf.parameter. diff --git a/lib/app/ogs-config.h b/lib/app/ogs-config.h index 2086d9b98b..d810fe3fec 100644 --- a/lib/app/ogs-config.h +++ b/lib/app/ogs-config.h @@ -69,6 +69,7 @@ typedef struct ogs_global_conf_s { int multicast; int use_openair; + int use_upg_vpp; int no_ipv4v6_local_addr_in_packet_filter; int no_pfcp_rr_select; diff --git a/src/smf/context.c b/src/smf/context.c index bb76b77c09..0534be0366 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -2268,6 +2268,7 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) ogs_pfcp_far_t *up2cp_far = NULL; ogs_assert(sess); + ogs_assert(sess->session.name); smf_sess_delete_cp_up_data_forwarding(sess); @@ -2275,15 +2276,10 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) ogs_assert(cp2up_pdr); sess->cp2up_pdr = cp2up_pdr; -#if 0 - /* - * DEPRECATED: - * In PDR, no need to distinguish the Network Instance from CP to UP. - */ - ogs_assert(sess->session.name); - cp2up_pdr->apn = ogs_strdup(sess->session.name); - ogs_assert(cp2up_pdr->apn); -#endif + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + cp2up_pdr->apn = ogs_strdup(sess->session.name); + ogs_assert(cp2up_pdr->apn); + } cp2up_pdr->src_if = OGS_PFCP_INTERFACE_CP_FUNCTION; @@ -2306,7 +2302,6 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) ogs_assert(up2cp_pdr); sess->up2cp_pdr = up2cp_pdr; - ogs_assert(sess->session.name); up2cp_pdr->apn = ogs_strdup(sess->session.name); ogs_assert(up2cp_pdr->apn); @@ -2344,15 +2339,10 @@ void smf_sess_create_cp_up_data_forwarding(smf_sess_t *sess) ogs_assert(up2cp_far); sess->up2cp_far = up2cp_far; - ogs_assert(sess->session.name); -#if 0 - /* - * DEPRECATED: - * In FAR, no need to distinguish the Network Instance from CP to UP. - */ - up2cp_far->apn = ogs_strdup(sess->session.name); - ogs_assert(up2cp_far->apn); -#endif + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + up2cp_far->apn = ogs_strdup(sess->session.name); + ogs_assert(up2cp_far->apn); + } up2cp_far->dst_if = OGS_PFCP_INTERFACE_CP_FUNCTION; ogs_pfcp_pdr_associate_far(up2cp_pdr, up2cp_far); diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 4a8203c96b..e91c061d00 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -521,16 +521,11 @@ bool smf_npcf_smpolicycontrol_handle_create( &dl_pdr->ue_ip_addr, &dl_pdr->ue_ip_addr_len)); dl_pdr->ue_ip_addr.sd = OGS_PFCP_UE_IP_DST; -#if 0 - /* DEPRECATED: - * - * The UE IP Address is unnecessary in the PDI of the UL PDR - * because the PDR can be found using the TEID. - */ - ogs_assert(OGS_OK == - ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, - &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); -#endif + if (ogs_global_conf()->parameter.use_upg_vpp == true) { + ogs_assert(OGS_OK == + ogs_pfcp_paa_to_ue_ip_addr(&sess->paa, + &ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len)); + } if (sess->session.ipv4_framed_routes && sess->pfcp_node->up_function_features.frrt) { From 3358e5128fb9568b972b2c97a0027bc82a07b1e3 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol <pespin@sysmocom.de> Date: Mon, 25 Nov 2024 19:48:29 +0100 Subject: [PATCH 265/323] [MME] Fix typo in log line --- src/mme/emm-sm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index e1045f1667..38f817ddf1 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -667,7 +667,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, } else { if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) { - ogs_debug(" Iniital UE Message"); + ogs_debug(" Initial UE Message"); if (mme_ue->nas_eps.update.active_flag) { /* From df83767653c94255d70e64a3f6b0d595fbd92d53 Mon Sep 17 00:00:00 2001 From: AlbertoBerlin <alberto-github@mobileplots.com> Date: Mon, 25 Nov 2024 10:27:10 +0100 Subject: [PATCH 266/323] Support for nf-instance-id as Subscription Condition in subscriptions to notifications from NRF --- lib/sbi/context.c | 3 +++ lib/sbi/context.h | 1 + src/nrf/nnrf-handler.c | 3 +++ src/nrf/sbi-path.c | 3 +++ 4 files changed, 10 insertions(+) diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 6b7005edff..d7a6d66ae4 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -2514,6 +2514,9 @@ void ogs_sbi_subscription_data_remove( if (subscription_data->subscr_cond.service_name) ogs_free(subscription_data->subscr_cond.service_name); + + if (subscription_data->subscr_cond.nf_instance_id) + ogs_free(subscription_data->subscr_cond.nf_instance_id); if (subscription_data->t_validity) ogs_timer_delete(subscription_data->t_validity); diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 1e375748a6..fbe08727c5 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -299,6 +299,7 @@ typedef struct ogs_sbi_subscription_data_s { struct { OpenAPI_nf_type_e nf_type; /* nfType */ char *service_name; /* ServiceName */ + char *nf_instance_id; /* NF Instance Id */ } subscr_cond; uint64_t requester_features; diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index d6b9e2468c..c77e187810 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -386,6 +386,9 @@ bool nrf_nnrf_handle_nf_status_subscribe( else if (SubscrCond->service_name) subscription_data->subscr_cond.service_name = ogs_strdup(SubscrCond->service_name); + else if (SubscrCond->nf_instance_id) + subscription_data->subscr_cond.nf_instance_id = + ogs_strdup(SubscrCond->nf_instance_id); else { ogs_error("No SubscrCond"); ogs_sbi_subscription_data_remove(subscription_data); diff --git a/src/nrf/sbi-path.c b/src/nrf/sbi-path.c index 02c0b967ea..303f5c866f 100644 --- a/src/nrf/sbi-path.c +++ b/src/nrf/sbi-path.c @@ -127,6 +127,9 @@ bool nrf_nnrf_nfm_send_nf_status_notify_all( ogs_sbi_nf_service_is_allowed_nf_type( nf_service, subscription_data->req_nf_type) == false) continue; + } else if (subscription_data->subscr_cond.nf_instance_id) { + if (strcmp(subscription_data->subscr_cond.nf_instance_id, nf_instance->id) != 0) + continue; } if (subscription_data->req_nf_type && From 02e1729ca65f87727299dd4cd22dbbbb517a48f7 Mon Sep 17 00:00:00 2001 From: AlbertoBerlin <alberto-github@mobileplots.com> Date: Mon, 25 Nov 2024 10:38:59 +0100 Subject: [PATCH 267/323] Removing from discovery responses an invalid nfProfileChangesSupportInd which should not be there --- src/nrf/nnrf-handler.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index c77e187810..f3e5d8e033 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -930,6 +930,9 @@ bool nrf_nnrf_handle_nf_discover( if (!NFProfile) { ogs_error("No NFProfile"); continue; + } else { + //This line is added to not include nfProfileChangesSupportInd in a discovery response which should not have it + NFProfile->is_nf_profile_changes_support_ind = false; } OpenAPI_list_add(SearchResult->nf_instances, NFProfile); From c3dccf13fc5ddcebe20c14b75c9f4ec81376976b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 28 Nov 2024 20:46:45 +0900 Subject: [PATCH 268/323] Revert "Removing from discovery responses an invalid nfProfileChangesSupportInd which should not be there" This reverts commit 02e1729ca65f87727299dd4cd22dbbbb517a48f7. --- src/nrf/nnrf-handler.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index f3e5d8e033..c77e187810 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -930,9 +930,6 @@ bool nrf_nnrf_handle_nf_discover( if (!NFProfile) { ogs_error("No NFProfile"); continue; - } else { - //This line is added to not include nfProfileChangesSupportInd in a discovery response which should not have it - NFProfile->is_nf_profile_changes_support_ind = false; } OpenAPI_list_add(SearchResult->nf_instances, NFProfile); From b8208464a220112c898fe20b43c8bf4aa9a473de Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 28 Nov 2024 20:47:16 +0900 Subject: [PATCH 269/323] [NRF] Remove nfProfileChangesSupportInd from responses (#3585) According to TS 29.510, the NFProfile structure in the NFDiscovery API does not include the nfProfileChangesSupportInd attribute. However, Open5GS NRF currently includes this attribute in NFDiscovery API responses, which has led to complaints from certain NF vendors. This commit modifies the nrf_nnrf_handle_nf_discover function in src/nrf/nnrf-handler.c to ensure that the nfProfileChangesSupportInd attribute is excluded when constructing NFProfile for NFDiscovery responses. --- lib/sbi/nnrf-build.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index 71c3d2d098..84bf5c33b1 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -61,6 +61,28 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_register(void) goto end; } + /* + * TS29510 + * 6.1.6.2 Structured data types + * 6.1.6.2.2 Type: NFProfile + * Table 6.1.6.2.2-1: Definition of type NFProfile + * + * NF Profile Changes Support Indicator. + * See Annex B. + * + * This IE may be present in the NFRegister or + * NFUpdate (NF Profile Complete Replacement) + * request and shall be absent in the response. + * + * true: the NF Service Consumer supports receiving + * NF Profile Changes in the response. + * + * false (default): the NF Service Consumer does not + * support receiving NF Profile Changes in the response. + */ + NFProfile->is_nf_profile_changes_support_ind = true; + NFProfile->nf_profile_changes_support_ind = true; + message.NFProfile = NFProfile; request = ogs_sbi_build_request(&message); @@ -146,9 +168,6 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( OpenAPI_list_free(PlmnIdList); } - NFProfile->is_nf_profile_changes_support_ind = true; - NFProfile->nf_profile_changes_support_ind = true; - if (nf_instance->fqdn) NFProfile->fqdn = ogs_strdup(nf_instance->fqdn); From c67bddd2b4f8fc98829f127e7af5d6de62ffdd82 Mon Sep 17 00:00:00 2001 From: dchard <metro4@freemail.hu> Date: Thu, 28 Nov 2024 14:05:48 +0100 Subject: [PATCH 270/323] [MME] Add fake combined attach In case an external HSS is used, and the NAM field is set to 0 (PACKET_ONLY), Open5GS MME will only respond with an "EPS_ONLY" attach accept. This behavior causes a lot of UEs (mainly phones) to disconnect after 1-2 seconds without further signalling. To resolve this, a new flag is introduced: ``` global: parameter: fake_csfb: true ``` If this flag is set to 'ture', the MME will respond with a combined EPS/IMSI attach accept even if the HSS NAM field is set to "PACKET_ONLY", or if the MME has no SGs connection towards a CS core. By default this flag is false, thus not modifying the original behavior. Note: some commercial core network vendors do include the LAI part in a "fake" combined EPS/IMSI attach accept message. As that field is optional, and testing also indicates that it is not needed, this patch does not implement it. --- lib/app/ogs-config.c | 3 +++ lib/app/ogs-config.h | 1 + src/mme/emm-build.c | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index cba7cf0fdd..8e3762844c 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -250,6 +250,9 @@ int ogs_app_parse_global_conf(ogs_yaml_iter_t *parent) } else if (!strcmp(parameter_key, "use_upg_vpp")) { global_conf.parameter.use_upg_vpp = ogs_yaml_iter_bool(&parameter_iter); + } else if (!strcmp(parameter_key, "fake_csfb")) { + global_conf.parameter.fake_csfb = + ogs_yaml_iter_bool(&parameter_iter); } else if (!strcmp(parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) { global_conf.parameter. diff --git a/lib/app/ogs-config.h b/lib/app/ogs-config.h index d810fe3fec..6f98a7c666 100644 --- a/lib/app/ogs-config.h +++ b/lib/app/ogs-config.h @@ -69,6 +69,7 @@ typedef struct ogs_global_conf_s { int multicast; int use_openair; + int fake_csfb; int use_upg_vpp; int no_ipv4v6_local_addr_in_packet_filter; diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index 4eba1d2330..e9cc8e187a 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -83,6 +83,11 @@ ogs_pkbuf_t *emm_build_attach_accept( if (mme_ue->network_access_mode == OGS_NETWORK_ACCESS_MODE_ONLY_PACKET) { /* permit only EPS_ATTACH */ eps_attach_result->result = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; + if (ogs_global_conf()->parameter.fake_csfb == true) + eps_attach_result->result = + OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; + else + eps_attach_result->result = OGS_NAS_ATTACH_TYPE_EPS_ATTACH; } else { eps_attach_result->result = mme_ue->nas_eps.attach.value; } From e690005a24835d8c48efe34a2af425da40ba223c Mon Sep 17 00:00:00 2001 From: liuxiaoxinxinxin <103559845+liuxiaoxinxinxin@users.noreply.github.com> Date: Sun, 1 Dec 2024 16:15:03 +0800 Subject: [PATCH 271/323] Update ngap-path.c --- src/amf/ngap-path.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index 5b9ce2bdf5..609c0f293f 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -168,6 +168,11 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, ogs_assert(ran_ue); ogs_assert(nasPdu); + if (nasPdu->size == 0) { + ogs_error("Empty NAS PDU"); + return OGS_ERROR; + } + amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id); /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. From 76060ff22bcca93f70d492014b885a7d3689db3c Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 2 Dec 2024 10:07:16 +0900 Subject: [PATCH 272/323] [AMF/MME] Add validation for NAS PDU and mitigate DoS attacks (#3607, #3606, #3131) - Added handling for empty NAS PDUs to prevent potential heap-buffer-overflow. - Implemented safeguards to reject invalid NAS messages and mitigate DoS attacks by removing S1/NG Context for affected UEs. --- src/amf/ngap-path.c | 1 + src/mme/s1ap-path.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index 609c0f293f..fda8957d6c 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -170,6 +170,7 @@ int ngap_send_to_nas(ran_ue_t *ran_ue, if (nasPdu->size == 0) { ogs_error("Empty NAS PDU"); + ran_ue_remove(ran_ue); return OGS_ERROR; } diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index 0ddc68c9e1..ddbdb336d8 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -173,6 +173,12 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, ogs_assert(enb_ue); ogs_assert(nasPdu); + if (nasPdu->size == 0) { + ogs_error("Empty NAS PDU"); + enb_ue_remove(enb_ue); + return OGS_ERROR; + } + mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id); /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. From f780f9af45c27b6f49987d96ba71dedb3dd85840 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 2 Dec 2024 11:21:48 +0900 Subject: [PATCH 273/323] [AMF] Fix crash due to incorrect handling of UE registration requests (#3608) This commit addresses an issue in the AMF where it crashes upon receiving the Nausf_UEAuthentication_Authenticate response in the gmm_state_exception function. The crash occurs when the same UE continuously sends registration requests while the previous UE context is released before the AUSF response is received, leading to incorrect states in the gmm state machine. The root cause was a lack of proper handling in the gmm_state_exception function for the scenario where multiple registration requests from the same UE cause the AMF to process outdated authentication vectors. This update introduces a fix to handle this edge case and prevent the AMF from crashing. --- src/amf/gmm-sm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index f17cae690f..f9a8f1a679 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -2815,6 +2815,53 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) ogs_assert(ran_ue); SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("[%s] Cannot find SUCI [%d]", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("[%s] Invalid HTTP method [%s]", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("[%s] Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) From e5f50f53f63f5e1bd90e413622008b7c58c27488 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 2 Dec 2024 16:51:16 +0900 Subject: [PATCH 274/323] [PFCP] Ensure correct TEID restoration behavior by checking F-TEID.ch value (#3574) Added a check to ensure that TEID restoration via swap occurs only when F-TEID.ch is false. In the restoration process, when F-TEID.ch is false, it indicates that the TEID has already been assigned, and the swap operation is necessary to restore the TEID. However, if F-TEID.ch is true, it means that the UPF needs to assign a new TEID for the first time, and performing a swap in this case would be incorrect. This check ensures that the swap operation is only triggered when the TEID is already assigned and prevents potential issues during the TEID assignment process. --- src/sgwu/sxa-handler.c | 12 +++++++++++- src/upf/n4-handler.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/sgwu/sxa-handler.c b/src/sgwu/sxa-handler.c index cf33e305c9..4482426f6e 100644 --- a/src/sgwu/sxa-handler.c +++ b/src/sgwu/sxa-handler.c @@ -95,7 +95,17 @@ void sgwu_sxa_handle_session_establishment_request( pdr = created_pdr[i]; ogs_assert(pdr); - if (pdr->f_teid_len) + /* + * Only perform TEID restoration via swap when F-TEID.ch is false. + * + * When F-TEID.ch is false, it means the TEID has already been assigned, and + * the restoration process can safely perform the swap. + * + * If F-TEID.ch is true, it indicates that the UPF needs to assign + * a new TEID for the first time, so performing a swap is not appropriate + * in this case. + */ + if (pdr->f_teid.ch == false && pdr->f_teid_len) ogs_pfcp_pdr_swap_teid(pdr); } restoration_indication = true; diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index 466cc89f0b..d7ad1de1de 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -152,7 +152,17 @@ void upf_n4_handle_session_establishment_request( pdr = created_pdr[i]; ogs_assert(pdr); - if (pdr->f_teid_len) + /* + * Only perform TEID restoration via swap when F-TEID.ch is false. + * + * When F-TEID.ch is false, it means the TEID has already been assigned, and + * the restoration process can safely perform the swap. + * + * If F-TEID.ch is true, it indicates that the UPF needs to assign + * a new TEID for the first time, so performing a swap is not appropriate + * in this case. + */ + if (pdr->f_teid.ch == false && pdr->f_teid_len) ogs_pfcp_pdr_swap_teid(pdr); } restoration_indication = true; From 525695501ec8bf5544e510d3b0af0e9484007a3b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 3 Dec 2024 08:59:34 +0900 Subject: [PATCH 275/323] [PFCP] Add assertion to ensure F-TEID.ch is false before TEID swap (#3036, #3574, #3610) This prevents incorrect restoration behavior by ensuring the TEID is only swapped when F-TEID.ch is false, indicating the TEID has already been assigned. --- docs/_pages/docs.md | 1 + lib/pfcp/context.c | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/_pages/docs.md b/docs/_pages/docs.md index 6409f7397c..65d3b364a1 100644 --- a/docs/_pages/docs.md +++ b/docs/_pages/docs.md @@ -43,6 +43,7 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" - [SMF Code Explanation](https://medium.com/@aditya.koranga/open5gs-smf-code-explanation-with-flow-charts-a3b3cd38c991) - @infinitydon + - [OAI's O-RAN Integration With Open5gs 5G Core](https://futuredon.medium.com/integrating-disaggregated-openairinterface-o-ran-components-with-open5gs-5g-core-76e5deac1730) - [Open5GS on Amazon Elastic Kubernetes Service](https://aws.amazon.com/blogs/opensource/open-source-mobile-core-network-implementation-on-amazon-elastic-kubernetes-service/) - [Kubernetes Open5GS Deployment](https://dev.to/infinitydon/virtual-4g-simulation-using-kubernetes-and-gns3-3b7k?fbclid=IwAR1p99h13a-mCfejanbBQe0H0-jp5grXkn5mWf1WrTHf47UtegB2-UHGGZQ) - [5G Core SBI mTLS Using External Certificate PKI](https://futuredon.medium.com/5g-core-sbi-mtls-using-external-certificate-pki-4ffc02ac7728) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 0572098751..f0fcff79be 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -1144,6 +1144,7 @@ void ogs_pfcp_pdr_swap_teid(ogs_pfcp_pdr_t *pdr) int i = 0; ogs_assert(pdr); + ogs_assert(!pdr->f_teid.ch); ogs_assert(pdr->f_teid.teid > 0 && pdr->f_teid.teid <= ogs_pfcp_pdr_teid_pool.size); From 43bcf08d51ed5910ae76c0cce9b55866d5a4a13f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 4 Dec 2024 14:24:01 +0900 Subject: [PATCH 276/323] [AMF] Resolve crash caused by incorrect handling of UE registration in multiple states (#3608, #3612) This commit resolves additional crashes in the AMF caused by improper handling of UE registration requests in various states of the GMM state machine. The issue occurs when the AMF receives multiple registration requests from the same UE while the previous UE context is being released, leading to outdated or invalid authentication vectors being processed. Although a previous fix addressed this problem in the gmm_state_exception function, similar crashes were identified in other states within gmm-sm.c. To address this, the handling of multiple registration requests from the same UE has been refined across all relevant states. The fix ensures proper synchronization and validation of UE contexts, preventing the AMF from processing outdated authentication data and maintaining stability during such edge cases. --- src/amf/gmm-sm.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index f9a8f1a679..2eeeb3dbe1 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -2123,6 +2123,53 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) ogs_assert(sbi_message); SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("[%s] Cannot find SUCI [%d]", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("[%s] Invalid HTTP method [%s]", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("[%s] Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) @@ -2257,6 +2304,53 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) state = e->h.sbi.state; SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT) { + if (sbi_message->res_status == + OGS_SBI_HTTP_STATUS_NOT_FOUND) { + ogs_warn("[%s] Cannot find SUCI [%d]", + amf_ue->suci, sbi_message->res_status); + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); + } + } + + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_PUT) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_warn("[%s] Ignore SBI message", amf_ue->suci); + break; + DEFAULT + ogs_error("[%s] Invalid HTTP method [%s]", + amf_ue->suci, sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("[%s] Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) SWITCH(sbi_message->h.resource.component[1]) From 1b167ef44d31c7edda78c43bdb9e31e1e8f2bb3f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 5 Dec 2024 10:17:30 +0900 Subject: [PATCH 277/323] [AMF] Fix state machine crash during UE context transfer in REGISTERED state (#3613) Added a handler in gmm_state_registered() to process SBI client events for UE context transfer, preventing fatal errors and AMF crashes during Initial Registration. --- src/amf/gmm-sm.c | 160 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 44 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 2eeeb3dbe1..caa6013ffc 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -547,61 +547,64 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) SWITCH(sbi_message->h.resource.component[2]) - CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) - - r = OGS_ERROR; - - if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { - amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_TRANSFER_NEW_AMF_STATE; - r = amf_namf_comm_handle_ue_context_transfer_response( - sbi_message, amf_ue); - if (r != OGS_OK) { - ogs_error("failed to handle " - "UE_CONTEXT_TRANSFER response"); - amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; - } - } else { - ogs_error("[%s] HTTP response error [%d]", - amf_ue->suci, sbi_message->res_status); - amf_ue->amf_ue_context_transfer_state = UE_CONTEXT_INITIAL_STATE; - } + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + r = OGS_ERROR; + + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_TRANSFER_NEW_AMF_STATE; + r = amf_namf_comm_handle_ue_context_transfer_response( + sbi_message, amf_ue); if (r != OGS_OK) { - if (!(AMF_UE_HAVE_SUCI(amf_ue) || - AMF_UE_HAVE_SUPI(amf_ue))) { - CLEAR_AMF_UE_TIMER(amf_ue->t3570); - r = nas_5gs_send_identity_request(amf_ue); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - } + ogs_error("failed to handle " + "UE_CONTEXT_TRANSFER response"); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; } + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } - xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions( - ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, - AMF_RELEASE_SM_CONTEXT_NO_STATE); - - if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && - amf_sess_xact_count(amf_ue) == xact_count) { - r = amf_ue_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, - amf_nausf_auth_build_authenticate, - amf_ue, 0, NULL); + if (r != OGS_OK) { + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(amf_ue))) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + break; } + } - OGS_FSM_TRAN(s, &gmm_state_authentication); - break; + xact_count = amf_sess_xact_count(amf_ue); + amf_sbi_send_release_all_sessions( + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); - DEFAULT - ogs_error("Invalid resource name [%s]", - sbi_message->h.resource.component[2]); - ogs_assert_if_reached(); - END + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate, + amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + + OGS_FSM_TRAN(s, &gmm_state_authentication); break; + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid resource name [%s]", sbi_message->h.resource.component[0]); @@ -1173,6 +1176,75 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_SERVICE_NAME_NAMF_COMM) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXTS) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) + + r = OGS_ERROR; + + if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_TRANSFER_NEW_AMF_STATE; + r = amf_namf_comm_handle_ue_context_transfer_response( + sbi_message, amf_ue); + if (r != OGS_OK) { + ogs_error("failed to handle " + "UE_CONTEXT_TRANSFER response"); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } + } else { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->suci, sbi_message->res_status); + amf_ue->amf_ue_context_transfer_state = + UE_CONTEXT_INITIAL_STATE; + } + + if (r != OGS_OK) { + if (!(AMF_UE_HAVE_SUCI(amf_ue) || + AMF_UE_HAVE_SUPI(amf_ue))) { + CLEAR_AMF_UE_TIMER(amf_ue->t3570); + r = nas_5gs_send_identity_request(amf_ue); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + break; + } + } + + xact_count = amf_sess_xact_count(amf_ue); + amf_sbi_send_release_all_sessions( + ran_ue_find_by_id(amf_ue->ran_ue_id), amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); + + if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && + amf_sess_xact_count(amf_ue) == xact_count) { + r = amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate, + amf_ue, 0, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } + + OGS_FSM_TRAN(s, &gmm_state_authentication); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[2]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid service name [%s]", sbi_message->h.service.name); ogs_assert_if_reached(); From 7e00910bfcb4fffd854c58dedf8ce96a314fefb5 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 26 Nov 2024 08:36:01 +0100 Subject: [PATCH 278/323] [AMF] save mapped HPLMN from Session Est Req In case that UE sends "mapped HPLMN" in the Session Establishment Request, AMF did not save it and forward it in the request to SMF. --- src/amf/gmm-handler.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 44a9caed39..c835fe1bc9 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1287,6 +1287,9 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, if (ie.sst == amf_ue->slice[i].s_nssai.sst && ie.sd.v == amf_ue->slice[i].s_nssai.sd.v) { + sess->mapped_hplmn.sst = ie.mapped_hplmn_sst; + sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v; + /* PASS */ } else { From 531e301f4de5ecc294223393fc19d2a995b92379 Mon Sep 17 00:00:00 2001 From: AlbertoBerlin <alberto-github@mobileplots.com> Date: Tue, 10 Dec 2024 17:49:43 +0100 Subject: [PATCH 279/323] When building a PCO response, if the incoming PCO has MS_SUPPORT_LOCAL_ADDR_TFT_INDICATOR, the SMF will also reply with the indication. Otherwise newer phones will reject the type of TFT that SMF sends for dedicated bearers (e.g. VoNR or VoLTE) because they do include the local address without having advertised support for it. --- src/smf/context.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/smf/context.c b/src/smf/context.c index 0534be0366..89889862f5 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -3116,7 +3116,10 @@ int smf_pco_build(uint8_t *pco_buf, uint8_t *buffer, int length) /* TODO */ break; case OGS_PCO_ID_MS_SUPPORT_LOCAL_ADDR_TFT_INDICATOR: - /* TODO */ + smf.ids[smf.num_of_id].id = ue.ids[i].id; + smf.ids[smf.num_of_id].len = 0; + smf.ids[smf.num_of_id].data = 0; + smf.num_of_id++; break; case OGS_PCO_ID_P_CSCF_RE_SELECTION_SUPPORT: /* TODO */ From 92515a9721b1fe60e347ecc153ead44d335d3dd3 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 11 Dec 2024 21:19:02 +0900 Subject: [PATCH 280/323] [NAS] Fix heap-buffer-overflow vulnerability in NAS message decoding (#3622) Resolved a heap-buffer-overflow issue in the ogs_nas_5gs_decode_registration_request function caused by improper handling of empty pkbuf. Added validation checks to ensure pkbuf size is non-zero before accessing its data. Reviewed similar patterns in other decoding functions to prevent similar vulnerabilities. --- lib/nas/5gs/ies.c | 821 +++++++++++++++++++++++++---- lib/nas/5gs/support/nas-message.py | 14 +- lib/nas/eps/ies.c | 578 +++++++++++++++++--- lib/nas/eps/support/nas-message.py | 14 +- 4 files changed, 1266 insertions(+), 161 deletions(-) diff --git a/lib/nas/5gs/ies.c b/lib/nas/5gs/ies.c index 79d78117e2..5c39a9eff3 100644 --- a/lib/nas/5gs/ies.c +++ b/lib/nas/5gs/ies.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.2.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-21 18:47:47.812038 by acetcom + * Created on: 2024-12-11 21:13:08.097860 by acetcom * from 24501-h90.docx ******************************************************************************/ @@ -48,7 +48,14 @@ int ogs_nas_5gs_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) int ogs_nas_5gs_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_t *source = (ogs_nas_additional_information_t *)pkbuf->data; + ogs_nas_additional_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_t *)pkbuf->data; additional_information->length = source->length; size = additional_information->length + sizeof(additional_information->length); @@ -87,7 +94,14 @@ int ogs_nas_5gs_encode_additional_information(ogs_pkbuf_t *pkbuf, ogs_nas_additi int ogs_nas_5gs_decode_service_level_aa_container(ogs_nas_service_level_aa_container_t *service_level_aa_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_service_level_aa_container_t *source = (ogs_nas_service_level_aa_container_t *)pkbuf->data; + ogs_nas_service_level_aa_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_service_level_aa_container_t *)pkbuf->data; service_level_aa_container->length = be16toh(source->length); size = service_level_aa_container->length + sizeof(service_level_aa_container->length); @@ -167,7 +181,14 @@ int ogs_nas_5gs_encode_access_type(ogs_pkbuf_t *pkbuf, ogs_nas_access_type_t *ac int ogs_nas_5gs_decode_dnn(ogs_nas_dnn_t *dnn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_dnn_t *source = (ogs_nas_dnn_t *)pkbuf->data; + ogs_nas_dnn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_dnn_t *)pkbuf->data; dnn->length = source->length; size = dnn->length + sizeof(dnn->length); @@ -219,7 +240,14 @@ int ogs_nas_5gs_encode_dnn(ogs_pkbuf_t *pkbuf, ogs_nas_dnn_t *dnn) int ogs_nas_5gs_decode_eap_message(ogs_nas_eap_message_t *eap_message, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eap_message_t *source = (ogs_nas_eap_message_t *)pkbuf->data; + ogs_nas_eap_message_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eap_message_t *)pkbuf->data; eap_message->length = be16toh(source->length); size = eap_message->length + sizeof(eap_message->length); @@ -299,7 +327,14 @@ int ogs_nas_5gs_encode_gprs_timer(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_t *gprs int ogs_nas_5gs_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_2_t *source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; + ogs_nas_gprs_timer_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; gprs_timer_2->length = source->length; size = gprs_timer_2->length + sizeof(gprs_timer_2->length); @@ -338,7 +373,14 @@ int ogs_nas_5gs_encode_gprs_timer_2(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_2_t * int ogs_nas_5gs_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_3_t *source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; + ogs_nas_gprs_timer_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; gprs_timer_3->length = source->length; size = gprs_timer_3->length + sizeof(gprs_timer_3->length); @@ -377,7 +419,14 @@ int ogs_nas_5gs_encode_gprs_timer_3(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_3_t * int ogs_nas_5gs_decode_s_nssai(ogs_nas_s_nssai_t *s_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s_nssai_t *source = (ogs_nas_s_nssai_t *)pkbuf->data; + ogs_nas_s_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_s_nssai_t *)pkbuf->data; s_nssai->length = source->length; size = s_nssai->length + sizeof(s_nssai->length); @@ -416,7 +465,14 @@ int ogs_nas_5gs_encode_s_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_s_nssai_t *s_nssai) int ogs_nas_5gs_decode_5gmm_capability(ogs_nas_5gmm_capability_t *gmm_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gmm_capability_t *source = (ogs_nas_5gmm_capability_t *)pkbuf->data; + ogs_nas_5gmm_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gmm_capability_t *)pkbuf->data; gmm_capability->length = source->length; size = gmm_capability->length + sizeof(gmm_capability->length); @@ -455,7 +511,14 @@ int ogs_nas_5gs_encode_5gmm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gmm_capabili int ogs_nas_5gs_decode_abba(ogs_nas_abba_t *abba, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_abba_t *source = (ogs_nas_abba_t *)pkbuf->data; + ogs_nas_abba_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_abba_t *)pkbuf->data; abba->length = source->length; size = abba->length + sizeof(abba->length); @@ -494,7 +557,14 @@ int ogs_nas_5gs_encode_abba(ogs_pkbuf_t *pkbuf, ogs_nas_abba_t *abba) int ogs_nas_5gs_decode_additional_5g_security_information(ogs_nas_additional_5g_security_information_t *additional_security_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_5g_security_information_t *source = (ogs_nas_additional_5g_security_information_t *)pkbuf->data; + ogs_nas_additional_5g_security_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_5g_security_information_t *)pkbuf->data; additional_security_information->length = source->length; size = additional_security_information->length + sizeof(additional_security_information->length); @@ -533,7 +603,14 @@ int ogs_nas_5gs_encode_additional_5g_security_information(ogs_pkbuf_t *pkbuf, og int ogs_nas_5gs_decode_additional_information_requested(ogs_nas_additional_information_requested_t *additional_information_requested, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_requested_t *source = (ogs_nas_additional_information_requested_t *)pkbuf->data; + ogs_nas_additional_information_requested_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_requested_t *)pkbuf->data; additional_information_requested->length = source->length; size = additional_information_requested->length + sizeof(additional_information_requested->length); @@ -572,7 +649,14 @@ int ogs_nas_5gs_encode_additional_information_requested(ogs_pkbuf_t *pkbuf, ogs_ int ogs_nas_5gs_decode_allowed_pdu_session_status(ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_allowed_pdu_session_status_t *source = (ogs_nas_allowed_pdu_session_status_t *)pkbuf->data; + ogs_nas_allowed_pdu_session_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_allowed_pdu_session_status_t *)pkbuf->data; allowed_pdu_session_status->length = source->length; size = allowed_pdu_session_status->length + sizeof(allowed_pdu_session_status->length); @@ -615,7 +699,14 @@ int ogs_nas_5gs_encode_allowed_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_al int ogs_nas_5gs_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_failure_parameter_t *source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; + ogs_nas_authentication_failure_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; authentication_failure_parameter->length = source->length; size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); @@ -654,7 +745,14 @@ int ogs_nas_5gs_encode_authentication_failure_parameter(ogs_pkbuf_t *pkbuf, ogs_ int ogs_nas_5gs_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_parameter_autn_t *source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; + ogs_nas_authentication_parameter_autn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; authentication_parameter_autn->length = source->length; size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); @@ -727,7 +825,14 @@ int ogs_nas_5gs_encode_authentication_parameter_rand(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_5gs_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_response_parameter_t *source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; + ogs_nas_authentication_response_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; authentication_response_parameter->length = source->length; size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); @@ -798,7 +903,14 @@ int ogs_nas_5gs_encode_configuration_update_indication(ogs_pkbuf_t *pkbuf, ogs_n int ogs_nas_5gs_decode_cag_information_list(ogs_nas_cag_information_list_t *cag_information_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_cag_information_list_t *source = (ogs_nas_cag_information_list_t *)pkbuf->data; + ogs_nas_cag_information_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_cag_information_list_t *)pkbuf->data; cag_information_list->length = be16toh(source->length); size = cag_information_list->length + sizeof(cag_information_list->length); @@ -844,7 +956,14 @@ int ogs_nas_5gs_encode_cag_information_list(ogs_pkbuf_t *pkbuf, ogs_nas_cag_info int ogs_nas_5gs_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ciphering_key_data_t *source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; + ogs_nas_ciphering_key_data_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; ciphering_key_data->length = be16toh(source->length); size = ciphering_key_data->length + sizeof(ciphering_key_data->length); @@ -890,7 +1009,14 @@ int ogs_nas_5gs_encode_ciphering_key_data(ogs_pkbuf_t *pkbuf, ogs_nas_ciphering_ int ogs_nas_5gs_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_daylight_saving_time_t *source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; + ogs_nas_daylight_saving_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; daylight_saving_time->length = source->length; size = daylight_saving_time->length + sizeof(daylight_saving_time->length); @@ -997,7 +1123,14 @@ int ogs_nas_5gs_encode_de_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_de_regis int ogs_nas_5gs_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_emergency_number_list_t *source = (ogs_nas_emergency_number_list_t *)pkbuf->data; + ogs_nas_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_emergency_number_list_t *)pkbuf->data; emergency_number_list->length = source->length; size = emergency_number_list->length + sizeof(emergency_number_list->length); @@ -1036,7 +1169,14 @@ int ogs_nas_5gs_encode_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_emergen int ogs_nas_5gs_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_bearer_context_status_t *source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; + ogs_nas_eps_bearer_context_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; eps_bearer_context_status->length = source->length; size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); @@ -1075,7 +1215,14 @@ int ogs_nas_5gs_encode_eps_bearer_context_status(ogs_pkbuf_t *pkbuf, ogs_nas_eps int ogs_nas_5gs_decode_eps_nas_message_container(ogs_nas_eps_nas_message_container_t *eps_nas_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_nas_message_container_t *source = (ogs_nas_eps_nas_message_container_t *)pkbuf->data; + ogs_nas_eps_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_nas_message_container_t *)pkbuf->data; eps_nas_message_container->length = be16toh(source->length); size = eps_nas_message_container->length + sizeof(eps_nas_message_container->length); @@ -1155,7 +1302,14 @@ int ogs_nas_5gs_encode_eps_nas_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_e int ogs_nas_5gs_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_emergency_number_list_t *source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; + ogs_nas_extended_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; extended_emergency_number_list->length = be16toh(source->length); size = extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); @@ -1201,7 +1355,14 @@ int ogs_nas_5gs_encode_extended_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_5gs_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_drx_parameters_t *source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; + ogs_nas_extended_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; extended_drx_parameters->length = source->length; size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); @@ -1272,7 +1433,14 @@ int ogs_nas_5gs_encode_imeisv_request(ogs_pkbuf_t *pkbuf, ogs_nas_imeisv_request int ogs_nas_5gs_decode_ladn_indication(ogs_nas_ladn_indication_t *ladn_indication, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ladn_indication_t *source = (ogs_nas_ladn_indication_t *)pkbuf->data; + ogs_nas_ladn_indication_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ladn_indication_t *)pkbuf->data; ladn_indication->length = be16toh(source->length); size = ladn_indication->length + sizeof(ladn_indication->length); @@ -1318,7 +1486,14 @@ int ogs_nas_5gs_encode_ladn_indication(ogs_pkbuf_t *pkbuf, ogs_nas_ladn_indicati int ogs_nas_5gs_decode_5gs_drx_parameters(ogs_nas_5gs_drx_parameters_t *drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_drx_parameters_t *source = (ogs_nas_5gs_drx_parameters_t *)pkbuf->data; + ogs_nas_5gs_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_drx_parameters_t *)pkbuf->data; drx_parameters->length = source->length; size = drx_parameters->length + sizeof(drx_parameters->length); @@ -1391,7 +1566,14 @@ int ogs_nas_5gs_encode_5gs_identity_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_identit int ogs_nas_5gs_decode_ladn_information(ogs_nas_ladn_information_t *ladn_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ladn_information_t *source = (ogs_nas_ladn_information_t *)pkbuf->data; + ogs_nas_ladn_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ladn_information_t *)pkbuf->data; ladn_information->length = be16toh(source->length); size = ladn_information->length + sizeof(ladn_information->length); @@ -1501,7 +1683,14 @@ int ogs_nas_5gs_encode_ma_pdu_session_information(ogs_pkbuf_t *pkbuf, ogs_nas_ma int ogs_nas_5gs_decode_mapped_nssai(ogs_nas_mapped_nssai_t *mapped_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mapped_nssai_t *source = (ogs_nas_mapped_nssai_t *)pkbuf->data; + ogs_nas_mapped_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mapped_nssai_t *)pkbuf->data; mapped_nssai->length = source->length; size = mapped_nssai->length + sizeof(mapped_nssai->length); @@ -1540,7 +1729,14 @@ int ogs_nas_5gs_encode_mapped_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_mapped_nssai_t * int ogs_nas_5gs_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_2_t *source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; mobile_station_classmark_2->length = source->length; size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); @@ -1611,7 +1807,14 @@ int ogs_nas_5gs_encode_key_set_identifier(ogs_pkbuf_t *pkbuf, ogs_nas_key_set_id int ogs_nas_5gs_decode_message_container(ogs_nas_message_container_t *message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_message_container_t *source = (ogs_nas_message_container_t *)pkbuf->data; + ogs_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_message_container_t *)pkbuf->data; message_container->length = be16toh(source->length); size = message_container->length + sizeof(message_container->length); @@ -1691,7 +1894,14 @@ int ogs_nas_5gs_encode_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_security_ int ogs_nas_5gs_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_name_t *source = (ogs_nas_network_name_t *)pkbuf->data; + ogs_nas_network_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_name_t *)pkbuf->data; network_name->length = source->length; size = network_name->length + sizeof(network_name->length); @@ -1794,7 +2004,14 @@ int ogs_nas_5gs_encode_non_3gpp_nw_provided_policies(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_5gs_decode_nssai(ogs_nas_nssai_t *nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nssai_t *source = (ogs_nas_nssai_t *)pkbuf->data; + ogs_nas_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nssai_t *)pkbuf->data; nssai->length = source->length; size = nssai->length + sizeof(nssai->length); @@ -1865,7 +2082,14 @@ int ogs_nas_5gs_encode_nssai_inclusion_mode(ogs_pkbuf_t *pkbuf, ogs_nas_nssai_in int ogs_nas_5gs_decode_operator_defined_access_category_definitions(ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_operator_defined_access_category_definitions_t *source = (ogs_nas_operator_defined_access_category_definitions_t *)pkbuf->data; + ogs_nas_operator_defined_access_category_definitions_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_operator_defined_access_category_definitions_t *)pkbuf->data; operator_defined_access_category_definitions->length = be16toh(source->length); size = operator_defined_access_category_definitions->length + sizeof(operator_defined_access_category_definitions->length); @@ -1911,7 +2135,14 @@ int ogs_nas_5gs_encode_operator_defined_access_category_definitions(ogs_pkbuf_t int ogs_nas_5gs_decode_payload_container(ogs_nas_payload_container_t *payload_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_payload_container_t *source = (ogs_nas_payload_container_t *)pkbuf->data; + ogs_nas_payload_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_payload_container_t *)pkbuf->data; payload_container->length = be16toh(source->length); size = payload_container->length + sizeof(payload_container->length); @@ -1957,7 +2188,14 @@ int ogs_nas_5gs_encode_payload_container(ogs_pkbuf_t *pkbuf, ogs_nas_payload_con int ogs_nas_5gs_decode_5gs_mobile_identity(ogs_nas_5gs_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_mobile_identity_t *source = (ogs_nas_5gs_mobile_identity_t *)pkbuf->data; + ogs_nas_5gs_mobile_identity_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_mobile_identity_t *)pkbuf->data; mobile_identity->length = be16toh(source->length); size = mobile_identity->length + sizeof(mobile_identity->length); @@ -2069,7 +2307,14 @@ int ogs_nas_5gs_encode_pdu_session_identity_2(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_se int ogs_nas_5gs_decode_pdu_session_reactivation_result(ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_reactivation_result_t *source = (ogs_nas_pdu_session_reactivation_result_t *)pkbuf->data; + ogs_nas_pdu_session_reactivation_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_reactivation_result_t *)pkbuf->data; pdu_session_reactivation_result->length = source->length; size = pdu_session_reactivation_result->length + sizeof(pdu_session_reactivation_result->length); @@ -2112,7 +2357,14 @@ int ogs_nas_5gs_encode_pdu_session_reactivation_result(ogs_pkbuf_t *pkbuf, ogs_n int ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause(ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_reactivation_result_error_cause_t *source = (ogs_nas_pdu_session_reactivation_result_error_cause_t *)pkbuf->data; + ogs_nas_pdu_session_reactivation_result_error_cause_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_reactivation_result_error_cause_t *)pkbuf->data; pdu_session_reactivation_result_error_cause->length = be16toh(source->length); size = pdu_session_reactivation_result_error_cause->length + sizeof(pdu_session_reactivation_result_error_cause->length); @@ -2158,7 +2410,14 @@ int ogs_nas_5gs_encode_pdu_session_reactivation_result_error_cause(ogs_pkbuf_t * int ogs_nas_5gs_decode_pdu_session_status(ogs_nas_pdu_session_status_t *pdu_session_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_status_t *source = (ogs_nas_pdu_session_status_t *)pkbuf->data; + ogs_nas_pdu_session_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_status_t *)pkbuf->data; pdu_session_status->length = source->length; size = pdu_session_status->length + sizeof(pdu_session_status->length); @@ -2201,7 +2460,14 @@ int ogs_nas_5gs_encode_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_sessio int ogs_nas_5gs_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_list_t *source = (ogs_nas_plmn_list_t *)pkbuf->data; + ogs_nas_plmn_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_list_t *)pkbuf->data; plmn_list->length = source->length; size = plmn_list->length + sizeof(plmn_list->length); @@ -2240,7 +2506,14 @@ int ogs_nas_5gs_encode_plmn_list(ogs_pkbuf_t *pkbuf, ogs_nas_plmn_list_t *plmn_l int ogs_nas_5gs_decode_rejected_nssai(ogs_nas_rejected_nssai_t *rejected_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_rejected_nssai_t *source = (ogs_nas_rejected_nssai_t *)pkbuf->data; + ogs_nas_rejected_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_rejected_nssai_t *)pkbuf->data; rejected_nssai->length = source->length; size = rejected_nssai->length + sizeof(rejected_nssai->length); @@ -2343,7 +2616,14 @@ int ogs_nas_5gs_encode_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_request_type_t * int ogs_nas_5gs_decode_s1_ue_network_capability(ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s1_ue_network_capability_t *source = (ogs_nas_s1_ue_network_capability_t *)pkbuf->data; + ogs_nas_s1_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_s1_ue_network_capability_t *)pkbuf->data; s1_ue_network_capability->length = source->length; size = s1_ue_network_capability->length + sizeof(s1_ue_network_capability->length); @@ -2382,7 +2662,14 @@ int ogs_nas_5gs_encode_s1_ue_network_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_u int ogs_nas_5gs_decode_s1_ue_security_capability(ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_s1_ue_security_capability_t *source = (ogs_nas_s1_ue_security_capability_t *)pkbuf->data; + ogs_nas_s1_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_s1_ue_security_capability_t *)pkbuf->data; s1_ue_security_capability->length = source->length; size = s1_ue_security_capability->length + sizeof(s1_ue_security_capability->length); @@ -2421,7 +2708,14 @@ int ogs_nas_5gs_encode_s1_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_ int ogs_nas_5gs_decode_service_area_list(ogs_nas_service_area_list_t *service_area_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_service_area_list_t *source = (ogs_nas_service_area_list_t *)pkbuf->data; + ogs_nas_service_area_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_service_area_list_t *)pkbuf->data; service_area_list->length = source->length; size = service_area_list->length + sizeof(service_area_list->length); @@ -2460,7 +2754,14 @@ int ogs_nas_5gs_encode_service_area_list(ogs_pkbuf_t *pkbuf, ogs_nas_service_are int ogs_nas_5gs_decode_5gs_network_feature_support(ogs_nas_5gs_network_feature_support_t *network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_network_feature_support_t *source = (ogs_nas_5gs_network_feature_support_t *)pkbuf->data; + ogs_nas_5gs_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_network_feature_support_t *)pkbuf->data; network_feature_support->length = source->length; size = network_feature_support->length + sizeof(network_feature_support->length); @@ -2531,7 +2832,14 @@ int ogs_nas_5gs_encode_sms_indication(ogs_pkbuf_t *pkbuf, ogs_nas_sms_indication int ogs_nas_5gs_decode_sor_transparent_container(ogs_nas_sor_transparent_container_t *sor_transparent_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_sor_transparent_container_t *source = (ogs_nas_sor_transparent_container_t *)pkbuf->data; + ogs_nas_sor_transparent_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_sor_transparent_container_t *)pkbuf->data; sor_transparent_container->length = be16toh(source->length); size = sor_transparent_container->length + sizeof(sor_transparent_container->length); @@ -2577,7 +2885,14 @@ int ogs_nas_5gs_encode_sor_transparent_container(ogs_pkbuf_t *pkbuf, ogs_nas_sor int ogs_nas_5gs_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_supported_codec_list_t *source = (ogs_nas_supported_codec_list_t *)pkbuf->data; + ogs_nas_supported_codec_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_supported_codec_list_t *)pkbuf->data; supported_codec_list->length = source->length; size = supported_codec_list->length + sizeof(supported_codec_list->length); @@ -2684,7 +2999,14 @@ int ogs_nas_5gs_encode_time_zone_and_time(ogs_pkbuf_t *pkbuf, ogs_nas_time_zone_ int ogs_nas_5gs_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_security_capability_t *source = (ogs_nas_ue_security_capability_t *)pkbuf->data; + ogs_nas_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_security_capability_t *)pkbuf->data; ue_security_capability->length = source->length; size = ue_security_capability->length + sizeof(ue_security_capability->length); @@ -2723,7 +3045,14 @@ int ogs_nas_5gs_encode_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_ue_sec int ogs_nas_5gs_decode_ue_usage_setting(ogs_nas_ue_usage_setting_t *ue_usage_setting, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_usage_setting_t *source = (ogs_nas_ue_usage_setting_t *)pkbuf->data; + ogs_nas_ue_usage_setting_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_usage_setting_t *)pkbuf->data; ue_usage_setting->length = source->length; size = ue_usage_setting->length + sizeof(ue_usage_setting->length); @@ -2762,7 +3091,14 @@ int ogs_nas_5gs_encode_ue_usage_setting(ogs_pkbuf_t *pkbuf, ogs_nas_ue_usage_set int ogs_nas_5gs_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_status_t *source = (ogs_nas_ue_status_t *)pkbuf->data; + ogs_nas_ue_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_status_t *)pkbuf->data; ue_status->length = source->length; size = ue_status->length + sizeof(ue_status->length); @@ -2801,7 +3137,14 @@ int ogs_nas_5gs_encode_ue_status(ogs_pkbuf_t *pkbuf, ogs_nas_ue_status_t *ue_sta int ogs_nas_5gs_decode_uplink_data_status(ogs_nas_uplink_data_status_t *uplink_data_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_uplink_data_status_t *source = (ogs_nas_uplink_data_status_t *)pkbuf->data; + ogs_nas_uplink_data_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_uplink_data_status_t *)pkbuf->data; uplink_data_status->length = source->length; size = uplink_data_status->length + sizeof(uplink_data_status->length); @@ -2844,7 +3187,14 @@ int ogs_nas_5gs_encode_uplink_data_status(ogs_pkbuf_t *pkbuf, ogs_nas_uplink_dat int ogs_nas_5gs_decode_5gs_registration_result(ogs_nas_5gs_registration_result_t *registration_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_registration_result_t *source = (ogs_nas_5gs_registration_result_t *)pkbuf->data; + ogs_nas_5gs_registration_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_registration_result_t *)pkbuf->data; registration_result->length = source->length; size = registration_result->length + sizeof(registration_result->length); @@ -2883,7 +3233,14 @@ int ogs_nas_5gs_encode_5gs_registration_result(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_r int ogs_nas_5gs_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_t *source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; ue_radio_capability_id->length = source->length; size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); @@ -2988,7 +3345,14 @@ int ogs_nas_5gs_encode_5gs_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_reg int ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration(ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_truncated_5g_s_tmsi_configuration_t *source = (ogs_nas_truncated_5g_s_tmsi_configuration_t *)pkbuf->data; + ogs_nas_truncated_5g_s_tmsi_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_truncated_5g_s_tmsi_configuration_t *)pkbuf->data; truncated_s_tmsi_configuration->length = source->length; size = truncated_s_tmsi_configuration->length + sizeof(truncated_s_tmsi_configuration->length); @@ -3027,7 +3391,14 @@ int ogs_nas_5gs_encode_truncated_5g_s_tmsi_configuration(ogs_pkbuf_t *pkbuf, ogs int ogs_nas_5gs_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_wus_assistance_information_t *source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; + ogs_nas_wus_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; wus_assistance_information->length = source->length; size = wus_assistance_information->length + sizeof(wus_assistance_information->length); @@ -3098,7 +3469,14 @@ int ogs_nas_5gs_encode_n5gc_indication(ogs_pkbuf_t *pkbuf, ogs_nas_n5gc_indicati int ogs_nas_5gs_decode_nb_n1_mode_drx_parameters(ogs_nas_nb_n1_mode_drx_parameters_t *nb_n1_mode_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nb_n1_mode_drx_parameters_t *source = (ogs_nas_nb_n1_mode_drx_parameters_t *)pkbuf->data; + ogs_nas_nb_n1_mode_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nb_n1_mode_drx_parameters_t *)pkbuf->data; nb_n1_mode_drx_parameters->length = source->length; size = nb_n1_mode_drx_parameters->length + sizeof(nb_n1_mode_drx_parameters->length); @@ -3169,7 +3547,14 @@ int ogs_nas_5gs_encode_additional_configuration_indication(ogs_pkbuf_t *pkbuf, o int ogs_nas_5gs_decode_extended_rejected_nssai(ogs_nas_extended_rejected_nssai_t *extended_rejected_nssai, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_rejected_nssai_t *source = (ogs_nas_extended_rejected_nssai_t *)pkbuf->data; + ogs_nas_extended_rejected_nssai_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_rejected_nssai_t *)pkbuf->data; extended_rejected_nssai->length = source->length; size = extended_rejected_nssai->length + sizeof(extended_rejected_nssai->length); @@ -3208,7 +3593,14 @@ int ogs_nas_5gs_encode_extended_rejected_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_exten int ogs_nas_5gs_decode_ue_request_type(ogs_nas_ue_request_type_t *ue_request_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_request_type_t *source = (ogs_nas_ue_request_type_t *)pkbuf->data; + ogs_nas_ue_request_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_request_type_t *)pkbuf->data; ue_request_type->length = source->length; size = ue_request_type->length + sizeof(ue_request_type->length); @@ -3247,7 +3639,14 @@ int ogs_nas_5gs_encode_ue_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_ue_request_ty int ogs_nas_5gs_decode_paging_restriction(ogs_nas_paging_restriction_t *paging_restriction, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_paging_restriction_t *source = (ogs_nas_paging_restriction_t *)pkbuf->data; + ogs_nas_paging_restriction_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_paging_restriction_t *)pkbuf->data; paging_restriction->length = source->length; size = paging_restriction->length + sizeof(paging_restriction->length); @@ -3286,7 +3685,14 @@ int ogs_nas_5gs_encode_paging_restriction(ogs_pkbuf_t *pkbuf, ogs_nas_paging_res int ogs_nas_5gs_decode_nid(ogs_nas_nid_t *nid, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nid_t *source = (ogs_nas_nid_t *)pkbuf->data; + ogs_nas_nid_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nid_t *)pkbuf->data; nid->length = source->length; size = nid->length + sizeof(nid->length); @@ -3363,7 +3769,14 @@ int ogs_nas_5gs_encode_5gs_tracking_area_identity(ogs_pkbuf_t *pkbuf, ogs_nas_5g int ogs_nas_5gs_decode_peips_assistance_information(ogs_nas_peips_assistance_information_t *peips_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_peips_assistance_information_t *source = (ogs_nas_peips_assistance_information_t *)pkbuf->data; + ogs_nas_peips_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_peips_assistance_information_t *)pkbuf->data; peips_assistance_information->length = source->length; size = peips_assistance_information->length + sizeof(peips_assistance_information->length); @@ -3402,7 +3815,14 @@ int ogs_nas_5gs_encode_peips_assistance_information(ogs_pkbuf_t *pkbuf, ogs_nas_ int ogs_nas_5gs_decode_5gs_additional_request_result(ogs_nas_5gs_additional_request_result_t *additional_request_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_additional_request_result_t *source = (ogs_nas_5gs_additional_request_result_t *)pkbuf->data; + ogs_nas_5gs_additional_request_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_additional_request_result_t *)pkbuf->data; additional_request_result->length = source->length; size = additional_request_result->length + sizeof(additional_request_result->length); @@ -3441,7 +3861,14 @@ int ogs_nas_5gs_encode_5gs_additional_request_result(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_5gs_decode_nssrg_information(ogs_nas_nssrg_information_t *nssrg_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nssrg_information_t *source = (ogs_nas_nssrg_information_t *)pkbuf->data; + ogs_nas_nssrg_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nssrg_information_t *)pkbuf->data; nssrg_information->length = be16toh(source->length); size = nssrg_information->length + sizeof(nssrg_information->length); @@ -3487,7 +3914,14 @@ int ogs_nas_5gs_encode_nssrg_information(ogs_pkbuf_t *pkbuf, ogs_nas_nssrg_infor int ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition(ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *list_of_plmns_to_be_used_in_disaster_condition, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *source = (ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *)pkbuf->data; + ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_list_of_plmns_to_be_used_in_disaster_condition_t *)pkbuf->data; list_of_plmns_to_be_used_in_disaster_condition->length = source->length; size = list_of_plmns_to_be_used_in_disaster_condition->length + sizeof(list_of_plmns_to_be_used_in_disaster_condition->length); @@ -3526,7 +3960,14 @@ int ogs_nas_5gs_encode_list_of_plmns_to_be_used_in_disaster_condition(ogs_pkbuf_ int ogs_nas_5gs_decode_registration_wait_range(ogs_nas_registration_wait_range_t *registration_wait_range, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_registration_wait_range_t *source = (ogs_nas_registration_wait_range_t *)pkbuf->data; + ogs_nas_registration_wait_range_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_registration_wait_range_t *)pkbuf->data; registration_wait_range->length = source->length; size = registration_wait_range->length + sizeof(registration_wait_range->length); @@ -3565,7 +4006,14 @@ int ogs_nas_5gs_encode_registration_wait_range(ogs_pkbuf_t *pkbuf, ogs_nas_regis int ogs_nas_5gs_decode_plmn_identity(ogs_nas_plmn_identity_t *plmn_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_identity_t *source = (ogs_nas_plmn_identity_t *)pkbuf->data; + ogs_nas_plmn_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_identity_t *)pkbuf->data; plmn_identity->length = source->length; size = plmn_identity->length + sizeof(plmn_identity->length); @@ -3604,7 +4052,14 @@ int ogs_nas_5gs_encode_plmn_identity(ogs_pkbuf_t *pkbuf, ogs_nas_plmn_identity_t int ogs_nas_5gs_decode_extended_cag_information_list(ogs_nas_extended_cag_information_list_t *extended_cag_information_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_cag_information_list_t *source = (ogs_nas_extended_cag_information_list_t *)pkbuf->data; + ogs_nas_extended_cag_information_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_cag_information_list_t *)pkbuf->data; extended_cag_information_list->length = be16toh(source->length); size = extended_cag_information_list->length + sizeof(extended_cag_information_list->length); @@ -3650,7 +4105,14 @@ int ogs_nas_5gs_encode_extended_cag_information_list(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_5gs_decode_nsag_information(ogs_nas_nsag_information_t *nsag_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nsag_information_t *source = (ogs_nas_nsag_information_t *)pkbuf->data; + ogs_nas_nsag_information_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nsag_information_t *)pkbuf->data; nsag_information->length = be16toh(source->length); size = nsag_information->length + sizeof(nsag_information->length); @@ -3696,7 +4158,14 @@ int ogs_nas_5gs_encode_nsag_information(ogs_pkbuf_t *pkbuf, ogs_nas_nsag_informa int ogs_nas_5gs_decode_5gs_tracking_area_identity_list(ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_tracking_area_identity_list_t *source = (ogs_nas_5gs_tracking_area_identity_list_t *)pkbuf->data; + ogs_nas_5gs_tracking_area_identity_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_tracking_area_identity_list_t *)pkbuf->data; tracking_area_identity_list->length = source->length; size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); @@ -3767,7 +4236,14 @@ int ogs_nas_5gs_encode_priority_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_priority_i int ogs_nas_5gs_decode_5gs_update_type(ogs_nas_5gs_update_type_t *update_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gs_update_type_t *source = (ogs_nas_5gs_update_type_t *)pkbuf->data; + ogs_nas_5gs_update_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gs_update_type_t *)pkbuf->data; update_type->length = source->length; size = update_type->length + sizeof(update_type->length); @@ -3806,7 +4282,14 @@ int ogs_nas_5gs_encode_5gs_update_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_update_ty int ogs_nas_5gs_decode_5gsm_capability(ogs_nas_5gsm_capability_t *gsm_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_capability_t *source = (ogs_nas_5gsm_capability_t *)pkbuf->data; + ogs_nas_5gsm_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_capability_t *)pkbuf->data; gsm_capability->length = source->length; size = gsm_capability->length + sizeof(gsm_capability->length); @@ -3845,7 +4328,14 @@ int ogs_nas_5gs_encode_5gsm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_capabili int ogs_nas_5gs_decode_pdu_address(ogs_nas_pdu_address_t *pdu_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_address_t *source = (ogs_nas_pdu_address_t *)pkbuf->data; + ogs_nas_pdu_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_address_t *)pkbuf->data; pdu_address->length = source->length; size = pdu_address->length + sizeof(pdu_address->length); @@ -3916,7 +4406,14 @@ int ogs_nas_5gs_encode_pdu_session_type(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_ int ogs_nas_5gs_decode_qos_flow_descriptions(ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_qos_flow_descriptions_t *source = (ogs_nas_qos_flow_descriptions_t *)pkbuf->data; + ogs_nas_qos_flow_descriptions_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_qos_flow_descriptions_t *)pkbuf->data; qos_flow_descriptions->length = be16toh(source->length); size = qos_flow_descriptions->length + sizeof(qos_flow_descriptions->length); @@ -3962,7 +4459,14 @@ int ogs_nas_5gs_encode_qos_flow_descriptions(ogs_pkbuf_t *pkbuf, ogs_nas_qos_flo int ogs_nas_5gs_decode_qos_rules(ogs_nas_qos_rules_t *qos_rules, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_qos_rules_t *source = (ogs_nas_qos_rules_t *)pkbuf->data; + ogs_nas_qos_rules_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_qos_rules_t *)pkbuf->data; qos_rules->length = be16toh(source->length); size = qos_rules->length + sizeof(qos_rules->length); @@ -4008,7 +4512,14 @@ int ogs_nas_5gs_encode_qos_rules(ogs_pkbuf_t *pkbuf, ogs_nas_qos_rules_t *qos_ru int ogs_nas_5gs_decode_session_ambr(ogs_nas_session_ambr_t *session_ambr, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_session_ambr_t *source = (ogs_nas_session_ambr_t *)pkbuf->data; + ogs_nas_session_ambr_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_session_ambr_t *)pkbuf->data; session_ambr->length = source->length; size = session_ambr->length + sizeof(session_ambr->length); @@ -4053,7 +4564,14 @@ int ogs_nas_5gs_encode_session_ambr(ogs_pkbuf_t *pkbuf, ogs_nas_session_ambr_t * int ogs_nas_5gs_decode_sm_pdu_dn_request_container(ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_sm_pdu_dn_request_container_t *source = (ogs_nas_sm_pdu_dn_request_container_t *)pkbuf->data; + ogs_nas_sm_pdu_dn_request_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_sm_pdu_dn_request_container_t *)pkbuf->data; sm_pdu_dn_request_container->length = source->length; size = sm_pdu_dn_request_container->length + sizeof(sm_pdu_dn_request_container->length); @@ -4124,7 +4642,14 @@ int ogs_nas_5gs_encode_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_ssc_mode_t *ssc_mode int ogs_nas_5gs_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_re_attempt_indicator_t *source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; re_attempt_indicator->length = source->length; size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); @@ -4163,7 +4688,14 @@ int ogs_nas_5gs_encode_re_attempt_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_re_attem int ogs_nas_5gs_decode_5gsm_network_feature_support(ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_network_feature_support_t *source = (ogs_nas_5gsm_network_feature_support_t *)pkbuf->data; + ogs_nas_5gsm_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_network_feature_support_t *)pkbuf->data; gsm_network_feature_support->length = source->length; size = gsm_network_feature_support->length + sizeof(gsm_network_feature_support->length); @@ -4236,7 +4768,14 @@ int ogs_nas_5gs_encode_5gsm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_cause_t *gsm_ int ogs_nas_5gs_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_serving_plmn_rate_control_t *source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; + ogs_nas_serving_plmn_rate_control_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; serving_plmn_rate_control->length = source->length; size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); @@ -4275,7 +4814,14 @@ int ogs_nas_5gs_encode_serving_plmn_rate_control(ogs_pkbuf_t *pkbuf, ogs_nas_ser int ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator(ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_5gsm_congestion_re_attempt_indicator_t *source = (ogs_nas_5gsm_congestion_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_5gsm_congestion_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_5gsm_congestion_re_attempt_indicator_t *)pkbuf->data; gsm_congestion_re_attempt_indicator->length = source->length; size = gsm_congestion_re_attempt_indicator->length + sizeof(gsm_congestion_re_attempt_indicator->length); @@ -4314,7 +4860,14 @@ int ogs_nas_5gs_encode_5gsm_congestion_re_attempt_indicator(ogs_pkbuf_t *pkbuf, int ogs_nas_5gs_decode_atsss_container(ogs_nas_atsss_container_t *atsss_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_atsss_container_t *source = (ogs_nas_atsss_container_t *)pkbuf->data; + ogs_nas_atsss_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_atsss_container_t *)pkbuf->data; atsss_container->length = be16toh(source->length); size = atsss_container->length + sizeof(atsss_container->length); @@ -4392,7 +4945,14 @@ int ogs_nas_5gs_encode_control_plane_only_indication(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_5gs_decode_ip_header_compression_configuration(ogs_nas_ip_header_compression_configuration_t *ip_header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ip_header_compression_configuration_t *source = (ogs_nas_ip_header_compression_configuration_t *)pkbuf->data; + ogs_nas_ip_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ip_header_compression_configuration_t *)pkbuf->data; ip_header_compression_configuration->length = source->length; size = ip_header_compression_configuration->length + sizeof(ip_header_compression_configuration->length); @@ -4431,7 +4991,14 @@ int ogs_nas_5gs_encode_ip_header_compression_configuration(ogs_pkbuf_t *pkbuf, o int ogs_nas_5gs_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_t *source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; + ogs_nas_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; header_compression_configuration->length = source->length; size = header_compression_configuration->length + sizeof(header_compression_configuration->length); @@ -4474,7 +5041,14 @@ int ogs_nas_5gs_encode_header_compression_configuration(ogs_pkbuf_t *pkbuf, ogs_ int ogs_nas_5gs_decode_ds_tt_ethernet_port_mac_address(ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ds_tt_ethernet_port_mac_address_t *source = (ogs_nas_ds_tt_ethernet_port_mac_address_t *)pkbuf->data; + ogs_nas_ds_tt_ethernet_port_mac_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ds_tt_ethernet_port_mac_address_t *)pkbuf->data; ds_tt_ethernet_port_mac_address->length = source->length; size = ds_tt_ethernet_port_mac_address->length + sizeof(ds_tt_ethernet_port_mac_address->length); @@ -4513,7 +5087,14 @@ int ogs_nas_5gs_encode_ds_tt_ethernet_port_mac_address(ogs_pkbuf_t *pkbuf, ogs_n int ogs_nas_5gs_decode_ue_ds_tt_residence_time(ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_ds_tt_residence_time_t *source = (ogs_nas_ue_ds_tt_residence_time_t *)pkbuf->data; + ogs_nas_ue_ds_tt_residence_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_ds_tt_residence_time_t *)pkbuf->data; ue_ds_tt_residence_time->length = source->length; size = ue_ds_tt_residence_time->length + sizeof(ue_ds_tt_residence_time->length); @@ -4552,7 +5133,14 @@ int ogs_nas_5gs_encode_ue_ds_tt_residence_time(ogs_pkbuf_t *pkbuf, ogs_nas_ue_ds int ogs_nas_5gs_decode_port_management_information_container(ogs_nas_port_management_information_container_t *port_management_information_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_port_management_information_container_t *source = (ogs_nas_port_management_information_container_t *)pkbuf->data; + ogs_nas_port_management_information_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_port_management_information_container_t *)pkbuf->data; port_management_information_container->length = be16toh(source->length); size = port_management_information_container->length + sizeof(port_management_information_container->length); @@ -4598,7 +5186,14 @@ int ogs_nas_5gs_encode_port_management_information_container(ogs_pkbuf_t *pkbuf, int ogs_nas_5gs_decode_ethernet_header_compression_configuration(ogs_nas_ethernet_header_compression_configuration_t *ethernet_header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ethernet_header_compression_configuration_t *source = (ogs_nas_ethernet_header_compression_configuration_t *)pkbuf->data; + ogs_nas_ethernet_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ethernet_header_compression_configuration_t *)pkbuf->data; ethernet_header_compression_configuration->length = source->length; size = ethernet_header_compression_configuration->length + sizeof(ethernet_header_compression_configuration->length); @@ -4669,7 +5264,14 @@ int ogs_nas_5gs_encode_always_on_pdu_session_indication(ogs_pkbuf_t *pkbuf, ogs_ int ogs_nas_5gs_decode_requested_mbs_container(ogs_nas_requested_mbs_container_t *requested_mbs_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_requested_mbs_container_t *source = (ogs_nas_requested_mbs_container_t *)pkbuf->data; + ogs_nas_requested_mbs_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_requested_mbs_container_t *)pkbuf->data; requested_mbs_container->length = be16toh(source->length); size = requested_mbs_container->length + sizeof(requested_mbs_container->length); @@ -4715,7 +5317,14 @@ int ogs_nas_5gs_encode_requested_mbs_container(ogs_pkbuf_t *pkbuf, ogs_nas_reque int ogs_nas_5gs_decode_received_mbs_container(ogs_nas_received_mbs_container_t *received_mbs_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_received_mbs_container_t *source = (ogs_nas_received_mbs_container_t *)pkbuf->data; + ogs_nas_received_mbs_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_received_mbs_container_t *)pkbuf->data; received_mbs_container->length = be16toh(source->length); size = received_mbs_container->length + sizeof(received_mbs_container->length); @@ -4761,7 +5370,14 @@ int ogs_nas_5gs_encode_received_mbs_container(ogs_pkbuf_t *pkbuf, ogs_nas_receiv int ogs_nas_5gs_decode_pdu_session_pair_id(ogs_nas_pdu_session_pair_id_t *pdu_session_pair_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdu_session_pair_id_t *source = (ogs_nas_pdu_session_pair_id_t *)pkbuf->data; + ogs_nas_pdu_session_pair_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdu_session_pair_id_t *)pkbuf->data; pdu_session_pair_id->length = source->length; size = pdu_session_pair_id->length + sizeof(pdu_session_pair_id->length); @@ -4800,7 +5416,14 @@ int ogs_nas_5gs_encode_pdu_session_pair_id(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_sessi int ogs_nas_5gs_decode_rsn(ogs_nas_rsn_t *rsn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_rsn_t *source = (ogs_nas_rsn_t *)pkbuf->data; + ogs_nas_rsn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_rsn_t *)pkbuf->data; rsn->length = source->length; size = rsn->length + sizeof(rsn->length); @@ -4903,7 +5526,14 @@ int ogs_nas_5gs_encode_allowed_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_allowed_ssc_ int ogs_nas_5gs_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_protocol_configuration_options_t *source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_extended_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; extended_protocol_configuration_options->length = be16toh(source->length); size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); @@ -4983,7 +5613,14 @@ int ogs_nas_5gs_encode_integrity_protection_maximum_data_rate(ogs_pkbuf_t *pkbuf int ogs_nas_5gs_decode_mapped_eps_bearer_contexts(ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mapped_eps_bearer_contexts_t *source = (ogs_nas_mapped_eps_bearer_contexts_t *)pkbuf->data; + ogs_nas_mapped_eps_bearer_contexts_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mapped_eps_bearer_contexts_t *)pkbuf->data; mapped_eps_bearer_contexts->length = be16toh(source->length); size = mapped_eps_bearer_contexts->length + sizeof(mapped_eps_bearer_contexts->length); diff --git a/lib/nas/5gs/support/nas-message.py b/lib/nas/5gs/support/nas-message.py index cc279fa9b4..8d7b0fbfa9 100644 --- a/lib/nas/5gs/support/nas-message.py +++ b/lib/nas/5gs/support/nas-message.py @@ -447,7 +447,12 @@ def write_cells_to_file(name, cells): f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 2) {\n") + f.write(" ogs_error(\"Not enough pkbuf [len:%d]\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = be16toh(source->length);\n" % get_value(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") @@ -480,7 +485,12 @@ def write_cells_to_file(name, cells): f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 1) {\n") + f.write(" ogs_error(\"Not enough pkbuf [len:%d]\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = source->length;\n" % get_value(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") diff --git a/lib/nas/eps/ies.c b/lib/nas/eps/ies.c index 8144341b80..8a221d7614 100644 --- a/lib/nas/eps/ies.c +++ b/lib/nas/eps/ies.c @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2024-01-21 18:50:03.402793 by acetcom + * Created on: 2024-12-11 21:08:02.462921 by acetcom * from 24301-h90.docx ******************************************************************************/ @@ -48,7 +48,14 @@ int ogs_nas_eps_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) int ogs_nas_eps_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_additional_information_t *source = (ogs_nas_additional_information_t *)pkbuf->data; + ogs_nas_additional_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_additional_information_t *)pkbuf->data; additional_information->length = source->length; size = additional_information->length + sizeof(additional_information->length); @@ -119,7 +126,14 @@ int ogs_nas_eps_encode_device_properties(ogs_pkbuf_t *pkbuf, ogs_nas_device_prop int ogs_nas_eps_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_bearer_context_status_t *source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; + ogs_nas_eps_bearer_context_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; eps_bearer_context_status->length = source->length; size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); @@ -158,7 +172,14 @@ int ogs_nas_eps_encode_eps_bearer_context_status(ogs_pkbuf_t *pkbuf, ogs_nas_eps int ogs_nas_eps_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_supported_codec_list_t *source = (ogs_nas_supported_codec_list_t *)pkbuf->data; + ogs_nas_supported_codec_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_supported_codec_list_t *)pkbuf->data; supported_codec_list->length = source->length; size = supported_codec_list->length + sizeof(supported_codec_list->length); @@ -235,7 +256,14 @@ int ogs_nas_eps_encode_location_area_identification(ogs_pkbuf_t *pkbuf, ogs_nas_ int ogs_nas_eps_decode_mobile_identity(ogs_nas_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_identity_t *source = (ogs_nas_mobile_identity_t *)pkbuf->data; + ogs_nas_mobile_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_identity_t *)pkbuf->data; mobile_identity->length = source->length; size = mobile_identity->length + sizeof(mobile_identity->length); @@ -283,7 +311,14 @@ int ogs_nas_eps_encode_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_mobile_identi int ogs_nas_eps_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_2_t *source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; mobile_station_classmark_2->length = source->length; size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); @@ -322,7 +357,14 @@ int ogs_nas_eps_encode_mobile_station_classmark_2(ogs_pkbuf_t *pkbuf, ogs_nas_mo int ogs_nas_eps_decode_mobile_station_classmark_3(ogs_nas_mobile_station_classmark_3_t *mobile_station_classmark_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_mobile_station_classmark_3_t *source = (ogs_nas_mobile_station_classmark_3_t *)pkbuf->data; + ogs_nas_mobile_station_classmark_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_mobile_station_classmark_3_t *)pkbuf->data; mobile_station_classmark_3->length = source->length; size = mobile_station_classmark_3->length + sizeof(mobile_station_classmark_3->length); @@ -361,7 +403,14 @@ int ogs_nas_eps_encode_mobile_station_classmark_3(ogs_pkbuf_t *pkbuf, ogs_nas_mo int ogs_nas_eps_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_plmn_list_t *source = (ogs_nas_plmn_list_t *)pkbuf->data; + ogs_nas_plmn_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_plmn_list_t *)pkbuf->data; plmn_list->length = source->length; size = plmn_list->length + sizeof(plmn_list->length); @@ -464,7 +513,14 @@ int ogs_nas_eps_encode_additional_update_type(ogs_pkbuf_t *pkbuf, ogs_nas_additi int ogs_nas_eps_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_failure_parameter_t *source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; + ogs_nas_authentication_failure_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; authentication_failure_parameter->length = source->length; size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); @@ -571,7 +627,14 @@ int ogs_nas_eps_encode_eps_attach_type(ogs_pkbuf_t *pkbuf, ogs_nas_eps_attach_ty int ogs_nas_eps_decode_eps_mobile_identity(ogs_nas_eps_mobile_identity_t *eps_mobile_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_mobile_identity_t *source = (ogs_nas_eps_mobile_identity_t *)pkbuf->data; + ogs_nas_eps_mobile_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_mobile_identity_t *)pkbuf->data; eps_mobile_identity->length = source->length; size = eps_mobile_identity->length + sizeof(eps_mobile_identity->length); @@ -621,7 +684,14 @@ int ogs_nas_eps_encode_eps_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_eps_mobil int ogs_nas_eps_decode_eps_network_feature_support(ogs_nas_eps_network_feature_support_t *eps_network_feature_support, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_network_feature_support_t *source = (ogs_nas_eps_network_feature_support_t *)pkbuf->data; + ogs_nas_eps_network_feature_support_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_network_feature_support_t *)pkbuf->data; eps_network_feature_support->length = source->length; size = eps_network_feature_support->length + sizeof(eps_network_feature_support->length); @@ -728,7 +798,14 @@ int ogs_nas_eps_encode_eps_update_type(ogs_pkbuf_t *pkbuf, ogs_nas_eps_update_ty int ogs_nas_eps_decode_esm_message_container(ogs_nas_esm_message_container_t *esm_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_esm_message_container_t *source = (ogs_nas_esm_message_container_t *)pkbuf->data; + ogs_nas_esm_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_esm_message_container_t *)pkbuf->data; esm_message_container->length = be16toh(source->length); size = esm_message_container->length + sizeof(esm_message_container->length); @@ -808,7 +885,14 @@ int ogs_nas_eps_encode_gprs_timer(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_t *gprs int ogs_nas_eps_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_2_t *source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; + ogs_nas_gprs_timer_2_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; gprs_timer_2->length = source->length; size = gprs_timer_2->length + sizeof(gprs_timer_2->length); @@ -847,7 +931,14 @@ int ogs_nas_eps_encode_gprs_timer_2(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_2_t * int ogs_nas_eps_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_gprs_timer_3_t *source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; + ogs_nas_gprs_timer_3_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; gprs_timer_3->length = source->length; size = gprs_timer_3->length + sizeof(gprs_timer_3->length); @@ -986,7 +1077,14 @@ int ogs_nas_eps_encode_ksi_and_sequence_number(ogs_pkbuf_t *pkbuf, ogs_nas_ksi_a int ogs_nas_eps_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_parameter_autn_t *source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; + ogs_nas_authentication_parameter_autn_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; authentication_parameter_autn->length = source->length; size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); @@ -1025,7 +1123,14 @@ int ogs_nas_eps_encode_authentication_parameter_autn(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_eps_decode_ms_network_capability(ogs_nas_ms_network_capability_t *ms_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ms_network_capability_t *source = (ogs_nas_ms_network_capability_t *)pkbuf->data; + ogs_nas_ms_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ms_network_capability_t *)pkbuf->data; ms_network_capability->length = source->length; size = ms_network_capability->length + sizeof(ms_network_capability->length); @@ -1128,7 +1233,14 @@ int ogs_nas_eps_encode_key_set_identifier(ogs_pkbuf_t *pkbuf, ogs_nas_key_set_id int ogs_nas_eps_decode_eps_message_container(ogs_nas_eps_message_container_t *eps_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_message_container_t *source = (ogs_nas_eps_message_container_t *)pkbuf->data; + ogs_nas_eps_message_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_message_container_t *)pkbuf->data; eps_message_container->length = source->length; size = eps_message_container->length + sizeof(eps_message_container->length); @@ -1201,7 +1313,14 @@ int ogs_nas_eps_encode_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_security_ int ogs_nas_eps_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_name_t *source = (ogs_nas_network_name_t *)pkbuf->data; + ogs_nas_network_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_name_t *)pkbuf->data; network_name->length = source->length; size = network_name->length + sizeof(network_name->length); @@ -1240,7 +1359,14 @@ int ogs_nas_eps_encode_network_name(ogs_pkbuf_t *pkbuf, ogs_nas_network_name_t * int ogs_nas_eps_decode_network_resource_identifier_container(ogs_nas_network_resource_identifier_container_t *network_resource_identifier_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_network_resource_identifier_container_t *source = (ogs_nas_network_resource_identifier_container_t *)pkbuf->data; + ogs_nas_network_resource_identifier_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_network_resource_identifier_container_t *)pkbuf->data; network_resource_identifier_container->length = source->length; size = network_resource_identifier_container->length + sizeof(network_resource_identifier_container->length); @@ -1665,7 +1791,14 @@ int ogs_nas_eps_encode_tracking_area_identity(ogs_pkbuf_t *pkbuf, ogs_nas_tracki int ogs_nas_eps_decode_tracking_area_identity_list(ogs_nas_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_tracking_area_identity_list_t *source = (ogs_nas_tracking_area_identity_list_t *)pkbuf->data; + ogs_nas_tracking_area_identity_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_tracking_area_identity_list_t *)pkbuf->data; tracking_area_identity_list->length = source->length; size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); @@ -1704,7 +1837,14 @@ int ogs_nas_eps_encode_tracking_area_identity_list(ogs_pkbuf_t *pkbuf, ogs_nas_t int ogs_nas_eps_decode_ue_network_capability(ogs_nas_ue_network_capability_t *ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_network_capability_t *source = (ogs_nas_ue_network_capability_t *)pkbuf->data; + ogs_nas_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_network_capability_t *)pkbuf->data; ue_network_capability->length = source->length; size = ue_network_capability->length + sizeof(ue_network_capability->length); @@ -1775,7 +1915,14 @@ int ogs_nas_eps_encode_ue_radio_capability_information_update_needed(ogs_pkbuf_t int ogs_nas_eps_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_security_capability_t *source = (ogs_nas_ue_security_capability_t *)pkbuf->data; + ogs_nas_ue_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_security_capability_t *)pkbuf->data; ue_security_capability->length = source->length; size = ue_security_capability->length + sizeof(ue_security_capability->length); @@ -1814,7 +1961,14 @@ int ogs_nas_eps_encode_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_ue_sec int ogs_nas_eps_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_emergency_number_list_t *source = (ogs_nas_emergency_number_list_t *)pkbuf->data; + ogs_nas_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_emergency_number_list_t *)pkbuf->data; emergency_number_list->length = source->length; size = emergency_number_list->length + sizeof(emergency_number_list->length); @@ -1853,7 +2007,14 @@ int ogs_nas_eps_encode_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_emergen int ogs_nas_eps_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_emergency_number_list_t *source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; + ogs_nas_extended_emergency_number_list_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; extended_emergency_number_list->length = be16toh(source->length); size = extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); @@ -1899,7 +2060,14 @@ int ogs_nas_eps_encode_extended_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_eps_decode_cli(ogs_nas_cli_t *cli, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_cli_t *source = (ogs_nas_cli_t *)pkbuf->data; + ogs_nas_cli_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_cli_t *)pkbuf->data; cli->length = source->length; size = cli->length + sizeof(cli->length); @@ -1972,7 +2140,14 @@ int ogs_nas_eps_encode_ss_code(ogs_pkbuf_t *pkbuf, ogs_nas_ss_code_t *ss_code) int ogs_nas_eps_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_authentication_response_parameter_t *source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; + ogs_nas_authentication_response_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; authentication_response_parameter->length = source->length; size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); @@ -2045,7 +2220,14 @@ int ogs_nas_eps_encode_lcs_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_lcs_indicator_t int ogs_nas_eps_decode_lcs_client_identity(ogs_nas_lcs_client_identity_t *lcs_client_identity, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_lcs_client_identity_t *source = (ogs_nas_lcs_client_identity_t *)pkbuf->data; + ogs_nas_lcs_client_identity_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_lcs_client_identity_t *)pkbuf->data; lcs_client_identity->length = source->length; size = lcs_client_identity->length + sizeof(lcs_client_identity->length); @@ -2118,7 +2300,14 @@ int ogs_nas_eps_encode_generic_message_container_type(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_eps_decode_generic_message_container(ogs_nas_generic_message_container_t *generic_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_generic_message_container_t *source = (ogs_nas_generic_message_container_t *)pkbuf->data; + ogs_nas_generic_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_generic_message_container_t *)pkbuf->data; generic_message_container->length = be16toh(source->length); size = generic_message_container->length + sizeof(generic_message_container->length); @@ -2164,7 +2353,14 @@ int ogs_nas_eps_encode_generic_message_container(ogs_pkbuf_t *pkbuf, ogs_nas_gen int ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting(ogs_nas_voice_domain_preference_and_ue_usage_setting_t *voice_domain_preference_and_ue_usage_setting, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_voice_domain_preference_and_ue_usage_setting_t *source = (ogs_nas_voice_domain_preference_and_ue_usage_setting_t *)pkbuf->data; + ogs_nas_voice_domain_preference_and_ue_usage_setting_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_voice_domain_preference_and_ue_usage_setting_t *)pkbuf->data; voice_domain_preference_and_ue_usage_setting->length = source->length; size = voice_domain_preference_and_ue_usage_setting->length + sizeof(voice_domain_preference_and_ue_usage_setting->length); @@ -2235,7 +2431,14 @@ int ogs_nas_eps_encode_guti_type(ogs_pkbuf_t *pkbuf, ogs_nas_guti_type_t *guti_t int ogs_nas_eps_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_drx_parameters_t *source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; + ogs_nas_extended_drx_parameters_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; extended_drx_parameters->length = source->length; size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); @@ -2274,7 +2477,14 @@ int ogs_nas_eps_encode_extended_drx_parameters(ogs_pkbuf_t *pkbuf, ogs_nas_exten int ogs_nas_eps_decode_dcn_id(ogs_nas_dcn_id_t *dcn_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_dcn_id_t *source = (ogs_nas_dcn_id_t *)pkbuf->data; + ogs_nas_dcn_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_dcn_id_t *)pkbuf->data; dcn_id->length = source->length; size = dcn_id->length + sizeof(dcn_id->length); @@ -2441,7 +2651,14 @@ int ogs_nas_eps_encode_csfb_response(ogs_pkbuf_t *pkbuf, ogs_nas_csfb_response_t int ogs_nas_eps_decode_hashmme(ogs_nas_hashmme_t *hashmme, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_hashmme_t *source = (ogs_nas_hashmme_t *)pkbuf->data; + ogs_nas_hashmme_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_hashmme_t *)pkbuf->data; hashmme->length = source->length; size = hashmme->length + sizeof(hashmme->length); @@ -2480,7 +2697,14 @@ int ogs_nas_eps_encode_hashmme(ogs_pkbuf_t *pkbuf, ogs_nas_hashmme_t *hashmme) int ogs_nas_eps_decode_replayed_nas_message_container(ogs_nas_replayed_nas_message_container_t *replayed_nas_message_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_replayed_nas_message_container_t *source = (ogs_nas_replayed_nas_message_container_t *)pkbuf->data; + ogs_nas_replayed_nas_message_container_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_replayed_nas_message_container_t *)pkbuf->data; replayed_nas_message_container->length = be16toh(source->length); size = replayed_nas_message_container->length + sizeof(replayed_nas_message_container->length); @@ -2558,7 +2782,14 @@ int ogs_nas_eps_encode_network_policy(ogs_pkbuf_t *pkbuf, ogs_nas_network_policy int ogs_nas_eps_decode_ue_additional_security_capability(ogs_nas_ue_additional_security_capability_t *ue_additional_security_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_additional_security_capability_t *source = (ogs_nas_ue_additional_security_capability_t *)pkbuf->data; + ogs_nas_ue_additional_security_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_additional_security_capability_t *)pkbuf->data; ue_additional_security_capability->length = source->length; size = ue_additional_security_capability->length + sizeof(ue_additional_security_capability->length); @@ -2597,7 +2828,14 @@ int ogs_nas_eps_encode_ue_additional_security_capability(ogs_pkbuf_t *pkbuf, ogs int ogs_nas_eps_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_status_t *source = (ogs_nas_ue_status_t *)pkbuf->data; + ogs_nas_ue_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_status_t *)pkbuf->data; ue_status->length = source->length; size = ue_status->length + sizeof(ue_status->length); @@ -2670,7 +2908,14 @@ int ogs_nas_eps_encode_additional_information_requested(ogs_pkbuf_t *pkbuf, ogs_ int ogs_nas_eps_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ciphering_key_data_t *source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; + ogs_nas_ciphering_key_data_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; ciphering_key_data->length = be16toh(source->length); size = ciphering_key_data->length + sizeof(ciphering_key_data->length); @@ -2716,7 +2961,14 @@ int ogs_nas_eps_encode_ciphering_key_data(ogs_pkbuf_t *pkbuf, ogs_nas_ciphering_ int ogs_nas_eps_decode_n1_ue_network_capability(ogs_nas_n1_ue_network_capability_t *n1_ue_network_capability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_n1_ue_network_capability_t *source = (ogs_nas_n1_ue_network_capability_t *)pkbuf->data; + ogs_nas_n1_ue_network_capability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_n1_ue_network_capability_t *)pkbuf->data; n1_ue_network_capability->length = source->length; size = n1_ue_network_capability->length + sizeof(n1_ue_network_capability->length); @@ -2755,7 +3007,14 @@ int ogs_nas_eps_encode_n1_ue_network_capability(ogs_pkbuf_t *pkbuf, ogs_nas_n1_u int ogs_nas_eps_decode_ue_radio_capability_id_availability(ogs_nas_ue_radio_capability_id_availability_t *ue_radio_capability_id_availability, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_availability_t *source = (ogs_nas_ue_radio_capability_id_availability_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_availability_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_availability_t *)pkbuf->data; ue_radio_capability_id_availability->length = source->length; size = ue_radio_capability_id_availability->length + sizeof(ue_radio_capability_id_availability->length); @@ -2794,7 +3053,14 @@ int ogs_nas_eps_encode_ue_radio_capability_id_availability(ogs_pkbuf_t *pkbuf, o int ogs_nas_eps_decode_ue_radio_capability_id_request(ogs_nas_ue_radio_capability_id_request_t *ue_radio_capability_id_request, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_request_t *source = (ogs_nas_ue_radio_capability_id_request_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_request_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_request_t *)pkbuf->data; ue_radio_capability_id_request->length = source->length; size = ue_radio_capability_id_request->length + sizeof(ue_radio_capability_id_request->length); @@ -2833,7 +3099,14 @@ int ogs_nas_eps_encode_ue_radio_capability_id_request(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_eps_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_daylight_saving_time_t *source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; + ogs_nas_daylight_saving_time_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; daylight_saving_time->length = source->length; size = daylight_saving_time->length + sizeof(daylight_saving_time->length); @@ -2872,7 +3145,14 @@ int ogs_nas_eps_encode_daylight_saving_time(ogs_pkbuf_t *pkbuf, ogs_nas_daylight int ogs_nas_eps_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_radio_capability_id_t *source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; + ogs_nas_ue_radio_capability_id_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; ue_radio_capability_id->length = source->length; size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); @@ -2943,7 +3223,14 @@ int ogs_nas_eps_encode_ue_radio_capability_id_deletion_indication(ogs_pkbuf_t *p int ogs_nas_eps_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_wus_assistance_information_t *source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; + ogs_nas_wus_assistance_information_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; wus_assistance_information->length = source->length; size = wus_assistance_information->length + sizeof(wus_assistance_information->length); @@ -2982,7 +3269,14 @@ int ogs_nas_eps_encode_wus_assistance_information(ogs_pkbuf_t *pkbuf, ogs_nas_wu int ogs_nas_eps_decode_nb_s1_drx_parameter(ogs_nas_nb_s1_drx_parameter_t *nb_s1_drx_parameter, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nb_s1_drx_parameter_t *source = (ogs_nas_nb_s1_drx_parameter_t *)pkbuf->data; + ogs_nas_nb_s1_drx_parameter_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nb_s1_drx_parameter_t *)pkbuf->data; nb_s1_drx_parameter->length = source->length; size = nb_s1_drx_parameter->length + sizeof(nb_s1_drx_parameter->length); @@ -3021,7 +3315,14 @@ int ogs_nas_eps_encode_nb_s1_drx_parameter(ogs_pkbuf_t *pkbuf, ogs_nas_nb_s1_drx int ogs_nas_eps_decode_imsi_offset(ogs_nas_imsi_offset_t *imsi_offset, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_imsi_offset_t *source = (ogs_nas_imsi_offset_t *)pkbuf->data; + ogs_nas_imsi_offset_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_imsi_offset_t *)pkbuf->data; imsi_offset->length = source->length; size = imsi_offset->length + sizeof(imsi_offset->length); @@ -3060,7 +3361,14 @@ int ogs_nas_eps_encode_imsi_offset(ogs_pkbuf_t *pkbuf, ogs_nas_imsi_offset_t *im int ogs_nas_eps_decode_ue_request_type(ogs_nas_ue_request_type_t *ue_request_type, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_ue_request_type_t *source = (ogs_nas_ue_request_type_t *)pkbuf->data; + ogs_nas_ue_request_type_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_ue_request_type_t *)pkbuf->data; ue_request_type->length = source->length; size = ue_request_type->length + sizeof(ue_request_type->length); @@ -3099,7 +3407,14 @@ int ogs_nas_eps_encode_ue_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_ue_request_ty int ogs_nas_eps_decode_paging_restriction(ogs_nas_paging_restriction_t *paging_restriction, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_paging_restriction_t *source = (ogs_nas_paging_restriction_t *)pkbuf->data; + ogs_nas_paging_restriction_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_paging_restriction_t *)pkbuf->data; paging_restriction->length = source->length; size = paging_restriction->length + sizeof(paging_restriction->length); @@ -3138,7 +3453,14 @@ int ogs_nas_eps_encode_paging_restriction(ogs_pkbuf_t *pkbuf, ogs_nas_paging_res int ogs_nas_eps_decode_eps_additional_request_result(ogs_nas_eps_additional_request_result_t *eps_additional_request_result, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_additional_request_result_t *source = (ogs_nas_eps_additional_request_result_t *)pkbuf->data; + ogs_nas_eps_additional_request_result_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_additional_request_result_t *)pkbuf->data; eps_additional_request_result->length = source->length; size = eps_additional_request_result->length + sizeof(eps_additional_request_result->length); @@ -3279,7 +3601,14 @@ int ogs_nas_eps_encode_emm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_emm_cause_t *emm_ca int ogs_nas_eps_decode_access_point_name(ogs_nas_access_point_name_t *access_point_name, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_access_point_name_t *source = (ogs_nas_access_point_name_t *)pkbuf->data; + ogs_nas_access_point_name_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_access_point_name_t *)pkbuf->data; access_point_name->length = source->length; size = access_point_name->length + sizeof(access_point_name->length); @@ -3331,7 +3660,14 @@ int ogs_nas_eps_encode_access_point_name(ogs_pkbuf_t *pkbuf, ogs_nas_access_poin int ogs_nas_eps_decode_protocol_configuration_options(ogs_nas_protocol_configuration_options_t *protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_protocol_configuration_options_t *source = (ogs_nas_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_protocol_configuration_options_t *)pkbuf->data; protocol_configuration_options->length = source->length; size = protocol_configuration_options->length + sizeof(protocol_configuration_options->length); @@ -3370,7 +3706,14 @@ int ogs_nas_eps_encode_protocol_configuration_options(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_eps_decode_quality_of_service(ogs_nas_quality_of_service_t *quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_quality_of_service_t *source = (ogs_nas_quality_of_service_t *)pkbuf->data; + ogs_nas_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_quality_of_service_t *)pkbuf->data; quality_of_service->length = source->length; size = quality_of_service->length + sizeof(quality_of_service->length); @@ -3441,7 +3784,14 @@ int ogs_nas_eps_encode_radio_priority(ogs_pkbuf_t *pkbuf, ogs_nas_radio_priority int ogs_nas_eps_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_re_attempt_indicator_t *source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; + ogs_nas_re_attempt_indicator_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; re_attempt_indicator->length = source->length; size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); @@ -3514,7 +3864,14 @@ int ogs_nas_eps_encode_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_request_type_t * int ogs_nas_eps_decode_traffic_flow_aggregate_description(ogs_nas_traffic_flow_aggregate_description_t *traffic_flow_aggregate_description, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_traffic_flow_aggregate_description_t *source = (ogs_nas_traffic_flow_aggregate_description_t *)pkbuf->data; + ogs_nas_traffic_flow_aggregate_description_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_traffic_flow_aggregate_description_t *)pkbuf->data; traffic_flow_aggregate_description->length = source->length; size = traffic_flow_aggregate_description->length + sizeof(traffic_flow_aggregate_description->length); @@ -3553,7 +3910,14 @@ int ogs_nas_eps_encode_traffic_flow_aggregate_description(ogs_pkbuf_t *pkbuf, og int ogs_nas_eps_decode_traffic_flow_template(ogs_nas_traffic_flow_template_t *traffic_flow_template, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_traffic_flow_template_t *source = (ogs_nas_traffic_flow_template_t *)pkbuf->data; + ogs_nas_traffic_flow_template_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_traffic_flow_template_t *)pkbuf->data; traffic_flow_template->length = source->length; size = traffic_flow_template->length + sizeof(traffic_flow_template->length); @@ -3592,7 +3956,14 @@ int ogs_nas_eps_encode_traffic_flow_template(ogs_pkbuf_t *pkbuf, ogs_nas_traffic int ogs_nas_eps_decode_transaction_identifier(ogs_nas_transaction_identifier_t *transaction_identifier, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_transaction_identifier_t *source = (ogs_nas_transaction_identifier_t *)pkbuf->data; + ogs_nas_transaction_identifier_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_transaction_identifier_t *)pkbuf->data; transaction_identifier->length = source->length; size = transaction_identifier->length + sizeof(transaction_identifier->length); @@ -3663,7 +4034,14 @@ int ogs_nas_eps_encode_wlan_offload_acceptability(ogs_pkbuf_t *pkbuf, ogs_nas_wl int ogs_nas_eps_decode_nbifom_container(ogs_nas_nbifom_container_t *nbifom_container, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_nbifom_container_t *source = (ogs_nas_nbifom_container_t *)pkbuf->data; + ogs_nas_nbifom_container_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_nbifom_container_t *)pkbuf->data; nbifom_container->length = source->length; size = nbifom_container->length + sizeof(nbifom_container->length); @@ -3702,7 +4080,14 @@ int ogs_nas_eps_encode_nbifom_container(ogs_pkbuf_t *pkbuf, ogs_nas_nbifom_conta int ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate(ogs_nas_apn_aggregate_maximum_bit_rate_t *apn_aggregate_maximum_bit_rate, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_apn_aggregate_maximum_bit_rate_t *source = (ogs_nas_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; + ogs_nas_apn_aggregate_maximum_bit_rate_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; apn_aggregate_maximum_bit_rate->length = source->length; size = apn_aggregate_maximum_bit_rate->length + sizeof(apn_aggregate_maximum_bit_rate->length); @@ -3741,7 +4126,14 @@ int ogs_nas_eps_encode_apn_aggregate_maximum_bit_rate(ogs_pkbuf_t *pkbuf, ogs_na int ogs_nas_eps_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_t *source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; + ogs_nas_header_compression_configuration_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; header_compression_configuration->length = source->length; size = header_compression_configuration->length + sizeof(header_compression_configuration->length); @@ -3816,7 +4208,14 @@ int ogs_nas_eps_encode_control_plane_only_indication(ogs_pkbuf_t *pkbuf, ogs_nas int ogs_nas_eps_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_protocol_configuration_options_t *source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; + ogs_nas_extended_protocol_configuration_options_t *source = NULL; + + if (pkbuf->len < 2) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; extended_protocol_configuration_options->length = be16toh(source->length); size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); @@ -3862,7 +4261,14 @@ int ogs_nas_eps_encode_extended_protocol_configuration_options(ogs_pkbuf_t *pkbu int ogs_nas_eps_decode_header_compression_configuration_status(ogs_nas_header_compression_configuration_status_t *header_compression_configuration_status, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_header_compression_configuration_status_t *source = (ogs_nas_header_compression_configuration_status_t *)pkbuf->data; + ogs_nas_header_compression_configuration_status_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_header_compression_configuration_status_t *)pkbuf->data; header_compression_configuration_status->length = source->length; size = header_compression_configuration_status->length + sizeof(header_compression_configuration_status->length); @@ -3901,7 +4307,14 @@ int ogs_nas_eps_encode_header_compression_configuration_status(ogs_pkbuf_t *pkbu int ogs_nas_eps_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_serving_plmn_rate_control_t *source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; + ogs_nas_serving_plmn_rate_control_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; serving_plmn_rate_control->length = source->length; size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); @@ -3940,7 +4353,14 @@ int ogs_nas_eps_encode_serving_plmn_rate_control(ogs_pkbuf_t *pkbuf, ogs_nas_ser int ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate(ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *extended_apn_aggregate_maximum_bit_rate, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *source = (ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; + ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_apn_aggregate_maximum_bit_rate_t *)pkbuf->data; extended_apn_aggregate_maximum_bit_rate->length = source->length; size = extended_apn_aggregate_maximum_bit_rate->length + sizeof(extended_apn_aggregate_maximum_bit_rate->length); @@ -4011,7 +4431,14 @@ int ogs_nas_eps_encode_connectivity_type(ogs_pkbuf_t *pkbuf, ogs_nas_connectivit int ogs_nas_eps_decode_eps_quality_of_service(ogs_nas_eps_quality_of_service_t *eps_quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_eps_quality_of_service_t *source = (ogs_nas_eps_quality_of_service_t *)pkbuf->data; + ogs_nas_eps_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_eps_quality_of_service_t *)pkbuf->data; eps_quality_of_service->length = source->length; size = eps_quality_of_service->length + sizeof(eps_quality_of_service->length); @@ -4050,7 +4477,14 @@ int ogs_nas_eps_encode_eps_quality_of_service(ogs_pkbuf_t *pkbuf, ogs_nas_eps_qu int ogs_nas_eps_decode_extended_quality_of_service(ogs_nas_extended_quality_of_service_t *extended_quality_of_service, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_extended_quality_of_service_t *source = (ogs_nas_extended_quality_of_service_t *)pkbuf->data; + ogs_nas_extended_quality_of_service_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_extended_quality_of_service_t *)pkbuf->data; extended_quality_of_service->length = source->length; size = extended_quality_of_service->length + sizeof(extended_quality_of_service->length); @@ -4223,7 +4657,14 @@ int ogs_nas_eps_encode_llc_service_access_point_identifier(ogs_pkbuf_t *pkbuf, o int ogs_nas_eps_decode_packet_flow_identifier(ogs_nas_packet_flow_identifier_t *packet_flow_identifier, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_packet_flow_identifier_t *source = (ogs_nas_packet_flow_identifier_t *)pkbuf->data; + ogs_nas_packet_flow_identifier_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_packet_flow_identifier_t *)pkbuf->data; packet_flow_identifier->length = source->length; size = packet_flow_identifier->length + sizeof(packet_flow_identifier->length); @@ -4262,7 +4703,14 @@ int ogs_nas_eps_encode_packet_flow_identifier(ogs_pkbuf_t *pkbuf, ogs_nas_packet int ogs_nas_eps_decode_pdn_address(ogs_nas_pdn_address_t *pdn_address, ogs_pkbuf_t *pkbuf) { int size = 0; - ogs_nas_pdn_address_t *source = (ogs_nas_pdn_address_t *)pkbuf->data; + ogs_nas_pdn_address_t *source = NULL; + + if (pkbuf->len < 1) { + ogs_error("Not enough pkbuf [len:%d]", pkbuf->len); + return -1; + } + + source = (ogs_nas_pdn_address_t *)pkbuf->data; pdn_address->length = source->length; size = pdn_address->length + sizeof(pdn_address->length); diff --git a/lib/nas/eps/support/nas-message.py b/lib/nas/eps/support/nas-message.py index 1bfd6efaa3..03a47c3206 100644 --- a/lib/nas/eps/support/nas-message.py +++ b/lib/nas/eps/support/nas-message.py @@ -461,7 +461,12 @@ def write_cells_to_file(name, cells): f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 2) {\n") + f.write(" ogs_error(\"Not enough pkbuf [len:%d]\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = be16toh(source->length);\n" % v_lower(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") @@ -494,7 +499,12 @@ def write_cells_to_file(name, cells): f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("{\n") f.write(" int size = 0;\n") - f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" ogs_nas_%s_t *source = NULL;\n\n" % v_lower(k)) + f.write(" if (pkbuf->len < 1) {\n") + f.write(" ogs_error(\"Not enough pkbuf [len:%d]\", pkbuf->len);\n") + f.write(" return -1;\n") + f.write(" }\n\n") + f.write(" source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % v_lower(k)) f.write(" %s->length = source->length;\n" % v_lower(k)) f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k))) f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n") From 6ffd7c978f3f89eacfdac147000a366d167c1245 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 12 Dec 2024 16:58:04 +0900 Subject: [PATCH 281/323] [BSF] Remove mandatory BSF dependency for PDU session establishment (#3626) Modified the PCF logic to bypass the BSF dependency when it is not available. This change ensures that the 5G Core can operate without requiring a BSF, allowing PDU sessions to be established successfully in setups where only a single PCF is used. --- lib/sbi/nnrf-path.c | 30 ++-- lib/sbi/path.c | 33 ++-- lib/sbi/path.h | 5 +- src/amf/context.c | 35 +--- src/pcf/nbsf-build.c | 12 +- src/pcf/nbsf-handler.c | 326 ++----------------------------------- src/pcf/nnrf-handler.c | 42 +++-- src/pcf/npcf-handler.c | 51 ++---- src/pcf/nudr-handler.c | 37 +---- src/pcf/sbi-path.c | 359 ++++++++++++++++++++++++++++++++++++++--- src/pcf/sbi-path.h | 5 +- src/pcf/sm-sm.c | 18 ++- src/scp/sbi-path.c | 50 +++--- 13 files changed, 474 insertions(+), 529 deletions(-) diff --git a/lib/sbi/nnrf-path.c b/lib/sbi/nnrf-path.c index 957f633e20..3ecf5ba7e3 100644 --- a/lib/sbi/nnrf-path.c +++ b/lib/sbi/nnrf-path.c @@ -32,8 +32,9 @@ bool ogs_nnrf_nfm_send_nf_register(ogs_sbi_nf_instance_t *nf_instance) return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -54,8 +55,9 @@ bool ogs_nnrf_nfm_send_nf_update(ogs_sbi_nf_instance_t *nf_instance) return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -76,8 +78,9 @@ bool ogs_nnrf_nfm_send_nf_de_register(ogs_sbi_nf_instance_t *nf_instance) return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, nf_instance); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, nf_instance); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -120,8 +123,9 @@ bool ogs_nnrf_nfm_send_nf_status_subscribe( return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -143,8 +147,9 @@ bool ogs_nnrf_nfm_send_nf_status_update( return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); ogs_expect(rc == true); ogs_sbi_request_free(request); @@ -166,8 +171,9 @@ bool ogs_nnrf_nfm_send_nf_status_unsubscribe( return false; } - rc = ogs_sbi_send_notification_request( - OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, request, subscription_data); + rc = ogs_sbi_send_request_to_nrf( + OGS_SBI_SERVICE_TYPE_NNRF_NFM, NULL, + ogs_sbi_client_handler, request, subscription_data); ogs_expect(rc == true); ogs_sbi_request_free(request); diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 218b2705a8..84cc93d681 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -779,57 +779,48 @@ bool ogs_sbi_send_request_to_client( return rc; } -bool ogs_sbi_send_notification_request( - ogs_sbi_service_type_e service_type, +bool ogs_sbi_send_request_to_nrf( + ogs_sbi_service_type_e nrf_service_type, ogs_sbi_discovery_option_t *discovery_option, + ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data) { bool rc; - ogs_sbi_client_t *client = NULL, *scp_client = NULL; - OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; + ogs_sbi_client_t *nrf_client = NULL, *scp_client = NULL; - ogs_assert(service_type); - target_nf_type = ogs_sbi_service_type_to_nf_type(service_type); - ogs_assert(target_nf_type); + ogs_assert(nrf_service_type); ogs_assert(request); scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - if (target_nf_type == OpenAPI_nf_type_NRF) - client = NF_INSTANCE_CLIENT(ogs_sbi_self()->nrf_instance); - else { - ogs_fatal("Not implemented[%s]", - ogs_sbi_service_type_to_name(service_type)); - ogs_assert_if_reached(); - } + nrf_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->nrf_instance); if (scp_client) { /************************* * INDIRECT COMMUNICATION *************************/ build_default_discovery_parameter( - request, service_type, discovery_option); + request, nrf_service_type, discovery_option); rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, ogs_sbi_client_handler, request, data); + scp_client, client_cb, request, data); ogs_expect(rc == true); - } else if (client) { + } else if (nrf_client) { /*********************** * DIRECT COMMUNICATION ***********************/ /* NRF is available */ - rc = ogs_sbi_client_send_request( - client, ogs_sbi_client_handler, request, data); + rc = ogs_sbi_client_send_request(nrf_client, client_cb, request, data); ogs_expect(rc == true); } else { ogs_fatal("[%s:%s] Cannot send request [%s:%s:%s]", - client ? "CLIENT" : "No-CLIENT", + nrf_client ? "NRF" : "No-NRF", scp_client ? "SCP" : "No-SCP", - ogs_sbi_service_type_to_name(service_type), + ogs_sbi_service_type_to_name(nrf_service_type), request->h.service.name, request->h.api.version); rc = false; ogs_assert_if_reached(); diff --git a/lib/sbi/path.h b/lib/sbi/path.h index 7a9d007785..a5e3a79455 100644 --- a/lib/sbi/path.h +++ b/lib/sbi/path.h @@ -38,9 +38,10 @@ bool ogs_sbi_send_request_to_nf_instance( bool ogs_sbi_send_request_to_client( ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data); -bool ogs_sbi_send_notification_request( - ogs_sbi_service_type_e service_type, +bool ogs_sbi_send_request_to_nrf( + ogs_sbi_service_type_e nrf_service_type, ogs_sbi_discovery_option_t *discovery_option, + ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data); #define ogs_sbi_send_http_status_no_content(__sTREAM) \ diff --git a/src/amf/context.c b/src/amf/context.c index f3ab505534..0a54f45c3a 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2365,7 +2365,6 @@ void amf_sbi_select_nf( { OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; - amf_sess_t *sess = NULL; ogs_assert(sbi_object); ogs_assert(service_type); @@ -2373,35 +2372,11 @@ void amf_sbi_select_nf( ogs_assert(target_nf_type); ogs_assert(requester_nf_type); - switch(sbi_object->type) { - case OGS_SBI_OBJ_UE_TYPE: - nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( - target_nf_type, requester_nf_type, discovery_option); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); - break; - case OGS_SBI_OBJ_SESS_TYPE: - sess = (amf_sess_t *)sbi_object; - ogs_assert(sess); - - ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { - if (ogs_sbi_discovery_param_is_matched( - nf_instance, - target_nf_type, requester_nf_type, discovery_option) == - false) - continue; - - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->service_type_array[service_type], nf_instance); - break; - } - break; - default: - ogs_fatal("(NF discover search result) Not implemented [%d]", - sbi_object->type); - ogs_assert_if_reached(); - } + nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( + target_nf_type, requester_nf_type, discovery_option); + if (nf_instance) + OGS_SBI_SETUP_NF_INSTANCE( + sbi_object->service_type_array[service_type], nf_instance); } int amf_sess_xact_count(amf_ue_t *amf_ue) diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index 81680eddba..8afbc7201c 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -35,15 +35,14 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_nf_service_t *nf_service = NULL; + OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; + int i; ogs_assert(sess); pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); ogs_assert(pcf_ue); - nf_instance = data; - ogs_assert(nf_instance); - memset(&message, 0, sizeof(message)); message.h.method = (char *)OGS_SBI_HTTP_METHOD_POST; message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NBSF_MANAGEMENT; @@ -69,6 +68,13 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( } PcfBinding.dnn = sess->dnn; + requester_nf_type = NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); + ogs_assert(requester_nf_type); + nf_instance = ogs_sbi_nf_instance_find_by_service_type( + OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION, + requester_nf_type); + ogs_assert(nf_instance); + nf_service = ogs_sbi_nf_service_find_by_name( nf_instance, (char *)OGS_SBI_SERVICE_NAME_NPCF_POLICYAUTHORIZATION); if (!nf_service) { diff --git a/src/pcf/nbsf-handler.c b/src/pcf/nbsf-handler.c index 7cb5a28a9b..14efee5e63 100644 --- a/src/pcf/nbsf-handler.c +++ b/src/pcf/nbsf-handler.c @@ -24,44 +24,16 @@ bool pcf_nbsf_management_handle_register( pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { - int i, rv, status = 0; + int rv, status = 0; char *strerror = NULL; pcf_ue_t *pcf_ue = NULL; ogs_sbi_server_t *server = NULL; - ogs_sbi_message_t sendmsg; ogs_sbi_header_t header; - ogs_sbi_response_t *response = NULL; - ogs_sbi_message_t message; - ogs_session_data_t session_data; - - ogs_session_t *session = NULL; - OpenAPI_pcf_binding_t *PcfBinding = NULL; - OpenAPI_sm_policy_decision_t SmPolicyDecision; - - OpenAPI_lnode_t *node = NULL; - - OpenAPI_list_t *SessRuleList = NULL; - OpenAPI_map_t *SessRuleMap = NULL; - OpenAPI_session_rule_t *SessionRule = NULL; - - OpenAPI_ambr_t AuthSessAmbr; - OpenAPI_authorized_default_qos_t AuthDefQos; - - OpenAPI_list_t *PccRuleList = NULL; - OpenAPI_map_t *PccRuleMap = NULL; - OpenAPI_pcc_rule_t *PccRule = NULL; - - OpenAPI_list_t *QosDecisionList = NULL; - OpenAPI_map_t *QosDecisionMap = NULL; - OpenAPI_qos_data_t *QosData = NULL; - - OpenAPI_list_t *PolicyCtrlReqTriggers = NULL; - bool rc; ogs_sbi_client_t *client = NULL; OpenAPI_uri_scheme_e scheme = OpenAPI_uri_scheme_NULL; @@ -78,8 +50,6 @@ bool pcf_nbsf_management_handle_register( ogs_assert(recvmsg); - memset(&session_data, 0, sizeof(ogs_session_data_t)); - ogs_assert(pcf_ue->supi); ogs_assert(sess->dnn); @@ -158,307 +128,33 @@ bool pcf_nbsf_management_handle_register( ogs_sbi_header_free(&header); - rv = pcf_db_qos_data( - pcf_ue->supi, - sess->home.presence == true ? &sess->home.plmn_id : NULL, - &sess->s_nssai, sess->dnn, &session_data); - if (rv != OGS_OK) { - strerror = ogs_msprintf("[%s:%d] Cannot find SUPI in DB", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_NOT_FOUND; - goto cleanup; - } - - session = &session_data.session; - - if (!session->qos.index) { - strerror = ogs_msprintf("[%s:%d] No 5QI", pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - if (!session->qos.arp.priority_level) { - strerror = ogs_msprintf("[%s:%d] No Priority Level", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - - if (!session->ambr.uplink && !session->ambr.downlink) { - strerror = ogs_msprintf("[%s:%d] No Session-AMBR", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - - memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision)); - - PolicyCtrlReqTriggers = OpenAPI_list_create(); - ogs_assert(PolicyCtrlReqTriggers); - - /************************************************************** - * Session Rule - *************************************************************/ - SessRuleList = OpenAPI_list_create(); - ogs_assert(SessRuleList); - - SessionRule = ogs_calloc(1, sizeof(*SessionRule)); - ogs_assert(SessionRule); - - /* Only 1 SessionRule is used */ - SessionRule->sess_rule_id = (char *)"1"; - - if (OGS_SBI_FEATURES_IS_SET(sess->smpolicycontrol_features, - OGS_SBI_NPCF_SMPOLICYCONTROL_DN_AUTHORIZATION)) { - if (sess->subscribed_sess_ambr) { - ogs_bitrate_t subscribed_sess_ambr; - - subscribed_sess_ambr.uplink = ogs_sbi_bitrate_from_string( - sess->subscribed_sess_ambr->uplink); - subscribed_sess_ambr.downlink = ogs_sbi_bitrate_from_string( - sess->subscribed_sess_ambr->downlink); - if (((subscribed_sess_ambr.uplink / 1000) != - (session->ambr.uplink / 1000)) || - ((subscribed_sess_ambr.downlink / 1000) != - (session->ambr.downlink / 1000))) { - - OpenAPI_list_add(PolicyCtrlReqTriggers, - (void *)OpenAPI_policy_control_request_trigger_SE_AMBR_CH); - } - - memset(&AuthSessAmbr, 0, sizeof(AuthSessAmbr)); - AuthSessAmbr.uplink = ogs_sbi_bitrate_to_string( - session->ambr.uplink, OGS_SBI_BITRATE_KBPS); - AuthSessAmbr.downlink = ogs_sbi_bitrate_to_string( - session->ambr.downlink, OGS_SBI_BITRATE_KBPS); - SessionRule->auth_sess_ambr = &AuthSessAmbr; - } - } - - if (sess->subscribed_default_qos) { - bool triggered = false; - - memset(&AuthDefQos, 0, sizeof(AuthDefQos)); - AuthDefQos.arp = ogs_calloc(1, sizeof(OpenAPI_arp_t)); - ogs_assert(AuthDefQos.arp); - - AuthDefQos.is__5qi = true; - AuthDefQos._5qi = session->qos.index; - AuthDefQos.is_priority_level = true; - AuthDefQos.priority_level = session->qos.arp.priority_level; - - if (session->qos.arp.pre_emption_capability == - OGS_5GC_PRE_EMPTION_ENABLED) - AuthDefQos.arp->preempt_cap = - OpenAPI_preemption_capability_MAY_PREEMPT; - else if (session->qos.arp.pre_emption_capability == - OGS_5GC_PRE_EMPTION_DISABLED) - AuthDefQos.arp->preempt_cap = - OpenAPI_preemption_capability_NOT_PREEMPT; - ogs_assert(AuthDefQos.arp->preempt_cap); - - if (session->qos.arp.pre_emption_vulnerability == - OGS_5GC_PRE_EMPTION_ENABLED) - AuthDefQos.arp->preempt_vuln = - OpenAPI_preemption_vulnerability_PREEMPTABLE; - else if (session->qos.arp.pre_emption_vulnerability == - OGS_5GC_PRE_EMPTION_DISABLED) - AuthDefQos.arp->preempt_vuln = - OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE; - ogs_assert(AuthDefQos.arp->preempt_vuln); - AuthDefQos.arp->priority_level = session->qos.arp.priority_level; - - SessionRule->auth_def_qos = &AuthDefQos; - - if (sess->subscribed_default_qos->_5qi != AuthDefQos._5qi) - triggered = true; - if (sess->subscribed_default_qos->priority_level != - AuthDefQos.priority_level) - triggered = true; - if (sess->subscribed_default_qos->arp) { - if (sess->subscribed_default_qos->arp->priority_level != - AuthDefQos.arp->priority_level) - triggered = true; - if (sess->subscribed_default_qos->arp->preempt_cap != - AuthDefQos.arp->preempt_cap) - triggered = true; - if (sess->subscribed_default_qos->arp->preempt_vuln != - AuthDefQos.arp->preempt_vuln) - triggered = true; - - } - - if (triggered) - OpenAPI_list_add(PolicyCtrlReqTriggers, - (void *)OpenAPI_policy_control_request_trigger_DEF_QOS_CH); - - } - - SessRuleMap = OpenAPI_map_create( - SessionRule->sess_rule_id, SessionRule); - ogs_assert(SessRuleMap); - - OpenAPI_list_add(SessRuleList, SessRuleMap); - - if (SessRuleList->count) - SmPolicyDecision.sess_rules = SessRuleList; - - /************************************************************** - * PCC Rule & QoS Decision - *************************************************************/ - PccRuleList = OpenAPI_list_create(); - ogs_assert(PccRuleList); - - QosDecisionList = OpenAPI_list_create(); - ogs_assert(QosDecisionList); - - for (i = 0; i < session_data.num_of_pcc_rule; i++) { - ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rule[i]; - - ogs_assert(pcc_rule); - ogs_assert(pcc_rule->id); - - if (!pcc_rule->num_of_flow) { - /* No Flow */ - continue; - } - - PccRule = ogs_sbi_build_pcc_rule(pcc_rule, 1); - ogs_assert(PccRule->pcc_rule_id); - - PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule); - ogs_assert(PccRuleMap); - - OpenAPI_list_add(PccRuleList, PccRuleMap); - - QosData = ogs_sbi_build_qos_data(pcc_rule); - ogs_assert(QosData); - ogs_assert(QosData->qos_id); - - QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData); - ogs_assert(QosDecisionMap); - - OpenAPI_list_add(QosDecisionList, QosDecisionMap); - } - - if (PccRuleList->count) - SmPolicyDecision.pcc_rules = PccRuleList; - - if (QosDecisionList->count) - SmPolicyDecision.qos_decs = QosDecisionList; + /* Send Response for SM Policy Association establishment */ + rc = pcf_sbi_send_smpolicycontrol_create_response(sess, stream); + ogs_expect(rc == true); - /* Policy Control Request Triggers */ - if (PolicyCtrlReqTriggers->count) - SmPolicyDecision.policy_ctrl_req_triggers = PolicyCtrlReqTriggers; - - /* Supported Features */ - if (sess->smpolicycontrol_features) { - SmPolicyDecision.supp_feat = - ogs_uint64_to_string(sess->smpolicycontrol_features); - ogs_assert(SmPolicyDecision.supp_feat); - } - - memset(&header, 0, sizeof(header)); - header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; - header.api.version = (char *)OGS_SBI_API_V1; - header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; - header.resource.component[1] = sess->sm_policy_id; - - memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.SmPolicyDecision = &SmPolicyDecision; - sendmsg.http.location = ogs_sbi_server_uri(server, &header); - - response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_CREATED); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - - ogs_free(sendmsg.http.location); - - OpenAPI_list_for_each(SessRuleList, node) { - SessRuleMap = node->data; - if (SessRuleMap) { - SessionRule = SessRuleMap->value; - if (SessionRule) { - if (SessionRule->auth_sess_ambr) { - if (SessionRule->auth_sess_ambr->uplink) - ogs_free(SessionRule->auth_sess_ambr->uplink); - if (SessionRule->auth_sess_ambr->downlink) - ogs_free(SessionRule->auth_sess_ambr->downlink); - } - if (SessionRule->auth_def_qos) { - ogs_free(SessionRule->auth_def_qos->arp); - - } - ogs_free(SessionRule); - } - ogs_free(SessRuleMap); - } - } - OpenAPI_list_free(SessRuleList); - - OpenAPI_list_for_each(PccRuleList, node) { - PccRuleMap = node->data; - if (PccRuleMap) { - PccRule = PccRuleMap->value; - if (PccRule) - ogs_sbi_free_pcc_rule(PccRule); - ogs_free(PccRuleMap); - } - } - OpenAPI_list_free(PccRuleList); - - OpenAPI_list_for_each(QosDecisionList, node) { - QosDecisionMap = node->data; - if (QosDecisionMap) { - QosData = QosDecisionMap->value; - if (QosData) - ogs_sbi_free_qos_data(QosData); - ogs_free(QosDecisionMap); - } - } - OpenAPI_list_free(QosDecisionList); - - OpenAPI_list_free(PolicyCtrlReqTriggers); - - if (SmPolicyDecision.supp_feat) - ogs_free(SmPolicyDecision.supp_feat); - - pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, - &sess->s_nssai, PCF_METR_CTR_PA_POLICYSMASSOSUCC, 1); - - OGS_SESSION_DATA_FREE(&session_data); - - return true; + return rc; cleanup: ogs_assert(strerror); ogs_assert(status); ogs_error("%s", strerror); - ogs_assert(true == - ogs_sbi_server_send_error(stream, status, recvmsg, strerror, NULL, - NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, status, recvmsg, strerror, NULL, NULL)); ogs_free(strerror); - OGS_SESSION_DATA_FREE(&session_data); - return false; } bool pcf_nbsf_management_handle_de_register( pcf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { - ogs_sbi_message_t sendmsg; - ogs_sbi_response_t *response = NULL; + bool rc; ogs_assert(sess); ogs_assert(stream); - memset(&sendmsg, 0, sizeof(sendmsg)); - - response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + rc = ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT); + ogs_expect(rc == true); - return true; + return rc; } diff --git a/src/pcf/nnrf-handler.c b/src/pcf/nnrf-handler.c index ca5d6ea667..4a32475801 100644 --- a/src/pcf/nnrf-handler.c +++ b/src/pcf/nnrf-handler.c @@ -23,13 +23,11 @@ void pcf_nnrf_handle_nf_discover( ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg) { - int r; ogs_sbi_nf_instance_t *nf_instance = NULL; ogs_sbi_object_t *sbi_object = NULL; ogs_pool_id_t sbi_object_id = OGS_INVALID_POOL_ID; ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; - ogs_sbi_stream_t *stream = NULL; pcf_ue_t *pcf_ue = NULL; pcf_sess_t *sess = NULL; @@ -55,10 +53,6 @@ void pcf_nnrf_handle_nf_discover( discovery_option = xact->discovery_option; - if (xact->assoc_stream_id >= OGS_MIN_POOL_ID && - xact->assoc_stream_id <= OGS_MAX_POOL_ID) - stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); - SearchResult = recvmsg->SearchResult; if (!SearchResult) { ogs_error("No SearchResult"); @@ -89,28 +83,28 @@ void pcf_nnrf_handle_nf_discover( sess ? sess->psi : 0, ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); + + /* If BSF is not reachable, we ignore NBSF_MANAGMENT service */ + if (service_type == OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT) { + ogs_sbi_stream_t *stream = NULL; + + ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && + xact->assoc_stream_id <= OGS_MAX_POOL_ID); + stream = ogs_sbi_stream_find_by_id(xact->assoc_stream_id); + ogs_assert(stream); + + /* Send Response for SM Policy Association establishment */ + ogs_expect(true == + pcf_sbi_send_smpolicycontrol_create_response(sess, stream)); + + ogs_sbi_xact_remove(xact); + } return; } OGS_SBI_SETUP_NF_INSTANCE( sbi_object->service_type_array[service_type], nf_instance); - switch (service_type) { - case OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION: - ogs_sbi_xact_remove(xact); - - ogs_assert(sess); - ogs_assert(stream); - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - break; - default: - ogs_assert(xact->request); - ogs_expect(true == pcf_sbi_send_request(nf_instance, xact)); - break; - } + ogs_assert(xact->request); + ogs_expect(true == pcf_sbi_send_request(nf_instance, xact)); } diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index 845fcdd7a4..e3ffeb3245 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -500,37 +500,12 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, if (ogs_sbi_supi_in_vplmn(pcf_ue->supi) == true) { /* Visited PLMN */ - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; - - service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - - nf_instance = OGS_SBI_GET_NF_INSTANCE( - sess->sbi.service_type_array[service_type]); - if (!nf_instance) { - OpenAPI_nf_type_e requester_nf_type = - NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); - ogs_assert(requester_nf_type); - nf_instance = ogs_sbi_nf_instance_find_by_service_type( - service_type, requester_nf_type); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sess->sbi.service_type_array[service_type], - nf_instance); - } - - if (nf_instance) { - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - r = pcf_sess_sbi_discover_only(sess, stream, service_type); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } + r = pcf_sess_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, + pcf_nbsf_management_build_register, + sess, stream, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); return (r == OGS_OK); } else { @@ -598,19 +573,17 @@ bool pcf_npcf_smpolicycontrol_handle_delete(pcf_sess_t *sess, if (pcf_sessions_number_by_snssai_and_dnn( pcf_ue, &sess->s_nssai, sess->dnn) > 1) { - ogs_sbi_message_t sendmsg; - memset(&sendmsg, 0, sizeof(sendmsg)); - - ogs_sbi_response_t *response = ogs_sbi_build_response( - &sendmsg, OGS_SBI_HTTP_STATUS_NO_CONTENT); - ogs_assert(response); - ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - } else { + ogs_expect(true == + ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT)); + } else if (sess->binding.resource_uri) { r = pcf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, pcf_nbsf_management_build_de_register, sess, stream, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); + } else { + ogs_expect(true == + ogs_sbi_send_response(stream, OGS_SBI_HTTP_STATUS_NO_CONTENT)); } return true; diff --git a/src/pcf/nudr-handler.c b/src/pcf/nudr-handler.c index 16d724ae98..be9c691b2b 100644 --- a/src/pcf/nudr-handler.c +++ b/src/pcf/nudr-handler.c @@ -203,9 +203,6 @@ bool pcf_nudr_dr_handle_query_sm_data( SWITCH(recvmsg->h.resource.component[3]) CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_sbi_service_type_e service_type = OGS_SBI_SERVICE_TYPE_NULL; - if (!recvmsg->SmPolicyData) { strerror = ogs_msprintf("[%s:%d] No SmPolicyData", pcf_ue->supi, sess->psi); @@ -213,34 +210,12 @@ bool pcf_nudr_dr_handle_query_sm_data( goto cleanup; } - service_type = OGS_SBI_SERVICE_TYPE_NPCF_POLICYAUTHORIZATION; - - nf_instance = OGS_SBI_GET_NF_INSTANCE( - sess->sbi.service_type_array[service_type]); - if (!nf_instance) { - OpenAPI_nf_type_e requester_nf_type = - NF_INSTANCE_TYPE(ogs_sbi_self()->nf_instance); - ogs_assert(requester_nf_type); - nf_instance = ogs_sbi_nf_instance_find_by_service_type( - service_type, requester_nf_type); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sess->sbi.service_type_array[service_type], - nf_instance); - } - - if (nf_instance) { - r = pcf_sess_sbi_discover_and_send( - OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, - pcf_nbsf_management_build_register, - sess, stream, nf_instance); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } else { - r = pcf_sess_sbi_discover_only(sess, stream, service_type); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - } + r = pcf_sess_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NBSF_MANAGEMENT, NULL, + pcf_nbsf_management_build_register, + sess, stream, NULL); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); return true; diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index fe18a40262..4d358e45e0 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -189,31 +189,6 @@ int pcf_ue_sbi_discover_and_send( return OGS_OK; } -int pcf_sess_sbi_discover_only( - pcf_sess_t *sess, ogs_sbi_stream_t *stream, - ogs_sbi_service_type_e service_type) -{ - ogs_sbi_xact_t *xact = NULL; - - ogs_assert(sess); - ogs_assert(service_type); - - xact = ogs_sbi_xact_add( - 0, &sess->sbi, service_type, NULL, NULL, NULL, NULL); - if (!xact) { - ogs_error("ogs_sbi_xact_add() failed"); - return OGS_ERROR; - } - - if (stream) { - xact->assoc_stream_id = ogs_sbi_id_from_stream(stream); - ogs_assert(xact->assoc_stream_id >= OGS_MIN_POOL_ID && - xact->assoc_stream_id <= OGS_MAX_POOL_ID); - } - - return ogs_sbi_discover_only(xact); -} - int pcf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, @@ -307,6 +282,340 @@ bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue) return rc; } +bool pcf_sbi_send_smpolicycontrol_create_response( + pcf_sess_t *sess, ogs_sbi_stream_t *stream) +{ + int i, rv, status = 0; + char *strerror = NULL; + pcf_ue_t *pcf_ue = NULL; + ogs_sbi_server_t *server = NULL; + + ogs_sbi_message_t sendmsg; + ogs_sbi_header_t header; + ogs_sbi_response_t *response = NULL; + + ogs_session_data_t session_data; + + ogs_session_t *session = NULL; + + OpenAPI_sm_policy_decision_t SmPolicyDecision; + + OpenAPI_lnode_t *node = NULL; + + OpenAPI_list_t *SessRuleList = NULL; + OpenAPI_map_t *SessRuleMap = NULL; + OpenAPI_session_rule_t *SessionRule = NULL; + + OpenAPI_ambr_t AuthSessAmbr; + OpenAPI_authorized_default_qos_t AuthDefQos; + + OpenAPI_list_t *PccRuleList = NULL; + OpenAPI_map_t *PccRuleMap = NULL; + OpenAPI_pcc_rule_t *PccRule = NULL; + + OpenAPI_list_t *QosDecisionList = NULL; + OpenAPI_map_t *QosDecisionMap = NULL; + OpenAPI_qos_data_t *QosData = NULL; + + OpenAPI_list_t *PolicyCtrlReqTriggers = NULL; + + ogs_assert(sess); + pcf_ue = pcf_ue_find_by_id(sess->pcf_ue_id); + ogs_assert(pcf_ue); + ogs_assert(stream); + server = ogs_sbi_server_from_stream(stream); + ogs_assert(server); + + memset(&session_data, 0, sizeof(ogs_session_data_t)); + + ogs_assert(pcf_ue->supi); + ogs_assert(sess->dnn); + + rv = pcf_db_qos_data( + pcf_ue->supi, + sess->home.presence == true ? &sess->home.plmn_id : NULL, + &sess->s_nssai, sess->dnn, &session_data); + if (rv != OGS_OK) { + strerror = ogs_msprintf("[%s:%d] Cannot find SUPI in DB", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_NOT_FOUND; + goto cleanup; + } + + session = &session_data.session; + + if (!session->qos.index) { + strerror = ogs_msprintf("[%s:%d] No 5QI", pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + if (!session->qos.arp.priority_level) { + strerror = ogs_msprintf("[%s:%d] No Priority Level", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + + if (!session->ambr.uplink && !session->ambr.downlink) { + strerror = ogs_msprintf("[%s:%d] No Session-AMBR", + pcf_ue->supi, sess->psi); + status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; + goto cleanup; + } + + memset(&SmPolicyDecision, 0, sizeof(SmPolicyDecision)); + + PolicyCtrlReqTriggers = OpenAPI_list_create(); + ogs_assert(PolicyCtrlReqTriggers); + + /************************************************************** + * Session Rule + *************************************************************/ + SessRuleList = OpenAPI_list_create(); + ogs_assert(SessRuleList); + + SessionRule = ogs_calloc(1, sizeof(*SessionRule)); + ogs_assert(SessionRule); + + /* Only 1 SessionRule is used */ + SessionRule->sess_rule_id = (char *)"1"; + + if (OGS_SBI_FEATURES_IS_SET(sess->smpolicycontrol_features, + OGS_SBI_NPCF_SMPOLICYCONTROL_DN_AUTHORIZATION)) { + if (sess->subscribed_sess_ambr) { + ogs_bitrate_t subscribed_sess_ambr; + + subscribed_sess_ambr.uplink = ogs_sbi_bitrate_from_string( + sess->subscribed_sess_ambr->uplink); + subscribed_sess_ambr.downlink = ogs_sbi_bitrate_from_string( + sess->subscribed_sess_ambr->downlink); + if (((subscribed_sess_ambr.uplink / 1000) != + (session->ambr.uplink / 1000)) || + ((subscribed_sess_ambr.downlink / 1000) != + (session->ambr.downlink / 1000))) { + + OpenAPI_list_add(PolicyCtrlReqTriggers, + (void *)OpenAPI_policy_control_request_trigger_SE_AMBR_CH); + } + + memset(&AuthSessAmbr, 0, sizeof(AuthSessAmbr)); + AuthSessAmbr.uplink = ogs_sbi_bitrate_to_string( + session->ambr.uplink, OGS_SBI_BITRATE_KBPS); + AuthSessAmbr.downlink = ogs_sbi_bitrate_to_string( + session->ambr.downlink, OGS_SBI_BITRATE_KBPS); + SessionRule->auth_sess_ambr = &AuthSessAmbr; + } + } + + if (sess->subscribed_default_qos) { + bool triggered = false; + + memset(&AuthDefQos, 0, sizeof(AuthDefQos)); + AuthDefQos.arp = ogs_calloc(1, sizeof(OpenAPI_arp_t)); + ogs_assert(AuthDefQos.arp); + + AuthDefQos.is__5qi = true; + AuthDefQos._5qi = session->qos.index; + AuthDefQos.is_priority_level = true; + AuthDefQos.priority_level = session->qos.arp.priority_level; + + if (session->qos.arp.pre_emption_capability == + OGS_5GC_PRE_EMPTION_ENABLED) + AuthDefQos.arp->preempt_cap = + OpenAPI_preemption_capability_MAY_PREEMPT; + else if (session->qos.arp.pre_emption_capability == + OGS_5GC_PRE_EMPTION_DISABLED) + AuthDefQos.arp->preempt_cap = + OpenAPI_preemption_capability_NOT_PREEMPT; + ogs_assert(AuthDefQos.arp->preempt_cap); + + if (session->qos.arp.pre_emption_vulnerability == + OGS_5GC_PRE_EMPTION_ENABLED) + AuthDefQos.arp->preempt_vuln = + OpenAPI_preemption_vulnerability_PREEMPTABLE; + else if (session->qos.arp.pre_emption_vulnerability == + OGS_5GC_PRE_EMPTION_DISABLED) + AuthDefQos.arp->preempt_vuln = + OpenAPI_preemption_vulnerability_NOT_PREEMPTABLE; + ogs_assert(AuthDefQos.arp->preempt_vuln); + AuthDefQos.arp->priority_level = session->qos.arp.priority_level; + + SessionRule->auth_def_qos = &AuthDefQos; + + if (sess->subscribed_default_qos->_5qi != AuthDefQos._5qi) + triggered = true; + if (sess->subscribed_default_qos->priority_level != + AuthDefQos.priority_level) + triggered = true; + if (sess->subscribed_default_qos->arp) { + if (sess->subscribed_default_qos->arp->priority_level != + AuthDefQos.arp->priority_level) + triggered = true; + if (sess->subscribed_default_qos->arp->preempt_cap != + AuthDefQos.arp->preempt_cap) + triggered = true; + if (sess->subscribed_default_qos->arp->preempt_vuln != + AuthDefQos.arp->preempt_vuln) + triggered = true; + + } + + if (triggered) + OpenAPI_list_add(PolicyCtrlReqTriggers, + (void *)OpenAPI_policy_control_request_trigger_DEF_QOS_CH); + + } + + SessRuleMap = OpenAPI_map_create( + SessionRule->sess_rule_id, SessionRule); + ogs_assert(SessRuleMap); + + OpenAPI_list_add(SessRuleList, SessRuleMap); + + if (SessRuleList->count) + SmPolicyDecision.sess_rules = SessRuleList; + + /************************************************************** + * PCC Rule & QoS Decision + *************************************************************/ + PccRuleList = OpenAPI_list_create(); + ogs_assert(PccRuleList); + + QosDecisionList = OpenAPI_list_create(); + ogs_assert(QosDecisionList); + + for (i = 0; i < session_data.num_of_pcc_rule; i++) { + ogs_pcc_rule_t *pcc_rule = &session_data.pcc_rule[i]; + + ogs_assert(pcc_rule); + ogs_assert(pcc_rule->id); + + if (!pcc_rule->num_of_flow) { + /* No Flow */ + continue; + } + + PccRule = ogs_sbi_build_pcc_rule(pcc_rule, 1); + ogs_assert(PccRule->pcc_rule_id); + + PccRuleMap = OpenAPI_map_create(PccRule->pcc_rule_id, PccRule); + ogs_assert(PccRuleMap); + + OpenAPI_list_add(PccRuleList, PccRuleMap); + + QosData = ogs_sbi_build_qos_data(pcc_rule); + ogs_assert(QosData); + ogs_assert(QosData->qos_id); + + QosDecisionMap = OpenAPI_map_create(QosData->qos_id, QosData); + ogs_assert(QosDecisionMap); + + OpenAPI_list_add(QosDecisionList, QosDecisionMap); + } + + if (PccRuleList->count) + SmPolicyDecision.pcc_rules = PccRuleList; + + if (QosDecisionList->count) + SmPolicyDecision.qos_decs = QosDecisionList; + + /* Policy Control Request Triggers */ + if (PolicyCtrlReqTriggers->count) + SmPolicyDecision.policy_ctrl_req_triggers = PolicyCtrlReqTriggers; + + /* Supported Features */ + if (sess->smpolicycontrol_features) { + SmPolicyDecision.supp_feat = + ogs_uint64_to_string(sess->smpolicycontrol_features); + ogs_assert(SmPolicyDecision.supp_feat); + } + + memset(&header, 0, sizeof(header)); + header.service.name = (char *)OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL; + header.api.version = (char *)OGS_SBI_API_V1; + header.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_SM_POLICIES; + header.resource.component[1] = sess->sm_policy_id; + + memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.SmPolicyDecision = &SmPolicyDecision; + sendmsg.http.location = ogs_sbi_server_uri(server, &header); + + response = ogs_sbi_build_response( + &sendmsg, OGS_SBI_HTTP_STATUS_CREATED); + ogs_assert(response); + ogs_assert(true == ogs_sbi_server_send_response(stream, response)); + + ogs_free(sendmsg.http.location); + + OpenAPI_list_for_each(SessRuleList, node) { + SessRuleMap = node->data; + if (SessRuleMap) { + SessionRule = SessRuleMap->value; + if (SessionRule) { + if (SessionRule->auth_sess_ambr) { + if (SessionRule->auth_sess_ambr->uplink) + ogs_free(SessionRule->auth_sess_ambr->uplink); + if (SessionRule->auth_sess_ambr->downlink) + ogs_free(SessionRule->auth_sess_ambr->downlink); + } + if (SessionRule->auth_def_qos) { + ogs_free(SessionRule->auth_def_qos->arp); + + } + ogs_free(SessionRule); + } + ogs_free(SessRuleMap); + } + } + OpenAPI_list_free(SessRuleList); + + OpenAPI_list_for_each(PccRuleList, node) { + PccRuleMap = node->data; + if (PccRuleMap) { + PccRule = PccRuleMap->value; + if (PccRule) + ogs_sbi_free_pcc_rule(PccRule); + ogs_free(PccRuleMap); + } + } + OpenAPI_list_free(PccRuleList); + + OpenAPI_list_for_each(QosDecisionList, node) { + QosDecisionMap = node->data; + if (QosDecisionMap) { + QosData = QosDecisionMap->value; + if (QosData) + ogs_sbi_free_qos_data(QosData); + ogs_free(QosDecisionMap); + } + } + OpenAPI_list_free(QosDecisionList); + + OpenAPI_list_free(PolicyCtrlReqTriggers); + + if (SmPolicyDecision.supp_feat) + ogs_free(SmPolicyDecision.supp_feat); + + pcf_metrics_inst_by_slice_add(&pcf_ue->guami.plmn_id, + &sess->s_nssai, PCF_METR_CTR_PA_POLICYSMASSOSUCC, 1); + + OGS_SESSION_DATA_FREE(&session_data); + + return true; + +cleanup: + ogs_assert(strerror); + ogs_assert(status); + ogs_error("%s", strerror); + ogs_assert(true == ogs_sbi_server_send_error( + stream, status, NULL, strerror, NULL, NULL)); + ogs_free(strerror); + + OGS_SESSION_DATA_FREE(&session_data); + + return false; +} + bool pcf_sbi_send_smpolicycontrol_update_notify( pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision) { diff --git a/src/pcf/sbi-path.h b/src/pcf/sbi-path.h index 0699212444..b724659647 100644 --- a/src/pcf/sbi-path.h +++ b/src/pcf/sbi-path.h @@ -45,11 +45,10 @@ int pcf_sess_sbi_discover_and_send( ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data), pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data); -int pcf_sess_sbi_discover_only( - pcf_sess_t *sess, ogs_sbi_stream_t *stream, - ogs_sbi_service_type_e service_type); bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue); +bool pcf_sbi_send_smpolicycontrol_create_response( + pcf_sess_t *sess, ogs_sbi_stream_t *stream); bool pcf_sbi_send_smpolicycontrol_update_notify( pcf_sess_t *sess, OpenAPI_sm_policy_decision_t *SmPolicyDecision); bool pcf_sbi_send_smpolicycontrol_delete_notify( diff --git a/src/pcf/sm-sm.c b/src/pcf/sm-sm.c index edd0f07fab..1693c1af84 100644 --- a/src/pcf/sm-sm.c +++ b/src/pcf/sm-sm.c @@ -291,8 +291,22 @@ void pcf_sm_state_operational(ogs_fsm_t *s, pcf_event_t *e) } else { SWITCH(message->h.method) CASE(OGS_SBI_HTTP_METHOD_POST) - pcf_nbsf_management_handle_register( - sess, stream, message); + if (message->res_status == + OGS_SBI_HTTP_STATUS_CREATED) { + pcf_nbsf_management_handle_register( + sess, stream, message); + } else { + ogs_error("[%s:%d] HTTP response error [%d]", + pcf_ue->supi, sess->psi, message->res_status); + + /* + * Send Response + * for SM Policy Association establishment + */ + ogs_expect(true == + pcf_sbi_send_smpolicycontrol_create_response( + sess, stream)); + } break; DEFAULT ogs_error("[%s:%d] Unknown method [%s]", diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 5441eb9c47..9fa29337c3 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -584,16 +584,6 @@ static int request_handler(ogs_sbi_request_t *request, void *data) return OGS_ERROR; } - assoc->request = request; - ogs_assert(assoc->request); - assoc->service_type = service_type; - ogs_assert(assoc->service_type); - - assoc->target_nf_type = target_nf_type; - ogs_assert(assoc->target_nf_type); - assoc->requester_nf_type = requester_nf_type; - ogs_assert(assoc->requester_nf_type); - if (!discovery_option->num_of_service_names) { ogs_error("No service names"); scp_assoc_remove(assoc); @@ -624,6 +614,16 @@ static int request_handler(ogs_sbi_request_t *request, void *data) "in TS29.500"); } + assoc->request = request; + ogs_assert(assoc->request); + assoc->service_type = service_type; + ogs_assert(assoc->service_type); + + assoc->target_nf_type = target_nf_type; + ogs_assert(assoc->target_nf_type); + assoc->requester_nf_type = requester_nf_type; + ogs_assert(assoc->requester_nf_type); + if (false == send_discover(nrf_client, nf_discover_handler, assoc)) { ogs_error("send_discover() failed"); scp_assoc_remove(assoc); @@ -715,7 +715,7 @@ static int response_handler( static int nf_discover_handler( int status, ogs_sbi_response_t *response, void *data) { - int rv; + int rv, res_status; char *strerror = NULL; ogs_sbi_message_t message; @@ -775,16 +775,19 @@ static int nf_discover_handler( rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { strerror = ogs_msprintf("cannot parse HTTP response"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { strerror = ogs_msprintf("NF-Discover failed [%d]", message.res_status); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (!message.SearchResult) { strerror = ogs_msprintf("No SearchResult"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -796,7 +799,7 @@ static int nf_discover_handler( strerror = ogs_msprintf("(NF discover) No NF-Instance [%s:%s]", ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); - + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -809,7 +812,7 @@ static int nf_discover_handler( strerror = ogs_msprintf("(NF discover) No client [%s:%s]", ogs_sbi_service_type_to_name(service_type), OpenAPI_nf_type_ToString(requester_nf_type)); - + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -823,6 +826,7 @@ static int nf_discover_handler( if (!sepp_client) { ogs_error("No SEPP [%s]", client->fqdn); strerror = ogs_msprintf("No SEPP [%s]", client->fqdn); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -837,6 +841,7 @@ static int nf_discover_handler( if (false == send_request( client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -852,10 +857,8 @@ static int nf_discover_handler( scp_assoc_remove(assoc); if (stream) { - ogs_assert(true == - ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, - NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, res_status, NULL, strerror, NULL, NULL)); } else ogs_error("STREAM has already been removed [%d]", stream_id); @@ -870,7 +873,7 @@ static int nf_discover_handler( static int sepp_discover_handler( int status, ogs_sbi_response_t *response, void *data) { - int rv; + int rv, res_status; char *strerror = NULL; ogs_sbi_message_t message; @@ -912,16 +915,19 @@ static int sepp_discover_handler( rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { strerror = ogs_msprintf("cannot parse HTTP response"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { strerror = ogs_msprintf("NF-Discover failed [%d]", message.res_status); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } if (!message.SearchResult) { strerror = ogs_msprintf("No SearchResult"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -933,6 +939,7 @@ static int sepp_discover_handler( sepp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->sepp_instance); if (!sepp_client) { strerror = ogs_msprintf("No SEPP"); + res_status = OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT; goto cleanup; } @@ -943,6 +950,7 @@ static int sepp_discover_handler( if (false == send_request( sepp_client, response_handler, request, false, assoc)) { strerror = ogs_msprintf("send_request() failed"); + res_status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; goto cleanup; } @@ -958,10 +966,8 @@ static int sepp_discover_handler( scp_assoc_remove(assoc); if (stream) { - ogs_assert(true == - ogs_sbi_server_send_error( - stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, NULL, strerror, NULL, - NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, res_status, NULL, strerror, NULL, NULL)); } else ogs_error("STREAM has already been removed [%d]", stream_id); From b44d159c7bb0edb33813a3b03a482501e1a4354b Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Fri, 13 Dec 2024 14:54:36 +0900 Subject: [PATCH 282/323] [SMF] Add check for relay peer in ogs_diam_is_relay_or_app_advertised function (#3589) Modify the function to return true if the peer is a relay, otherwise check for advertised application. --- lib/diameter/common/base.h | 2 +- lib/diameter/common/util.c | 23 ++++++++++++++--------- src/smf/context.c | 6 ++++-- src/smf/gn-handler.c | 4 ++-- src/smf/s5c-handler.c | 8 ++++---- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/lib/diameter/common/base.h b/lib/diameter/common/base.h index a44dece729..d8ad7f77a0 100644 --- a/lib/diameter/common/base.h +++ b/lib/diameter/common/base.h @@ -90,7 +90,7 @@ int ogs_diam_start(void); void ogs_diam_final(void); int ogs_diam_config_init(ogs_diam_config_t *fd_config); -bool ogs_diam_app_connected(uint32_t app_id); +bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id); int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp ); diff --git a/lib/diameter/common/util.c b/lib/diameter/common/util.c index fa534c4b8c..94a7fb8eed 100644 --- a/lib/diameter/common/util.c +++ b/lib/diameter/common/util.c @@ -19,7 +19,7 @@ #include "ogs-diameter-common.h" -bool ogs_diam_app_connected(uint32_t app_id) +bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id) { struct fd_list *li = NULL; struct fd_app *found = NULL; @@ -36,18 +36,23 @@ bool ogs_diam_app_connected(uint32_t app_id) if (state == STATE_OPEN) { ogs_debug("'%s' STATE is OPEN", p->info.pi_diamid); - /* Check if the remote peer advertised the message's appli */ - fd_app_check(&p->info.runtime.pir_apps, app_id, &found); - - if (found) break; + if (p->info.runtime.pir_relay) { + ogs_debug("'%s' RELAY is enabled", p->info.pi_diamid); + CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); + return true; + } else { + /* Check if the remote peer advertised the message's appli */ + fd_app_check(&p->info.runtime.pir_apps, app_id, &found); + if (found) { + CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); + return true; + } + } } else { ogs_debug("'%s' STATE[%d] is NOT open ", p->info.pi_diamid, state); } } CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); - if (found) - return true; - else - return false; + return false; } diff --git a/src/smf/context.c b/src/smf/context.c index 89889862f5..142496bc51 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -53,9 +53,11 @@ int smf_use_gy_iface(void) { switch (smf_self()->ctf_config.enabled) { case SMF_CTF_ENABLED_AUTO: - return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0; + return ogs_diam_is_relay_or_app_advertised( + OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0; case SMF_CTF_ENABLED_YES: - return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1; + return ogs_diam_is_relay_or_app_advertised( + OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1; case SMF_CTF_ENABLED_NO: return 0; default: diff --git a/src/smf/gn-handler.c b/src/smf/gn-handler.c index 73001b3470..c4c35b6ca7 100644 --- a/src/smf/gn-handler.c +++ b/src/smf/gn-handler.c @@ -110,7 +110,7 @@ uint8_t smf_gn_handle_create_pdp_context_request( cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING; } - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); cause_value = OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE; } @@ -309,7 +309,7 @@ uint8_t smf_gn_handle_delete_pdp_context_request( { ogs_debug("Delete PDP Context Request"); - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); return OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE; } diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index fbba768ccb..e6fe5ad790 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -155,7 +155,7 @@ uint8_t smf_s5c_handle_create_session_request( cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } @@ -172,7 +172,7 @@ uint8_t smf_s5c_handle_create_session_request( } break; case OGS_GTP2_RAT_TYPE_WLAN: - if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) { ogs_error("No S6b Diameter Peer"); cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } @@ -485,13 +485,13 @@ uint8_t smf_s5c_handle_delete_session_request( ogs_assert(xact); ogs_assert(req); - if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) { ogs_error("No Gx Diameter Peer"); return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) { - if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) { + if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) { ogs_error("No S6b Diameter Peer"); return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING; } From b0bfd35c63d57b271f6550dad54aa8f38d52cdca Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 23 Dec 2024 21:08:13 +0900 Subject: [PATCH 283/323] [SCTP] Support setting local address (#3344) Added support for binding to local IP addresses in ogs_sctp_client and ogs_sctp_server, and correct SGsAP configuration Implemented the ability to bind to one or multiple local IP addresses using `sctp_bindx()` in both the `ogs_sctp_client()` and `ogs_sctp_server()` APIs. Users can now specify local addresses in the configuration files under the new `local_addresses` field, reducing unnecessary complexity and signaling caused by binding to `ANY_ADDR`. This update addresses issue https://osmocom.org/issues/6509 by ensuring correct operation in multi-interface and complex networking setups. Additionally, corrected the `sgsap` configuration by changing it from `server` to `client`, and added support for specifying `local_addresses` for local binding as follows: ``` sgsap: client: - address: msc.open5gs.org # SCTP server address configured on the MSC/VL local_address: 127.0.0.2 # SCTP local IP addresses to be bound in the M ``` --- configs/csfb.yaml.in | 2 +- configs/open5gs/mme.yaml.in | 15 +- lib/sctp/ogs-lksctp.c | 380 +++++++++++++++++++++++++++--------- lib/sctp/ogs-sctp.h | 4 +- lib/sctp/ogs-usrsctp.c | 4 +- src/mme/mme-context.c | 114 +++++++---- src/mme/mme-context.h | 6 +- src/mme/sgsap-sctp.c | 21 +- tests/common/sctp.c | 6 +- tests/sctp/sctp-test.c | 6 +- 10 files changed, 416 insertions(+), 142 deletions(-) diff --git a/configs/csfb.yaml.in b/configs/csfb.yaml.in index 9538a580ea..53f19af8df 100644 --- a/configs/csfb.yaml.in +++ b/configs/csfb.yaml.in @@ -59,7 +59,7 @@ mme: smf: - address: 127.0.0.4 sgsap: - server: + client: - address: 127.0.0.2 map: tai: diff --git a/configs/open5gs/mme.yaml.in b/configs/open5gs/mme.yaml.in index b3daf838d7..39b2a00713 100644 --- a/configs/open5gs/mme.yaml.in +++ b/configs/open5gs/mme.yaml.in @@ -164,8 +164,9 @@ mme: ################################################################################ # o MSC/VLR # sgsap: -# server: -# - address: 127.0.0.2 +# client: +# - address: msc.open5gs.org # SCTP server address configured on the MSC/VLR +# local_address: 127.0.0.2 # SCTP local IP addresses to be bound in the MME # map: # tai: # plmn_id: @@ -188,7 +189,15 @@ mme: # mcc: 002 # mnc: 02 # lac: 43692 -# - address: msc.open5gs.org +# - address: # SCTP server address configured on the MSC/VLR +# - 127.0.0.88 +# - 10.0.0.88 +# - 172.16.0.88 +# - 2001:db8:babe::88 +# local_address: # SCTP local IP addresses to be bound in the MME +# - 127.0.0.2 +# - 192.168.1.4 +# - 2001:db8:cafe::2 # map: # tai: # plmn_id: diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index 89a6b985cf..f9a0a27ecd 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -53,138 +53,332 @@ ogs_sock_t *ogs_sctp_socket(int family, int type) return new; } +/** + * @brief + * 1) Count the number of addresses in sa_list and determine the total + * buffer size. + * 2) Allocate a single continuous buffer (unsigned char). + * 3) Copy each address (sockaddr_in or sockaddr_in6) into this continuous + * buffer. + * + * @param sa_list Linked list of ogs_sockaddr_t structures. + * @param out_count [OUT] Receives the number of addresses. + * @param out_total_len [OUT] Receives the total bytes for the continuous + * buffer. + * + * @return + * On success, returns a pointer to the allocated buffer containing all + * addresses. On failure, logs an error and returns NULL. + */ +static unsigned char *create_continuous_address_buffer( + ogs_sockaddr_t *sa_list, + int *out_count, + int *out_total_len) +{ + ogs_sockaddr_t *addr; + int addr_count = 0; + int total_len = 0; + unsigned char *addr_buf = NULL; + int offset = 0; + + /* 1) Count addresses and total buffer size needed. */ + for (addr = sa_list; addr; addr = addr->next) { + addr_count++; + /* E.g., sizeof(sockaddr_in) or sizeof(sockaddr_in6). */ + total_len += ogs_sockaddr_len(addr); + } + + if (addr_count == 0) { + ogs_error("No valid address in sa_list"); + return NULL; + } + + /* 2) Allocate the continuous buffer (unsigned char). */ + addr_buf = ogs_calloc(1, total_len); + if (!addr_buf) { + ogs_error("Failed to allocate memory for addr_buf"); + return NULL; + } + + /* 3) Copy each address structure into addr_buf. */ + offset = 0; + for (addr = sa_list; addr; addr = addr->next) { + socklen_t socklen = ogs_sockaddr_len(addr); + memcpy(addr_buf + offset, &addr->sa, socklen); + offset += socklen; + } + + /* Pass back the number of addresses and total length. */ + *out_count = addr_count; + *out_total_len = total_len; + + return addr_buf; +} + +/** + * @brief Create an SCTP server socket and bind multiple addresses at once + * using sctp_bindx(). + * + * @param type SCTP socket type (e.g., SOCK_SEQPACKET or SOCK_STREAM) + * @param sa_list Linked list of ogs_sockaddr_t structures + * @param socket_option Additional socket/SCTP options + * + * @return + * On success, returns a pointer to an ogs_sock_t instance; on failure, + * returns NULL. + */ ogs_sock_t *ogs_sctp_server( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) + int type, + ogs_sockaddr_t *sa_list, + ogs_sockopt_t *socket_option) { int rv; char buf[OGS_ADDRSTRLEN]; - - ogs_sock_t *new = NULL; - ogs_sockaddr_t *addr; + ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; + /* Variables for sctp_bindx() usage. */ + unsigned char *addr_buf = NULL; + int addr_count = 0; + int total_len = 0; + ogs_assert(sa_list); + /* Initialize socket options. */ ogs_sockopt_init(&option); if (socket_option) - memcpy(&option, socket_option, sizeof option); + memcpy(&option, socket_option, sizeof(option)); + + /* + * Obtain a contiguous buffer for all addresses: + * 1) Count the addresses. + * 2) Allocate the buffer. + * 3) Copy the addresses into the buffer. + */ + addr_buf = create_continuous_address_buffer( + sa_list, &addr_count, &total_len); + if (!addr_buf) { + /* The helper logs errors, so just return. */ + return NULL; + } - addr = sa_list; - while (addr) { - new = ogs_sctp_socket(addr->ogs_sa_family, type); - if (new) { - rv = ogs_sctp_peer_addr_params(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_rto_info(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_initmsg(new, &option); - ogs_assert(rv == OGS_OK); - - if (option.sctp_nodelay == true) { - rv = ogs_sctp_nodelay(new, true); - ogs_assert(rv == OGS_OK); - } else - ogs_warn("SCTP NO_DELAY Disabled"); - - if (option.so_linger.l_onoff == true) { - rv = ogs_sctp_so_linger(new, option.so_linger.l_linger); - ogs_assert(rv == OGS_OK); - } - - rv = ogs_listen_reusable(new->fd, true); - ogs_assert(rv == OGS_OK); - - if (ogs_sock_bind(new, addr) == OGS_OK) { - ogs_debug("sctp_server() [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - break; - } - - ogs_sock_destroy(new); - } + /* + * Create an SCTP socket using the family of the first address + * in sa_list. + */ + new_sock = ogs_sctp_socket(sa_list->ogs_sa_family, type); + if (!new_sock) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_server() Failed to create SCTP socket"); + goto err; + } - addr = addr->next; + /* Configure SCTP-specific options. */ + rv = ogs_sctp_peer_addr_params(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_rto_info(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_initmsg(new_sock, &option); + ogs_assert(rv == OGS_OK); + + if (option.sctp_nodelay == true) { + rv = ogs_sctp_nodelay(new_sock, true); + ogs_assert(rv == OGS_OK); + } else { + ogs_warn("SCTP NO_DELAY Disabled"); } - if (addr == NULL) { + if (option.so_linger.l_onoff == true) { + rv = ogs_sctp_so_linger(new_sock, option.so_linger.l_linger); + ogs_assert(rv == OGS_OK); + } + + /* Enable address reuse if needed. */ + rv = ogs_listen_reusable(new_sock->fd, true); + ogs_assert(rv == OGS_OK); + + /* + * Bind all addresses at once using sctp_bindx(). + * (struct sockaddr *)addr_buf points to the contiguous buffer. + */ + rv = sctp_bindx(new_sock->fd, (struct sockaddr *)addr_buf, + addr_count, SCTP_BINDX_ADD_ADDR); + if (rv < 0) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_server() [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); - return NULL; + "sctp_bindx() failed to bind multiple addresses"); + goto err; } - ogs_assert(new); + /* + * Log debug info: only the first address is shown here as an example. + */ + ogs_debug("sctp_server() [%s]:%d (bound %d addresses)", + OGS_ADDR(sa_list, buf), OGS_PORT(sa_list), addr_count); - rv = ogs_sock_listen(new); + /* Start listening for connections. */ + rv = ogs_sock_listen(new_sock); ogs_assert(rv == OGS_OK); - return new; + /* Success: free the buffer and return the socket. */ + ogs_free(addr_buf); + return new_sock; + +err: + if (addr_buf) + ogs_free(addr_buf); + if (new_sock) + ogs_sock_destroy(new_sock); + + /* + * On failure, log an error based on the first address + * in sa_list (customize as needed). + */ + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_server() [%s]:%d failed", + OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + return NULL; } ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) + int type, + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option) { int rv; char buf[OGS_ADDRSTRLEN]; - - ogs_sock_t *new = NULL; - ogs_sockaddr_t *addr; + ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; + /* Buffers and counters for remote addresses. */ + unsigned char *remote_buf = NULL; + int remote_count = 0; + int remote_len = 0; + + /* Buffers and counters for local addresses (if provided). */ + unsigned char *local_buf = NULL; + int local_count = 0; + int local_len = 0; + ogs_assert(sa_list); + /* Initialize socket options and copy user-provided options if present. */ ogs_sockopt_init(&option); if (socket_option) - memcpy(&option, socket_option, sizeof option); + memcpy(&option, socket_option, sizeof(option)); + + /* + * Build the contiguous buffer for REMOTE addresses using our helper + * function. This will be used later by sctp_connectx(). + */ + remote_buf = create_continuous_address_buffer( + sa_list, &remote_count, &remote_len); + if (!remote_buf) { + /* Logs and returns NULL on failure. */ + return NULL; + } - addr = sa_list; - while (addr) { - new = ogs_sctp_socket(addr->ogs_sa_family, type); - if (new) { - rv = ogs_sctp_peer_addr_params(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_rto_info(new, &option); - ogs_assert(rv == OGS_OK); - - rv = ogs_sctp_initmsg(new, &option); - ogs_assert(rv == OGS_OK); - - if (option.sctp_nodelay == true) { - rv = ogs_sctp_nodelay(new, true); - ogs_assert(rv == OGS_OK); - } else - ogs_warn("SCTP NO_DELAY Disabled"); - - if (option.so_linger.l_onoff == true) { - rv = ogs_sctp_so_linger(new, option.so_linger.l_linger); - ogs_assert(rv == OGS_OK); - } - - if (ogs_sock_connect(new, addr) == OGS_OK) { - ogs_debug("sctp_client() [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - break; - } - - ogs_sock_destroy(new); - } + /* + * Create the SCTP socket using the address family of the first remote + * address. + */ + new_sock = ogs_sctp_socket(sa_list->ogs_sa_family, type); + if (!new_sock) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() Failed to create SCTP socket"); + goto err; + } - addr = addr->next; + /* Configure SCTP-specific options. */ + rv = ogs_sctp_peer_addr_params(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_rto_info(new_sock, &option); + ogs_assert(rv == OGS_OK); + + rv = ogs_sctp_initmsg(new_sock, &option); + ogs_assert(rv == OGS_OK); + + if (option.sctp_nodelay == true) { + rv = ogs_sctp_nodelay(new_sock, true); + ogs_assert(rv == OGS_OK); + } else { + ogs_warn("SCTP NO_DELAY Disabled"); } - if (addr == NULL) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_client() [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); - return NULL; + if (option.so_linger.l_onoff == true) { + rv = ogs_sctp_so_linger(new_sock, option.so_linger.l_linger); + ogs_assert(rv == OGS_OK); } - ogs_assert(new); + /* + * If local_sa_list is provided, bind those addresses before connecting. + * (Optional: some clients do not need explicit local bind.) + */ + if (local_sa_list) { + local_buf = create_continuous_address_buffer( + local_sa_list, &local_count, &local_len); + if (!local_buf) { + /* Error already logged. */ + goto err; + } + /* We can bind them using sctp_bindx() if desired. */ + rv = sctp_bindx(new_sock->fd, + (struct sockaddr *)local_buf, + local_count, + SCTP_BINDX_ADD_ADDR); + if (rv < 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() bind local addresses failed"); + goto err; + } + ogs_debug("sctp_client() bound %d local addresses", local_count); + } - return new; + /* + * Connect to the REMOTE addresses using sctp_connectx(). + * (struct sockaddr *)remote_buf is the contiguous buffer. + */ + rv = sctp_connectx(new_sock->fd, + (struct sockaddr *)remote_buf, + remote_count, + NULL /* assoc_id */); + if (rv < 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_connectx() failed to connect"); + goto err; + } + + /* Debug log for the first remote address. */ + ogs_debug("sctp_client() connected to [%s]:%d", + OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + + /* Success: free buffers and return the new socket. */ + if (local_buf) + ogs_free(local_buf); + if (remote_buf) + ogs_free(remote_buf); + return new_sock; + +err: + if (local_buf) + ogs_free(local_buf); + if (remote_buf) + ogs_free(remote_buf); + if (new_sock) + ogs_sock_destroy(new_sock); + + /* + * On failure, log an error based on the first remote address. + * Adjust to your needs, e.g., log local too if necessary. + */ + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "sctp_client() [%s]:%d failed", + OGS_ADDR(sa_list, buf), + OGS_PORT(sa_list)); + return NULL; } int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) diff --git a/lib/sctp/ogs-sctp.h b/lib/sctp/ogs-sctp.h index 3384a98dfa..f698bf6af2 100644 --- a/lib/sctp/ogs-sctp.h +++ b/lib/sctp/ogs-sctp.h @@ -109,7 +109,9 @@ ogs_sock_t *ogs_sctp_socket(int family, int type); ogs_sock_t *ogs_sctp_server( int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option); ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option); + int type, + ogs_sockaddr_t *sa_list, ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option); int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list); int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list); diff --git a/lib/sctp/ogs-usrsctp.c b/lib/sctp/ogs-usrsctp.c index 60675ca93e..066fecafa6 100644 --- a/lib/sctp/ogs-usrsctp.c +++ b/lib/sctp/ogs-usrsctp.c @@ -156,7 +156,9 @@ ogs_sock_t *ogs_sctp_server( } ogs_sock_t *ogs_sctp_client( - int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) + int type, + ogs_sockaddr_t *sa_list, ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *socket_option) { int rv; char buf[OGS_ADDRSTRLEN]; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index b27c9977e1..547a1419ec 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2050,9 +2050,9 @@ int mme_context_parse_config(void) while (ogs_yaml_iter_next(&sgsap_iter)) { const char *sgsap_key = ogs_yaml_iter_key(&sgsap_iter); ogs_assert(sgsap_key); - if (!strcmp(sgsap_key, "server")) { - ogs_yaml_iter_t server_iter, server_array; - ogs_yaml_iter_recurse(&sgsap_iter, &server_array); + if (!strcmp(sgsap_key, "client")) { + ogs_yaml_iter_t client_iter, client_array; + ogs_yaml_iter_recurse(&sgsap_iter, &client_array); do { mme_vlr_t *vlr = NULL; ogs_plmn_id_t plmn_id; @@ -2063,38 +2063,39 @@ int mme_context_parse_config(void) const char *tac, *lac; } map[MAX_NUM_OF_CSMAP]; int map_num = 0; - ogs_sockaddr_t *addr = NULL; + ogs_sockaddr_t *addr = NULL, *local_addr = NULL; int family = AF_UNSPEC; - int i, hostname_num = 0; - const char *hostname[OGS_MAX_NUM_OF_HOSTNAME]; + int i, hostname_num = 0, local_hostname_num = 0; + const char *hostname[OGS_MAX_NUM_OF_HOSTNAME], + *local_hostname[OGS_MAX_NUM_OF_HOSTNAME]; uint16_t port = self.sgsap_port; ogs_sockopt_t option; bool is_option = false; - if (ogs_yaml_iter_type(&server_array) == + if (ogs_yaml_iter_type(&client_array) == YAML_MAPPING_NODE) { - memcpy(&server_iter, &server_array, + memcpy(&client_iter, &client_array, sizeof(ogs_yaml_iter_t)); - } else if (ogs_yaml_iter_type(&server_array) == + } else if (ogs_yaml_iter_type(&client_array) == YAML_SEQUENCE_NODE) { - if (!ogs_yaml_iter_next(&server_array)) + if (!ogs_yaml_iter_next(&client_array)) break; ogs_yaml_iter_recurse( - &server_array, &server_iter); - } else if (ogs_yaml_iter_type(&server_array) == + &client_array, &client_iter); + } else if (ogs_yaml_iter_type(&client_array) == YAML_SCALAR_NODE) { break; } else ogs_assert_if_reached(); - while (ogs_yaml_iter_next(&server_iter)) { - const char *server_key = - ogs_yaml_iter_key(&server_iter); - ogs_assert(server_key); - if (!strcmp(server_key, "family")) { + while (ogs_yaml_iter_next(&client_iter)) { + const char *client_key = + ogs_yaml_iter_key(&client_iter); + ogs_assert(client_key); + if (!strcmp(client_key, "family")) { const char *v = - ogs_yaml_iter_value(&server_iter); + ogs_yaml_iter_value(&client_iter); if (v) family = atoi(v); if (family != AF_UNSPEC && family != AF_INET && @@ -2106,9 +2107,9 @@ int mme_context_parse_config(void) AF_UNSPEC, AF_INET, AF_INET6); family = AF_UNSPEC; } - } else if (!strcmp(server_key, "address")) { + } else if (!strcmp(client_key, "address")) { ogs_yaml_iter_t hostname_iter; - ogs_yaml_iter_recurse(&server_iter, + ogs_yaml_iter_recurse(&client_iter, &hostname_iter); ogs_assert(ogs_yaml_iter_type( &hostname_iter) != @@ -2131,26 +2132,53 @@ int mme_context_parse_config(void) } while (ogs_yaml_iter_type( &hostname_iter) == YAML_SEQUENCE_NODE); - } else if (!strcmp(server_key, "port")) { + } else if (!strcmp(client_key, + "local_address")) { + ogs_yaml_iter_t local_hostname_iter; + ogs_yaml_iter_recurse(&client_iter, + &local_hostname_iter); + ogs_assert(ogs_yaml_iter_type( + &local_hostname_iter) != + YAML_MAPPING_NODE); + + do { + if (ogs_yaml_iter_type( + &local_hostname_iter) == + YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next( + &local_hostname_iter)) + break; + } + + ogs_assert(local_hostname_num < + OGS_MAX_NUM_OF_HOSTNAME); + local_hostname + [local_hostname_num++] = + ogs_yaml_iter_value( + &local_hostname_iter); + } while (ogs_yaml_iter_type( + &local_hostname_iter) == + YAML_SEQUENCE_NODE); + } else if (!strcmp(client_key, "port")) { const char *v = - ogs_yaml_iter_value(&server_iter); + ogs_yaml_iter_value(&client_iter); if (v) { port = atoi(v); self.sgsap_port = port; } - } else if (!strcmp(server_key, "option")) { + } else if (!strcmp(client_key, "option")) { rv = ogs_app_parse_sockopt_config( - &server_iter, &option); + &client_iter, &option); if (rv != OGS_OK) { ogs_error("ogs_app_parse_sockopt_" "config() failed"); return rv; } is_option = true; - } else if (!strcmp(server_key, "map")) { + } else if (!strcmp(client_key, "map")) { ogs_yaml_iter_t map_iter; ogs_yaml_iter_recurse( - &server_iter, &map_iter); + &client_iter, &map_iter); map[map_num].tai_mcc = NULL; map[map_num].tai_mnc = NULL; @@ -2320,13 +2348,13 @@ int mme_context_parse_config(void) map_num++; - } else if (!strcmp(server_key, "tai")) { + } else if (!strcmp(client_key, "tai")) { ogs_error( "tai/lai configuraton changed to " "map.tai/map.lai"); ogs_log_print(OGS_LOG_ERROR, "sgsap:\n" - " server\n" + " client\n" " address: 127.0.0.2\n" " map:\n" " tai:\n" @@ -2340,13 +2368,13 @@ int mme_context_parse_config(void) " mnc: 01\n" " lac: 43691\n"); return OGS_ERROR; - } else if (!strcmp(server_key, "lai")) { + } else if (!strcmp(client_key, "lai")) { ogs_error( "tai/lai configuraton changed to " "map.tai/map.lai"); ogs_log_print(OGS_LOG_ERROR, "sgsap:\n" - " server\n" + " client\n" " address: 127.0.0.2\n" " map:\n" " tai:\n" @@ -2362,7 +2390,7 @@ int mme_context_parse_config(void) return OGS_ERROR; } else ogs_warn("unknown key `%s`", - server_key); + client_key); } @@ -2386,7 +2414,20 @@ int mme_context_parse_config(void) if (addr == NULL) continue; - vlr = mme_vlr_add(addr, + local_addr = NULL; + for (i = 0; i < local_hostname_num; i++) { + rv = ogs_addaddrinfo(&local_addr, + family, local_hostname[i], port, 0); + ogs_assert(rv == OGS_OK); + } + + ogs_filter_ip_version(&local_addr, + ogs_global_conf()->parameter.no_ipv4, + ogs_global_conf()->parameter.no_ipv6, + ogs_global_conf()->parameter. + prefer_ipv4); + + vlr = mme_vlr_add(addr, local_addr, is_option ? &option : NULL); ogs_assert(vlr); @@ -2409,7 +2450,7 @@ int mme_context_parse_config(void) &csmap->lai.nas_plmn_id, &plmn_id); csmap->lai.lac = atoi(map[i].lac); } - } while (ogs_yaml_iter_type(&server_array) == + } while (ogs_yaml_iter_type(&client_array) == YAML_SEQUENCE_NODE); } else ogs_warn("unknown key `%s`", sgsap_key); @@ -2737,7 +2778,10 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn_enb( return NULL; } -mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list, ogs_sockopt_t *option) +mme_vlr_t *mme_vlr_add( + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *option) { mme_vlr_t *vlr = NULL; @@ -2751,6 +2795,7 @@ mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list, ogs_sockopt_t *option) vlr->ostream_id = 0; vlr->sa_list = sa_list; + vlr->local_sa_list = local_sa_list; if (option) { vlr->max_num_of_ostreams = option->sctp.sinit_num_ostreams; vlr->option = ogs_memdup(option, sizeof *option); @@ -2770,6 +2815,7 @@ void mme_vlr_remove(mme_vlr_t *vlr) mme_vlr_close(vlr); ogs_freeaddrinfo(vlr->sa_list); + ogs_freeaddrinfo(vlr->local_sa_list); if (vlr->option) ogs_free(vlr->option); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index c58e945870..957140d89b 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -216,6 +216,7 @@ typedef struct mme_vlr_s { uint16_t ostream_id; /* vlr_ostream_id generator */ ogs_sockaddr_t *sa_list; /* VLR SGsAP Socket Address List */ + ogs_sockaddr_t *local_sa_list; /* VLR SGsAP Socket Local Address List */ ogs_sock_t *sock; /* VLR SGsAP Socket */ ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */ @@ -938,7 +939,10 @@ void mme_pgw_remove_all(void); ogs_sockaddr_t *mme_pgw_addr_find_by_apn_enb( ogs_list_t *list, int family, const mme_sess_t *sess); -mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list, ogs_sockopt_t *option); +mme_vlr_t *mme_vlr_add( + ogs_sockaddr_t *sa_list, + ogs_sockaddr_t *local_sa_list, + ogs_sockopt_t *option); void mme_vlr_remove(mme_vlr_t *vlr); void mme_vlr_remove_all(void); void mme_vlr_close(mme_vlr_t *vlr); diff --git a/src/mme/sgsap-sctp.c b/src/mme/sgsap-sctp.c index d14c9287e9..99704022c6 100644 --- a/src/mme/sgsap-sctp.c +++ b/src/mme/sgsap-sctp.c @@ -39,7 +39,8 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) ogs_assert(vlr); - sock = ogs_sctp_client(SOCK_SEQPACKET, vlr->sa_list, vlr->option); + sock = ogs_sctp_client(SOCK_SEQPACKET, + vlr->sa_list, vlr->local_sa_list, vlr->option); if (sock) { vlr->sock = sock; #if HAVE_USRSCTP @@ -47,7 +48,23 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) usrsctp_set_non_blocking((struct socket *)sock, 1); usrsctp_set_upcall((struct socket *)sock, usrsctp_recv_handler, NULL); #else - vlr->addr = &sock->remote_addr; + +/* + * Originally, the code assigned vlr->addr to the address of sock->remote_addr: + * vlr->addr = &sock->remote_addr; + * However, when using sctp_connectx, it was not easy to set remote_addr. + * Therefore, at this point, vlr->addr is now assigned to vlr->sa_list, + * utilizing the initially used address: + * vlr->addr = vlr->sa_list; + * + * This approach may lead to issues when connecting to multiple addresses, + * as subsequent addresses cannot be accurately compared using the 'from' + * parameter in sctp_recvmsg. + * + * Since a proper solution is deferred, it is recommended to avoid using + * sctp_connectx with multiple addresses for the time being. + */ + vlr->addr = vlr->sa_list; vlr->poll = ogs_pollset_add(ogs_app()->pollset, OGS_POLLIN, sock->fd, lksctp_recv_handler, sock); ogs_assert(vlr->poll); diff --git a/tests/common/sctp.c b/tests/common/sctp.c index a08bcca7ca..575d8ca08a 100644 --- a/tests/common/sctp.c +++ b/tests/common/sctp.c @@ -54,7 +54,7 @@ ogs_socknode_t *testsctp_client(const char *ipstr, int port) node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock; @@ -82,7 +82,7 @@ ogs_socknode_t *tests1ap_client(int family) node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock; @@ -121,7 +121,7 @@ ogs_socknode_t *testngap_client(int index, int family) node = ogs_socknode_new(addr); ogs_assert(node); - sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL); + sock = ogs_sctp_client(SOCK_STREAM, node->addr, NULL, NULL); ogs_assert(sock); node->sock = sock; diff --git a/tests/sctp/sctp-test.c b/tests/sctp/sctp-test.c index 288e06b44a..4361852935 100644 --- a/tests/sctp/sctp-test.c +++ b/tests/sctp/sctp-test.c @@ -53,7 +53,7 @@ static void test1_func(abts_case *tc, void *data) rv = ogs_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, OGS_OK, rv); - rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST1_PORT2, AI_PASSIVE); + rv = ogs_getaddrinfo(&addr, AF_INET6, NULL, TEST1_PORT2, AI_PASSIVE); ABTS_INT_EQUAL(tc, OGS_OK, rv); sctp = ogs_sctp_server(SOCK_SEQPACKET, addr, NULL); ABTS_PTR_NOTNULL(tc, sctp); @@ -77,7 +77,7 @@ static void test2_main(void *data) rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST2_PORT, 0); ABTS_INT_EQUAL(tc, OGS_OK, rv); - sctp = ogs_sctp_client(SOCK_SEQPACKET, addr, NULL); + sctp = ogs_sctp_client(SOCK_SEQPACKET, addr, NULL, NULL); ABTS_PTR_NOTNULL(tc, sctp); size = ogs_sctp_recvdata(sctp, str, STRLEN, &from, &sinfo); @@ -192,7 +192,7 @@ static void test4_main(void *data) rv = ogs_getaddrinfo(&addr, AF_UNSPEC, NULL, TEST4_PORT, 0); ABTS_INT_EQUAL(tc, OGS_OK, rv); - sctp = ogs_sctp_client(SOCK_STREAM, addr, NULL); + sctp = ogs_sctp_client(SOCK_STREAM, addr, NULL, NULL); ABTS_PTR_NOTNULL(tc, sctp); size = ogs_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), NULL, PPID, 0); From 33532a5858b26cce49326a9d9765e124083add97 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 24 Dec 2024 15:22:00 +0900 Subject: [PATCH 284/323] [SGsAP] Refactor VLR Lookup to Use Socket Pointers Instead of Addresses (#3344) Updated the VLR (mme_vlr_t) lookup mechanism to identify VLR instances using socket pointers rather than IP addresses. Replaced the `mme_vlr_find_by_addr` function with `mme_vlr_find_by_sock` across relevant modules, including `mme-context.c`, `mme-context.h`, and `mme-sm.c`. Adjusted memory management for the `addr` field within the VLR structure to ensure proper allocation and deallocation. Removed address assignments in `sgsap-sctp.c` for usrsctp and updated logging to reflect the new socket-based identification. --- src/mme/mme-context.c | 8 +++++--- src/mme/mme-context.h | 4 ++-- src/mme/mme-sm.c | 24 +++++++++++++++--------- src/mme/sgsap-sctp.c | 20 +------------------- 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 547a1419ec..84038a524d 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2816,6 +2816,8 @@ void mme_vlr_remove(mme_vlr_t *vlr) ogs_freeaddrinfo(vlr->sa_list); ogs_freeaddrinfo(vlr->local_sa_list); + if (vlr->addr) + ogs_free(vlr->addr); if (vlr->option) ogs_free(vlr->option); @@ -2840,13 +2842,13 @@ void mme_vlr_close(mme_vlr_t *vlr) ogs_sctp_destroy(vlr->sock); } -mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr) +mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock) { mme_vlr_t *vlr = NULL; - ogs_assert(addr); + ogs_assert(sock); ogs_list_for_each(&self.vlr_list, vlr) { - if (ogs_sockaddr_is_equal(vlr->addr, addr) == true) + if (vlr->sock == sock) return vlr; } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 957140d89b..ab27c093af 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -219,7 +219,7 @@ typedef struct mme_vlr_s { ogs_sockaddr_t *local_sa_list; /* VLR SGsAP Socket Local Address List */ ogs_sock_t *sock; /* VLR SGsAP Socket */ - ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */ + ogs_sockaddr_t *addr; /* VLR SGsAP Socket Address */ ogs_sockopt_t *option; /* VLR SGsAP Socket Option */ ogs_poll_t *poll; /* VLR SGsAP Poll */ } mme_vlr_t; @@ -946,7 +946,7 @@ mme_vlr_t *mme_vlr_add( void mme_vlr_remove(mme_vlr_t *vlr); void mme_vlr_remove_all(void); void mme_vlr_close(mme_vlr_t *vlr); -mme_vlr_t *mme_vlr_find_by_addr(const ogs_sockaddr_t *addr); +mme_vlr_t *mme_vlr_find_by_sock(const ogs_sock_t *sock); mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr); void mme_csmap_remove(mme_csmap_t *csmap); diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 7cc0d4c634..36e3133096 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -978,12 +978,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) max_num_of_ostreams = e->max_num_of_ostreams; - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); - + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); + if (vlr->addr) + ogs_free(vlr->addr); + vlr->addr = addr; + vlr->max_num_of_ostreams = ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams); @@ -1003,12 +1005,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(addr->ogs_sa_family == AF_INET || addr->ogs_sa_family == AF_INET6); - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); - + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); + if (vlr->addr) + ogs_free(vlr->addr); + vlr->addr = addr; + if (OGS_FSM_CHECK(&vlr->sm, sgsap_state_connected)) { e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); @@ -1033,12 +1037,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(addr->ogs_sa_family == AF_INET || addr->ogs_sa_family == AF_INET6); - vlr = mme_vlr_find_by_addr(addr); - ogs_free(addr); - + vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); + if (vlr->addr) + ogs_free(vlr->addr); + vlr->addr = addr; + e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); diff --git a/src/mme/sgsap-sctp.c b/src/mme/sgsap-sctp.c index 99704022c6..3b8c680e17 100644 --- a/src/mme/sgsap-sctp.c +++ b/src/mme/sgsap-sctp.c @@ -44,33 +44,15 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) if (sock) { vlr->sock = sock; #if HAVE_USRSCTP - vlr->addr = vlr->sa_list; usrsctp_set_non_blocking((struct socket *)sock, 1); usrsctp_set_upcall((struct socket *)sock, usrsctp_recv_handler, NULL); #else - -/* - * Originally, the code assigned vlr->addr to the address of sock->remote_addr: - * vlr->addr = &sock->remote_addr; - * However, when using sctp_connectx, it was not easy to set remote_addr. - * Therefore, at this point, vlr->addr is now assigned to vlr->sa_list, - * utilizing the initially used address: - * vlr->addr = vlr->sa_list; - * - * This approach may lead to issues when connecting to multiple addresses, - * as subsequent addresses cannot be accurately compared using the 'from' - * parameter in sctp_recvmsg. - * - * Since a proper solution is deferred, it is recommended to avoid using - * sctp_connectx with multiple addresses for the time being. - */ - vlr->addr = vlr->sa_list; vlr->poll = ogs_pollset_add(ogs_app()->pollset, OGS_POLLIN, sock->fd, lksctp_recv_handler, sock); ogs_assert(vlr->poll); #endif ogs_info("sgsap client() [%s]:%d", - OGS_ADDR(vlr->addr, buf), OGS_PORT(vlr->addr)); + OGS_ADDR(vlr->sa_list, buf), OGS_PORT(vlr->sa_list)); } return sock; From 3b7654061fdaf742e88596e5a0b452df73b903ca Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 24 Dec 2024 15:30:46 +0900 Subject: [PATCH 285/323] [SCTP] Refactor SCTP socket creation to use address family from sa_list (#3344) Refactored the SCTP socket creation logic to dynamically select the address family based on the provided address list. A new function, `create_sctp_socket_from_addr_list`, was introduced to check for the presence of an IPv6 address in the address list and create an SCTP socket accordingly. If an IPv6 address is found, it uses AF_INET6; otherwise, it defaults to AF_INET. This change was applied to both the `ogs_sctp_server` and `ogs_sctp_client` functions. --- lib/sctp/ogs-lksctp.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index f9a0a27ecd..e4e0a85e45 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -53,6 +53,41 @@ ogs_sock_t *ogs_sctp_socket(int family, int type) return new; } +/** + * Creates an SCTP socket using the appropriate address family. + * If there is an IPv6 address in sa_list, it will use AF_INET6, + * otherwise, it will use AF_INET. + * + * @param sa_list List of addresses to check. + * @param type The type of the socket (e.g., SOCK_STREAM). + * @return The created SCTP socket, or NULL if creation failed. + */ +static ogs_sock_t *create_sctp_socket_from_addr_list( + ogs_sockaddr_t *sa_list, int type) +{ + ogs_sockaddr_t *addr = sa_list; + ogs_sock_t *new_sock = NULL; + + ogs_assert(sa_list); + + /* Check for the presence of an IPv6 address in sa_list */ + while (addr != NULL) { + if (addr->ogs_sa_family == AF_INET6) { + // If an IPv6 address is found, use AF_INET6 + new_sock = ogs_sctp_socket(AF_INET6, type); + break; + } + addr = addr->next; + } + + /* If no IPv6 address is found, default to AF_INET */ + if (!new_sock) { + new_sock = ogs_sctp_socket(AF_INET, type); + } + + return new_sock; +} + /** * @brief * 1) Count the number of addresses in sa_list and determine the total @@ -166,7 +201,7 @@ ogs_sock_t *ogs_sctp_server( * Create an SCTP socket using the family of the first address * in sa_list. */ - new_sock = ogs_sctp_socket(sa_list->ogs_sa_family, type); + new_sock = create_sctp_socket_from_addr_list(sa_list, type); if (!new_sock) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "sctp_server() Failed to create SCTP socket"); @@ -284,7 +319,7 @@ ogs_sock_t *ogs_sctp_client( * Create the SCTP socket using the address family of the first remote * address. */ - new_sock = ogs_sctp_socket(sa_list->ogs_sa_family, type); + new_sock = create_sctp_socket_from_addr_list(sa_list, type); if (!new_sock) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "sctp_client() Failed to create SCTP socket"); From 4016293214d5d5a1f5357e0230f6a4f9dcd1d043 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 24 Dec 2024 16:42:23 +0900 Subject: [PATCH 286/323] [SEC] Fix overflow issue with QFI in QoS flow and adjust URR access (#3642) - Modified the `ogs_nas_qos_rule_s` structure to increase the size of the `identifier` field from 4 bits to 6 bits in order to allow for larger QoS Flow Identifiers (QFI). - Adjusted the URR access logic in `upf_sess_urr_acc_add` to prevent out-of-bounds access by ensuring the URR ID is within the valid range. --- lib/nas/5gs/types.h | 2 +- src/upf/context.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index 49e3285041..3e56f26343 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -1049,7 +1049,7 @@ typedef struct ogs_nas_qos_rule_s { struct { ED3(uint8_t spare:1;, uint8_t segregation:1;, - uint8_t identifier:4;) + uint8_t identifier:6;) }; uint8_t flags; } flow; diff --git a/src/upf/context.c b/src/upf/context.c index 7c286fa821..6b3402acc2 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -682,9 +682,12 @@ uint8_t upf_sess_set_ue_ipv6_framed_routes(upf_sess_t *sess, void upf_sess_urr_acc_add(upf_sess_t *sess, ogs_pfcp_urr_t *urr, size_t size, bool is_uplink) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id-1]; uint64_t vol; + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; + /* Increment total & ul octets + pkts */ urr_acc->total_octets += size; urr_acc->total_pkts++; From 08b9e7c55f72649ef25b5407e7e4d938f0f16531 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 24 Dec 2024 17:14:50 +0900 Subject: [PATCH 287/323] [DBI] Fix crash in ogs_dbi_auth_info due to invalid SUPI (#3635) Added checks to validate the SUPI ID in the ogs_dbi_auth_info function before calling ogs_assert. This prevents a crash when the SUPI ID is malformed, such as when it does not contain a hyphen. The fix ensures that invalid SUPI values are logged and handled gracefully, avoiding assertion failures and crashes in the UDR. --- lib/dbi/subscription.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index ac8a44c908..25f849440c 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -39,9 +39,16 @@ int ogs_dbi_auth_info(char *supi, ogs_dbi_auth_info_t *auth_info) ogs_assert(auth_info); supi_type = ogs_id_get_type(supi); - ogs_assert(supi_type); + if (!supi_type) { + ogs_error("Invalid supi=%s", supi); + return OGS_ERROR; + } supi_id = ogs_id_get_value(supi); - ogs_assert(supi_id); + if (!supi_id) { + ogs_error("Invalid supi=%s", supi); + ogs_free(supi_type); + return OGS_ERROR; + } query = BCON_NEW(supi_type, BCON_UTF8(supi_id)); #if MONGOC_CHECK_VERSION(1, 5, 0) From 68375f6c35b2a3ec1377a4bf63bbb89e73ef7ac2 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 25 Dec 2024 11:09:07 +0900 Subject: [PATCH 288/323] [SGsAP] Change SCTP socket to SOCK_STREAM and remove 'addr' field (#3344) Addressed feedback on commit 33532a5 by switching SGsAP's SCTP socket from SOCK_SEQPACKET to SOCK_STREAM. This change eliminates the need for the 'addr' field, as SOCK_STREAM does not require specifying the address in sctp_sendmsg. All references to the 'addr' field have been removed from the VLR structure and related functions, simplifying SCTP message handling and ensuring better compatibility with multiple addresses. Updated `sgsap-sctp.c` accordingly to reflect these changes and improve the reliability of SCTP connections. --- lib/core/ogs-sockaddr.c | 28 +++++++++++++++++++++++++++ lib/core/ogs-sockaddr.h | 1 + lib/sctp/ogs-lksctp.c | 34 +++++++++++++++++++------------- lib/sctp/ogs-usrsctp.c | 40 ++++++++++++++++++++++++-------------- src/mme/mme-context.c | 2 -- src/mme/mme-context.h | 1 - src/mme/mme-event.c | 1 - src/mme/mme-sm.c | 43 ++++++++++------------------------------- src/mme/sgsap-path.c | 14 ++++++++------ src/mme/sgsap-path.h | 3 +-- src/mme/sgsap-sctp.c | 37 ++++++++++------------------------- 11 files changed, 105 insertions(+), 99 deletions(-) diff --git a/lib/core/ogs-sockaddr.c b/lib/core/ogs-sockaddr.c index fb8dbeb8c1..fb25ecd229 100644 --- a/lib/core/ogs-sockaddr.c +++ b/lib/core/ogs-sockaddr.c @@ -666,3 +666,31 @@ char *ogs_ipstrdup(ogs_sockaddr_t *addr) return ogs_strdup(buf); } + +char *ogs_sockaddr_strdup(ogs_sockaddr_t *sa_list) +{ + char dumpstr[OGS_HUGE_LEN]; + char *p, *last; + ogs_sockaddr_t *addr = NULL; + + last = dumpstr + OGS_HUGE_LEN; + p = dumpstr; + + addr = (ogs_sockaddr_t *)sa_list; + while (addr) { + char buf[OGS_ADDRSTRLEN]; + p = ogs_slprintf(p, last, "[%s]:%d ", + OGS_ADDR(addr, buf), OGS_PORT(addr)); + addr = addr->next; + } + + if (p > dumpstr) { + /* If there is more than one addr, remove the last character */ + *(p-1) = 0; + + return ogs_strdup(dumpstr); + } + + /* No address */ + return NULL; +} diff --git a/lib/core/ogs-sockaddr.h b/lib/core/ogs-sockaddr.h index a28e5b570e..817b68df15 100644 --- a/lib/core/ogs-sockaddr.h +++ b/lib/core/ogs-sockaddr.h @@ -125,6 +125,7 @@ int ogs_ipsubnet(ogs_ipsubnet_t *ipsub, char *ogs_gethostname(ogs_sockaddr_t *addr); char *ogs_ipstrdup(ogs_sockaddr_t *addr); +char *ogs_sockaddr_strdup(ogs_sockaddr_t *sa_list); #ifdef __cplusplus } diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index e4e0a85e45..27aa00b8c3 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -168,7 +168,7 @@ ogs_sock_t *ogs_sctp_server( ogs_sockopt_t *socket_option) { int rv; - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -249,8 +249,9 @@ ogs_sock_t *ogs_sctp_server( /* * Log debug info: only the first address is shown here as an example. */ - ogs_debug("sctp_server() [%s]:%d (bound %d addresses)", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list), addr_count); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_debug("sctp_server() %s (bound %d addresses)", sa_list_str, addr_count); + ogs_free(sa_list_str); /* Start listening for connections. */ rv = ogs_sock_listen(new_sock); @@ -270,9 +271,11 @@ ogs_sock_t *ogs_sctp_server( * On failure, log an error based on the first address * in sa_list (customize as needed). */ + sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_server() [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + "sctp_server() %s failed", sa_list_str); + ogs_free(sa_list_str); + return NULL; } @@ -283,7 +286,7 @@ ogs_sock_t *ogs_sctp_client( ogs_sockopt_t *socket_option) { int rv; - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -387,8 +390,9 @@ ogs_sock_t *ogs_sctp_client( } /* Debug log for the first remote address. */ - ogs_debug("sctp_client() connected to [%s]:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_debug("sctp_client() connected to %s", sa_list_str); + ogs_free(sa_list_str); /* Success: free buffers and return the new socket. */ if (local_buf) @@ -409,16 +413,18 @@ ogs_sock_t *ogs_sctp_client( * On failure, log an error based on the first remote address. * Adjust to your needs, e.g., log local too if necessary. */ + sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_client() [%s]:%d failed", - OGS_ADDR(sa_list, buf), - OGS_PORT(sa_list)); + "sctp_client() %s failed", sa_list_str); + ogs_free(sa_list_str); + return NULL; } int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { ogs_sockaddr_t *addr; + char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_assert(sock); @@ -439,9 +445,11 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) } if (addr == NULL) { + sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_connect() [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + "sctp_connect() %s failed", sa_list_str); + ogs_free(sa_list_str); + return OGS_ERROR; } diff --git a/lib/sctp/ogs-usrsctp.c b/lib/sctp/ogs-usrsctp.c index 066fecafa6..323118a194 100644 --- a/lib/sctp/ogs-usrsctp.c +++ b/lib/sctp/ogs-usrsctp.c @@ -93,6 +93,7 @@ ogs_sock_t *ogs_sctp_server( int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) { int rv; + char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *new = NULL; @@ -142,8 +143,10 @@ ogs_sock_t *ogs_sctp_server( } if (addr == NULL) { - ogs_error("sctp_server [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_error("sctp_server %s failed", sa_list_str); + ogs_free(sa_list_str); + return NULL; } @@ -161,6 +164,7 @@ ogs_sock_t *ogs_sctp_client( ogs_sockopt_t *socket_option) { int rv; + char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *new = NULL; @@ -210,8 +214,10 @@ ogs_sock_t *ogs_sctp_client( } if (addr == NULL) { - ogs_error("sctp_client [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_error("sctp_client %s failed", sa_list_str); + ogs_free(sa_list_str); + return NULL; } @@ -221,7 +227,7 @@ ogs_sock_t *ogs_sctp_client( int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; socklen_t addrlen; ogs_assert(socket); @@ -231,13 +237,16 @@ int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) ogs_assert(addrlen); if (usrsctp_bind(socket, &sa_list->sa, addrlen) != 0) { - ogs_error("sctp_bind() [%s]:%d failed", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_error("sctp_bind() %s failed", sa_list_str); + ogs_free(sa_list_str); + return OGS_ERROR; } - ogs_debug("sctp_bind() [%s]:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_debug("sctp_bind() %s", sa_list_str); + ogs_free(sa_list_str); return OGS_OK; } @@ -245,7 +254,7 @@ int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; socklen_t addrlen; ogs_assert(socket); @@ -255,13 +264,16 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) ogs_assert(addrlen); if (usrsctp_connect(socket, &sa_list->sa, addrlen) != 0) { - ogs_error("sctp_connect() [%s]:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_error("sctp_connect() %s", sa_list_str); + ogs_free(sa_list_str); + return OGS_ERROR; } - ogs_debug("sctp_connect() [%s]:%d", - OGS_ADDR(sa_list, buf), OGS_PORT(sa_list)); + sa_list_str = ogs_sockaddr_strdup(sa_list); + ogs_debug("sctp_connect() %s", sa_list_str); + ogs_free(sa_list_str); return OGS_OK; } diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 84038a524d..426ea274a9 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2816,8 +2816,6 @@ void mme_vlr_remove(mme_vlr_t *vlr) ogs_freeaddrinfo(vlr->sa_list); ogs_freeaddrinfo(vlr->local_sa_list); - if (vlr->addr) - ogs_free(vlr->addr); if (vlr->option) ogs_free(vlr->option); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index ab27c093af..4452bbbedd 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -219,7 +219,6 @@ typedef struct mme_vlr_s { ogs_sockaddr_t *local_sa_list; /* VLR SGsAP Socket Local Address List */ ogs_sock_t *sock; /* VLR SGsAP Socket */ - ogs_sockaddr_t *addr; /* VLR SGsAP Socket Address */ ogs_sockopt_t *option; /* VLR SGsAP Socket Option */ ogs_poll_t *poll; /* VLR SGsAP Poll */ } mme_vlr_t; diff --git a/src/mme/mme-event.c b/src/mme/mme-event.c index 483b02b12f..42ce405d75 100644 --- a/src/mme/mme-event.c +++ b/src/mme/mme-event.c @@ -117,7 +117,6 @@ void mme_sctp_event_push(mme_event_e id, ogs_assert(id); ogs_assert(sock); - ogs_assert(addr); e = mme_event_new(id); ogs_assert(e); diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 36e3133096..fbf74506b6 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -54,6 +54,7 @@ void mme_state_final(ogs_fsm_t *s, mme_event_t *e) void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) { int rv; + char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *sock = NULL; @@ -970,11 +971,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) case MME_EVENT_SGSAP_LO_SCTP_COMM_UP: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); - - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); max_num_of_ostreams = e->max_num_of_ostreams; @@ -982,15 +978,13 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); - if (vlr->addr) - ogs_free(vlr->addr); - vlr->addr = addr; - vlr->max_num_of_ostreams = ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams); - ogs_debug("VLR-SGs SCTP_COMM_UP[%s] Max Num of Outbound Streams[%d]", - OGS_ADDR(vlr->addr, buf), vlr->max_num_of_ostreams); + sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); + ogs_debug("VLR-SGs SCTP_COMM_UP %s Max Num of Outbound Streams[%d]", + sa_list_str, vlr->max_num_of_ostreams); + ogs_free(sa_list_str); e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); @@ -999,52 +993,35 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) case MME_EVENT_SGSAP_LO_CONNREFUSED: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); - - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); - if (vlr->addr) - ogs_free(vlr->addr); - vlr->addr = addr; - + sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); if (OGS_FSM_CHECK(&vlr->sm, sgsap_state_connected)) { e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); - ogs_info("VLR-SGs[%s] connection refused!!!", - OGS_ADDR(vlr->addr, buf)); + ogs_info("VLR-SGs %s connection refused!!!", sa_list_str); } else { - ogs_warn("VLR-SGs[%s] connection refused, Already Removed!", - OGS_ADDR(vlr->addr, buf)); + ogs_warn("VLR-SGs %s connection refused, Already Removed!", + sa_list_str); } + ogs_free(sa_list_str); break; case MME_EVENT_SGSAP_MESSAGE: sock = e->sock; ogs_assert(sock); - addr = e->addr; - ogs_assert(addr); pkbuf = e->pkbuf; ogs_assert(pkbuf); - ogs_assert(addr->ogs_sa_family == AF_INET || - addr->ogs_sa_family == AF_INET6); - vlr = mme_vlr_find_by_sock(sock); ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); - if (vlr->addr) - ogs_free(vlr->addr); - vlr->addr = addr; - e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); diff --git a/src/mme/sgsap-path.c b/src/mme/sgsap-path.c index a42915aa1a..b3e70a4f98 100644 --- a/src/mme/sgsap-path.c +++ b/src/mme/sgsap-path.c @@ -53,8 +53,7 @@ void sgsap_close(void) } } -int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, - ogs_sockaddr_t *addr, uint16_t stream_no) +int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, uint16_t stream_no) { int sent; @@ -62,7 +61,7 @@ int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, ogs_assert(pkbuf); sent = ogs_sctp_sendmsg(sock, pkbuf->data, pkbuf->len, - addr, OGS_SCTP_SGSAP_PPID, stream_no); + NULL, OGS_SCTP_SGSAP_PPID, stream_no); if (sent < 0 || sent != pkbuf->len) { ogs_error("ogs_sctp_sendmsg(len:%d,ssn:%d) error (%d:%s)", pkbuf->len, stream_no, errno, strerror(errno)); @@ -77,7 +76,7 @@ int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, int sgsap_send_to_vlr_with_sid( mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no) { - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; ogs_sock_t *sock = NULL;; ogs_assert(vlr); @@ -85,8 +84,11 @@ int sgsap_send_to_vlr_with_sid( sock = vlr->sock; ogs_assert(sock); - ogs_debug(" VLR-IP[%s]", OGS_ADDR(vlr->addr, buf)); - return sgsap_send(sock, pkbuf, vlr->addr, stream_no); + sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); + ogs_debug(" StreamNO[%d] VLR-IP[%s]", stream_no, sa_list_str); + ogs_free(sa_list_str); + + return sgsap_send(sock, pkbuf, stream_no); } int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf) diff --git a/src/mme/sgsap-path.h b/src/mme/sgsap-path.h index 0c22996a82..897019c9bc 100644 --- a/src/mme/sgsap-path.h +++ b/src/mme/sgsap-path.h @@ -36,8 +36,7 @@ void sgsap_close(void); ogs_sock_t *sgsap_client(mme_vlr_t *vlr); -int sgsap_send(ogs_sock_t *sock, - ogs_pkbuf_t *pkbuf, ogs_sockaddr_t *addr, uint16_t stream_no); +int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, uint16_t stream_no); int sgsap_send_to_vlr_with_sid( mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no); diff --git a/src/mme/sgsap-sctp.c b/src/mme/sgsap-sctp.c index 3b8c680e17..0b21a1b607 100644 --- a/src/mme/sgsap-sctp.c +++ b/src/mme/sgsap-sctp.c @@ -34,12 +34,12 @@ static void recv_handler(ogs_sock_t *sock); ogs_sock_t *sgsap_client(mme_vlr_t *vlr) { - char buf[OGS_ADDRSTRLEN]; + char *sa_list_str = NULL; ogs_sock_t *sock = NULL; ogs_assert(vlr); - sock = ogs_sctp_client(SOCK_SEQPACKET, + sock = ogs_sctp_client(SOCK_STREAM, vlr->sa_list, vlr->local_sa_list, vlr->option); if (sock) { vlr->sock = sock; @@ -51,8 +51,9 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) OGS_POLLIN, sock->fd, lksctp_recv_handler, sock); ogs_assert(vlr->poll); #endif - ogs_info("sgsap client() [%s]:%d", - OGS_ADDR(vlr->sa_list, buf), OGS_PORT(vlr->sa_list)); + sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); + ogs_info("sgsap client() %s", sa_list_str); + ogs_free(sa_list_str); } return sock; @@ -85,8 +86,6 @@ static void recv_handler(ogs_sock_t *sock) { ogs_pkbuf_t *pkbuf; int size; - ogs_sockaddr_t *addr = NULL; - ogs_sockaddr_t from; ogs_sctp_info_t sinfo; int flags = 0; @@ -96,7 +95,7 @@ static void recv_handler(ogs_sock_t *sock) ogs_assert(pkbuf); ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); size = ogs_sctp_recvmsg( - sock, pkbuf->data, pkbuf->len, &from, &sinfo, &flags); + sock, pkbuf->data, pkbuf->len, NULL, &sinfo, &flags); if (size < 0 || size >= OGS_MAX_SDU_LEN) { ogs_error("ogs_sctp_recvmsg(%d) failed(%d:%s)", size, errno, strerror(errno)); @@ -121,12 +120,8 @@ static void recv_handler(ogs_sock_t *sock) if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) { ogs_debug("SCTP_COMM_UP"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - sgsap_event_push(MME_EVENT_SGSAP_LO_SCTP_COMM_UP, - sock, addr, NULL, + sock, NULL, NULL, not->sn_assoc_change.sac_inbound_streams, not->sn_assoc_change.sac_outbound_streams); } else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP || @@ -137,12 +132,8 @@ static void recv_handler(ogs_sock_t *sock) if (not->sn_assoc_change.sac_state == SCTP_COMM_LOST) ogs_debug("SCTP_COMM_LOST"); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - sgsap_event_push(MME_EVENT_SGSAP_LO_CONNREFUSED, - sock, addr, NULL, 0, 0); + sock, NULL, NULL, 0, 0); } break; case SCTP_SHUTDOWN_EVENT : @@ -165,12 +156,8 @@ static void recv_handler(ogs_sock_t *sock) not->sn_send_failed.ssf_error); #endif - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - sgsap_event_push(MME_EVENT_SGSAP_LO_CONNREFUSED, - sock, addr, NULL, 0, 0); + sock, NULL, NULL, 0, 0); break; case SCTP_PEER_ADDR_CHANGE: ogs_warn("SCTP_PEER_ADDR_CHANGE:[T:%d, F:0x%x, S:%d]", @@ -192,11 +179,7 @@ static void recv_handler(ogs_sock_t *sock) } else if (flags & MSG_EOR) { ogs_pkbuf_trim(pkbuf, size); - addr = ogs_calloc(1, sizeof(ogs_sockaddr_t)); - ogs_assert(addr); - memcpy(addr, &from, sizeof(ogs_sockaddr_t)); - - sgsap_event_push(MME_EVENT_SGSAP_MESSAGE, sock, addr, pkbuf, 0, 0); + sgsap_event_push(MME_EVENT_SGSAP_MESSAGE, sock, NULL, pkbuf, 0, 0); return; } else { if (ogs_socket_errno != OGS_EAGAIN) { From badbefe7b35b788011f3b4cbfd0222a51f941801 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 25 Dec 2024 12:21:35 +0900 Subject: [PATCH 289/323] [SGsAP] Refactor SCTP socket creation (#3344) - Removed `create_sctp_socket_from_addr_list` function. - Introduced direct use of `sctp_socket_family_from_addr_list` in `ogs_sctp_server` and `ogs_sctp_client`. - Ensured proper handling of address family selection for SCTP sockets, defaulting to `AF_INET` or `AF_INET6` based on the address list. - Added error handling for cases where no suitable address family is found. --- lib/sctp/ogs-lksctp.c | 81 +++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index 27aa00b8c3..79506adc67 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -54,40 +54,36 @@ ogs_sock_t *ogs_sctp_socket(int family, int type) } /** - * Creates an SCTP socket using the appropriate address family. - * If there is an IPv6 address in sa_list, it will use AF_INET6, - * otherwise, it will use AF_INET. + * Determines the appropriate SCTP socket family based on the provided + * address list. + * Returns AF_INET6 if any address in sa_list is IPv6, otherwise AF_INET. + * Returns AF_UNSPEC if sa_list is NULL or no suitable family is found. * * @param sa_list List of addresses to check. - * @param type The type of the socket (e.g., SOCK_STREAM). - * @return The created SCTP socket, or NULL if creation failed. + * @return AF_INET6, AF_INET, or AF_UNSPEC if no suitable family is found. */ -static ogs_sock_t *create_sctp_socket_from_addr_list( - ogs_sockaddr_t *sa_list, int type) +static int sctp_socket_family_from_addr_list(const ogs_sockaddr_t *sa_list) { - ogs_sockaddr_t *addr = sa_list; - ogs_sock_t *new_sock = NULL; + const ogs_sockaddr_t *addr = sa_list; - ogs_assert(sa_list); + if (!sa_list) { + ogs_error("Address list is NULL"); + return AF_UNSPEC; + } - /* Check for the presence of an IPv6 address in sa_list */ + /* Iterate through the address list to find an IPv6 address */ while (addr != NULL) { if (addr->ogs_sa_family == AF_INET6) { - // If an IPv6 address is found, use AF_INET6 - new_sock = ogs_sctp_socket(AF_INET6, type); - break; + return AF_INET6; } addr = addr->next; } - /* If no IPv6 address is found, default to AF_INET */ - if (!new_sock) { - new_sock = ogs_sctp_socket(AF_INET, type); - } - - return new_sock; + /* Default to AF_INET if no IPv6 address is found */ + return AF_INET; } + /** * @brief * 1) Count the number of addresses in sa_list and determine the total @@ -169,6 +165,7 @@ ogs_sock_t *ogs_sctp_server( { int rv; char *sa_list_str = NULL; + int sa_family; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -178,6 +175,7 @@ ogs_sock_t *ogs_sctp_server( int total_len = 0; ogs_assert(sa_list); + sa_list_str = ogs_sockaddr_strdup(sa_list); /* Initialize socket options. */ ogs_sockopt_init(&option); @@ -194,20 +192,22 @@ ogs_sock_t *ogs_sctp_server( sa_list, &addr_count, &total_len); if (!addr_buf) { /* The helper logs errors, so just return. */ - return NULL; + ogs_error("create_continuous_address_buffer() failed"); + goto err; } - /* - * Create an SCTP socket using the family of the first address - * in sa_list. - */ - new_sock = create_sctp_socket_from_addr_list(sa_list, type); - if (!new_sock) { + /* Determine the appropriate address family from sa_list */ + sa_family = sctp_socket_family_from_addr_list(sa_list); + if (sa_family == AF_UNSPEC) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_server() Failed to create SCTP socket"); + "sctp_client() No suitable address family found " + "in sa_list"); goto err; } + /* Create the SCTP socket using the determined address family */ + new_sock = ogs_sctp_socket(sa_family, type); + /* Configure SCTP-specific options. */ rv = ogs_sctp_peer_addr_params(new_sock, &option); ogs_assert(rv == OGS_OK); @@ -249,7 +249,6 @@ ogs_sock_t *ogs_sctp_server( /* * Log debug info: only the first address is shown here as an example. */ - sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_debug("sctp_server() %s (bound %d addresses)", sa_list_str, addr_count); ogs_free(sa_list_str); @@ -271,7 +270,6 @@ ogs_sock_t *ogs_sctp_server( * On failure, log an error based on the first address * in sa_list (customize as needed). */ - sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "sctp_server() %s failed", sa_list_str); ogs_free(sa_list_str); @@ -287,6 +285,7 @@ ogs_sock_t *ogs_sctp_client( { int rv; char *sa_list_str = NULL; + int sa_family; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -301,6 +300,7 @@ ogs_sock_t *ogs_sctp_client( int local_len = 0; ogs_assert(sa_list); + sa_list_str = ogs_sockaddr_strdup(sa_list); /* Initialize socket options and copy user-provided options if present. */ ogs_sockopt_init(&option); @@ -314,21 +314,22 @@ ogs_sock_t *ogs_sctp_client( remote_buf = create_continuous_address_buffer( sa_list, &remote_count, &remote_len); if (!remote_buf) { - /* Logs and returns NULL on failure. */ - return NULL; + ogs_error("create_continuous_address_buffer() failed"); + goto err; } - /* - * Create the SCTP socket using the address family of the first remote - * address. - */ - new_sock = create_sctp_socket_from_addr_list(sa_list, type); - if (!new_sock) { + /* Determine the appropriate address family from sa_list */ + sa_family = sctp_socket_family_from_addr_list(sa_list); + if (sa_family == AF_UNSPEC) { ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_client() Failed to create SCTP socket"); + "sctp_client() No suitable address family found " + "in sa_list"); goto err; } + /* Create the SCTP socket using the determined address family */ + new_sock = ogs_sctp_socket(sa_family, type); + /* Configure SCTP-specific options. */ rv = ogs_sctp_peer_addr_params(new_sock, &option); ogs_assert(rv == OGS_OK); @@ -390,7 +391,6 @@ ogs_sock_t *ogs_sctp_client( } /* Debug log for the first remote address. */ - sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_debug("sctp_client() connected to %s", sa_list_str); ogs_free(sa_list_str); @@ -413,7 +413,6 @@ ogs_sock_t *ogs_sctp_client( * On failure, log an error based on the first remote address. * Adjust to your needs, e.g., log local too if necessary. */ - sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "sctp_client() %s failed", sa_list_str); ogs_free(sa_list_str); From 2ce9f2b27edf2ad004f5cf816422eb8639592d87 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 25 Dec 2024 18:04:42 +0900 Subject: [PATCH 290/323] [SEC] Fix overflow issue of adjusting the URR access (#3642) Adjusted the URR access logic to prevent out-of-bounds access by ensuring the URR ID is within the valid range. --- src/upf/context.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/upf/context.c b/src/upf/context.c index 6b3402acc2..84b1d30573 100644 --- a/src/upf/context.c +++ b/src/upf/context.c @@ -682,7 +682,7 @@ uint8_t upf_sess_set_ue_ipv6_framed_routes(upf_sess_t *sess, void upf_sess_urr_acc_add(upf_sess_t *sess, ogs_pfcp_urr_t *urr, size_t size, bool is_uplink) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id-1]; + upf_sess_urr_acc_t *urr_acc = NULL; uint64_t vol; ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); @@ -725,10 +725,13 @@ void upf_sess_urr_acc_add(upf_sess_t *sess, ogs_pfcp_urr_t *urr, size_t size, bo void upf_sess_urr_acc_fill_usage_report(upf_sess_t *sess, const ogs_pfcp_urr_t *urr, ogs_pfcp_user_plane_report_t *report, unsigned int idx) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; ogs_time_t last_report_timestamp; ogs_time_t now; + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; + now = ogs_time_now(); /* we need UTC for start_time and end_time */ if (urr_acc->last_report.timestamp) @@ -783,7 +786,11 @@ void upf_sess_urr_acc_fill_usage_report(upf_sess_t *sess, const ogs_pfcp_urr_t * void upf_sess_urr_acc_snapshot(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; + urr_acc->last_report.total_octets = urr_acc->total_octets; urr_acc->last_report.dl_octets = urr_acc->dl_octets; urr_acc->last_report.ul_octets = urr_acc->ul_octets; @@ -819,7 +826,10 @@ static void upf_sess_urr_acc_timers_cb(void *data) static void upf_sess_urr_acc_validity_time_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; ogs_debug("Installing URR Quota Validity Time timer"); urr_acc->reporting_enabled = true; @@ -832,7 +842,10 @@ static void upf_sess_urr_acc_validity_time_setup(upf_sess_t *sess, ogs_pfcp_urr_ static void upf_sess_urr_acc_time_quota_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; ogs_debug("Installing URR Time Quota timer"); urr_acc->reporting_enabled = true; @@ -844,7 +857,10 @@ static void upf_sess_urr_acc_time_quota_setup(upf_sess_t *sess, ogs_pfcp_urr_t * static void upf_sess_urr_acc_time_threshold_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; ogs_debug("Installing URR Time Threshold timer"); urr_acc->reporting_enabled = true; @@ -857,7 +873,11 @@ static void upf_sess_urr_acc_time_threshold_setup(upf_sess_t *sess, ogs_pfcp_urr void upf_sess_urr_acc_timers_setup(upf_sess_t *sess, ogs_pfcp_urr_t *urr) { - upf_sess_urr_acc_t *urr_acc = &sess->urr_acc[urr->id]; + upf_sess_urr_acc_t *urr_acc = NULL; + + ogs_assert(urr->id > 0 && urr->id <= OGS_MAX_NUM_OF_URR); + urr_acc = &sess->urr_acc[urr->id-1]; + urr_acc->time_start = ogs_time_ntp32_now(); if (urr->rep_triggers.quota_validity_time && urr->quota_validity_time > 0) upf_sess_urr_acc_validity_time_setup(sess, urr); From 33960bbb66b4ea2b5d36c2302e34cf2818deedea Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 26 Dec 2024 14:36:00 +0900 Subject: [PATCH 291/323] [NRF] Implemented PLMN list update handling in nrf_nnrf_handle_nf_update (#3566) - Added functionality to parse and validate the plmnList JSON array during a PATCH request. - Updated the nf_instance structure with new PLMN data from the request. - Ensured robust error handling for invalid PLMN entries and excessive PLMN counts. - Responded with appropriate HTTP status codes for success and error scenarios. --- lib/sbi/conv.c | 29 ++++++++ lib/sbi/conv.h | 2 + lib/sbi/message.h | 1 + src/nrf/nnrf-handler.c | 159 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 185 insertions(+), 6 deletions(-) diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index acbcbf7e57..8e133a4ddb 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -1205,6 +1205,35 @@ void ogs_sbi_free_plmn_list(OpenAPI_list_t *PlmnList) OpenAPI_list_free(PlmnList); } +/** + * Compares an ogs_plmn_id_t structure with an OpenAPI_plmn_id_t structure. + * + * @param plmn_list The PLMN-ID in ogs_plmn_id_t format. + * @param PlmnList The PLMN-ID in OpenAPI_plmn_id_t format. + * @return true if the PLMN-IDs are equal; otherwise, false. + */ +bool ogs_sbi_compare_plmn_list( + ogs_plmn_id_t *plmn_id, OpenAPI_plmn_id_t *PlmnId) +{ + ogs_plmn_id_t temp_plmn_id; + + ogs_assert(plmn_id); + ogs_assert(PlmnId); + ogs_assert(PlmnId->mcc); + ogs_assert(PlmnId->mnc); + + /* Convert OpenAPI_plmn_id_t to ogs_plmn_id_t */ + ogs_sbi_parse_plmn_id(&temp_plmn_id, PlmnId); + + /* Compare MCC and MNC values */ + if (ogs_plmn_id_mcc(plmn_id) == ogs_plmn_id_mcc(&temp_plmn_id) && + ogs_plmn_id_mnc(plmn_id) == ogs_plmn_id_mnc(&temp_plmn_id)) { + return true; + } + + return false; +} + OpenAPI_plmn_id_nid_t *ogs_sbi_build_plmn_id_nid(ogs_plmn_id_t *plmn_id) { OpenAPI_plmn_id_nid_t *PlmnIdNid = NULL; diff --git a/lib/sbi/conv.h b/lib/sbi/conv.h index dc01e3069f..6a7d055f77 100644 --- a/lib/sbi/conv.h +++ b/lib/sbi/conv.h @@ -98,6 +98,8 @@ OpenAPI_list_t *ogs_sbi_build_plmn_list( int ogs_sbi_parse_plmn_list( ogs_plmn_id_t *plmn_list, OpenAPI_list_t *PlmnList); void ogs_sbi_free_plmn_list(OpenAPI_list_t *PlmnList); +bool ogs_sbi_compare_plmn_list( + ogs_plmn_id_t *plmn_id, OpenAPI_plmn_id_t *PlmnId); OpenAPI_plmn_id_nid_t *ogs_sbi_build_plmn_id_nid(ogs_plmn_id_t *plmn_id); bool ogs_sbi_parse_plmn_id_nid( diff --git a/lib/sbi/message.h b/lib/sbi/message.h index c41d01e8a9..e303862e67 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -150,6 +150,7 @@ extern "C" { #define OGS_SBI_PATCH_PATH_NF_STATUS "/nfStatus" #define OGS_SBI_PATCH_PATH_LOAD "/load" +#define OGS_SBI_PATCH_PATH_PLMN_LIST "/plmnList" #define OGS_SBI_PATCH_PATH_VALIDITY_TIME "/validityTime" diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index c77e187810..d82a5040df 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -25,6 +25,15 @@ static int discover_handler( static void handle_nf_discover_search_result( OpenAPI_search_result_t *SearchResult); +/** + * Handles NF registration in NRF. Validates the PLMN-ID against configured + * serving PLMN-IDs and registers the NF instance if valid. + * + * @param nf_instance The NF instance being registered. + * @param stream The SBI stream for communication. + * @param recvmsg The received SBI message. + * @return true if registration is successful; otherwise, false. + */ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg) { @@ -33,6 +42,10 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, OpenAPI_nf_profile_t *NFProfile = NULL; + OpenAPI_lnode_t *node = NULL; + bool plmn_valid = false; + int i; + ogs_assert(nf_instance); ogs_assert(stream); ogs_assert(recvmsg); @@ -73,6 +86,41 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, return false; } + /* Validate the PLMN-ID against configured serving PLMN-IDs */ + if (NFProfile->plmn_list) { + /* Set PLMN status to invalid */ + plmn_valid = false; + + if (ogs_local_conf()->num_of_serving_plmn_id > 0 && NFProfile->plmn_list) { + OpenAPI_list_for_each(NFProfile->plmn_list, node) { + OpenAPI_plmn_id_t *PlmnId = node->data; + if (PlmnId == NULL) { + continue; + } + for (i = 0; i < ogs_local_conf()->num_of_serving_plmn_id; i++) { + if (ogs_sbi_compare_plmn_list( + &ogs_local_conf()->serving_plmn_id[i], + PlmnId) == true) { + plmn_valid = true; + break; + } + } + if (plmn_valid) { + break; + } + } + } + + /* Reject the registration if PLMN-ID is invalid */ + if (!plmn_valid) { + ogs_error("PLMN-ID in NFProfile is not allowed"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "PLMN-ID not allowed", NULL, NULL)); + return false; + } + } + ogs_nnrf_nfm_handle_nf_profile(nf_instance, NFProfile); ogs_sbi_client_associate(nf_instance); @@ -146,7 +194,6 @@ bool nrf_nnrf_handle_nf_register(ogs_sbi_nf_instance_t *nf_instance, if (ogs_local_conf()->num_of_serving_plmn_id && NFProfile->plmn_list == NULL) { OpenAPI_list_t *PlmnIdList = NULL; - int i; PlmnIdList = OpenAPI_list_create(); ogs_assert(PlmnIdList); @@ -208,6 +255,10 @@ bool nrf_nnrf_handle_nf_update(ogs_sbi_nf_instance_t *nf_instance, ogs_assert(stream); ogs_assert(recvmsg); + cJSON *plmn_array = NULL, *plmn_item = NULL; + bool plmn_valid = false; + int i; + SWITCH(recvmsg->h.method) CASE(OGS_SBI_HTTP_METHOD_PUT) return nrf_nnrf_handle_nf_register( @@ -224,14 +275,14 @@ bool nrf_nnrf_handle_nf_update(ogs_sbi_nf_instance_t *nf_instance, return false; } + /* Iterate through the PatchItemList */ OpenAPI_list_for_each(PatchItemList, node) { OpenAPI_patch_item_t *patch_item = node->data; if (!patch_item) { ogs_error("No PatchItem"); - ogs_assert(true == - ogs_sbi_server_send_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - recvmsg, "No PatchItem", NULL, NULL)); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "No PatchItem", NULL, NULL)); return false; } @@ -246,6 +297,102 @@ bool nrf_nnrf_handle_nf_update(ogs_sbi_nf_instance_t *nf_instance, break; CASE(OGS_SBI_PATCH_PATH_LOAD) break; + CASE(OGS_SBI_PATCH_PATH_PLMN_LIST) + /* Ensure the value is not null and is a valid JSON array */ + if (patch_item->value && patch_item->value->json) { + /* Set PLMN status to invalid */ + plmn_valid = false; + + plmn_array = patch_item->value->json; + if (!cJSON_IsArray(plmn_array)) { + ogs_error("Value for /plmnList is not a JSON array"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "Invalid value for /plmnList", NULL, NULL)); + return false; + } + + /* Clear existing PLMN data in nf_instance */ + memset(nf_instance->plmn_id, 0, + sizeof(nf_instance->plmn_id)); + nf_instance->num_of_plmn_id = 0; + + /* Iterate through the JSON array of PLMN IDs */ + cJSON_ArrayForEach(plmn_item, plmn_array) { + OpenAPI_plmn_id_t plmn_id; + memset(&plmn_id, 0, sizeof(plmn_id)); + + if (nf_instance->num_of_plmn_id >= + OGS_ARRAY_SIZE(nf_instance->plmn_id)) { + ogs_error("Exceeded maximum number of PLMN IDs"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, + "Too many PLMN IDs", NULL, NULL)); + return false; + } + + /* Parse the PLMN item */ + plmn_id.mcc = cJSON_GetObjectItem(plmn_item, "mcc") + ? cJSON_GetStringValue( + cJSON_GetObjectItem( + plmn_item, "mcc")) + : NULL; + plmn_id.mnc = cJSON_GetObjectItem(plmn_item, "mnc") + ? cJSON_GetStringValue( + cJSON_GetObjectItem( + plmn_item, "mnc")) + : NULL; + + if (!plmn_id.mcc || !plmn_id.mnc) { + ogs_error( + "Invalid PLMN item in /plmnList update"); + ogs_assert(true == + ogs_sbi_server_send_error( + stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, + "Invalid PLMN item", NULL, + NULL)); + return false; + } + + /* + * Convert OpenAPI_plmn_id_t to ogs_plmn_id_t + * and store in nf_instance + */ + ogs_sbi_parse_plmn_id( + &nf_instance-> + plmn_id[nf_instance->num_of_plmn_id], + &plmn_id); + nf_instance->num_of_plmn_id++; + + /* Compare with the serving PLMN list */ + for (i = 0; + i < ogs_local_conf()->num_of_serving_plmn_id; + i++) { + if (ogs_sbi_compare_plmn_list( + &ogs_local_conf()->serving_plmn_id[i], + &plmn_id) == true) { + plmn_valid = true; + break; + } + } + if (plmn_valid) { + break; + } + } + + /* Reject the update if PLMN-ID is invalid */ + if (!plmn_valid) { + ogs_error("PLMN-ID in NFProfile update is not allowed"); + ogs_assert(true == ogs_sbi_server_send_error( + stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, recvmsg, + "PLMN-ID not allowed", NULL, NULL)); + return false; + } + } + break; DEFAULT ogs_error("Unknown PatchItem.Path [%s]", patch_item->path); END From 3f6f2a8846106e30c4a2fc5034be46cc48562027 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 30 Dec 2024 21:20:01 +0900 Subject: [PATCH 292/323] [SBI] Enable SSL Key Logging for Enhanced Debugging and Analysis (#3647) - Add `sslkeylogfile` configuration options to `*.yaml.in` in NFs. - Update `open5gs-common.dirs` to include `var/log/open5gs/tls` directory - Extend `ogs_sbi_context_s` structure in `context.h` to include `sslkeylog` - Modify `context.c` to parse and handle `sslkeylogfile` settings - Update `server.c` and `server.h` to manage the `sslkeylog` field in server structures - Update `ogs_sbi_client_add` and `ogs_sbi_client_remove` functions to handle `sslkeylog` field. - Adjust `meson.build` to create the TLS log directory during installation This commit introduces SSL key logging functionality to Open5GS, enabling the capture of SSL/TLS keys. This feature is essential for debugging encrypted traffic and allows integration with tools like Wireshark for decrypting TLS sessions. --- configs/open5gs/amf.yaml.in | 18 ++++++++++ configs/open5gs/ausf.yaml.in | 21 ++++++++++++ configs/open5gs/bsf.yaml.in | 21 ++++++++++++ configs/open5gs/nrf.yaml.in | 18 ++++++++++ configs/open5gs/nssf.yaml.in | 25 ++++++++++++++ configs/open5gs/pcf.yaml.in | 21 ++++++++++++ configs/open5gs/scp.yaml.in | 21 ++++++++++++ configs/open5gs/sepp1.yaml.in | 30 +++++++++++++++++ configs/open5gs/sepp2.yaml.in | 32 ++++++++++++++++++ configs/open5gs/smf.yaml.in | 21 ++++++++++++ configs/open5gs/udm.yaml.in | 22 ++++++++++++- configs/open5gs/udr.yaml.in | 21 ++++++++++++ debian/open5gs-common.dirs | 2 +- lib/sbi/client.c | 36 +++++++++++++++++++- lib/sbi/client.h | 2 +- lib/sbi/context.c | 62 ++++++++++++++++++++++++++++++++++- lib/sbi/context.h | 4 +++ lib/sbi/nghttp2-server.c | 15 +++++++-- lib/sbi/server.c | 4 +++ lib/sbi/server.h | 2 +- meson.build | 2 +- 21 files changed, 391 insertions(+), 9 deletions(-) diff --git a/configs/open5gs/amf.yaml.in b/configs/open5gs/amf.yaml.in index 24e2c97576..0970736cd1 100644 --- a/configs/open5gs/amf.yaml.in +++ b/configs/open5gs/amf.yaml.in @@ -117,6 +117,24 @@ amf: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/nrf.key +# cert: @sysconfdir@/open5gs/tls/nrf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-client-sslkeylog.log +# sbi: +# server: +# - address: nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/ausf.yaml.in b/configs/open5gs/ausf.yaml.in index db4c79f571..e20b89b5b0 100644 --- a/configs/open5gs/ausf.yaml.in +++ b/configs/open5gs/ausf.yaml.in @@ -80,6 +80,27 @@ ausf: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/ausf.key +# cert: @sysconfdir@/open5gs/tls/ausf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/ausf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/ausf-client-sslkeylog.log +# sbi: +# server: +# - address: ausf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/bsf.yaml.in b/configs/open5gs/bsf.yaml.in index 37ceced210..88d166770a 100644 --- a/configs/open5gs/bsf.yaml.in +++ b/configs/open5gs/bsf.yaml.in @@ -80,6 +80,27 @@ bsf: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/bsf.key +# cert: @sysconfdir@/open5gs/tls/bsf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/bsf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/bsf-client-sslkeylog.log +# sbi: +# server: +# - address: bsf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in index e082c0fb83..1a612080c4 100644 --- a/configs/open5gs/nrf.yaml.in +++ b/configs/open5gs/nrf.yaml.in @@ -51,6 +51,24 @@ nrf: # server: # - address: nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/nrf.key +# cert: @sysconfdir@/open5gs/tls/nrf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/nrf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/nrf-client-sslkeylog.log +# sbi: +# server: +# - address: nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/nssf.yaml.in b/configs/open5gs/nssf.yaml.in index 258ff7825e..6686bc7a37 100644 --- a/configs/open5gs/nssf.yaml.in +++ b/configs/open5gs/nssf.yaml.in @@ -110,6 +110,31 @@ nssf: # s_nssai: # sst: 1 # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/nssf.key +# cert: @sysconfdir@/open5gs/tls/nssf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/nssf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/nssf-client-sslkeylog.log +# sbi: +# server: +# - address: nssf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# nsi: +# - uri: https://nrf.localdomain +# s_nssai: +# sst: 1 +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index afe96458be..0bfc6c994b 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -206,6 +206,27 @@ pcf: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/pcf.key +# cert: @sysconfdir@/open5gs/tls/pcf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/pcf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/pcf-client-sslkeylog.log +# sbi: +# server: +# - address: pcf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/scp.yaml.in b/configs/open5gs/scp.yaml.in index 3d80497eba..1a5e384ba7 100644 --- a/configs/open5gs/scp.yaml.in +++ b/configs/open5gs/scp.yaml.in @@ -105,6 +105,27 @@ scp: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/scp.key +# cert: @sysconfdir@/open5gs/tls/scp.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/scp-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/scp-client-sslkeylog.log +# sbi: +# server: +# - address: scp.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/sepp1.yaml.in b/configs/open5gs/sepp1.yaml.in index afa276a352..46d774ca5d 100644 --- a/configs/open5gs/sepp1.yaml.in +++ b/configs/open5gs/sepp1.yaml.in @@ -148,6 +148,36 @@ sepp: # uri: https://sepp2.localdomain # resolve: 127.0.2.251 # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# private_key: @sysconfdir@/open5gs/tls/sepp1.key +# cert: @sysconfdir@/open5gs/tls/sepp1.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp1-server-sslkeylog.log +# client: +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp1-client-sslkeylog.log +# sbi: +# server: +# - address: 127.0.1.250 +# port: 7777 +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# n32: +# server: +# - sender: sepp1.localdomain +# scheme: https +# address: 127.0.1.251 +# client: +# sepp: +# - receiver: sepp2.localdomain +# uri: https://sepp2.localdomain +# resolve: 127.0.2.251 +# # o Add client TLS verification to N32 interface # default: # tls: diff --git a/configs/open5gs/sepp2.yaml.in b/configs/open5gs/sepp2.yaml.in index fc78fb2563..2b67f3f35c 100644 --- a/configs/open5gs/sepp2.yaml.in +++ b/configs/open5gs/sepp2.yaml.in @@ -14,8 +14,10 @@ sepp: server: private_key: @sysconfdir@/open5gs/tls/sepp2.key cert: @sysconfdir@/open5gs/tls/sepp2.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-server-sslkeylog.log client: cacert: @sysconfdir@/open5gs/tls/ca.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-client-sslkeylog.log sbi: server: - address: 127.0.2.250 @@ -148,6 +150,36 @@ sepp: # uri: https://sepp1.localdomain # resolve: 127.0.1.251 # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# private_key: @sysconfdir@/open5gs/tls/sepp2.key +# cert: @sysconfdir@/open5gs/tls/sepp2.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-server-sslkeylog.log +# client: +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/sepp2-client-sslkeylog.log +# sbi: +# server: +# - address: 127.0.2.250 +# port: 7777 +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# n32: +# server: +# - sender: sepp2.localdomain +# scheme: https +# address: 127.0.2.251 +# client: +# sepp: +# - receiver: sepp1.localdomain +# uri: https://sepp1.localdomain +# resolve: 127.0.1.251 +# # o Add client TLS verification to N32 interface # default: # tls: diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index 3ec2fb6483..fc7b4fd5e5 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -244,6 +244,27 @@ smf: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/smf.key +# cert: @sysconfdir@/open5gs/tls/smf.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/smf-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/smf-client-sslkeylog.log +# sbi: +# server: +# - address: smf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/udm.yaml.in b/configs/open5gs/udm.yaml.in index a6a718094d..9b2ba0853a 100644 --- a/configs/open5gs/udm.yaml.in +++ b/configs/open5gs/udm.yaml.in @@ -38,7 +38,6 @@ udm: scp: - uri: http://127.0.0.200:7777 -# ################################################################################ # Home Network Public Key ################################################################################ @@ -140,6 +139,27 @@ udm: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/udm.key +# cert: @sysconfdir@/open5gs/tls/udm.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/udm-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/udm-client-sslkeylog.log +# sbi: +# server: +# - address: udm.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/configs/open5gs/udr.yaml.in b/configs/open5gs/udr.yaml.in index f8fd4250c3..6308d3ce28 100644 --- a/configs/open5gs/udr.yaml.in +++ b/configs/open5gs/udr.yaml.in @@ -81,6 +81,27 @@ udr: # nrf: # - uri: https://nrf.localdomain # +# o Enable SSL key logging for Wireshark +# - This configuration allows capturing SSL/TLS session keys +# for debugging or analysis purposes using Wireshark. +# default: +# tls: +# server: +# scheme: https +# private_key: @sysconfdir@/open5gs/tls/udr.key +# cert: @sysconfdir@/open5gs/tls/udr.crt +# sslkeylogfile: @localstatedir@/log/open5gs/tls/udr-server-sslkeylog.log +# client: +# scheme: https +# cacert: @sysconfdir@/open5gs/tls/ca.crt +# client_sslkeylogfile: @localstatedir@/log/open5gs/tls/udr-client-sslkeylog.log +# sbi: +# server: +# - address: udr.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain +# # o Add client TLS verification # default: # tls: diff --git a/debian/open5gs-common.dirs b/debian/open5gs-common.dirs index d5b197ccfa..be7656f72e 100644 --- a/debian/open5gs-common.dirs +++ b/debian/open5gs-common.dirs @@ -1 +1 @@ -var/log/open5gs +var/log/open5gs/tls diff --git a/lib/sbi/client.c b/lib/sbi/client.c index e402551515..16aa1c617a 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -129,6 +129,9 @@ ogs_sbi_client_t *ogs_sbi_client_add( ogs_strdup(ogs_sbi_self()->tls.client.private_key); if (ogs_sbi_self()->tls.client.cert) client->cert = ogs_strdup(ogs_sbi_self()->tls.client.cert); + if (ogs_sbi_self()->tls.client.sslkeylog) + client->sslkeylog = + ogs_strdup(ogs_sbi_self()->tls.client.sslkeylog); ogs_debug("ogs_sbi_client_add [%s]", OpenAPI_uri_scheme_ToString(scheme)); OGS_OBJECT_REF(client); @@ -212,6 +215,8 @@ void ogs_sbi_client_remove(ogs_sbi_client_t *client) ogs_free(client->private_key); if (client->cert) ogs_free(client->cert); + if (client->sslkeylog) + ogs_free(client->sslkeylog); if (client->fqdn) ogs_free(client->fqdn); @@ -369,6 +374,24 @@ static char *add_params_to_uri(CURL *easy, char *uri, ogs_hash_t *params) return uri; } +/* User-defined SSL_CTX callback function */ +static CURLcode sslctx_callback(CURL *curl, void *sslctx, void *userdata) +{ + SSL_CTX *ctx = (SSL_CTX *)sslctx; + ogs_sbi_client_t *client = userdata; + + ogs_assert(ctx); + ogs_assert(userdata); + + /* Ensure app data is set for SSL objects */ + SSL_CTX_set_app_data(ctx, client->sslkeylog); + + /* Set the SSL Key Log callback */ + SSL_CTX_set_keylog_callback(ctx, ogs_sbi_keylog_callback); + + return CURLE_OK; +} + static connection_t *connection_add( ogs_sbi_client_t *client, ogs_sbi_client_cb_f client_cb, ogs_sbi_request_t *request, void *data) @@ -459,6 +482,7 @@ static connection_t *connection_add( curl_easy_setopt(conn->easy, CURLOPT_BUFFERSIZE, OGS_MAX_SDU_LEN); + /* HTTPS certificate-related settings */ if (client->scheme == OpenAPI_uri_scheme_https) { if (client->insecure_skip_verify) { curl_easy_setopt(conn->easy, CURLOPT_SSL_VERIFYPEER, 0); @@ -468,13 +492,23 @@ static connection_t *connection_add( curl_easy_setopt(conn->easy, CURLOPT_CAINFO, client->cacert); } + /* Set private key & certificate */ if (client->private_key && client->cert) { curl_easy_setopt(conn->easy, CURLOPT_SSLKEY, client->private_key); curl_easy_setopt(conn->easy, CURLOPT_SSLCERT, client->cert); } + + if (client->sslkeylog) { + /* Set SSL_CTX callback */ + curl_easy_setopt(conn->easy, CURLOPT_SSL_CTX_FUNCTION, + sslctx_callback); + + /* Optionally set additional user data */ + curl_easy_setopt(conn->easy, CURLOPT_SSL_CTX_DATA, client); + } } - /* HTTP Method */ + /* Configure HTTP Method */ if (strcmp(request->h.method, OGS_SBI_HTTP_METHOD_PUT) == 0 || strcmp(request->h.method, OGS_SBI_HTTP_METHOD_PATCH) == 0 || strcmp(request->h.method, OGS_SBI_HTTP_METHOD_DELETE) == 0 || diff --git a/lib/sbi/client.h b/lib/sbi/client.h index d6687b38ed..e9bfbc918f 100644 --- a/lib/sbi/client.h +++ b/lib/sbi/client.h @@ -80,7 +80,7 @@ typedef struct ogs_sbi_client_s { OpenAPI_uri_scheme_e scheme; bool insecure_skip_verify; - char *cacert, *private_key, *cert; + char *cacert, *private_key, *cert, *sslkeylog; char *fqdn; uint16_t fqdn_port; diff --git a/lib/sbi/context.c b/lib/sbi/context.c index d7a6d66ae4..b35ab7f299 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -281,6 +281,11 @@ int ogs_sbi_context_parse_config( self.tls.server.cert = ogs_yaml_iter_value( &server_iter); + } else if (!strcmp(server_key, + "sslkeylogfile")) { + self.tls.server.sslkeylog = + ogs_yaml_iter_value( + &server_iter); } else if (!strcmp(server_key, "verify_client")) { self.tls.server.verify_client = @@ -340,6 +345,11 @@ int ogs_sbi_context_parse_config( self.tls.client.cert = ogs_yaml_iter_value( &client_iter); + } else if (!strcmp(client_key, + "client_sslkeylogfile")) { + self.tls.client.sslkeylog = + ogs_yaml_iter_value( + &client_iter); } } } @@ -664,7 +674,7 @@ int ogs_sbi_context_parse_server_config( const char *dev = NULL; ogs_sockaddr_t *addr = NULL; - const char *private_key = NULL, *cert = NULL; + const char *private_key = NULL, *cert = NULL, *sslkeylog = NULL; bool verify_client = false; const char *verify_client_cacert = NULL; @@ -759,6 +769,8 @@ int ogs_sbi_context_parse_server_config( private_key = ogs_yaml_iter_value(&server_iter); } else if (!strcmp(server_key, "cert")) { cert = ogs_yaml_iter_value(&server_iter); + } else if (!strcmp(server_key, "sslkeylogfile")) { + sslkeylog = ogs_yaml_iter_value(&server_iter); } else if (!strcmp(server_key, "verify_client")) { verify_client = ogs_yaml_iter_bool(&server_iter); } else if (!strcmp(server_key, "verify_client_cacert")) { @@ -853,6 +865,12 @@ int ogs_sbi_context_parse_server_config( server->cert = ogs_strdup(cert); ogs_assert(server->cert); } + if (sslkeylog) { + if (server->sslkeylog) + ogs_free(server->sslkeylog); + server->sslkeylog = ogs_strdup(sslkeylog); + ogs_assert(server->sslkeylog); + } if (scheme == OpenAPI_uri_scheme_https) { if (!server->private_key) { @@ -902,6 +920,12 @@ int ogs_sbi_context_parse_server_config( server->cert = ogs_strdup(cert); ogs_assert(server->cert); } + if (sslkeylog) { + if (server->sslkeylog) + ogs_free(server->sslkeylog); + server->sslkeylog = ogs_strdup(sslkeylog); + ogs_assert(server->sslkeylog); + } if (scheme == OpenAPI_uri_scheme_https) { if (!server->private_key) { @@ -939,6 +963,7 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) const char *client_private_key = NULL; const char *client_cert = NULL; + const char *client_sslkeylog = NULL; bool rc; @@ -980,6 +1005,8 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) client_private_key = ogs_yaml_iter_value(iter); } else if (!strcmp(key, "client_cert")) { client_cert = ogs_yaml_iter_value(iter); + } else if (!strcmp(key, "client_sslkeylogfile")) { + client_sslkeylog = ogs_yaml_iter_value(iter); } } @@ -1049,6 +1076,13 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) ogs_assert(client->cert); } + if (client_sslkeylog) { + if (client->sslkeylog) + ogs_free(client->sslkeylog); + client->sslkeylog = ogs_strdup(client_sslkeylog); + ogs_assert(client->sslkeylog); + } + if ((!client_private_key && client_cert) || (client_private_key && !client_cert)) { ogs_error("Either the private key or certificate is missing."); @@ -2669,3 +2703,29 @@ bool ogs_sbi_fqdn_in_vplmn(char *fqdn) return false; } + +/* OpenSSL Key Log Callback */ +void ogs_sbi_keylog_callback(const SSL *ssl, const char *line) +{ + SSL_CTX *ctx = NULL; + FILE *file = NULL; + const char *sslkeylog_file = NULL; + + ogs_assert(ssl); + ogs_assert(line); + + /* Retrieve SSL_CTX from SSL object */ + ctx = SSL_get_SSL_CTX(ssl); + ogs_assert(ctx); + + sslkeylog_file = (const char *)SSL_CTX_get_app_data(ctx); + ogs_assert(sslkeylog_file); + + file = fopen(sslkeylog_file, "a"); + if (file) { + fprintf(file, "%s\n", line); + fclose(file); + } else { + ogs_error("Failed to open SSL key log file: %s", sslkeylog_file); + } +} diff --git a/lib/sbi/context.h b/lib/sbi/context.h index fbe08727c5..97f10c5abf 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -65,6 +65,7 @@ typedef struct ogs_sbi_context_s { const char *private_key; const char *cert; + const char *sslkeylog; bool verify_client; const char *verify_client_cacert; @@ -77,6 +78,7 @@ typedef struct ogs_sbi_context_s { const char *private_key; const char *cert; + const char *sslkeylog; } client; } tls; @@ -570,6 +572,8 @@ bool ogs_sbi_supi_in_vplmn(char *supi); bool ogs_sbi_plmn_id_in_vplmn(ogs_plmn_id_t *plmn_id); bool ogs_sbi_fqdn_in_vplmn(char *fqdn); +void ogs_sbi_keylog_callback(const SSL *ssl, const char *line); + #ifdef __cplusplus } #endif diff --git a/lib/sbi/nghttp2-server.c b/lib/sbi/nghttp2-server.c index de8cc2a1cf..c5f3033799 100644 --- a/lib/sbi/nghttp2-server.c +++ b/lib/sbi/nghttp2-server.c @@ -196,7 +196,9 @@ static int ssl_ctx_set_proto_versions(SSL_CTX *ssl_ctx, int min, int max) #endif /* OPENSSL_VERSION_NUMBER >= 0x1010000fL */ } -static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) +static SSL_CTX *create_ssl_ctx( + const char *key_file, const char *cert_file, + const char *sslkeylog_file) { SSL_CTX *ssl_ctx; uint64_t ssl_opts; @@ -210,6 +212,14 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) return NULL; } + /* Set key log files for each SSL_CTX */ + if (sslkeylog_file) { + /* Ensure app data is set for SSL objects */ + SSL_CTX_set_app_data(ssl_ctx, sslkeylog_file); + /* Set the SSL Key Log callback */ + SSL_CTX_set_keylog_callback(ssl_ctx, ogs_sbi_keylog_callback); + } + ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION | SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | @@ -322,7 +332,8 @@ static int server_start(ogs_sbi_server_t *server, /* Create SSL CTX */ if (server->scheme == OpenAPI_uri_scheme_https) { - server->ssl_ctx = create_ssl_ctx(server->private_key, server->cert); + server->ssl_ctx = create_ssl_ctx( + server->private_key, server->cert, server->sslkeylog); if (!server->ssl_ctx) { ogs_error("Cannot create SSL CTX"); return OGS_ERROR; diff --git a/lib/sbi/server.c b/lib/sbi/server.c index f0c1e207e2..e0bc83e8c9 100644 --- a/lib/sbi/server.c +++ b/lib/sbi/server.c @@ -75,6 +75,8 @@ ogs_sbi_server_t *ogs_sbi_server_add( ogs_strdup(ogs_sbi_self()->tls.server.private_key); if (ogs_sbi_self()->tls.server.cert) server->cert = ogs_strdup(ogs_sbi_self()->tls.server.cert); + if (ogs_sbi_self()->tls.server.sslkeylog) + server->sslkeylog = ogs_strdup(ogs_sbi_self()->tls.server.sslkeylog); server->verify_client = ogs_sbi_self()->tls.server.verify_client; if (ogs_sbi_self()->tls.server.verify_client_cacert) @@ -112,6 +114,8 @@ void ogs_sbi_server_remove(ogs_sbi_server_t *server) ogs_free(server->private_key); if (server->cert) ogs_free(server->cert); + if (server->sslkeylog) + ogs_free(server->sslkeylog); ogs_pool_id_free(&server_pool, server); } diff --git a/lib/sbi/server.h b/lib/sbi/server.h index af58a0cf14..19db7d8060 100644 --- a/lib/sbi/server.h +++ b/lib/sbi/server.h @@ -41,7 +41,7 @@ typedef struct ogs_sbi_server_s { char *interface; OpenAPI_uri_scheme_e scheme; - char *private_key, *cert; + char *private_key, *cert, *sslkeylog; bool verify_client; char *verify_client_cacert; diff --git a/meson.build b/meson.build index b3befad2bf..c54a57768b 100644 --- a/meson.build +++ b/meson.build @@ -57,7 +57,7 @@ if clangtidy.found() != true endif meson.add_install_script(python3_exe, '-c', - mkdir_p.format(join_paths(localstatedir, 'log', 'open5gs'))) + mkdir_p.format(join_paths(localstatedir, 'log', 'open5gs', 'tls'))) # Compiler flags if cc.get_id() == 'gcc' or cc.get_id() == 'clang' From be5a7e1ded658823e7d6d285ec53f7040a0dba87 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 31 Dec 2024 21:49:36 +0900 Subject: [PATCH 293/323] [SBI] Added support for custom port numbers in SBI configuration with FQDN.(#3385) This update allows the parsing and handling of user-defined port numbers in the `advertise` field or explicitly in the `server` configuration for SBI. Users can now specify non-default ports for both binding and advertising while maintaining compatibility with existing configurations. The feature includes logic to handle FQDNs with embedded port numbers (e.g., `example.com:8080`) and ensures proper memory management during parsing. Updated the client association logic to utilize custom ports when specified. Examples: - Bind to the address on the eth0 and advertise as open5gs-amf.svc.local ``` sbi: server: - dev:eth0 advertise: open5gs-amf.svc.local ``` - Specify a custom port number 7777 while binding to the given address ``` sbi: server: - address: amf.localdomain port: 7777 ``` - Bind to 127.0.0.5 and advertise as open5gs-amf.svc.local ``` sbi: server: - address: 127.0.0.5 port: 7777 advertise: open5gs-amf.svc.local ``` - Bind to port 7777 but advertise with a different port number 8888 ``` sbi: server: - address: 127.0.0.5 port: 7777 advertise: open5gs-amf.svc.local:8888 ``` --- configs/open5gs/amf.yaml.in | 23 +++++++++++--- configs/open5gs/ausf.yaml.in | 25 +++++++++++---- configs/open5gs/bsf.yaml.in | 25 +++++++++++---- configs/open5gs/nrf.yaml.in | 25 +++++++++++---- configs/open5gs/nssf.yaml.in | 25 +++++++++++---- configs/open5gs/pcf.yaml.in | 25 +++++++++++---- configs/open5gs/scp.yaml.in | 25 +++++++++++---- configs/open5gs/smf.yaml.in | 25 +++++++++++---- configs/open5gs/udm.yaml.in | 25 +++++++++++---- configs/open5gs/udr.yaml.in | 25 +++++++++++---- lib/sbi/context.c | 59 +++++++++++++++++++++++++++++------- 11 files changed, 237 insertions(+), 70 deletions(-) diff --git a/configs/open5gs/amf.yaml.in b/configs/open5gs/amf.yaml.in index 0970736cd1..3b3123f1cf 100644 --- a/configs/open5gs/amf.yaml.in +++ b/configs/open5gs/amf.yaml.in @@ -59,18 +59,31 @@ amf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-amf.svc.local # sbi: # server: # - dev:eth0 # advertise: open5gs-amf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: amf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.5 and advertise as open5gs-amf.svc.local +# sbi: +# server: +# - address: 127.0.0.5 +# port: 7777 +# advertise: open5gs-amf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.5 +# port: 7777 +# advertise: open5gs-amf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/ausf.yaml.in b/configs/open5gs/ausf.yaml.in index e20b89b5b0..58a8f77a8c 100644 --- a/configs/open5gs/ausf.yaml.in +++ b/configs/open5gs/ausf.yaml.in @@ -22,18 +22,31 @@ ausf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-ausf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-ausf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: ausf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.11 and advertise as open5gs-ausf.svc.local +# sbi: +# server: +# - address: 127.0.0.11 +# port: 7777 +# advertise: open5gs-ausf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.11 +# port: 7777 +# advertise: open5gs-ausf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/bsf.yaml.in b/configs/open5gs/bsf.yaml.in index 88d166770a..fa989be402 100644 --- a/configs/open5gs/bsf.yaml.in +++ b/configs/open5gs/bsf.yaml.in @@ -22,18 +22,31 @@ bsf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-bsf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-bsf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: bsf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.15 and advertise as open5gs-bsf.svc.local +# sbi: +# server: +# - address: 127.0.0.15 +# port: 7777 +# advertise: open5gs-bsf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.15 +# port: 7777 +# advertise: open5gs-bsf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in index 1a612080c4..c69f8c40cd 100644 --- a/configs/open5gs/nrf.yaml.in +++ b/configs/open5gs/nrf.yaml.in @@ -21,18 +21,31 @@ nrf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-nrf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-nrf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: nrf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.10 and advertise as open5gs-nrf.svc.local +# sbi: +# server: +# - address: 127.0.0.10 +# port: 7777 +# advertise: open5gs-nrf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.10 +# port: 7777 +# advertise: open5gs-nrf.svc.local:8888 # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/nssf.yaml.in b/configs/open5gs/nssf.yaml.in index 6686bc7a37..86f826a5a7 100644 --- a/configs/open5gs/nssf.yaml.in +++ b/configs/open5gs/nssf.yaml.in @@ -25,18 +25,31 @@ nssf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-nssf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-nssf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: nssf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.14 and advertise as open5gs-nssf.svc.local +# sbi: +# server: +# - address: 127.0.0.14 +# port: 7777 +# advertise: open5gs-nssf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.14 +# port: 7777 +# advertise: open5gs-nssf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index 0bfc6c994b..02833669d2 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -148,18 +148,31 @@ pcf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-pcf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-pcf.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: pcf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.13 and advertise as open5gs-pcf.svc.local +# sbi: +# server: +# - address: 127.0.0.13 +# port: 7777 +# advertise: open5gs-pcf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.13 +# port: 7777 +# advertise: open5gs-pcf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/scp.yaml.in b/configs/open5gs/scp.yaml.in index 1a5e384ba7..737be86eaa 100644 --- a/configs/open5gs/scp.yaml.in +++ b/configs/open5gs/scp.yaml.in @@ -63,18 +63,31 @@ scp: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-scp.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-scp.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: scp.localdomain +# port: 7777 +# +# o Bind to 127.0.0.200 and advertise as open5gs-scp.svc.local +# sbi: +# server: +# - address: 127.0.0.200 +# port: 7777 +# advertise: open5gs-scp.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.200 +# port: 7777 +# advertise: open5gs-scp.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index fc7b4fd5e5..5c92d545dd 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -186,18 +186,31 @@ smf: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-smf.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-smf.svc.local # +# o Specify a custom port number 7777 while binding to the given address +# sbi: +# server: +# - address: smf.localdomain +# port: 7777 +# +# o Bind to 127.0.0.4 and advertise as open5gs-smf.svc.local # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: 127.0.0.4 +# port: 7777 +# advertise: open5gs-smf.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.4 +# port: 7777 +# advertise: open5gs-smf.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/udm.yaml.in b/configs/open5gs/udm.yaml.in index 9b2ba0853a..6b7ec48ff4 100644 --- a/configs/open5gs/udm.yaml.in +++ b/configs/open5gs/udm.yaml.in @@ -81,18 +81,31 @@ udm: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-udm.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-udm.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: udm.localdomain +# port: 7777 +# +# o Bind to 127.0.0.12 and advertise as open5gs-udm.svc.local +# sbi: +# server: +# - address: 127.0.0.12 +# port: 7777 +# advertise: open5gs-udm.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.12 +# port: 7777 +# advertise: open5gs-udm.svc.local:8888 # ################################################################################ # SBI Client diff --git a/configs/open5gs/udr.yaml.in b/configs/open5gs/udr.yaml.in index 6308d3ce28..e3c3b82a54 100644 --- a/configs/open5gs/udr.yaml.in +++ b/configs/open5gs/udr.yaml.in @@ -23,18 +23,31 @@ udr: ################################################################################ # SBI Server ################################################################################ -# o Override SBI address to be advertised to NRF +# o Bind to the address on the eth0 and advertise as open5gs-udr.svc.local # sbi: # server: -# - dev: eth0 +# - dev:eth0 # advertise: open5gs-udr.svc.local # +# o Specify a custom port number 7777 while binding to the given address # sbi: # server: -# - address: localhost -# advertise: -# - 127.0.0.99 -# - ::1 +# - address: udr.localdomain +# port: 7777 +# +# o Bind to 127.0.0.20 and advertise as open5gs-udr.svc.local +# sbi: +# server: +# - address: 127.0.0.20 +# port: 7777 +# advertise: open5gs-udr.svc.local +# +# o Bind to port 7777 but advertise with a different port number 8888 +# sbi: +# server: +# - address: 127.0.0.20 +# port: 7777 +# advertise: open5gs-udr.svc.local:8888 # ################################################################################ # SBI Client diff --git a/lib/sbi/context.c b/lib/sbi/context.c index b35ab7f299..f4581bd987 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -823,9 +823,38 @@ int ogs_sbi_context_parse_server_config( } addr = NULL; + /* ----- Process advertise (Host+Port Parsing Logic) ----- */ for (i = 0; i < num_of_advertise; i++) { - rv = ogs_addaddrinfo(&addr, family, advertise[i], port, 0); + uint16_t adv_port = port; /* Default to server's port */ + char *hostbuf = NULL; + const char *colon_pos = strchr(advertise[i], ':'); + + if (colon_pos) { + /* If a colon exists, split host and port */ + size_t host_len = colon_pos - advertise[i]; + + /* Allocate memory for the host part */ + hostbuf = (char *)ogs_malloc(host_len + 1); + ogs_assert(hostbuf); + + /* Copy the host part into hostbuf */ + memcpy(hostbuf, advertise[i], host_len); + hostbuf[host_len] = '\0'; + + /* Parse the port part */ + adv_port = (uint16_t)atoi(colon_pos + 1); + } else { + /* If no colon, treat the entire string as the host */ + hostbuf = ogs_strdup(advertise[i]); + ogs_assert(hostbuf); + } + + /* Add the parsed address info */ + rv = ogs_addaddrinfo(&addr, family, hostbuf, adv_port, 0); ogs_assert(rv == OGS_OK); + + /* Free the allocated memory */ + ogs_free(hostbuf); } node = ogs_list_first(&list); @@ -1752,11 +1781,8 @@ void ogs_sbi_nf_instance_build_default(ogs_sbi_nf_instance_t *nf_instance) ogs_assert(advertise); /* First FQDN is selected */ - if (!hostname) { + if (!hostname) hostname = ogs_gethostname(advertise); - if (hostname) - continue; - } if (nf_instance->num_of_ipv4 < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { ogs_sockaddr_t *addr = NULL; @@ -1826,11 +1852,8 @@ ogs_sbi_nf_service_t *ogs_sbi_nf_service_build_default( ogs_assert(advertise); /* First FQDN is selected */ - if (!hostname) { + if (!hostname) hostname = ogs_gethostname(advertise); - if (hostname) - continue; - } if (nf_service->num_of_addr < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { bool is_port = true; @@ -1943,6 +1966,7 @@ static void nf_service_associate_client(ogs_sbi_nf_service_t *nf_service) { ogs_sbi_client_t *client = NULL; ogs_sockaddr_t *addr = NULL, *addr6 = NULL; + uint16_t port = 0; ogs_assert(nf_service->scheme); @@ -1950,15 +1974,28 @@ static void nf_service_associate_client(ogs_sbi_nf_service_t *nf_service) if (nf_service->num_of_addr) { addr = nf_service->addr[0].ipv4; addr6 = nf_service->addr[0].ipv6; + + /* + * Added support for using custom port numbers with FQDN. + * + * This code checks if a user-defined port number is provided in the + * NFService structure. If the is_port flag is set, the port is + * assigned the specified value. + * + * This ensures that services using non-default ports can be accessed + * correctly, regardless of whether TLS is enabled or not. + */ + if (nf_service->addr[0].is_port) + port = nf_service->addr[0].port; } if (nf_service->fqdn || addr || addr6) { client = ogs_sbi_client_find( - nf_service->scheme, nf_service->fqdn, 0, addr, addr6); + nf_service->scheme, nf_service->fqdn, port, addr, addr6); if (!client) { ogs_debug("%s: ogs_sbi_client_add()", OGS_FUNC); client = ogs_sbi_client_add( - nf_service->scheme, nf_service->fqdn, 0, addr, addr6); + nf_service->scheme, nf_service->fqdn, port, addr, addr6); if (!client) { ogs_error("%s: ogs_sbi_client_add() failed", OGS_FUNC); return; From f04497ac3127afc17317ab6c7cdd3ea2001bbfbf Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 2 Jan 2025 17:44:37 +0900 Subject: [PATCH 294/323] [SBI] Allow direct NRF communication in Model C by configuring delegation modes (#3399) Introduce client_delegated_config to manage delegation settings for NRF and SCP separately. This ensures that in Model C, all NRF-related procedures (registration, heartbeat, deregistration, etc.) communicate directly with the NRF without routing through the SCP. This change aligns Open5GS behavior with 3GPP standards, providing consistent direct communication for both discovery and management in Model C, and maintaining indirect communication in Model D. - Direct Communication with NRF ``` sbi: client: nrf: - uri: http://127.0.0.10:7777 ``` - Indirect Communication by Delegating to SCP ``` sbi: client: scp: - uri: http://127.0.0.200:7777 ``` - Indirect Communication without Delegation ``` sbi: client: nrf: - uri: http://127.0.0.10:7777 scp: - uri: http://127.0.0.200:7777 delegated: nrf: nfm: no # Directly communicate NRF management functions disc: no # Directly communicate NRF discovery scp: next: no # Do not delegate to SCP for next-hop ``` - Indirect Communication with Delegated Discovery ``` sbi: client: nrf: - uri: http://127.0.0.10:7777 scp: - uri: http://127.0.0.200:7777 delegated: nrf: nfm: no # Directly communicate NRF management functions disc: yes # Delegate discovery to SCP scp: next: yes # Delegate to SCP for next-hop communications ``` - Default delegation: all communications are delegated to the SCP ``` sbi: client: nrf: - uri: http://127.0.0.10:7777 scp: - uri: http://127.0.0.200:7777 # No 'delegated' section; defaults to AUTO delegation ``` --- configs/open5gs/amf.yaml.in | 37 +++++- configs/open5gs/ausf.yaml.in | 37 +++++- configs/open5gs/bsf.yaml.in | 37 +++++- configs/open5gs/nssf.yaml.in | 38 +++++- configs/open5gs/pcf.yaml.in | 37 +++++- configs/open5gs/scp.yaml.in | 39 +++++- configs/open5gs/smf.yaml.in | 37 +++++- configs/open5gs/udm.yaml.in | 37 +++++- configs/open5gs/udr.yaml.in | 37 +++++- lib/sbi/context.c | 238 +++++++++++++++++++++++------------ lib/sbi/context.h | 26 ++-- lib/sbi/message.c | 3 +- lib/sbi/path.c | 98 ++++++++++----- src/scp/sbi-path.c | 16 +-- 14 files changed, 544 insertions(+), 173 deletions(-) diff --git a/configs/open5gs/amf.yaml.in b/configs/open5gs/amf.yaml.in index 3b3123f1cf..fcf3f25e61 100644 --- a/configs/open5gs/amf.yaml.in +++ b/configs/open5gs/amf.yaml.in @@ -88,27 +88,54 @@ amf: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/ausf.yaml.in b/configs/open5gs/ausf.yaml.in index 58a8f77a8c..52291fdf72 100644 --- a/configs/open5gs/ausf.yaml.in +++ b/configs/open5gs/ausf.yaml.in @@ -51,27 +51,54 @@ ausf: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/bsf.yaml.in b/configs/open5gs/bsf.yaml.in index fa989be402..12bc11433f 100644 --- a/configs/open5gs/bsf.yaml.in +++ b/configs/open5gs/bsf.yaml.in @@ -51,27 +51,54 @@ bsf: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/nssf.yaml.in b/configs/open5gs/nssf.yaml.in index 86f826a5a7..015085f566 100644 --- a/configs/open5gs/nssf.yaml.in +++ b/configs/open5gs/nssf.yaml.in @@ -77,27 +77,55 @@ nssf: # sst: 1 # sd: 009000 # -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation +# # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index 02833669d2..10fd43faff 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -177,27 +177,54 @@ pcf: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/scp.yaml.in b/configs/open5gs/scp.yaml.in index 737be86eaa..b2d4795d04 100644 --- a/configs/open5gs/scp.yaml.in +++ b/configs/open5gs/scp.yaml.in @@ -92,12 +92,49 @@ scp: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # +# o Indirect Communication by Delegating to Next-SCP +# sbi: +# client: +# scp: +# - uri: http://127.0.0.200:7777 +# +# o Indirect Communication without Delegation +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegation +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the Next-SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation +# ################################################################################ # HTTPS scheme with TLS ################################################################################ diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index 5c92d545dd..e47752393f 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -215,27 +215,54 @@ smf: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/udm.yaml.in b/configs/open5gs/udm.yaml.in index 6b7ec48ff4..395d041f69 100644 --- a/configs/open5gs/udm.yaml.in +++ b/configs/open5gs/udm.yaml.in @@ -110,27 +110,54 @@ udm: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/configs/open5gs/udr.yaml.in b/configs/open5gs/udr.yaml.in index e3c3b82a54..cfc41286cb 100644 --- a/configs/open5gs/udr.yaml.in +++ b/configs/open5gs/udr.yaml.in @@ -52,27 +52,54 @@ udr: ################################################################################ # SBI Client ################################################################################ -# o Direct communication with NRF interaction +# o Direct Communication with NRF # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # -# o Indirect communication with delegated discovery +# o Indirect Communication by Delegating to SCP # sbi: # client: # scp: # - uri: http://127.0.0.200:7777 # -# o Indirect communication without delegated discovery +# o Indirect Communication without Delegation # sbi: # client: # nrf: # - uri: http://127.0.0.10:7777 # scp: # - uri: http://127.0.0.200:7777 -# discovery: -# delegated: no +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: no # Directly communicate NRF discovery +# scp: +# next: no # Do not delegate to SCP for next-hop +# +# o Indirect Communication with Delegated Discovery +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# delegated: +# nrf: +# nfm: no # Directly communicate NRF management functions +# disc: yes # Delegate discovery to SCP +# scp: +# next: yes # Delegate to SCP for next-hop communications +# +# o Default delegation: all communications are delegated to the SCP +# sbi: +# client: +# nrf: +# - uri: http://127.0.0.10:7777 +# scp: +# - uri: http://127.0.0.200:7777 +# # No 'delegated' section; defaults to AUTO delegation # ################################################################################ # HTTPS scheme with TLS diff --git a/lib/sbi/context.c b/lib/sbi/context.c index f4581bd987..886accca6f 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -134,56 +134,73 @@ static int ogs_sbi_context_prepare(void) self.tls.server.scheme = OpenAPI_uri_scheme_http; self.tls.client.scheme = OpenAPI_uri_scheme_http; + /* Initialize delegated config with defaults */ + self.client_delegated_config.nrf.nfm = OGS_SBI_CLIENT_DELEGATED_AUTO; + self.client_delegated_config.nrf.disc = OGS_SBI_CLIENT_DELEGATED_AUTO; + self.client_delegated_config.scp.next = OGS_SBI_CLIENT_DELEGATED_AUTO; + return OGS_OK; } static int ogs_sbi_context_validation( const char *local, const char *nrf, const char *scp) { +#define MAX_MODE 3 + int i; + ogs_sbi_client_delegated_mode_e mode[MAX_MODE]; + + ogs_assert(context_initialized == 1); + /* If SMF is only used in 4G EPC, no SBI interface is required. */ if (local && strcmp(local, "smf") != 0 && ogs_sbi_server_first() == NULL) { ogs_error("No %s.sbi.address: in '%s'", local, ogs_app()->file); return OGS_ERROR; } - ogs_assert(context_initialized == 1); - switch (self.discovery_config.delegated) { - case OGS_SBI_DISCOVERY_DELEGATED_AUTO: - if (local && strcmp(local, "nrf") == 0) { - /* Skip NRF */ - } else if (local && strcmp(local, "scp") == 0) { - /* Skip SCP */ - } else if (local && strcmp(local, "smf") == 0) { - /* Skip SMF since SMF can run 4G */ - } else { - if (NF_INSTANCE_CLIENT(self.nrf_instance) || - NF_INSTANCE_CLIENT(self.scp_instance)) { + mode[0] = self.client_delegated_config.nrf.nfm; + mode[1] = self.client_delegated_config.nrf.disc; + mode[2] = self.client_delegated_config.scp.next; + + for (i = 0; i < MAX_MODE; i++) { + switch (mode[i]) { + case OGS_SBI_CLIENT_DELEGATED_AUTO: + if (local && strcmp(local, "nrf") == 0) { + /* Skip NRF */ + } else if (local && strcmp(local, "scp") == 0) { + /* Skip SCP */ + } else if (local && strcmp(local, "smf") == 0) { + /* Skip SMF since SMF can run 4G */ } else { - ogs_error("DELEGATED_AUTO - Both NRF and %s are unavailable", - scp && strcmp(scp, "next_scp") == 0 ? + if (NF_INSTANCE_CLIENT(self.nrf_instance) || + NF_INSTANCE_CLIENT(self.scp_instance)) { + } else { + ogs_error("[%d] DELEGATED_AUTO - " + "Both NRF and %s are unavailable", + i, scp && strcmp(scp, "next_scp") == 0 ? + "Next-hop SCP" : "SCP"); + return OGS_ERROR; + } + } + break; + case OGS_SBI_CLIENT_DELEGATED_YES: + if (NF_INSTANCE_CLIENT(self.scp_instance) == NULL) { + ogs_error("[%d] DELEGATED_YES - no %s available", + i, scp && strcmp(scp, "next_scp") == 0 ? "Next-hop SCP" : "SCP"); return OGS_ERROR; } + break; + case OGS_SBI_CLIENT_DELEGATED_NO: + if (NF_INSTANCE_CLIENT(self.nrf_instance) == NULL) { + ogs_error("[%d] DELEGATED_NO - no NRF available", i); + return OGS_ERROR; + } + break; + default: + ogs_fatal("[%d] Invalid dicovery-config delegated [%d]", + i, mode[i]); + ogs_assert_if_reached(); } - break; - case OGS_SBI_DISCOVERY_DELEGATED_YES: - if (NF_INSTANCE_CLIENT(self.scp_instance) == NULL) { - ogs_error("DELEGATED_YES - no %s available", - scp && strcmp(scp, "next_scp") == 0 ? - "Next-hop SCP" : "SCP"); - return OGS_ERROR; - } - break; - case OGS_SBI_DISCOVERY_DELEGATED_NO: - if (NF_INSTANCE_CLIENT(self.nrf_instance) == NULL) { - ogs_error("DELEGATED_NO - no NRF available"); - return OGS_ERROR; - } - break; - default: - ogs_fatal("Invalid dicovery-config delegated [%d]", - self.discovery_config.delegated); - ogs_assert_if_reached(); } if (ogs_sbi_self()->tls.server.scheme == OpenAPI_uri_scheme_https) { @@ -491,6 +508,115 @@ int ogs_sbi_context_parse_config( } while (ogs_yaml_iter_type(&scp_array) == YAML_SEQUENCE_NODE); } + /* Parse delegated section */ + else if (!strcmp(client_key, "delegated")) { + ogs_yaml_iter_t delegated_iter; + ogs_yaml_iter_recurse(&client_iter, + &delegated_iter); + + while (ogs_yaml_iter_next( + &delegated_iter)) { + const char *del_key = + ogs_yaml_iter_key( + &delegated_iter); + if (!strcmp(del_key, "nrf")) { + ogs_yaml_iter_t nrf_iter; + ogs_yaml_iter_recurse( + &delegated_iter, &nrf_iter); + while (ogs_yaml_iter_next( + &nrf_iter)) { + const char *nrf_key = + ogs_yaml_iter_key( + &nrf_iter); + const char *nrf_val = + ogs_yaml_iter_value( + &nrf_iter); + ogs_assert(nrf_key); + + if (!strcmp(nrf_key,"nfm")) { + if (!strcmp(nrf_val,"no")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + nrf_val,"yes")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + nrf_val,"auto")) { + self.client_delegated_config.nrf.nfm = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'nfm' `%s`", + nrf_val); + } + } else if (!strcmp( + nrf_key,"disc")) { + if (!strcmp(nrf_val,"no")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + nrf_val,"yes")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + nrf_val,"auto")) { + self.client_delegated_config.nrf.disc = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'disc' `%s`", + nrf_val); + } + } else { + ogs_warn("unknown nrf " + "delegated key `%s`", + nrf_key); + } + } + } else if (!strcmp(del_key, "scp")) { + ogs_yaml_iter_t scp_iter; + ogs_yaml_iter_recurse( + &delegated_iter, &scp_iter); + while (ogs_yaml_iter_next( + &scp_iter)) { + const char *scp_key = + ogs_yaml_iter_key( + &scp_iter); + const char *scp_val = + ogs_yaml_iter_value( + &scp_iter); + ogs_assert(scp_key); + + if (!strcmp(scp_key,"next")) { + if (!strcmp(scp_val,"no")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_NO; + } else if (!strcmp( + scp_val,"yes")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_YES; + } else if (!strcmp( + scp_val,"auto")) { + self.client_delegated_config.scp.next = + OGS_SBI_CLIENT_DELEGATED_AUTO; + } else { + ogs_warn("unknown " + "'next' `%s`", + scp_val); + } + } else { + ogs_warn("unknown scp " + "delegated key `%s`", + scp_key); + } + } + } else { + ogs_warn("unknown delegated " + "key `%s`", del_key); + } + } + } } } else ogs_warn("unknown key `%s`", sbi_key); @@ -517,52 +643,6 @@ int ogs_sbi_context_parse_config( } while (ogs_yaml_iter_type( &service_name_iter) == YAML_SEQUENCE_NODE); - } else if (!strcmp(local_key, "discovery")) { - ogs_yaml_iter_t discovery_iter; - ogs_yaml_iter_recurse(&local_iter, &discovery_iter); - while (ogs_yaml_iter_next(&discovery_iter)) { - const char *discovery_key = - ogs_yaml_iter_key(&discovery_iter); - ogs_assert(discovery_key); - if (!strcmp(discovery_key, "delegated")) { - const char *delegated = - ogs_yaml_iter_value(&discovery_iter); - if (!strcmp(delegated, "auto")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_AUTO; - else if (!strcmp(delegated, "yes")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_YES; - else if (!strcmp(delegated, "no")) - self.discovery_config.delegated = - OGS_SBI_DISCOVERY_DELEGATED_NO; - else - ogs_warn("unknown 'delegated' value `%s`", - delegated); - } else if (!strcmp(discovery_key, "option")) { - ogs_yaml_iter_t option_iter; - ogs_yaml_iter_recurse( - &discovery_iter, &option_iter); - - while (ogs_yaml_iter_next(&option_iter)) { - const char *option_key = - ogs_yaml_iter_key(&option_iter); - ogs_assert(option_key); - - if (!strcmp(option_key, "no_service_names")) { - self.discovery_config.no_service_names = - ogs_yaml_iter_bool(&option_iter); - } else if (!strcmp(option_key, - "prefer_requester_nf_instance_id")) { - self.discovery_config. - prefer_requester_nf_instance_id = - ogs_yaml_iter_bool(&option_iter); - } else - ogs_warn("unknown key `%s`", option_key); - } - } else - ogs_warn("unknown key `%s`", discovery_key); - } } } } diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 97f10c5abf..e7cae0e30f 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -36,19 +36,25 @@ typedef struct ogs_sbi_smf_info_s ogs_sbi_smf_info_t; typedef struct ogs_sbi_nf_instance_s ogs_sbi_nf_instance_t; typedef enum { - OGS_SBI_DISCOVERY_DELEGATED_AUTO = 0, - OGS_SBI_DISCOVERY_DELEGATED_YES, - OGS_SBI_DISCOVERY_DELEGATED_NO, -} ogs_sbi_discovery_delegated_mode; + OGS_SBI_CLIENT_DELEGATED_AUTO = 0, + OGS_SBI_CLIENT_DELEGATED_YES, + OGS_SBI_CLIENT_DELEGATED_NO, +} ogs_sbi_client_delegated_mode_e; -typedef struct ogs_sbi_discovery_config_s { - ogs_sbi_discovery_delegated_mode delegated; - bool no_service_names; - bool prefer_requester_nf_instance_id; -} ogs_sbi_discovery_config_t; +/* To hold all delegated config under sbi.client.delegated */ +typedef struct ogs_sbi_client_delegated_config_s { + struct { + ogs_sbi_client_delegated_mode_e nfm; /* e.g. Registration, Heartbeat */ + ogs_sbi_client_delegated_mode_e disc; /* NF discovery */ + } nrf; + struct { + ogs_sbi_client_delegated_mode_e next; /* Next-hop SCP delegation */ + } scp; +} ogs_sbi_client_delegated_config_t; typedef struct ogs_sbi_context_s { - ogs_sbi_discovery_config_t discovery_config; /* SCP Discovery Delegated */ + /* For sbi.client.delegated */ + ogs_sbi_client_delegated_config_t client_delegated_config; #define OGS_HOME_NETWORK_PKI_VALUE_MIN 1 #define OGS_HOME_NETWORK_PKI_VALUE_MAX 254 diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 20b2b540e7..38bfe0aca7 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -412,8 +412,7 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) &discovery_option->guami.amf_id)); } } - if (ogs_sbi_self()->discovery_config.no_service_names == false && - discovery_option->num_of_service_names) { + if (discovery_option->num_of_service_names) { /* * Issues #1730 diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 84cc93d681..bccb32979c 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -273,11 +273,11 @@ int ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact) discovery_option = xact->discovery_option; /* SCP Availability */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.nrf.disc == + OGS_SBI_CLIENT_DELEGATED_AUTO) { scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.nrf.disc == + OGS_SBI_CLIENT_DELEGATED_YES) { scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(scp_client); } @@ -787,6 +787,7 @@ bool ogs_sbi_send_request_to_nrf( { bool rc; ogs_sbi_client_t *nrf_client = NULL, *scp_client = NULL; + ogs_sbi_client_delegated_mode_e mode = OGS_SBI_CLIENT_DELEGATED_AUTO; ogs_assert(nrf_service_type); ogs_assert(request); @@ -794,39 +795,72 @@ bool ogs_sbi_send_request_to_nrf( scp_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); nrf_client = NF_INSTANCE_CLIENT(ogs_sbi_self()->nrf_instance); - if (scp_client) { - /************************* - * INDIRECT COMMUNICATION - *************************/ - build_default_discovery_parameter( - request, nrf_service_type, discovery_option); - - rc = ogs_sbi_client_send_via_scp_or_sepp( - scp_client, client_cb, request, data); + /* Decide which delegated mode to use */ + if (nrf_service_type == OGS_SBI_SERVICE_TYPE_NNRF_NFM) + mode = ogs_sbi_self()->client_delegated_config.nrf.nfm; + else if (nrf_service_type == OGS_SBI_SERVICE_TYPE_NNRF_DISC) + mode = ogs_sbi_self()->client_delegated_config.nrf.disc; + /* else if it's some other Nnrf service, fallback to AUTO or keep default */ + + switch (mode) { + case OGS_SBI_CLIENT_DELEGATED_NO: + /* NO => Direct communication (NRF must exist) */ + if (!nrf_client) { + ogs_fatal("[No-NRF] Cannot send request [%s:%s:%s]", + ogs_sbi_service_type_to_name(nrf_service_type), + request->h.service.name, request->h.api.version); + ogs_assert_if_reached(); + return false; + } + /* Send directly to NRF */ + rc = ogs_sbi_client_send_request(nrf_client, client_cb, + request, data); ogs_expect(rc == true); + break; - } else if (nrf_client) { - - /*********************** - * DIRECT COMMUNICATION - ***********************/ - - /* NRF is available */ - rc = ogs_sbi_client_send_request(nrf_client, client_cb, request, data); + case OGS_SBI_CLIENT_DELEGATED_YES: + /* YES => Indirect communication (SCP must exist) */ + if (!scp_client) { + ogs_fatal("[No-SCP] Cannot send request [%s:%s:%s]", + ogs_sbi_service_type_to_name(nrf_service_type), + request->h.service.name, request->h.api.version); + ogs_assert_if_reached(); + return false; + } + /* Indirect via SCP, build discovery parameter if needed */ + build_default_discovery_parameter(request, nrf_service_type, + discovery_option); + rc = ogs_sbi_client_send_via_scp_or_sepp(scp_client, client_cb, + request, data); ogs_expect(rc == true); - - - } else { - ogs_fatal("[%s:%s] Cannot send request [%s:%s:%s]", - nrf_client ? "NRF" : "No-NRF", - scp_client ? "SCP" : "No-SCP", + break; + + case OGS_SBI_CLIENT_DELEGATED_AUTO: + default: + /* + * AUTO => If SCP is present, use it; otherwise direct. + */ + if (scp_client) { + build_default_discovery_parameter(request, nrf_service_type, + discovery_option); + rc = ogs_sbi_client_send_via_scp_or_sepp(scp_client, client_cb, + request, data); + ogs_expect(rc == true); + } else if (nrf_client) { + rc = ogs_sbi_client_send_request(nrf_client, client_cb, + request, data); + ogs_expect(rc == true); + } else { + ogs_fatal("[No-NRF:No-SCP] Cannot send request [%s:%s:%s]", ogs_sbi_service_type_to_name(nrf_service_type), request->h.service.name, request->h.api.version); - rc = false; - ogs_assert_if_reached(); + ogs_assert_if_reached(); + return false; + } + break; } - return true; + return rc; } bool ogs_sbi_send_response(ogs_sbi_stream_t *stream, int status) @@ -1000,9 +1034,7 @@ static void build_default_discovery_parameter( OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_NF_INSTANCE_ID, discovery_option->requester_nf_instance_id); } - if (ogs_sbi_self()->discovery_config. - no_service_names == false && - discovery_option->num_of_service_names) { + if (discovery_option->num_of_service_names) { bool rc = false; /* send array items separated by a comma */ diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 9fa29337c3..817bdcfa2e 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -68,11 +68,11 @@ int scp_sbi_open(void) } /* Check if Next-SCP's client */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_AUTO) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_YES) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(next_scp); } @@ -153,11 +153,11 @@ static int request_handler(ogs_sbi_request_t *request, void *data) } /* Next-SCP client */ - if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_AUTO) { + if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_AUTO) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); - } else if (ogs_sbi_self()->discovery_config.delegated == - OGS_SBI_DISCOVERY_DELEGATED_YES) { + } else if (ogs_sbi_self()->client_delegated_config.scp.next == + OGS_SBI_CLIENT_DELEGATED_YES) { next_scp = NF_INSTANCE_CLIENT(ogs_sbi_self()->scp_instance); ogs_assert(next_scp); } From fce22ca069fc887a79c57705b194714448d35265 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 2 Jan 2025 22:08:38 +0900 Subject: [PATCH 295/323] Fix the example configuration for AMF-TLS --- configs/open5gs/amf.yaml.in | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/configs/open5gs/amf.yaml.in b/configs/open5gs/amf.yaml.in index fcf3f25e61..3919c5c2c5 100644 --- a/configs/open5gs/amf.yaml.in +++ b/configs/open5gs/amf.yaml.in @@ -164,8 +164,8 @@ amf: # tls: # server: # scheme: https -# private_key: @sysconfdir@/open5gs/tls/nrf.key -# cert: @sysconfdir@/open5gs/tls/nrf.crt +# private_key: @sysconfdir@/open5gs/tls/amf.key +# cert: @sysconfdir@/open5gs/tls/amf.crt # sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-server-sslkeylog.log # client: # scheme: https @@ -173,7 +173,10 @@ amf: # client_sslkeylogfile: @localstatedir@/log/open5gs/tls/amf-client-sslkeylog.log # sbi: # server: -# - address: nrf.localdomain +# - address: amf.localdomain +# client: +# nrf: +# - uri: https://nrf.localdomain # # o Add client TLS verification # default: From a38530f4f5327c80f61cccf4605079c404e8412d Mon Sep 17 00:00:00 2001 From: herlesupreeth <herlesupreeth@gmail.com> Date: Fri, 27 Dec 2024 16:23:26 +0100 Subject: [PATCH 296/323] [SMF] Update QoS parameters even when only PFs needs to be added to QoS Flow --- src/smf/binding.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/smf/binding.c b/src/smf/binding.c index 3617e8973c..4a2383cb37 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -599,19 +599,19 @@ void smf_qos_flow_binding(smf_sess_t *sess) } else { ogs_assert(strcmp(qos_flow->pcc_rule.id, pcc_rule->id) == 0); - if ((pcc_rule->qos.mbr.downlink && - qos_flow->qos.mbr.downlink != pcc_rule->qos.mbr.downlink) || - (pcc_rule->qos.mbr.uplink && - qos_flow->qos.mbr.uplink != pcc_rule->qos.mbr.uplink) || - (pcc_rule->qos.gbr.downlink && - qos_flow->qos.gbr.downlink != pcc_rule->qos.gbr.downlink) || - (pcc_rule->qos.gbr.uplink && - qos_flow->qos.gbr.uplink != pcc_rule->qos.gbr.uplink)) { - /* Update QoS parameter */ - memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t)); - - /* Update Bearer Request encodes updated QoS parameter */ - qos_presence = true; + if (pcc_rule->qos.mbr.downlink || pcc_rule->qos.mbr.uplink || + pcc_rule->qos.gbr.downlink || pcc_rule->qos.gbr.uplink) { + + if ((ogs_list_count(&qos_flow->pf_to_add_list) > 0) || + (qos_flow->qos.mbr.downlink != pcc_rule->qos.mbr.downlink) || + (qos_flow->qos.mbr.uplink != pcc_rule->qos.mbr.uplink) || + (qos_flow->qos.gbr.downlink != pcc_rule->qos.gbr.downlink) || + (qos_flow->qos.gbr.uplink != pcc_rule->qos.gbr.uplink)) { + /* Update QoS parameter */ + memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t)); + /* Update Bearer Request encodes updated QoS parameter */ + qos_presence = true; + } } } From 34a9816c7b293a0e9fbf61f5f5d08f2c351022c6 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 9 Jan 2025 21:02:37 +0900 Subject: [PATCH 297/323] [SMF] Update comments for PR #3660 --- src/smf/binding.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/smf/binding.c b/src/smf/binding.c index 4a2383cb37..5ad081a728 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -599,17 +599,35 @@ void smf_qos_flow_binding(smf_sess_t *sess) } else { ogs_assert(strcmp(qos_flow->pcc_rule.id, pcc_rule->id) == 0); + /* + * Check if any MBR/GBR value is non-zero. This indicates that + * the flow might require GBR/MBR-specific handling. + */ if (pcc_rule->qos.mbr.downlink || pcc_rule->qos.mbr.uplink || pcc_rule->qos.gbr.downlink || pcc_rule->qos.gbr.uplink) { + /* + * If new packet filters are being added, or if any MBR/GBR + * field differs from what is currently set, then we must + * update the QoS parameters. + */ if ((ogs_list_count(&qos_flow->pf_to_add_list) > 0) || (qos_flow->qos.mbr.downlink != pcc_rule->qos.mbr.downlink) || (qos_flow->qos.mbr.uplink != pcc_rule->qos.mbr.uplink) || (qos_flow->qos.gbr.downlink != pcc_rule->qos.gbr.downlink) || (qos_flow->qos.gbr.uplink != pcc_rule->qos.gbr.uplink)) { - /* Update QoS parameter */ + + /* + * Update the QoS parameters so that the GBR QoS Flow + * Information IE is properly encoded in the upcoming + * signaling (NGAP/PFCP) messages. + */ memcpy(&qos_flow->qos, &pcc_rule->qos, sizeof(ogs_qos_t)); - /* Update Bearer Request encodes updated QoS parameter */ + + /* + * Setting 'qos_presence' to true triggers encoding of + * the QoS IE in the subsequent Bearer Request message. + */ qos_presence = true; } } From c331207233d5a4a3a450d298440c8b5d782ac0a9 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 26 Nov 2024 12:51:01 +0100 Subject: [PATCH 298/323] [all] allow value of 0 for S-NSSAI SST 3GPP TS 23.003: 28.4.2 Format of the S-NSSAI The SST field may have standardized and non-standardized values. Values 0 to 127 belong to the standardized SST range and they are defined in 3GPP TS 23.501 [119]. Values 128 to 255 belong to the Operator-specific range. --- lib/app/ogs-config.c | 2 -- lib/dbi/session.c | 5 ----- lib/nas/5gs/types.c | 7 ++----- lib/sbi/message.c | 5 ----- src/amf/nsmf-build.c | 8 +++----- src/nssf/context.c | 1 - src/pcf/context.c | 21 +++++---------------- src/pcf/nbsf-build.c | 4 ---- src/pcf/npcf-handler.c | 7 ------- src/udm/nudm-handler.c | 2 +- src/udm/nudr-handler.c | 3 +-- tests/af/npcf-build.c | 17 +++++++---------- 12 files changed, 19 insertions(+), 63 deletions(-) diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index 8e3762844c..3a64af0977 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -1258,7 +1258,6 @@ ogs_app_slice_conf_t *ogs_app_slice_conf_add( ogs_assert(policy_conf); ogs_assert(s_nssai); - ogs_assert(s_nssai->sst); ogs_pool_alloc(&slice_conf_pool, &slice_conf); if (!slice_conf) { @@ -1289,7 +1288,6 @@ ogs_app_slice_conf_t *ogs_app_slice_conf_find_by_s_nssai( ogs_assert(policy_conf); ogs_assert(s_nssai); - ogs_assert(s_nssai->sst); ogs_list_for_each(&policy_conf->slice_list, slice_conf) { if (slice_conf->data.s_nssai.sst == s_nssai->sst && diff --git a/lib/dbi/session.c b/lib/dbi/session.c index 4748e37958..6181a8514c 100644 --- a/lib/dbi/session.c +++ b/lib/dbi/session.c @@ -109,11 +109,6 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn, } } - if (!sst) { - ogs_error("No SST"); - continue; - } - if (s_nssai && s_nssai->sst != sst) continue; if (s_nssai && diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index f8a049debc..15a45e98e3 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -128,8 +128,7 @@ void ogs_nas_build_s_nssai( pos = 0; - if (nas_s_nssai_ie->sst) - nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->sst; + nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->sst; if (nas_s_nssai_ie->sd.v != OGS_S_NSSAI_NO_SD_VALUE || @@ -141,7 +140,6 @@ void ogs_nas_build_s_nssai( * "no SD value associated with the SST". */ (nas_s_nssai_ie->sd.v == OGS_S_NSSAI_NO_SD_VALUE && - nas_s_nssai_ie->mapped_hplmn_sst && nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE)) { v = ogs_htobe24(nas_s_nssai_ie->sd); @@ -149,8 +147,7 @@ void ogs_nas_build_s_nssai( pos += 3; } - if (nas_s_nssai_ie->mapped_hplmn_sst) - nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst; + nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst; if (nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE) { v = ogs_htobe24(nas_s_nssai_ie->mapped_hplmn_sd); diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 38bfe0aca7..375e15a628 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -612,11 +612,6 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) char *v = NULL; cJSON *item = NULL; - if (!message->param.s_nssai.sst) { - ogs_error("No S-NSSAI SST"); - ogs_sbi_request_free(request); - return NULL; - } if (!message->param.roaming_indication) { ogs_error("No Roaming Indication"); ogs_sbi_request_free(request); diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index 2a0df02de1..ee06bcb0f9 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -133,11 +133,9 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); SmContextCreateData.s_nssai = &sNssai; - if (sess->mapped_hplmn.sst) { - hplmnSnssai.sst = sess->mapped_hplmn.sst; - hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); - SmContextCreateData.hplmn_snssai = &hplmnSnssai; - } + hplmnSnssai.sst = sess->mapped_hplmn.sst; + hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); + SmContextCreateData.hplmn_snssai = &hplmnSnssai; SmContextCreateData.guami = ogs_sbi_build_guami(amf_ue->guami); if (!SmContextCreateData.guami) { diff --git a/src/nssf/context.c b/src/nssf/context.c index d2a0bc6362..e04721d4c8 100644 --- a/src/nssf/context.c +++ b/src/nssf/context.c @@ -285,7 +285,6 @@ nssf_nsi_t *nssf_nsi_add(char *nrf_id, uint8_t sst, ogs_uint24_t sd) nssf_nsi_t *nsi = NULL; ogs_assert(nrf_id); - ogs_assert(sst); ogs_pool_alloc(&nssf_nsi_pool, &nsi); ogs_assert(nsi); diff --git a/src/pcf/context.c b/src/pcf/context.c index c90855357a..9131318f96 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -132,12 +132,6 @@ static int parse_slice_conf( const char *v = ogs_yaml_iter_value(&slice_iter); if (v) { s_nssai.sst = atoi(v); - if (s_nssai.sst == 1 || s_nssai.sst == 2 || - s_nssai.sst == 3 || s_nssai.sst == 4) { - } else { - ogs_error("Unknown SST [%d]", s_nssai.sst); - return OGS_ERROR; - } } } else if (!strcmp(slice_key, OGS_SD_STRING)) { const char *v = ogs_yaml_iter_value(&slice_iter); @@ -147,18 +141,13 @@ static int parse_slice_conf( } } - if (s_nssai.sst) { - slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); - if (!slice_conf) { - ogs_error("ogs_app_slice_conf_add() failed [SST:%d,SD:0x%x]", - s_nssai.sst, s_nssai.sd.v); - return OGS_ERROR; - } - slice_conf->data.default_indicator = default_indicator; - } else { - ogs_error("No SST"); + slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); + if (!slice_conf) { + ogs_error("ogs_app_slice_conf_add() failed [SST:%d,SD:0x%x]", + s_nssai.sst, s_nssai.sd.v); return OGS_ERROR; } + slice_conf->data.default_indicator = default_indicator; OGS_YAML_ARRAY_RECURSE(&slice_array, &slice_iter); while (ogs_yaml_iter_next(&slice_iter)) { diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index 8afbc7201c..0454b8df2a 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -133,10 +133,6 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( } } - if (!sess->s_nssai.sst) { - ogs_error("No SST"); - goto end; - } if (PcfIpEndPointList->count) PcfBinding.pcf_ip_end_points = PcfIpEndPointList; else diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index e3ffeb3245..dadbdf273a 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -299,13 +299,6 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, goto cleanup; } - if (!sliceInfo->sst) { - strerror = ogs_msprintf("[%s:%d] No sliceInfo->sst", - pcf_ue->supi, sess->psi); - status = OGS_SBI_HTTP_STATUS_BAD_REQUEST; - goto cleanup; - } - servingNetwork = SmPolicyContextData->serving_network; if (servingNetwork) { if (!servingNetwork->mcc) { diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 8ce08e7fab..52101b4f01 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -558,7 +558,7 @@ bool udm_nudm_uecm_handle_smf_registration( return false; } - if (!SmfRegistration->single_nssai || !SmfRegistration->single_nssai->sst) { + if (!SmfRegistration->single_nssai) { ogs_error("[%s:%d] No singleNssai", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, diff --git a/src/udm/nudr-handler.c b/src/udm/nudr-handler.c index a6050bda69..0274820484 100644 --- a/src/udm/nudr-handler.c +++ b/src/udm/nudr-handler.c @@ -808,8 +808,7 @@ bool udm_nudr_dr_handle_smf_registration( return false; } - if (!SmfRegistration->single_nssai || - !SmfRegistration->single_nssai->sst) { + if (!SmfRegistration->single_nssai) { ogs_error("[%s:%d] No singleNssai", udm_ue->supi, sess->psi); ogs_assert(true == ogs_sbi_server_send_error( diff --git a/tests/af/npcf-build.c b/tests/af/npcf-build.c index 688a72f66e..136106aff0 100644 --- a/tests/af/npcf-build.c +++ b/tests/af/npcf-build.c @@ -115,11 +115,9 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create( AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); - if (sess->s_nssai.sst) { - sNssai.sst = sess->s_nssai.sst; - sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); - AscReqData.slice_info = &sNssai; - } + sNssai.sst = sess->s_nssai.sst; + sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + AscReqData.slice_info = &sNssai; AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; @@ -709,11 +707,10 @@ ogs_sbi_request_t *af_npcf_policyauthorization_build_create_video( AscReqData.ev_subsc = &evSubsc; memset(&sNssai, 0, sizeof(sNssai)); - if (sess->s_nssai.sst) { - sNssai.sst = sess->s_nssai.sst; - sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); - AscReqData.slice_info = &sNssai; - } + + sNssai.sst = sess->s_nssai.sst; + sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); + AscReqData.slice_info = &sNssai; AscReqData.spon_status = OpenAPI_sponsoring_status_SPONSOR_DISABLED; From 90cd67fccada72ee73aa1c168d9c04b03fc4a5b4 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Tue, 17 Dec 2024 09:56:20 +0100 Subject: [PATCH 299/323] [AMF,SMF] Prevent mapped HPLMN SST to always be set In case that mapped HPLMN SST was not set by the UE in the request to Establish PDU Session, AMF/SMF would assume it is set to 0 (since the recent change to allow SST value 0). --- lib/nas/5gs/types.c | 18 +++++++++++++----- lib/nas/5gs/types.h | 1 + src/amf/context.c | 4 ++++ src/amf/context.h | 1 + src/amf/gmm-handler.c | 7 +++++-- src/amf/nsmf-build.c | 8 +++++--- src/smf/context.h | 1 + src/smf/gsm-build.c | 3 ++- src/smf/nsmf-handler.c | 1 + tests/common/context.c | 1 + tests/slice/same-dnn-test.c | 4 ++++ 11 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index 15a45e98e3..e9a4cbc947 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -147,7 +147,8 @@ void ogs_nas_build_s_nssai( pos += 3; } - nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst; + if (nas_s_nssai_ie->mapped_hplmn_sst_presence) + nas_s_nssai->buffer[pos++] = nas_s_nssai_ie->mapped_hplmn_sst; if (nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE) { v = ogs_htobe24(nas_s_nssai_ie->mapped_hplmn_sd); @@ -166,14 +167,19 @@ void ogs_nas_build_s_nssai2( ogs_assert(nas_s_nssai); ogs_assert(s_nssai); - ogs_assert(mapped_hplmn); memset(&ie, 0, sizeof(ie)); ie.sst = s_nssai->sst; ie.sd.v = s_nssai->sd.v; - ie.mapped_hplmn_sst = mapped_hplmn->sst; - ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v; + + if (mapped_hplmn) { + ie.mapped_hplmn_sst_presence = true; + ie.mapped_hplmn_sst = mapped_hplmn->sst; + ie.mapped_hplmn_sd.v = mapped_hplmn->sd.v; + } else { + ie.mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; + } ogs_nas_build_s_nssai(nas_s_nssai, &ie); } @@ -237,8 +243,10 @@ int ogs_nas_parse_s_nssai( pos += 3; } - if (mapped_hplmn_sst) + if (mapped_hplmn_sst) { nas_s_nssai_ie->mapped_hplmn_sst = nas_s_nssai->buffer[pos++]; + nas_s_nssai_ie->mapped_hplmn_sst_presence = true; + } if (mapped_hplmn_sd) { memcpy(&v, nas_s_nssai->buffer+pos, 3); diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h index 3e56f26343..8ca6defb9f 100644 --- a/lib/nas/5gs/types.h +++ b/lib/nas/5gs/types.h @@ -66,6 +66,7 @@ typedef struct ogs_nas_s_nssai_ie_s { uint8_t sst; ogs_uint24_t sd; uint8_t mapped_hplmn_sst; + bool mapped_hplmn_sst_presence; ogs_uint24_t mapped_hplmn_sd; } __attribute__ ((packed)) ogs_nas_s_nssai_ie_t; diff --git a/src/amf/context.c b/src/amf/context.c index 0a54f45c3a..1f69548262 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2265,6 +2265,7 @@ amf_sess_t *amf_sess_add(amf_ue_t *amf_ue, uint8_t psi) sess->s_nssai.sst = 0; sess->s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; + sess->mapped_hplmn_presence = false; sess->mapped_hplmn.sst = 0; sess->mapped_hplmn.sd.v = OGS_S_NSSAI_NO_SD_VALUE; @@ -2887,6 +2888,8 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue) allowed->sst = requested->sst; allowed->sd.v = requested->sd.v; + allowed->mapped_hplmn_sst_presence = + requested->mapped_hplmn_sst_presence; allowed->mapped_hplmn_sst = requested->mapped_hplmn_sst; allowed->mapped_hplmn_sd.v = requested->mapped_hplmn_sd.v; @@ -2923,6 +2926,7 @@ bool amf_update_allowed_nssai(amf_ue_t *amf_ue) allowed->sst = slice->s_nssai.sst; allowed->sd.v = slice->s_nssai.sd.v; + allowed->mapped_hplmn_sst_presence = false; allowed->mapped_hplmn_sst = 0; allowed->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; diff --git a/src/amf/context.h b/src/amf/context.h index 48992481d9..92732dd1dd 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -834,6 +834,7 @@ typedef struct amf_sess_s { ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; + bool mapped_hplmn_presence; char *dnn; } amf_sess_t; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index c835fe1bc9..b15040dca1 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1287,8 +1287,11 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, if (ie.sst == amf_ue->slice[i].s_nssai.sst && ie.sd.v == amf_ue->slice[i].s_nssai.sd.v) { - sess->mapped_hplmn.sst = ie.mapped_hplmn_sst; - sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v; + if (ie.mapped_hplmn_sst_presence) { + sess->mapped_hplmn_presence = true; + sess->mapped_hplmn.sst = ie.mapped_hplmn_sst; + sess->mapped_hplmn.sd.v = ie.mapped_hplmn_sd.v; + } /* PASS */ diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index ee06bcb0f9..836b7449f9 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -133,9 +133,11 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd); SmContextCreateData.s_nssai = &sNssai; - hplmnSnssai.sst = sess->mapped_hplmn.sst; - hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); - SmContextCreateData.hplmn_snssai = &hplmnSnssai; + if (sess->mapped_hplmn_presence) { + hplmnSnssai.sst = sess->mapped_hplmn.sst; + hplmnSnssai.sd = ogs_s_nssai_sd_to_string(sess->mapped_hplmn.sd); + SmContextCreateData.hplmn_snssai = &hplmnSnssai; + } SmContextCreateData.guami = ogs_sbi_build_guami(amf_ue->guami); if (!SmContextCreateData.guami) { diff --git a/src/smf/context.h b/src/smf/context.h index add0d89a80..b43fc6b84f 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -379,6 +379,7 @@ typedef struct smf_sess_s { /* S_NSSAI */ ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; + bool mapped_hplmn_presence; /* PDN Configuration */ ogs_session_t session; diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 05153a0d51..5cead5c8da 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -186,7 +186,8 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) /* S-NSSAI */ pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_PRESENT; - ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai, &sess->mapped_hplmn); + ogs_nas_build_s_nssai2(nas_s_nssai, &sess->s_nssai, + (sess->mapped_hplmn_presence) ? &sess->mapped_hplmn : NULL); /* QoS flow descriptions */ memset(&qos_flow_description, 0, sizeof(qos_flow_description)); diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 907fe3332f..1f1c32b07a 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -236,6 +236,7 @@ bool smf_nsmf_handle_create_sm_context( sess->s_nssai.sst = sNssai->sst; sess->s_nssai.sd = ogs_s_nssai_sd_from_string(sNssai->sd); if (SmContextCreateData->hplmn_snssai) { + sess->mapped_hplmn_presence = true; sess->mapped_hplmn.sst = SmContextCreateData->hplmn_snssai->sst; sess->mapped_hplmn.sd = ogs_s_nssai_sd_from_string( SmContextCreateData->hplmn_snssai->sd); diff --git a/tests/common/context.c b/tests/common/context.c index 8307c212ca..3aa4ef1a95 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -1174,6 +1174,7 @@ test_ue_t *test_ue_add_by_suci( s_nssai->sst = 0; s_nssai->sd.v = OGS_S_NSSAI_NO_SD_VALUE; + s_nssai->mapped_hplmn_sst_presence = false; s_nssai->mapped_hplmn_sst = 0; s_nssai->mapped_hplmn_sd.v = OGS_S_NSSAI_NO_SD_VALUE; diff --git a/tests/slice/same-dnn-test.c b/tests/slice/same-dnn-test.c index 64263bf6c2..f2f90ddb0e 100644 --- a/tests/slice/same-dnn-test.c +++ b/tests/slice/same-dnn-test.c @@ -426,6 +426,8 @@ static void test2_func(abts_case *tc, void *data) sst = 2; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. sd.v = OGS_S_NSSAI_NO_SD_VALUE; + test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. + mapped_hplmn_sst_presence = false; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. mapped_hplmn_sst = 0; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. @@ -436,6 +438,8 @@ static void test2_func(abts_case *tc, void *data) sst = 3; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. sd.v = 0x000080; + test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. + mapped_hplmn_sst_presence = false; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. mapped_hplmn_sst = 0; test_ue->requested_nssai.s_nssai[test_ue->requested_nssai.num_of_s_nssai]. From 04ec945e1d334ca5917705a885eff80ad30e1e38 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 11 Jan 2025 20:24:30 +0900 Subject: [PATCH 300/323] [SBI] Follow up on #3655 --- lib/dbi/session.c | 7 +++++++ lib/dbi/subscription.c | 8 ++++++++ lib/nas/5gs/types.c | 1 + src/pcf/context.c | 17 ++++++++++++----- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/dbi/session.c b/lib/dbi/session.c index 6181a8514c..092cca7b58 100644 --- a/lib/dbi/session.c +++ b/lib/dbi/session.c @@ -85,6 +85,7 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn, if (!strcmp(key, OGS_SLICE_STRING) && BSON_ITER_HOLDS_ARRAY(&iter)) { bson_iter_recurse(&iter, &child1_iter); while (bson_iter_next(&child1_iter)) { + bool sst_presence = false; uint8_t sst; ogs_uint24_t sd; @@ -97,6 +98,7 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn, if (!strcmp(child2_key, OGS_SST_STRING) && BSON_ITER_HOLDS_INT32(&child2_iter)) { + sst_presence = true; sst = bson_iter_int32(&child2_iter); } else if (!strcmp(child2_key, OGS_SD_STRING) && BSON_ITER_HOLDS_UTF8(&child2_iter)) { @@ -109,6 +111,11 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn, } } + if (!sst_presence) { + ogs_error("No SST"); + continue; + } + if (s_nssai && s_nssai->sst != sst) continue; if (s_nssai && diff --git a/lib/dbi/subscription.c b/lib/dbi/subscription.c index 25f849440c..e337935fe9 100644 --- a/lib/dbi/subscription.c +++ b/lib/dbi/subscription.c @@ -466,6 +466,7 @@ int ogs_dbi_subscription_data(char *supi, bson_iter_recurse(&iter, &child1_iter); while (bson_iter_next(&child1_iter)) { ogs_slice_data_t *slice_data = NULL; + bool sst_presence = false; ogs_assert( subscription_data->num_of_slice < OGS_MAX_NUM_OF_SLICE); @@ -483,6 +484,7 @@ int ogs_dbi_subscription_data(char *supi, if (!strcmp(child2_key, OGS_SST_STRING) && BSON_ITER_HOLDS_INT32(&child2_iter)) { slice_data->s_nssai.sst = bson_iter_int32(&child2_iter); + sst_presence = true; } else if (!strcmp(child2_key, OGS_SD_STRING) && BSON_ITER_HOLDS_UTF8(&child2_iter)) { utf8 = bson_iter_utf8(&child2_iter, &length); @@ -794,6 +796,12 @@ int ogs_dbi_subscription_data(char *supi, } } } + + if (!sst_presence) { + ogs_error("No SST"); + continue; + } + subscription_data->num_of_slice++; } } else if (!strcmp(key, OGS_MME_HOST_STRING) && diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index e9a4cbc947..5e65c0942e 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -140,6 +140,7 @@ void ogs_nas_build_s_nssai( * "no SD value associated with the SST". */ (nas_s_nssai_ie->sd.v == OGS_S_NSSAI_NO_SD_VALUE && + nas_s_nssai_ie->mapped_hplmn_sst_presence && nas_s_nssai_ie->mapped_hplmn_sd.v != OGS_S_NSSAI_NO_SD_VALUE)) { v = ogs_htobe24(nas_s_nssai_ie->sd); diff --git a/src/pcf/context.c b/src/pcf/context.c index 9131318f96..41f1779bd9 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -119,6 +119,7 @@ static int parse_slice_conf( do { ogs_app_slice_conf_t *slice_conf = NULL; ogs_s_nssai_t s_nssai; + bool sst_presence = false; bool default_indicator = false; s_nssai.sst = 0; @@ -131,6 +132,7 @@ static int parse_slice_conf( if (!strcmp(slice_key, OGS_SST_STRING)) { const char *v = ogs_yaml_iter_value(&slice_iter); if (v) { + sst_presence = true; s_nssai.sst = atoi(v); } } else if (!strcmp(slice_key, OGS_SD_STRING)) { @@ -141,13 +143,18 @@ static int parse_slice_conf( } } - slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); - if (!slice_conf) { - ogs_error("ogs_app_slice_conf_add() failed [SST:%d,SD:0x%x]", - s_nssai.sst, s_nssai.sd.v); + if (sst_presence) { + slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); + if (!slice_conf) { + ogs_error("ogs_app_slice_conf_add() failed [SST:%d,SD:0x%x]", + s_nssai.sst, s_nssai.sd.v); + return OGS_ERROR; + } + slice_conf->data.default_indicator = default_indicator; + } else { + ogs_error("No SST"); return OGS_ERROR; } - slice_conf->data.default_indicator = default_indicator; OGS_YAML_ARRAY_RECURSE(&slice_array, &slice_iter); while (ogs_yaml_iter_next(&slice_iter)) { From ff917e9436a1925fb7a84729ae6b083918d2d9d1 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 4 Jan 2025 14:11:08 +0900 Subject: [PATCH 301/323] [GTP/PFCP] Enable server to bind to multiple addresses via FQDN resolution (#3431) Modified the `ogs_gtp/pfcp_context_parse_config` function to iterate through all configured GTP/PFCP server addresses. When a Fully Qualified Domain Name (FQDN) resolves to multiple IP addresses, the server now binds and listens on each IP address individually. These modifications enhance the flexibility and reliability of the GTP/PFCP server within Open5GS, allowing it to handle multiple network interfaces and redundant IP configurations as required. --- lib/gtp/context.c | 66 ++++++++++++++++++++++++++++++++-------------- lib/pfcp/context.c | 36 ++++++++++++++++++------- 2 files changed, 72 insertions(+), 30 deletions(-) diff --git a/lib/gtp/context.c b/lib/gtp/context.c index 17620b4da7..5c144b54fc 100644 --- a/lib/gtp/context.c +++ b/lib/gtp/context.c @@ -200,6 +200,7 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) server_key); } + /* Add address information */ addr = NULL; for (i = 0; i < num; i++) { rv = ogs_addaddrinfo(&addr, @@ -207,17 +208,30 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) ogs_assert(rv == OGS_OK); } + /* Add each address as a separate socknode */ if (addr) { - if (ogs_global_conf()->parameter. - no_ipv4 == 0) - ogs_socknode_add( - &self.gtpc_list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()->parameter. - no_ipv6 == 0) - ogs_socknode_add( - &self.gtpc_list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&self.gtpc_list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&self.gtpc_list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); } @@ -417,16 +431,28 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) ogs_list_init(&list6); if (addr) { - if (ogs_global_conf()->parameter. - no_ipv4 == 0) - ogs_socknode_add( - &list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()->parameter. - no_ipv6 == 0) - ogs_socknode_add( - &list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); } diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index f0fcff79be..9981fb2d51 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -371,6 +371,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) server_key); } + /* Add address information */ addr = NULL; for (i = 0; i < num; i++) { rv = ogs_addaddrinfo(&addr, @@ -378,20 +379,34 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) ogs_assert(rv == OGS_OK); } + /* Add each address as a separate socknode */ if (addr) { - if (ogs_global_conf()-> - parameter.no_ipv4 == 0) - ogs_socknode_add( - &self.pfcp_list, AF_INET, addr, - is_option ? &option : NULL); - if (ogs_global_conf()-> - parameter.no_ipv6 == 0) - ogs_socknode_add( - &self.pfcp_list6, AF_INET6, addr, - is_option ? &option : NULL); + ogs_sockaddr_t *current = addr; + while (current) { + if (current->ogs_sa_family == + AF_INET && + ogs_global_conf()-> + parameter.no_ipv4 == 0) { + ogs_socknode_add(&self.pfcp_list, + AF_INET, current, + is_option ? + &option : NULL); + } + if (current->ogs_sa_family == + AF_INET6 && + ogs_global_conf()-> + parameter.no_ipv6 == 0) { + ogs_socknode_add(&self.pfcp_list6, + AF_INET6, current, + is_option ? + &option : NULL); + } + current = current->next; + } ogs_freeaddrinfo(addr); } + /* Process advertise addresses if needed */ addr = NULL; for (i = 0; i < num_of_advertise; i++) { rv = ogs_addaddrinfo(&addr, @@ -420,6 +435,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) ogs_freeaddrinfo(addr); } + /* Bind to device if specified */ if (dev) { rv = ogs_socknode_probe( ogs_global_conf()-> From df079b48d85e26ffe03fc18579ed9f7d69e1bff5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 5 Jan 2025 22:17:38 +0900 Subject: [PATCH 302/323] [PFCP] Add ogs_pfcp_get_node_id function with util modules (#3431) Created util.h and util.c to implement the ogs_pfcp_get_node_id function, which retrieves the node_id from a PFCP message. Utilized the ogs_pfcp_status_e enum for enhanced error handling, distinguishing between success, absence, and error states. --- lib/pfcp/meson.build | 2 + lib/pfcp/ogs-pfcp.h | 1 + lib/pfcp/util.c | 144 +++++++++++++++++++++++++++++++++++++++++++ lib/pfcp/util.h | 57 +++++++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 lib/pfcp/util.c create mode 100644 lib/pfcp/util.h diff --git a/lib/pfcp/meson.build b/lib/pfcp/meson.build index 910b50828c..50b524852d 100644 --- a/lib/pfcp/meson.build +++ b/lib/pfcp/meson.build @@ -45,6 +45,7 @@ libpfcp_sources = files(''' xact.h context.h rule-match.h + util.h message.c types.c @@ -55,6 +56,7 @@ libpfcp_sources = files(''' xact.c context.c rule-match.c + util.c '''.split()) libpfcp_inc = include_directories('.') diff --git a/lib/pfcp/ogs-pfcp.h b/lib/pfcp/ogs-pfcp.h index 7403ba80d8..e6ea050a39 100644 --- a/lib/pfcp/ogs-pfcp.h +++ b/lib/pfcp/ogs-pfcp.h @@ -43,6 +43,7 @@ #include "pfcp/path.h" #include "pfcp/xact.h" #include "pfcp/handler.h" +#include "pfcp/util.h" #ifdef __cplusplus extern "C" { diff --git a/lib/pfcp/util.c b/lib/pfcp/util.c new file mode 100644 index 0000000000..fd91ca608d --- /dev/null +++ b/lib/pfcp/util.c @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2025 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "ogs-pfcp.h" + +/** + * Extracts the `node_id` from a PFCP message. + * + * @param node_id Pointer to store the extracted node_id. + * @param msg Pointer to the parsed PFCP message. + * @return ogs_pfcp_status_e Status of the operation. + */ +ogs_pfcp_status_e ogs_pfcp_get_node_id( + ogs_pfcp_node_id_t *node_id, ogs_pfcp_message_t *message) +{ + ogs_pfcp_tlv_node_id_t *tlv_node_id = NULL; + + ogs_assert(node_id); + ogs_assert(message); + + switch (message->h.type) { + /* Message Types with node_id */ + case OGS_PFCP_PFD_MANAGEMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_pfd_management_request.node_id; + break; + + case OGS_PFCP_PFD_MANAGEMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_pfd_management_response.node_id; + break; + + case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_setup_request.node_id; + break; + + case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_setup_response.node_id; + break; + + case OGS_PFCP_ASSOCIATION_UPDATE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_update_request.node_id; + break; + + case OGS_PFCP_ASSOCIATION_UPDATE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_update_response.node_id; + break; + + case OGS_PFCP_ASSOCIATION_RELEASE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_release_request.node_id; + break; + + case OGS_PFCP_ASSOCIATION_RELEASE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_release_response.node_id; + break; + + case OGS_PFCP_NODE_REPORT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_node_report_request.node_id; + break; + + case OGS_PFCP_NODE_REPORT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_node_report_response.node_id; + break; + + case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_request.node_id; + break; + + case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_response.node_id; + break; + + case OGS_PFCP_SESSION_SET_MODIFICATION_REQUEST_TYPE: + tlv_node_id = + &message->pfcp_session_set_modification_request.node_id; + break; + + case OGS_PFCP_SESSION_SET_MODIFICATION_RESPONSE_TYPE: + tlv_node_id = + &message->pfcp_session_set_modification_response.node_id; + break; + + case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_establishment_request.node_id; + break; + + case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_establishment_response.node_id; + break; + + case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_modification_request.node_id; + break; + + /* Add other message types with node_id here as needed */ + + /* Message Types without node_id */ + case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: + case OGS_PFCP_HEARTBEAT_RESPONSE_TYPE: + case OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE: + case OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE: + case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: + case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE: + break; + + default: + ogs_error("Unknown message type %d", message->h.type); + return OGS_PFCP_ERROR_UNKNOWN_MESSAGE; + } + + if (!tlv_node_id) + return OGS_PFCP_ERROR_NODE_ID_NOT_FOUND; + + if (!tlv_node_id->presence) + return OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT; + + memcpy(node_id, tlv_node_id->data, tlv_node_id->len); + + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Semantic incorrect message[%d] type[%d]", + message->h.type, node_id->type); + return OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE; + } + + return OGS_PFCP_STATUS_SUCCESS; +} diff --git a/lib/pfcp/util.h b/lib/pfcp/util.h new file mode 100644 index 0000000000..7380efa3d2 --- /dev/null +++ b/lib/pfcp/util.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2025 by Sukchan Lee <acetcom@gmail.com> + * + * This file is part of Open5GS. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(OGS_PFCP_INSIDE) && !defined(OGS_PFCP_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_PFCP_UTIL_H +#define OGS_PFCP_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + /* Operation was successful */ + OGS_PFCP_STATUS_SUCCESS = 0, + + /* The message type is unknown */ + OGS_PFCP_ERROR_UNKNOWN_MESSAGE, + + /* The message is semantically incorrect */ + OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE, + + /* The node ID is not present in the message */ + OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT, + + /* The node ID was not found in the expected location */ + OGS_PFCP_ERROR_NODE_ID_NOT_FOUND, + + /* Add additional error codes as needed */ +} ogs_pfcp_status_e; + +ogs_pfcp_status_e ogs_pfcp_get_node_id( + ogs_pfcp_node_id_t *node_id, ogs_pfcp_message_t *message); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_PFCP_UTIL_H */ From 8ff1d1b66675c69e2916e3289e481899df5bfc23 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 6 Jan 2025 10:38:51 +0900 Subject: [PATCH 303/323] [CORE] Refactor ogs_sockaddr_strdup to use static buffer and rename - Changed ogs_sockaddr_strdup to ogs_sockaddr_to_string_static - Replaced dynamic allocation with a static buffer - Updated source and header files accordingly --- lib/core/ogs-sockaddr.c | 6 +++--- lib/core/ogs-sockaddr.h | 2 +- lib/sctp/ogs-lksctp.c | 26 ++++++++++---------------- src/mme/mme-sm.c | 13 +++++-------- src/mme/sgsap-path.c | 6 ++---- src/mme/sgsap-sctp.c | 6 ++---- 6 files changed, 23 insertions(+), 36 deletions(-) diff --git a/lib/core/ogs-sockaddr.c b/lib/core/ogs-sockaddr.c index fb25ecd229..31df69a692 100644 --- a/lib/core/ogs-sockaddr.c +++ b/lib/core/ogs-sockaddr.c @@ -667,9 +667,9 @@ char *ogs_ipstrdup(ogs_sockaddr_t *addr) return ogs_strdup(buf); } -char *ogs_sockaddr_strdup(ogs_sockaddr_t *sa_list) +char *ogs_sockaddr_to_string_static(ogs_sockaddr_t *sa_list) { - char dumpstr[OGS_HUGE_LEN]; + static char dumpstr[OGS_HUGE_LEN]; char *p, *last; ogs_sockaddr_t *addr = NULL; @@ -688,7 +688,7 @@ char *ogs_sockaddr_strdup(ogs_sockaddr_t *sa_list) /* If there is more than one addr, remove the last character */ *(p-1) = 0; - return ogs_strdup(dumpstr); + return dumpstr; } /* No address */ diff --git a/lib/core/ogs-sockaddr.h b/lib/core/ogs-sockaddr.h index 817b68df15..95e4d0daaa 100644 --- a/lib/core/ogs-sockaddr.h +++ b/lib/core/ogs-sockaddr.h @@ -125,7 +125,7 @@ int ogs_ipsubnet(ogs_ipsubnet_t *ipsub, char *ogs_gethostname(ogs_sockaddr_t *addr); char *ogs_ipstrdup(ogs_sockaddr_t *addr); -char *ogs_sockaddr_strdup(ogs_sockaddr_t *sa_list); +char *ogs_sockaddr_to_string_static(ogs_sockaddr_t *sa_list); #ifdef __cplusplus } diff --git a/lib/sctp/ogs-lksctp.c b/lib/sctp/ogs-lksctp.c index 79506adc67..c40a991361 100644 --- a/lib/sctp/ogs-lksctp.c +++ b/lib/sctp/ogs-lksctp.c @@ -164,7 +164,6 @@ ogs_sock_t *ogs_sctp_server( ogs_sockopt_t *socket_option) { int rv; - char *sa_list_str = NULL; int sa_family; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -175,7 +174,6 @@ ogs_sock_t *ogs_sctp_server( int total_len = 0; ogs_assert(sa_list); - sa_list_str = ogs_sockaddr_strdup(sa_list); /* Initialize socket options. */ ogs_sockopt_init(&option); @@ -249,8 +247,8 @@ ogs_sock_t *ogs_sctp_server( /* * Log debug info: only the first address is shown here as an example. */ - ogs_debug("sctp_server() %s (bound %d addresses)", sa_list_str, addr_count); - ogs_free(sa_list_str); + ogs_debug("sctp_server() %s (bound %d addresses)", + ogs_sockaddr_to_string_static(sa_list), addr_count); /* Start listening for connections. */ rv = ogs_sock_listen(new_sock); @@ -271,8 +269,8 @@ ogs_sock_t *ogs_sctp_server( * in sa_list (customize as needed). */ ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_server() %s failed", sa_list_str); - ogs_free(sa_list_str); + "sctp_server() %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -284,7 +282,6 @@ ogs_sock_t *ogs_sctp_client( ogs_sockopt_t *socket_option) { int rv; - char *sa_list_str = NULL; int sa_family; ogs_sock_t *new_sock = NULL; ogs_sockopt_t option; @@ -300,7 +297,6 @@ ogs_sock_t *ogs_sctp_client( int local_len = 0; ogs_assert(sa_list); - sa_list_str = ogs_sockaddr_strdup(sa_list); /* Initialize socket options and copy user-provided options if present. */ ogs_sockopt_init(&option); @@ -391,8 +387,8 @@ ogs_sock_t *ogs_sctp_client( } /* Debug log for the first remote address. */ - ogs_debug("sctp_client() connected to %s", sa_list_str); - ogs_free(sa_list_str); + ogs_debug("sctp_client() connected to %s", + ogs_sockaddr_to_string_static(sa_list)); /* Success: free buffers and return the new socket. */ if (local_buf) @@ -414,8 +410,8 @@ ogs_sock_t *ogs_sctp_client( * Adjust to your needs, e.g., log local too if necessary. */ ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_client() %s failed", sa_list_str); - ogs_free(sa_list_str); + "sctp_client() %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -423,7 +419,6 @@ ogs_sock_t *ogs_sctp_client( int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { ogs_sockaddr_t *addr; - char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_assert(sock); @@ -444,10 +439,9 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) } if (addr == NULL) { - sa_list_str = ogs_sockaddr_strdup(sa_list); ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "sctp_connect() %s failed", sa_list_str); - ogs_free(sa_list_str); + "sctp_connect() %s failed", + ogs_sockaddr_to_string_static(sa_list)); return OGS_ERROR; } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index fbf74506b6..6a06fd3e2b 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -54,7 +54,6 @@ void mme_state_final(ogs_fsm_t *s, mme_event_t *e) void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) { int rv; - char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *sock = NULL; @@ -981,10 +980,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) vlr->max_num_of_ostreams = ogs_min(max_num_of_ostreams, vlr->max_num_of_ostreams); - sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); ogs_debug("VLR-SGs SCTP_COMM_UP %s Max Num of Outbound Streams[%d]", - sa_list_str, vlr->max_num_of_ostreams); - ogs_free(sa_list_str); + ogs_sockaddr_to_string_static(vlr->sa_list), + vlr->max_num_of_ostreams); e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); @@ -998,18 +996,17 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(vlr); ogs_assert(OGS_FSM_STATE(&vlr->sm)); - sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); if (OGS_FSM_CHECK(&vlr->sm, sgsap_state_connected)) { e->vlr = vlr; ogs_fsm_dispatch(&vlr->sm, e); - ogs_info("VLR-SGs %s connection refused!!!", sa_list_str); + ogs_info("VLR-SGs %s connection refused!!!", + ogs_sockaddr_to_string_static(vlr->sa_list)); } else { ogs_warn("VLR-SGs %s connection refused, Already Removed!", - sa_list_str); + ogs_sockaddr_to_string_static(vlr->sa_list)); } - ogs_free(sa_list_str); break; case MME_EVENT_SGSAP_MESSAGE: diff --git a/src/mme/sgsap-path.c b/src/mme/sgsap-path.c index b3e70a4f98..2fbdfb2b1b 100644 --- a/src/mme/sgsap-path.c +++ b/src/mme/sgsap-path.c @@ -76,7 +76,6 @@ int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf, uint16_t stream_no) int sgsap_send_to_vlr_with_sid( mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no) { - char *sa_list_str = NULL; ogs_sock_t *sock = NULL;; ogs_assert(vlr); @@ -84,9 +83,8 @@ int sgsap_send_to_vlr_with_sid( sock = vlr->sock; ogs_assert(sock); - sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); - ogs_debug(" StreamNO[%d] VLR-IP[%s]", stream_no, sa_list_str); - ogs_free(sa_list_str); + ogs_debug(" StreamNO[%d] VLR-IP[%s]", + stream_no, ogs_sockaddr_to_string_static(vlr->sa_list)); return sgsap_send(sock, pkbuf, stream_no); } diff --git a/src/mme/sgsap-sctp.c b/src/mme/sgsap-sctp.c index 0b21a1b607..e7c8d340cc 100644 --- a/src/mme/sgsap-sctp.c +++ b/src/mme/sgsap-sctp.c @@ -34,7 +34,6 @@ static void recv_handler(ogs_sock_t *sock); ogs_sock_t *sgsap_client(mme_vlr_t *vlr) { - char *sa_list_str = NULL; ogs_sock_t *sock = NULL; ogs_assert(vlr); @@ -51,9 +50,8 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) OGS_POLLIN, sock->fd, lksctp_recv_handler, sock); ogs_assert(vlr->poll); #endif - sa_list_str = ogs_sockaddr_strdup(vlr->sa_list); - ogs_info("sgsap client() %s", sa_list_str); - ogs_free(sa_list_str); + ogs_info("sgsap client() %s", + ogs_sockaddr_to_string_static(vlr->sa_list)); } return sock; From d181ab54ccf9fb829ec491dfc18ab42e4179ae8f Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 11 Jan 2025 14:32:39 +0900 Subject: [PATCH 304/323] [PFCP] Refactor PFCP address handling (#3431) - Replace direct usage of OGS_ADDR/OGS_PORT macros with ogs_sockaddr_to_string_static() for consistent IPv4/IPv6 logging. - Remove redundant stack buffer allocations for address printing. - Update PFCP node address handling to use addr_list and related merges, avoiding obsolete sa_list references. - Use ogs_pfcp_extract_node_id() and related APIs to safely extract PFCP Node ID, improving error handling and reducing stack usage. --- lib/core/ogs-sockaddr.c | 102 ++++++++++-- lib/core/ogs-sockaddr.h | 17 +- lib/pfcp/context.c | 189 +++++++++++++++++++--- lib/pfcp/context.h | 27 +++- lib/pfcp/handler.c | 22 +-- lib/pfcp/path.c | 99 ++++-------- lib/pfcp/path.h | 4 - lib/pfcp/util.c | 338 ++++++++++++++++++++++++++++++---------- lib/pfcp/util.h | 26 ++-- lib/pfcp/xact.c | 113 +++++--------- lib/sctp/ogs-usrsctp.c | 34 ++-- src/sgwc/context.c | 16 +- src/sgwc/pfcp-path.c | 105 +++++++++++-- src/sgwc/pfcp-sm.c | 44 ++---- src/sgwc/sgwc-sm.c | 16 +- src/sgwu/pfcp-path.c | 105 +++++++++++-- src/sgwu/pfcp-sm.c | 44 ++---- src/sgwu/sgwu-sm.c | 17 +- src/smf/binding.c | 10 +- src/smf/context.c | 17 +- src/smf/gx-handler.c | 9 +- src/smf/npcf-handler.c | 9 +- src/smf/pfcp-path.c | 105 +++++++++++-- src/smf/pfcp-sm.c | 43 ++--- src/smf/smf-sm.c | 16 +- src/upf/pfcp-path.c | 105 +++++++++++-- src/upf/pfcp-sm.c | 44 ++---- src/upf/upf-sm.c | 17 +- 28 files changed, 1104 insertions(+), 589 deletions(-) diff --git a/lib/core/ogs-sockaddr.c b/lib/core/ogs-sockaddr.c index 31df69a692..c54a1f5908 100644 --- a/lib/core/ogs-sockaddr.c +++ b/lib/core/ogs-sockaddr.c @@ -55,6 +55,10 @@ #undef OGS_LOG_DOMAIN #define OGS_LOG_DOMAIN __ogs_sock_domain +static bool ogs_sockaddr_compare(const ogs_sockaddr_t *a, + const ogs_sockaddr_t *b, + bool compare_port); + /* If you want to use getnameinfo, * you need to consider DNS query delay (about 10 seconds) */ #if 0 @@ -264,6 +268,60 @@ int ogs_sortaddrinfo(ogs_sockaddr_t **sa_list, int family) return OGS_OK; } +/*-------------------------------------------------------------------------- + * Merge a single node if not already in "dest" list + *-------------------------------------------------------------------------- + */ +void ogs_merge_single_addrinfo( + ogs_sockaddr_t **dest, const ogs_sockaddr_t *item) +{ + ogs_sockaddr_t *p; + ogs_sockaddr_t *new_sa; + + ogs_assert(dest); + ogs_assert(item); + + p = *dest; + + while (p) { + if (ogs_sockaddr_is_equal(p, item)) { + /* Already exists */ + return; + } + p = p->next; + } + new_sa = (ogs_sockaddr_t *)ogs_malloc(sizeof(*new_sa)); + ogs_assert(new_sa); + memcpy(new_sa, item, sizeof(*new_sa)); + if (item->hostname) { + new_sa->hostname = ogs_strdup(item->hostname); + ogs_assert(new_sa->hostname); + } + new_sa->next = NULL; + if (!(*dest)) { + *dest = new_sa; + } else { + p = *dest; + while (p->next) + p = p->next; + p->next = new_sa; + } +} + +/*-------------------------------------------------------------------------- + * Merge an entire src list into dest + *-------------------------------------------------------------------------- + */ +void ogs_merge_addrinfo(ogs_sockaddr_t **dest, const ogs_sockaddr_t *src) +{ + const ogs_sockaddr_t *cur; + cur = src; + while (cur) { + ogs_merge_single_addrinfo(dest, cur); + cur = cur->next; + } +} + ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa) { #if defined(HAVE_GETIFADDRS) @@ -419,13 +477,16 @@ socklen_t ogs_sockaddr_len(const void *sa) } } -bool ogs_sockaddr_is_equal(const void *p, const void *q) +/* + * Helper function to compare two addresses. + * If compare_port is true, compare both port and address. + * Otherwise, compare address only. + */ +static bool ogs_sockaddr_compare(const ogs_sockaddr_t *a, + const ogs_sockaddr_t *b, + bool compare_port) { - const ogs_sockaddr_t *a, *b; - - a = p; ogs_assert(a); - b = q; ogs_assert(b); if (a->ogs_sa_family != b->ogs_sa_family) @@ -433,23 +494,42 @@ bool ogs_sockaddr_is_equal(const void *p, const void *q) switch (a->ogs_sa_family) { case AF_INET: - if (a->sin.sin_port != b->sin.sin_port) + if (compare_port && (a->sin.sin_port != b->sin.sin_port)) return false; - if (memcmp(&a->sin.sin_addr, &b->sin.sin_addr, sizeof(struct in_addr)) != 0) + if (memcmp(&a->sin.sin_addr, &b->sin.sin_addr, + sizeof(struct in_addr)) != 0) return false; return true; case AF_INET6: - if (a->sin6.sin6_port != b->sin6.sin6_port) + if (compare_port && (a->sin6.sin6_port != b->sin6.sin6_port)) return false; - if (memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, sizeof(struct in6_addr)) != 0) + if (memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, + sizeof(struct in6_addr)) != 0) return false; return true; default: - ogs_error("Unexpected address faimily %u", a->ogs_sa_family); + ogs_error("Unexpected address family %u", a->ogs_sa_family); ogs_abort(); + return false; /* Defensive return */ } } +/* Compare addresses including port */ +bool ogs_sockaddr_is_equal(const void *p, const void *q) +{ + const ogs_sockaddr_t *a = (const ogs_sockaddr_t *)p; + const ogs_sockaddr_t *b = (const ogs_sockaddr_t *)q; + return ogs_sockaddr_compare(a, b, true); +} + +/* Compare addresses without considering port */ +bool ogs_sockaddr_is_equal_addr(const void *p, const void *q) +{ + const ogs_sockaddr_t *a = (const ogs_sockaddr_t *)p; + const ogs_sockaddr_t *b = (const ogs_sockaddr_t *)q; + return ogs_sockaddr_compare(a, b, false); +} + static int parse_network(ogs_ipsubnet_t *ipsub, const char *network) { /* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */ @@ -669,7 +749,7 @@ char *ogs_ipstrdup(ogs_sockaddr_t *addr) char *ogs_sockaddr_to_string_static(ogs_sockaddr_t *sa_list) { - static char dumpstr[OGS_HUGE_LEN]; + static char dumpstr[OGS_HUGE_LEN] = { 0, }; char *p, *last; ogs_sockaddr_t *addr = NULL; diff --git a/lib/core/ogs-sockaddr.h b/lib/core/ogs-sockaddr.h index 95e4d0daaa..c4550878cf 100644 --- a/lib/core/ogs-sockaddr.h +++ b/lib/core/ogs-sockaddr.h @@ -67,20 +67,8 @@ struct ogs_sockaddr_s { * If there is a name in the configuration file, * it is set in the 'hostname' of ogs_sockaddr_t. * Then, it immediately call getaddrinfo() to fill addr in ogs_sockaddr_t. - * - * When it was always possible to convert DNS to addr, that was no problem. - * However, in some environments, such as Roaming, there are situations - * where it is difficult to always change the DNS to addr. - * - * So, 'fqdn' was created for the purpose of first use in ogs_sbi_client_t. - * 'fqdn' always do not change with addr. - * This value is used as it is in the actual client connection. - * - * Note that 'hostname' is still in use for server or other client - * except for ogs_sbi_client_t. */ char *hostname; - char *fqdn; ogs_sockaddr_t *next; }; @@ -103,6 +91,10 @@ int ogs_copyaddrinfo( int ogs_filteraddrinfo(ogs_sockaddr_t **sa_list, int family); int ogs_sortaddrinfo(ogs_sockaddr_t **sa_list, int family); +void ogs_merge_single_addrinfo( + ogs_sockaddr_t **dest, const ogs_sockaddr_t *item); +void ogs_merge_addrinfo(ogs_sockaddr_t **dest, const ogs_sockaddr_t *src); + ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa); ogs_sockaddr_t *ogs_link_local_addr_by_dev(const char *dev); ogs_sockaddr_t *ogs_link_local_addr_by_sa(const ogs_sockaddr_t *sa); @@ -119,6 +111,7 @@ int ogs_inet_pton(int family, const char *src, void *sa); socklen_t ogs_sockaddr_len(const void *sa); bool ogs_sockaddr_is_equal(const void *p, const void *q); +bool ogs_sockaddr_is_equal_addr(const void *p, const void *q); int ogs_ipsubnet(ogs_ipsubnet_t *ipsub, const char *ipstr, const char *mask_or_numbits); diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 9981fb2d51..9d5b7544a9 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -868,20 +868,67 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) return OGS_OK; } -ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list) +/*-------------------------------------------------------------------------- + * check_any_match(): + * If any node in "list" or the single "single" matches base, return 1 + *-------------------------------------------------------------------------- + */ +static bool check_any_match(ogs_sockaddr_t *base, + ogs_sockaddr_t *list, + const ogs_sockaddr_t *single) +{ + ogs_sockaddr_t *p = NULL; + + while (list) { + p = base; + while (p) { + if (ogs_sockaddr_is_equal_addr(p, list)) + return true; + p = p->next; + } + list = list->next; + } + if (single) { + p = base; + while (p) { + if (ogs_sockaddr_is_equal_addr(p, single)) + return true; + p = p->next; + } + } + return false; +} + +/*-------------------------------------------------------------------------- + * ogs_pfcp_node_new(): + * Create node with config_addr, copy config_addr into node->addr_list + *-------------------------------------------------------------------------- + */ +ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *config_addr) { + int rv; ogs_pfcp_node_t *node = NULL; - ogs_assert(sa_list); - ogs_pool_alloc(&ogs_pfcp_node_pool, &node); if (!node) { - ogs_error("No memory: ogs_pool_alloc() failed"); + ogs_error("No memory: ogs_pool_alloc() failed [%s]", + ogs_sockaddr_to_string_static(config_addr)); return NULL; } memset(node, 0, sizeof(ogs_pfcp_node_t)); - node->sa_list = sa_list; + /* Store config_addr, if any */ + node->config_addr = config_addr; + + /* If config_addr is given, copy it immediately into addr_list */ + if (config_addr) { + rv = ogs_copyaddrinfo(&node->addr_list, config_addr); + if (rv != OGS_OK) { + ogs_error("ogs_copyaddrinfo() failed"); + ogs_pool_free(&ogs_pfcp_node_pool, node); + return NULL; + } + } ogs_list_init(&node->local_list); ogs_list_init(&node->remote_list); @@ -899,49 +946,125 @@ void ogs_pfcp_node_free(ogs_pfcp_node_t *node) ogs_pfcp_xact_delete_all(node); - ogs_freeaddrinfo(node->sa_list); + ogs_freeaddrinfo(node->config_addr); + ogs_freeaddrinfo(node->addr_list); + ogs_pool_free(&ogs_pfcp_node_pool, node); } -ogs_pfcp_node_t *ogs_pfcp_node_add( - ogs_list_t *list, ogs_sockaddr_t *addr) +/*-------------------------------------------------------------------------- + * ogs_pfcp_node_add(): + * Create a new node (with config_addr=NULL), set node_id/from, + * then merge => finally add to list + *-------------------------------------------------------------------------- + */ +ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { ogs_pfcp_node_t *node = NULL; - ogs_sockaddr_t *new = NULL; ogs_assert(list); - ogs_assert(addr); + ogs_assert(node_id && from); - ogs_assert(OGS_OK == ogs_copyaddrinfo(&new, addr)); - node = ogs_pfcp_node_new(new); + /* Create node with no config_addr initially */ + node = ogs_pfcp_node_new(NULL); if (!node) { - ogs_error("No memory : ogs_pfcp_node_new() failed"); - ogs_freeaddrinfo(new); + ogs_error("No memory: ogs_pfcp_node_add() failed node_id:%s from:%s", + ogs_pfcp_node_id_to_string_static(node_id), + ogs_sockaddr_to_string_static(from)); return NULL; } - ogs_assert(node); - memcpy(&node->addr, new, sizeof node->addr); + /* Store node_id and from_addr */ + memcpy(&node->node_id, node_id, sizeof(node->node_id)); + + /* Merge them => fill node->addr_list if conditions are met */ + if (ogs_pfcp_node_merge(node, node_id, from) != OGS_OK) { + ogs_error("ogs_pfcp_node_merge() failed node_id [%s] from [%s]", + ogs_pfcp_node_id_to_string_static(node_id), + ogs_sockaddr_to_string_static(from)); + ogs_pool_free(&ogs_pfcp_node_pool, node); + return NULL; + } ogs_list_add(list, node); return node; } -ogs_pfcp_node_t *ogs_pfcp_node_find( - ogs_list_t *list, ogs_sockaddr_t *addr) +/*-------------------------------------------------------------------------- + * ogs_pfcp_node_find(): + * Find a node in the list whose "addr_list" matches node_id or from_addr + *-------------------------------------------------------------------------- + */ +ogs_pfcp_node_t *ogs_pfcp_node_find(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { - ogs_pfcp_node_t *node = NULL; + ogs_pfcp_node_t *cur; + ogs_sockaddr_t *nid_list = NULL; + int found = 0; ogs_assert(list); - ogs_assert(addr); + ogs_assert(node_id || from); + + if (node_id) + nid_list = ogs_pfcp_node_id_to_addrinfo(node_id); - ogs_list_for_each(list, node) { - if (ogs_sockaddr_is_equal(&node->addr, addr) == true) + ogs_list_for_each(list, cur) { + if (check_any_match(cur->addr_list, nid_list, from)) { + found = 1; break; + } } + if (nid_list) + ogs_freeaddrinfo(nid_list); - return node; + if (found) + return cur; + + return NULL; +} + +/*-------------------------------------------------------------------------- + * ogs_pfcp_node_merge(): + * Merge logic: addr_list + node_id + from_addr + *-------------------------------------------------------------------------- + * - If node->addr_list is empty, copy node->config_addr into addr_list first + * - Convert node_id to addresses, then check from_addr + * - If addr_list is empty => merge everything + * - If addr_list not empty => merge only if there's a matching IP + */ +int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) +{ + ogs_sockaddr_t *nid_list = NULL; + ogs_sockaddr_t single; + + ogs_assert(node); + ogs_assert(node_id || from); + + /* Convert node_id to a list of addresses */ + if (node_id) { + nid_list = ogs_pfcp_node_id_to_addrinfo(node_id); + if (!nid_list) { + ogs_error("ogs_pfcp_node_id_to_addrinfo() failed [%d]", + node_id->type); + return OGS_ERROR; + } + + ogs_merge_addrinfo(&node->addr_list, nid_list); + ogs_freeaddrinfo(nid_list); + } + + /* "from" as single item */ + if (from) { + memcpy(&single, from, sizeof(single)); + single.next = NULL; + + ogs_merge_addrinfo(&node->addr_list, &single); + } + + return OGS_OK; } void ogs_pfcp_node_remove(ogs_list_t *list, ogs_pfcp_node_t *node) @@ -963,6 +1086,26 @@ void ogs_pfcp_node_remove_all(ogs_list_t *list) ogs_pfcp_node_remove(list, node); } +/* Function to compare two node IDs */ +int ogs_pfcp_node_id_compare( + const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2) +{ + if (id1->type != id2->type) { + return false; /* Types do not match */ + } + + switch (id1->type) { + case OGS_PFCP_NODE_ID_IPV4: + return (id1->addr == id2->addr); + case OGS_PFCP_NODE_ID_IPV6: + return (memcmp(id1->addr6, id2->addr6, OGS_IPV6_LEN) == 0); + case OGS_PFCP_NODE_ID_FQDN: + return (strcmp(id1->fqdn, id2->fqdn) == 0); + default: + return false; /* Unknown types do not match */ + } +} + ogs_gtpu_resource_t *ogs_pfcp_find_gtpu_resource(ogs_list_t *list, char *dnn, ogs_pfcp_interface_t source_interface) { diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 289bbd9896..219644fcf2 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -84,10 +84,17 @@ typedef struct ogs_pfcp_context_s { typedef struct ogs_pfcp_node_s { ogs_lnode_t lnode; /* A node of list_t */ - ogs_sockaddr_t *sa_list; /* Socket Address List Candidate */ + ogs_sockaddr_t *config_addr; /* Configured addresses */ + ogs_pfcp_node_id_t node_id; /* PFCP node ID */ - ogs_sock_t *sock; /* Socket Instance */ - ogs_sockaddr_t addr; /* Remote Address */ + /* List of addresses:: final merged address list */ + ogs_sockaddr_t *addr_list; + + /* + * Iterator for round-robin sendto operations. + * Points to the current address in the round-robin sequence. + */ + ogs_sockaddr_t *current_addr; ogs_list_t local_list; ogs_list_t remote_list; @@ -399,15 +406,19 @@ void ogs_pfcp_context_final(void); ogs_pfcp_context_t *ogs_pfcp_self(void); int ogs_pfcp_context_parse_config(const char *local, const char *remote); -ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *sa_list); +ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *config_addr); void ogs_pfcp_node_free(ogs_pfcp_node_t *node); -ogs_pfcp_node_t *ogs_pfcp_node_add( - ogs_list_t *list, ogs_sockaddr_t *addr); -ogs_pfcp_node_t *ogs_pfcp_node_find( - ogs_list_t *list, ogs_sockaddr_t *addr); +ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); +ogs_pfcp_node_t *ogs_pfcp_node_find(ogs_list_t *list, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); +int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, + ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); void ogs_pfcp_node_remove(ogs_list_t *list, ogs_pfcp_node_t *node); void ogs_pfcp_node_remove_all(ogs_list_t *list); +int ogs_pfcp_node_id_compare( + const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2); ogs_gtpu_resource_t *ogs_pfcp_find_gtpu_resource(ogs_list_t *list, char *dnn, ogs_pfcp_interface_t source_interface); diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 6228d1361c..caee63eb9f 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -130,14 +130,9 @@ bool ogs_pfcp_cp_handle_association_setup_request( } } - if (node->up_function_features.ftup == 0) { - char buf[OGS_ADDRSTRLEN]; - ogs_sockaddr_t *addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("F-TEID allocation/release not supported with peer [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - } + if (node->up_function_features.ftup == 0) + ogs_warn("F-TEID allocation/release not supported with peer %s", + ogs_sockaddr_to_string_static(node->addr_list)); return true; } @@ -182,14 +177,9 @@ bool ogs_pfcp_cp_handle_association_setup_response( } } - if (node->up_function_features.ftup == 0) { - char buf[OGS_ADDRSTRLEN]; - ogs_sockaddr_t *addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("F-TEID allocation/release not supported with peer [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - } + if (node->up_function_features.ftup == 0) + ogs_warn("F-TEID allocation/release not supported with peer %s", + ogs_sockaddr_to_string_static(node->addr_list)); return true; } diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index 82e3a3467c..bbced86141 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -36,69 +36,6 @@ ogs_sock_t *ogs_pfcp_server(ogs_socknode_t *node) return pfcp; } -int ogs_pfcp_connect( - ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_pfcp_node_t *node) -{ - ogs_sockaddr_t *addr; - char buf[OGS_ADDRSTRLEN]; - - ogs_assert(ipv4 || ipv6); - ogs_assert(node); - ogs_assert(node->sa_list); - - addr = node->sa_list; - while (addr) { - ogs_sock_t *sock = NULL; - - if (addr->ogs_sa_family == AF_INET) - sock = ipv4; - else if (addr->ogs_sa_family == AF_INET6) - sock = ipv6; - else - ogs_assert_if_reached(); - - if (sock) { - ogs_info("ogs_pfcp_connect() [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - - node->sock = sock; - memcpy(&node->addr, addr, sizeof node->addr); - break; - } - - addr = addr->next; - } - - if (addr == NULL) { - ogs_error("ogs_pfcp_connect() [%s]:%d failed", - OGS_ADDR(node->sa_list, buf), OGS_PORT(node->sa_list)); - ogs_error("Please check the IP version between SMF and UPF nodes."); - return OGS_ERROR; - } - - return OGS_OK; -} - -int ogs_pfcp_send(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) -{ - ssize_t sent; - ogs_sock_t *sock = NULL; - - ogs_assert(node); - ogs_assert(pkbuf); - sock = node->sock; - ogs_assert(sock); - - sent = ogs_send(sock->fd, pkbuf->data, pkbuf->len, 0); - if (sent < 0 || sent != pkbuf->len) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_pfcp_send() failed"); - return OGS_ERROR; - } - - return OGS_OK; -} - int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) { ssize_t sent; @@ -107,11 +44,34 @@ int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) ogs_assert(node); ogs_assert(pkbuf); - sock = node->sock; - ogs_assert(sock); - addr = &node->addr; + ogs_assert(node->addr_list); + + /* Initialize round-robin iterator if needed */ + if (node->current_addr == NULL) { + node->current_addr = node->addr_list; + } + addr = node->current_addr; ogs_assert(addr); + if (addr->ogs_sa_family == AF_INET) { + sock = ogs_pfcp_self()->pfcp_sock; + if (!sock) { + ogs_error("IPv4 socket (pfcp_sock) is not available. " + "Ensure that 'pfcp.server.address: 127.0.0.1' " + "is set in the YAML configuration file."); + return OGS_ERROR; + } + } else if (addr->ogs_sa_family == AF_INET6) { + sock = ogs_pfcp_self()->pfcp_sock6; + if (!sock) { + ogs_error("IPv6 socket (pfcp_sock) is not available. " + "Ensure that 'pfcp.server.address: [::1]' " + "is set in the YAML configuration file."); + return OGS_ERROR; + } + } else + ogs_assert_if_reached(); + sent = ogs_sendto(sock->fd, pkbuf->data, pkbuf->len, 0, addr); if (sent < 0 || sent != pkbuf->len) { if (ogs_socket_errno != OGS_EAGAIN) { @@ -125,6 +85,13 @@ int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) return OGS_ERROR; } + /* Move to next address in round-robin sequence */ + if (node->current_addr->next) + node->current_addr = node->current_addr->next; + else + /* If end of list reached, wrap around to the start */ + node->current_addr = node->addr_list; + return OGS_OK; } diff --git a/lib/pfcp/path.h b/lib/pfcp/path.h index 379e992ebe..f187970b4e 100644 --- a/lib/pfcp/path.h +++ b/lib/pfcp/path.h @@ -56,10 +56,6 @@ extern "C" { typedef struct ogs_pfcp_xact_s ogs_pfcp_xact_t; ogs_sock_t *ogs_pfcp_server(ogs_socknode_t *node); -int ogs_pfcp_connect( - ogs_sock_t *ipv4, ogs_sock_t *ipv6, ogs_pfcp_node_t *node); - -int ogs_pfcp_send(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf); int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf); ogs_pkbuf_t *ogs_pfcp_handle_echo_req(ogs_pkbuf_t *pkt); diff --git a/lib/pfcp/util.c b/lib/pfcp/util.c index fd91ca608d..d640ba2481 100644 --- a/lib/pfcp/util.c +++ b/lib/pfcp/util.c @@ -19,116 +19,180 @@ #include "ogs-pfcp.h" -/** - * Extracts the `node_id` from a PFCP message. - * - * @param node_id Pointer to store the extracted node_id. - * @param msg Pointer to the parsed PFCP message. - * @return ogs_pfcp_status_e Status of the operation. +/* + * Requirements of Node ID: + * NONE : Node ID must not be present + * OPTIONAL : Node ID may or may not be present + * MANDATORY : Node ID must be present */ -ogs_pfcp_status_e ogs_pfcp_get_node_id( - ogs_pfcp_node_id_t *node_id, ogs_pfcp_message_t *message) +#define OGS_PFCP_NODE_ID_NONE 0 +#define OGS_PFCP_NODE_ID_OPTIONAL 1 +#define OGS_PFCP_NODE_ID_MANDATORY 2 + +/* + * This function extracts the PFCP Node ID from the given PFCP message. + * It determines the Node ID field location and requirement based on + * the message type. Then it validates presence and copies data into + * 'node_id'. If Node ID is not consistent with the requirement, an + * error status is returned. + */ +ogs_pfcp_status_e +ogs_pfcp_extract_node_id(ogs_pfcp_message_t *message, + ogs_pfcp_node_id_t *node_id) { + + /* For C89 compliance, all variables are declared upfront. */ ogs_pfcp_tlv_node_id_t *tlv_node_id = NULL; + int requirement = OGS_PFCP_NODE_ID_NONE; + ogs_pfcp_status_e status = OGS_PFCP_STATUS_SUCCESS; - ogs_assert(node_id); + /* Validate input pointers */ ogs_assert(message); + ogs_assert(node_id); + + /* Initialize the output structure */ + memset(node_id, 0, sizeof(*node_id)); + /* Determine the location of node_id TLV and requirement */ switch (message->h.type) { - /* Message Types with node_id */ - case OGS_PFCP_PFD_MANAGEMENT_REQUEST_TYPE: - tlv_node_id = &message->pfcp_pfd_management_request.node_id; - break; + case OGS_PFCP_PFD_MANAGEMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_pfd_management_request.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; - case OGS_PFCP_PFD_MANAGEMENT_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_pfd_management_response.node_id; - break; + case OGS_PFCP_PFD_MANAGEMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_pfd_management_response.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; - case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - tlv_node_id = &message->pfcp_association_setup_request.node_id; - break; + case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_setup_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_association_setup_response.node_id; - break; + case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_setup_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_ASSOCIATION_UPDATE_REQUEST_TYPE: - tlv_node_id = &message->pfcp_association_update_request.node_id; - break; + case OGS_PFCP_ASSOCIATION_UPDATE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_update_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_ASSOCIATION_UPDATE_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_association_update_response.node_id; - break; + case OGS_PFCP_ASSOCIATION_UPDATE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_update_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_ASSOCIATION_RELEASE_REQUEST_TYPE: - tlv_node_id = &message->pfcp_association_release_request.node_id; - break; + case OGS_PFCP_ASSOCIATION_RELEASE_REQUEST_TYPE: + tlv_node_id = &message->pfcp_association_release_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_ASSOCIATION_RELEASE_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_association_release_response.node_id; - break; + case OGS_PFCP_ASSOCIATION_RELEASE_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_association_release_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_NODE_REPORT_REQUEST_TYPE: - tlv_node_id = &message->pfcp_node_report_request.node_id; - break; + case OGS_PFCP_NODE_REPORT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_node_report_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_NODE_REPORT_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_node_report_response.node_id; - break; + case OGS_PFCP_NODE_REPORT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_node_report_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE: - tlv_node_id = &message->pfcp_session_set_deletion_request.node_id; - break; + case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_session_set_deletion_response.node_id; - break; + case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_set_deletion_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_SET_MODIFICATION_REQUEST_TYPE: - tlv_node_id = - &message->pfcp_session_set_modification_request.node_id; - break; + case OGS_PFCP_SESSION_SET_MODIFICATION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_set_modification_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_SET_MODIFICATION_RESPONSE_TYPE: - tlv_node_id = - &message->pfcp_session_set_modification_response.node_id; - break; + case OGS_PFCP_SESSION_SET_MODIFICATION_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_set_modification_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: - tlv_node_id = &message->pfcp_session_establishment_request.node_id; - break; + case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_establishment_request.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: - tlv_node_id = &message->pfcp_session_establishment_response.node_id; - break; + case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE: + tlv_node_id = &message->pfcp_session_establishment_response.node_id; + requirement = OGS_PFCP_NODE_ID_MANDATORY; + break; - case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: - tlv_node_id = &message->pfcp_session_modification_request.node_id; - break; + case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: + tlv_node_id = &message->pfcp_session_modification_request.node_id; + requirement = OGS_PFCP_NODE_ID_OPTIONAL; + break; - /* Add other message types with node_id here as needed */ - - /* Message Types without node_id */ - case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: - case OGS_PFCP_HEARTBEAT_RESPONSE_TYPE: - case OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE: - case OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE: - case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE: - case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: - case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: - case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE: - break; + /* Add other message types with node_id here as needed */ - default: - ogs_error("Unknown message type %d", message->h.type); - return OGS_PFCP_ERROR_UNKNOWN_MESSAGE; + case OGS_PFCP_HEARTBEAT_REQUEST_TYPE: + case OGS_PFCP_HEARTBEAT_RESPONSE_TYPE: + case OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE: + case OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE: + case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE: + case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE: + case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE: + /* Node ID must not be present for these messages */ + requirement = OGS_PFCP_NODE_ID_NONE; + break; + + default: + /* Unknown message type */ + ogs_error("Unknown message type %d", message->h.type); + return OGS_PFCP_ERROR_UNKNOWN_MESSAGE; } - if (!tlv_node_id) - return OGS_PFCP_ERROR_NODE_ID_NOT_FOUND; + /* Check requirement vs. tlv_node_id existence */ + switch (requirement) { + case OGS_PFCP_NODE_ID_MANDATORY: + /* Must have tlv_node_id. presence must be 1. */ + ogs_assert(tlv_node_id); + if (!tlv_node_id->presence) { + status = OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT; + goto done; + } + break; - if (!tlv_node_id->presence) - return OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT; + case OGS_PFCP_NODE_ID_OPTIONAL: + /* + * Must have tlv_node_id. presence=1 => real Node ID + * presence=0 => no Node ID + */ + ogs_assert(tlv_node_id); + if (!tlv_node_id->presence) { + status = OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT; + goto done; + } + break; + + case OGS_PFCP_NODE_ID_NONE: + /* Must be NULL => no Node ID field */ + ogs_assert(tlv_node_id == NULL); + status = OGS_PFCP_STATUS_NODE_ID_NONE; + goto done; + + default: + status = OGS_PFCP_ERROR_UNKNOWN_MESSAGE; + goto done; + } memcpy(node_id, tlv_node_id->data, tlv_node_id->len); @@ -140,5 +204,113 @@ ogs_pfcp_status_e ogs_pfcp_get_node_id( return OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE; } - return OGS_PFCP_STATUS_SUCCESS; + /* Node ID is valid */ + status = OGS_PFCP_STATUS_SUCCESS; + +done: + return status; +} + +ogs_sockaddr_t *ogs_pfcp_node_id_to_addrinfo(const ogs_pfcp_node_id_t *node_id) +{ + ogs_sockaddr_t *p; + int ret; + uint16_t port = ogs_pfcp_self()->pfcp_port; + char fqdn[OGS_MAX_FQDN_LEN+1]; + + ogs_assert(node_id); + switch (node_id->type) { + + /*------------------------------------------------ + * 1) IPv4 + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_IPV4: + p = (ogs_sockaddr_t *)ogs_calloc(1, sizeof(*p)); + if (!p) { + ogs_error("ogs_calloc() failed"); + return NULL; + } + p->sa.sa_family = AF_INET; + p->sin.sin_port = htobe16(port); + p->sin.sin_addr.s_addr = node_id->addr; + p->next = NULL; + return p; + + /*------------------------------------------------ + * 2) IPv6 + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_IPV6: + p = (ogs_sockaddr_t *)ogs_calloc(1, sizeof(*p)); + if (!p) { + ogs_error("ogs_calloc() failed"); + return NULL; + } + p->sa.sa_family = AF_INET6; + p->sin6.sin6_port = htobe16(port); + /* Copy 16 bytes of IPv6 address */ + memcpy(&p->sin6.sin6_addr, node_id->addr6, 16); + p->next = NULL; + return OGS_OK; + + /*------------------------------------------------ + * 3) FQDN + *-----------------------------------------------*/ + case OGS_PFCP_NODE_ID_FQDN: + /* If the FQDN is not empty, we attempt DNS resolution. + * ogs_addaddrinfo() is a placeholder for your actual + * DNS -> ogs_sockaddr_t function (often wraps getaddrinfo). + */ + /* Port=0 or set as needed, family=AF_UNSPEC, flags=0. */ + if (ogs_fqdn_parse(fqdn, node_id->fqdn, strlen(node_id->fqdn)) <= 0) { + ogs_error("ogs_fqdn_parse() error [%s]", node_id->fqdn); + return NULL; + } + ret = ogs_getaddrinfo(&p, AF_UNSPEC, fqdn, port, 0); + if (ret != 0) { + /* DNS resolution failed => *out remains NULL */ + ogs_error("ogs_addaddrinfo() failed"); + return NULL; + } + /* If FQDN is empty, just return with no addresses. */ + return p; + + /*------------------------------------------------ + * 4) Unsupported type or default + *-----------------------------------------------*/ + default: + /* Optionally handle an error or just return success + * with no addresses. + */ + ogs_error("Unknown type [%d]", node_id->type); + return NULL; + } +} + +/* Utility function to convert node_id to string for logging */ +const char *ogs_pfcp_node_id_to_string_static( + const ogs_pfcp_node_id_t *node_id) +{ + static char buffer[OGS_MAX_FQDN_LEN+1] = { 0, }; + + if (node_id) { + switch (node_id->type) { + case OGS_PFCP_NODE_ID_IPV4: + inet_ntop(AF_INET, &node_id->addr, buffer, sizeof(buffer)); + break; + case OGS_PFCP_NODE_ID_IPV6: + inet_ntop(AF_INET6, node_id->addr6, buffer, sizeof(buffer)); + break; + case OGS_PFCP_NODE_ID_FQDN: + if (ogs_fqdn_parse(buffer, + node_id->fqdn, + strlen(node_id->fqdn)) <= 0) + snprintf(buffer, sizeof(buffer), "%s", node_id->fqdn); + break; + default: + snprintf(buffer, sizeof(buffer), "Unknown"); + break; + } + } + + return buffer; } diff --git a/lib/pfcp/util.h b/lib/pfcp/util.h index 7380efa3d2..ef6ae5d9a6 100644 --- a/lib/pfcp/util.h +++ b/lib/pfcp/util.h @@ -29,26 +29,30 @@ extern "C" { #endif typedef enum { - /* Operation was successful */ + /* Success with actual Node ID */ OGS_PFCP_STATUS_SUCCESS = 0, - /* The message type is unknown */ - OGS_PFCP_ERROR_UNKNOWN_MESSAGE, + /* Success with no Node ID (NONE type) */ + OGS_PFCP_STATUS_NODE_ID_NONE, - /* The message is semantically incorrect */ - OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE, + /* Success with OPTIONAL node_id_tlv, but presence=0 */ + OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT, - /* The node ID is not present in the message */ + /* Error codes */ + OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE, OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT, - - /* The node ID was not found in the expected location */ OGS_PFCP_ERROR_NODE_ID_NOT_FOUND, + OGS_PFCP_ERROR_UNKNOWN_MESSAGE - /* Add additional error codes as needed */ } ogs_pfcp_status_e; -ogs_pfcp_status_e ogs_pfcp_get_node_id( - ogs_pfcp_node_id_t *node_id, ogs_pfcp_message_t *message); +ogs_pfcp_status_e +ogs_pfcp_extract_node_id(ogs_pfcp_message_t *message, + ogs_pfcp_node_id_t *node_id); + +ogs_sockaddr_t *ogs_pfcp_node_id_to_addrinfo(const ogs_pfcp_node_id_t *node_id); +const char *ogs_pfcp_node_id_to_string_static( + const ogs_pfcp_node_id_t *node_id); #ifdef __cplusplus } diff --git a/lib/pfcp/xact.c b/lib/pfcp/xact.c index 30f3f9f12f..fbbc2d97c5 100644 --- a/lib/pfcp/xact.c +++ b/lib/pfcp/xact.c @@ -70,7 +70,6 @@ void ogs_pfcp_xact_final(void) ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, void (*cb)(ogs_pfcp_xact_t *xact, void *data), void *data) { - char buf[OGS_ADDRSTRLEN]; ogs_pfcp_xact_t *xact = NULL; ogs_assert(node); @@ -109,11 +108,10 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, ogs_list_init(&xact->pdr_to_create_list); - ogs_debug("[%d] %s Create peer [%s]:%d", + ogs_debug("[%d] %s Create peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); return xact; } @@ -121,7 +119,6 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_local_create(ogs_pfcp_node_t *node, static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( ogs_pfcp_node_t *node, uint32_t sqn) { - char buf[OGS_ADDRSTRLEN]; ogs_pfcp_xact_t *xact = NULL; ogs_assert(node); @@ -156,11 +153,10 @@ static ogs_pfcp_xact_t *ogs_pfcp_xact_remote_create( ogs_list_add(xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? &xact->node->local_list : &xact->node->remote_list, xact); - ogs_debug("[%d] %s Create peer [%s]:%d", + ogs_debug("[%d] %s Create peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); return xact; } @@ -183,7 +179,6 @@ ogs_pfcp_xact_t *ogs_pfcp_xact_find_by_id(ogs_pool_id_t id) int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_pfcp_header_t *hdesc, ogs_pkbuf_t *pkbuf) { - char buf[OGS_ADDRSTRLEN]; ogs_pfcp_xact_stage_t stage; ogs_pfcp_header_t *h = NULL; int pfcp_hlen = 0; @@ -193,12 +188,11 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, ogs_assert(hdesc); ogs_assert(pkbuf); - ogs_debug("[%d] %s UPD TX-%d peer [%s]:%d", + ogs_debug("[%d] %s UPD TX-%d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", hdesc->type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); stage = ogs_pfcp_xact_get_stage(hdesc->type, xact->xid); if (xact->org == OGS_PFCP_LOCAL_ORIGINATOR) { @@ -290,15 +284,13 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact, static int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type) { - char buf[OGS_ADDRSTRLEN]; ogs_pfcp_xact_stage_t stage; - ogs_debug("[%d] %s UPD RX-%d peer [%s]:%d", + ogs_debug("[%d] %s UPD RX-%d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); stage = ogs_pfcp_xact_get_stage(type, xact->xid); if (xact->org == OGS_PFCP_LOCAL_ORIGINATOR) { @@ -325,25 +317,23 @@ static int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type) pfcp.t1_holding_duration); ogs_warn("[%d] %s Request Duplicated. Retransmit!" - " for step %d type %d peer [%s]:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("[%d] %s Request Duplicated. Discard!" - " for step %d type %d peer [%s]:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); } return OGS_RETRY; @@ -391,25 +381,23 @@ static int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type) pfcp.t1_holding_duration); ogs_warn("[%d] %s Request Duplicated. Retransmit!" - " for step %d type %d peer [%s]:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("[%d] %s Request Duplicated. Discard!" - " for step %d type %d peer [%s]:%d", + " for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, type, - OGS_ADDR(&xact->node->addr, - buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static( + xact->node->addr_list)); } return OGS_RETRY; @@ -462,8 +450,6 @@ static int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type) int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact) { - char buf[OGS_ADDRSTRLEN]; - uint8_t type; ogs_pkbuf_t *pkbuf = NULL; ogs_pfcp_xact_stage_t stage; @@ -471,11 +457,10 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact) ogs_assert(xact); ogs_assert(xact->node); - ogs_debug("[%d] %s Commit peer [%s]:%d", + ogs_debug("[%d] %s Commit peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); type = xact->seq[xact->step-1].type; stage = ogs_pfcp_xact_get_stage(type, xact->xid); @@ -581,7 +566,6 @@ void ogs_pfcp_xact_delayed_commit(ogs_pfcp_xact_t *xact, ogs_time_t duration) static void response_timeout(void *data) { - char buf[OGS_ADDRSTRLEN]; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -597,12 +581,11 @@ static void response_timeout(void *data) ogs_assert(xact->node); ogs_debug("[%d] %s Response Timeout " - "for step %d type %d peer [%s]:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seq[xact->step-1].type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (--xact->response_rcount > 0) { ogs_pkbuf_t *pkbuf = NULL; @@ -617,12 +600,11 @@ static void response_timeout(void *data) ogs_expect(OGS_OK == ogs_pfcp_sendto(xact->node, pkbuf)); } else { ogs_warn("[%d] %s No Reponse. Give up! " - "for step %d type %d peer [%s]:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seq[xact->step-1].type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (xact->cb) xact->cb(xact, xact->data); @@ -633,7 +615,6 @@ static void response_timeout(void *data) static void holding_timeout(void *data) { - char buf[OGS_ADDRSTRLEN]; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -649,12 +630,11 @@ static void holding_timeout(void *data) ogs_assert(xact->node); ogs_debug("[%d] %s Holding Timeout " - "for step %d type %d peer [%s]:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seq[xact->step-1].type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (--xact->holding_rcount > 0) { if (xact->tm_holding) @@ -662,19 +642,17 @@ static void holding_timeout(void *data) ogs_local_conf()->time.message.pfcp.t1_holding_duration); } else { ogs_debug("[%d] %s Delete Transaction " - "for step %d type %d peer [%s]:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seq[xact->step-1].type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); ogs_pfcp_xact_delete(xact); } } static void delayed_commit_timeout(void *data) { - char buf[OGS_ADDRSTRLEN]; ogs_pool_id_t xact_id = OGS_INVALID_POOL_ID; ogs_pfcp_xact_t *xact = NULL; @@ -690,12 +668,11 @@ static void delayed_commit_timeout(void *data) ogs_assert(xact->node); ogs_debug("[%d] %s Delayed Send Timeout " - "for step %d type %d peer [%s]:%d", + "for step %d type %d peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", xact->step, xact->seq[xact->step-1].type, - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); ogs_pfcp_xact_commit(xact); } @@ -704,7 +681,6 @@ int ogs_pfcp_xact_receive( ogs_pfcp_node_t *node, ogs_pfcp_header_t *h, ogs_pfcp_xact_t **xact) { int rv; - char buf[OGS_ADDRSTRLEN]; uint8_t type; uint32_t sqn, xid; @@ -731,35 +707,33 @@ int ogs_pfcp_xact_receive( list = &node->local_list; break; default: - ogs_error("[%d] Unexpected type %u from PFCP peer [%s]:%d", - xid, type, OGS_ADDR(&node->addr, buf), OGS_PORT(&node->addr)); + ogs_error("[%d] Unexpected type %u from PFCP peer %s", + xid, type, ogs_sockaddr_to_string_static(node->addr_list)); return OGS_ERROR; } ogs_assert(list); ogs_list_for_each(list, new) { if (new->xid == xid) { - ogs_debug("[%d] %s Find peer [%s]:%d", + ogs_debug("[%d] %s Find peer %s", new->xid, new->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); break; } } if (!new) { - ogs_debug("[%d] Cannot find new type %u from PFCP peer [%s]:%d", - xid, type, OGS_ADDR(&node->addr, buf), OGS_PORT(&node->addr)); + ogs_debug("[%d] Cannot find new type %u from PFCP peer %s", + xid, type, ogs_sockaddr_to_string_static(node->addr_list)); new = ogs_pfcp_xact_remote_create(node, sqn); } ogs_assert(new); - ogs_debug("[%d] %s Receive peer [%s]:%d", + ogs_debug("[%d] %s Receive peer %s", new->xid, new->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_sockaddr_to_string_static(node->addr_list)); rv = ogs_pfcp_xact_update_rx(new, type); if (rv == OGS_ERROR) { @@ -811,16 +785,13 @@ static ogs_pfcp_xact_stage_t ogs_pfcp_xact_get_stage(uint8_t type, uint32_t xid) int ogs_pfcp_xact_delete(ogs_pfcp_xact_t *xact) { - char buf[OGS_ADDRSTRLEN]; - ogs_assert(xact); ogs_assert(xact->node); - ogs_debug("[%d] %s Delete peer [%s]:%d", + ogs_debug("[%d] %s Delete peer %s", xact->xid, xact->org == OGS_PFCP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE", - OGS_ADDR(&xact->node->addr, buf), - OGS_PORT(&xact->node->addr)); + ogs_sockaddr_to_string_static(xact->node->addr_list)); if (xact->seq[0].pkbuf) ogs_pkbuf_free(xact->seq[0].pkbuf); diff --git a/lib/sctp/ogs-usrsctp.c b/lib/sctp/ogs-usrsctp.c index 323118a194..a587fbcaed 100644 --- a/lib/sctp/ogs-usrsctp.c +++ b/lib/sctp/ogs-usrsctp.c @@ -93,7 +93,6 @@ ogs_sock_t *ogs_sctp_server( int type, ogs_sockaddr_t *sa_list, ogs_sockopt_t *socket_option) { int rv; - char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *new = NULL; @@ -143,10 +142,8 @@ ogs_sock_t *ogs_sctp_server( } if (addr == NULL) { - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_error("sctp_server %s failed", sa_list_str); - ogs_free(sa_list_str); - + ogs_error("sctp_server %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -164,7 +161,6 @@ ogs_sock_t *ogs_sctp_client( ogs_sockopt_t *socket_option) { int rv; - char *sa_list_str = NULL; char buf[OGS_ADDRSTRLEN]; ogs_sock_t *new = NULL; @@ -214,10 +210,8 @@ ogs_sock_t *ogs_sctp_client( } if (addr == NULL) { - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_error("sctp_client %s failed", sa_list_str); - ogs_free(sa_list_str); - + ogs_error("sctp_client %s failed", + ogs_sockaddr_to_string_static(sa_list)); return NULL; } @@ -227,7 +221,6 @@ ogs_sock_t *ogs_sctp_client( int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char *sa_list_str = NULL; socklen_t addrlen; ogs_assert(socket); @@ -237,16 +230,13 @@ int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) ogs_assert(addrlen); if (usrsctp_bind(socket, &sa_list->sa, addrlen) != 0) { - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_error("sctp_bind() %s failed", sa_list_str); - ogs_free(sa_list_str); + ogs_error("sctp_bind() %s failed", + ogs_sockaddr_to_string_static(sa_list)); return OGS_ERROR; } - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_debug("sctp_bind() %s", sa_list_str); - ogs_free(sa_list_str); + ogs_debug("sctp_bind() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_OK; } @@ -254,7 +244,6 @@ int ogs_sctp_bind(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) { struct socket *socket = (struct socket *)sock; - char *sa_list_str = NULL; socklen_t addrlen; ogs_assert(socket); @@ -264,16 +253,11 @@ int ogs_sctp_connect(ogs_sock_t *sock, ogs_sockaddr_t *sa_list) ogs_assert(addrlen); if (usrsctp_connect(socket, &sa_list->sa, addrlen) != 0) { - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_error("sctp_connect() %s", sa_list_str); - ogs_free(sa_list_str); - + ogs_error("sctp_connect() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_ERROR; } - sa_list_str = ogs_sockaddr_strdup(sa_list); - ogs_debug("sctp_connect() %s", sa_list_str); - ogs_free(sa_list_str); + ogs_debug("sctp_connect() %s", ogs_sockaddr_to_string_static(sa_list)); return OGS_OK; } diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 3c19ad7bee..758486ef7d 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -408,8 +408,6 @@ static ogs_pfcp_node_t *selected_sgwu_node( void sgwc_sess_select_sgwu(sgwc_sess_t *sess) { - char buf[OGS_ADDRSTRLEN]; - ogs_assert(sess); /* @@ -425,8 +423,9 @@ void sgwc_sess_select_sgwu(sgwc_sess_t *sess) selected_sgwu_node(ogs_pfcp_self()->pfcp_node, sess); ogs_assert(ogs_pfcp_self()->pfcp_node); OGS_SETUP_PFCP_NODE(sess, ogs_pfcp_self()->pfcp_node); - ogs_debug("UE using SGW-U on IP[%s]", - OGS_ADDR(&ogs_pfcp_self()->pfcp_node->addr, buf)); + ogs_debug("UE using SGW-U on IP %s", + ogs_sockaddr_to_string_static( + ogs_pfcp_self()->pfcp_node->addr_list)); } int sgwc_sess_remove(sgwc_sess_t *sess) @@ -761,14 +760,15 @@ sgwc_tunnel_t *sgwc_tunnel_add( else tunnel->local_teid = pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &tunnel->local_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &tunnel->local_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &tunnel->local_addr6, &sess->pfcp_node->addr)); + &tunnel->local_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index b0b12aaddc..5712fa98cd 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -61,8 +61,12 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; + ogs_pfcp_message_t *message = NULL; ogs_pfcp_header_t *h = NULL; + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; + ogs_assert(fd != INVALID_SOCKET); pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); @@ -102,28 +106,105 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) e = sgwc_event_new(SGWC_EVT_SXA_MESSAGE); ogs_assert(e); - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); + ogs_pkbuf_free(pkbuf); + sgwc_event_free(e); + return; + } + + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type [%d] pfcp_status [%d] node_id [%s] from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } + + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - sgwc_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type [%d] node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - sgwc_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + sgwc_event_free(e); } int sgwc_pfcp_open(void) diff --git a/src/sgwc/pfcp-sm.c b/src/sgwc/pfcp-sm.c index e0357ae61b..bf9ed5aa28 100644 --- a/src/sgwc/pfcp-sm.c +++ b/src/sgwc/pfcp-sm.c @@ -25,7 +25,6 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data); void sgwc_pfcp_state_initial(ogs_fsm_t *s, sgwc_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -36,10 +35,6 @@ void sgwc_pfcp_state_initial(ogs_fsm_t *s, sgwc_event_t *e) node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, sgwc_timer_pfcp_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -63,14 +58,10 @@ void sgwc_pfcp_state_final(ogs_fsm_t *s, sgwc_event_t *e) void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; - ogs_assert(s); ogs_assert(e); @@ -78,8 +69,6 @@ void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -103,8 +92,8 @@ void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) node = e->pfcp_node; ogs_assert(node); - ogs_warn("Retry association with peer [%s]:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -159,13 +148,10 @@ void sgwc_pfcp_state_will_associate(ogs_fsm_t *s, sgwc_event_t *e) void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; sgwc_sess_t *sess = NULL; ogs_assert(s); @@ -175,14 +161,11 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -195,9 +178,8 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case SGWC_EVT_SXA_MESSAGE: @@ -274,16 +256,14 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCP[REQ] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[REQ] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCP[RSP] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[RSP] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -359,8 +339,8 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e) } break; case SGWC_EVT_SXA_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SGW-U [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SGW-U %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, sgwc_pfcp_state_will_associate); break; default: diff --git a/src/sgwc/sgwc-sm.c b/src/sgwc/sgwc-sm.c index 1d24945eb4..96c7d12725 100644 --- a/src/sgwc/sgwc-sm.c +++ b/src/sgwc/sgwc-sm.c @@ -89,23 +89,12 @@ void sgwc_state_operational(ogs_fsm_t *s, sgwc_event_t *e) ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); pfcp_node = e->pfcp_node; ogs_assert(pfcp_node); ogs_assert(OGS_FSM_STATE(&pfcp_node->sm)); - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } - rv = ogs_pfcp_xact_receive(pfcp_node, &pfcp_message->h, &pfcp_xact); if (rv != OGS_OK) { ogs_pkbuf_free(recvbuf); @@ -113,7 +102,6 @@ void sgwc_state_operational(ogs_fsm_t *s, sgwc_event_t *e) break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp_message = NULL; diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index 73def6adb0..90093543a5 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -61,8 +61,12 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; + ogs_pfcp_message_t *message = NULL; ogs_pfcp_header_t *h = NULL; + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; + ogs_assert(fd != INVALID_SOCKET); pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); @@ -102,28 +106,105 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) e = sgwu_event_new(SGWU_EVT_SXA_MESSAGE); ogs_assert(e); - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); + ogs_pkbuf_free(pkbuf); + sgwu_event_free(e); + return; + } + + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type [%d] pfcp_status [%d] node_id [%s] from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } + + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - sgwu_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type [%d] node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - sgwu_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + sgwu_event_free(e); } int sgwu_pfcp_open(void) diff --git a/src/sgwu/pfcp-sm.c b/src/sgwu/pfcp-sm.c index 9696cf4a7b..130a79912b 100644 --- a/src/sgwu/pfcp-sm.c +++ b/src/sgwu/pfcp-sm.c @@ -25,7 +25,6 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data); void sgwu_pfcp_state_initial(ogs_fsm_t *s, sgwu_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -36,10 +35,6 @@ void sgwu_pfcp_state_initial(ogs_fsm_t *s, sgwu_event_t *e) node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, sgwu_timer_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -63,12 +58,9 @@ void sgwu_pfcp_state_final(ogs_fsm_t *s, sgwu_event_t *e) void sgwu_pfcp_state_will_associate(ogs_fsm_t *s, sgwu_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; ogs_assert(s); ogs_assert(e); @@ -96,11 +88,8 @@ void sgwu_pfcp_state_will_associate(ogs_fsm_t *s, sgwu_event_t *e) case SGWU_EVT_SXA_TIMER: switch(e->timer_id) { case SGWU_TIMER_ASSOCIATION: - addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("Retry association with peer [%s]:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -155,13 +144,10 @@ void sgwu_pfcp_state_will_associate(ogs_fsm_t *s, sgwu_event_t *e) void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; sgwu_sess_t *sess = NULL; ogs_assert(s); @@ -171,14 +157,11 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -191,9 +174,8 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case SGWU_EVT_SXA_MESSAGE: @@ -263,16 +245,14 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCP[REQ] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[REQ] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCP[RSP] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[RSP] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -318,8 +298,8 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e) } break; case SGWU_EVT_SXA_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SGW-C [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SGW-C %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, sgwu_pfcp_state_will_associate); break; default: diff --git a/src/sgwu/sgwu-sm.c b/src/sgwu/sgwu-sm.c index 1490707719..9604306588 100644 --- a/src/sgwu/sgwu-sm.c +++ b/src/sgwu/sgwu-sm.c @@ -58,21 +58,11 @@ void sgwu_state_operational(ogs_fsm_t *s, sgwu_event_t *e) ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); node = e->pfcp_node; ogs_assert(node); - - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } + ogs_assert(OGS_FSM_STATE(&node->sm)); rv = ogs_pfcp_xact_receive(node, &pfcp_message->h, &xact); if (rv != OGS_OK) { @@ -81,7 +71,6 @@ void sgwu_state_operational(ogs_fsm_t *s, sgwu_event_t *e) break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, sgwu_pfcp_state_exception)) { diff --git a/src/smf/binding.c b/src/smf/binding.c index 5ad081a728..d43d639634 100644 --- a/src/smf/binding.c +++ b/src/smf/binding.c @@ -206,15 +206,17 @@ void smf_bearer_binding(smf_sess_t *sess) else bearer->pgw_s5u_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == + AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo(&bearer->pgw_s5u_addr, - &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == + sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo(&bearer->pgw_s5u_addr6, - &sess->pfcp_node->addr)); + sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); diff --git a/src/smf/context.c b/src/smf/context.c index 142496bc51..762a9914e9 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1184,8 +1184,6 @@ static ogs_pfcp_node_t *selected_upf_node( void smf_sess_select_upf(smf_sess_t *sess) { - char buf[OGS_ADDRSTRLEN]; - ogs_assert(sess); /* @@ -1201,8 +1199,9 @@ void smf_sess_select_upf(smf_sess_t *sess) selected_upf_node(ogs_pfcp_self()->pfcp_node, sess); ogs_assert(ogs_pfcp_self()->pfcp_node); OGS_SETUP_PFCP_NODE(sess, ogs_pfcp_self()->pfcp_node); - ogs_debug("UE using UPF on IP[%s]", - OGS_ADDR(&ogs_pfcp_self()->pfcp_node->addr, buf)); + ogs_debug("UE using UPF on IP %s", + ogs_sockaddr_to_string_static( + ogs_pfcp_self()->pfcp_node->addr_list)); } smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type) @@ -2186,14 +2185,16 @@ void smf_sess_create_indirect_data_forwarding(smf_sess_t *sess) else sess->handover.upf_dl_teid = pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( &sess->handover.upf_dl_addr, - &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == + AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( &sess->handover.upf_dl_addr6, - &sess->pfcp_node->addr)); + sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); diff --git a/src/smf/gx-handler.c b/src/smf/gx-handler.c index e9b6d043e3..aba48bd99c 100644 --- a/src/smf/gx-handler.c +++ b/src/smf/gx-handler.c @@ -210,14 +210,15 @@ uint32_t smf_gx_handle_cca_initial_request( else bearer->pgw_s5u_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &bearer->pgw_s5u_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &bearer->pgw_s5u_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &bearer->pgw_s5u_addr6, &sess->pfcp_node->addr)); + &bearer->pgw_s5u_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index e91c061d00..237c46add1 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -645,14 +645,15 @@ bool smf_npcf_smpolicycontrol_handle_create( else sess->upf_n3_teid = ul_pdr->teid; } else { - if (sess->pfcp_node->addr.ogs_sa_family == AF_INET) + ogs_assert(sess->pfcp_node->addr_list); + if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &sess->upf_n3_addr, &sess->pfcp_node->addr)); - else if (sess->pfcp_node->addr.ogs_sa_family == AF_INET6) + &sess->upf_n3_addr, sess->pfcp_node->addr_list)); + else if (sess->pfcp_node->addr_list->ogs_sa_family == AF_INET6) ogs_assert(OGS_OK == ogs_copyaddrinfo( - &sess->upf_n3_addr6, &sess->pfcp_node->addr)); + &sess->upf_n3_addr6, sess->pfcp_node->addr_list)); else ogs_assert_if_reached(); diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 2739325aaa..55976ea1ee 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -101,8 +101,12 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; + ogs_pfcp_message_t *message = NULL; ogs_pfcp_header_t *h = NULL; + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; + ogs_assert(fd != INVALID_SOCKET); pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); @@ -142,28 +146,105 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) e = smf_event_new(SMF_EVT_N4_MESSAGE); ogs_assert(e); - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); + ogs_pkbuf_free(pkbuf); + ogs_event_free(e); + return; + } + + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type [%d] pfcp_status [%d] node_id [%s] from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } + + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); - return; - } + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_error("Cannot find PFCP-Node: type [%d] node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - ogs_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + ogs_event_free(e); } int smf_pfcp_open(void) diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 86cd34e6cf..58ed1c5924 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -28,7 +28,6 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data); void smf_pfcp_state_initial(ogs_fsm_t *s, smf_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -39,10 +38,6 @@ void smf_pfcp_state_initial(ogs_fsm_t *s, smf_event_t *e) node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, smf_timer_pfcp_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -66,13 +61,10 @@ void smf_pfcp_state_final(ogs_fsm_t *s, smf_event_t *e) void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; smf_sess_t *sess; ogs_assert(s); @@ -82,8 +74,6 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: @@ -107,8 +97,8 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) node = e->pfcp_node; ogs_assert(node); - ogs_warn("Retry association with peer [%s]:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -179,13 +169,10 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e) void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; smf_sess_t *sess = NULL; ogs_assert(s); @@ -195,14 +182,11 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->h.id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -215,9 +199,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case SMF_EVT_N4_MESSAGE: @@ -296,16 +279,14 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCP[REQ] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[REQ] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCP[RSP] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[RSP] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_cp_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -421,8 +402,8 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) } break; case SMF_EVT_N4_NO_HEARTBEAT: - ogs_warn("No Heartbeat from UPF [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from UPF %s", + ogs_sockaddr_to_string_static(node->addr_list)); /* * reselect_upf() should not be executed on node_timeout diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index dab4a81694..4c161de1be 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -405,23 +405,12 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); pfcp_node = e->pfcp_node; ogs_assert(pfcp_node); ogs_assert(OGS_FSM_STATE(&pfcp_node->sm)); - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } - rv = ogs_pfcp_xact_receive(pfcp_node, &pfcp_message->h, &pfcp_xact); if (rv != OGS_OK) { ogs_pkbuf_free(recvbuf); @@ -429,7 +418,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = pfcp_xact ? pfcp_xact->id : OGS_INVALID_POOL_ID; e->gtp2_message = NULL; diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index ea4591dce6..bd5c5d03a8 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -64,8 +64,12 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; + ogs_pfcp_message_t *message = NULL; ogs_pfcp_header_t *h = NULL; + ogs_pfcp_status_e pfcp_status;; + ogs_pfcp_node_id_t node_id; + ogs_assert(fd != INVALID_SOCKET); pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); @@ -105,28 +109,105 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) e = upf_event_new(UPF_EVT_N4_MESSAGE); ogs_assert(e); - node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, &from); + /* + * Issue #1911 + * + * Because ogs_pfcp_message_t is over 80kb in size, + * it can cause stack overflow. + * To avoid this, the pfcp_message structure uses heap memory. + */ + if ((message = ogs_pfcp_parse_msg(pkbuf)) == NULL) { + ogs_error("ogs_pfcp_parse_msg() failed"); + ogs_pkbuf_free(pkbuf); + upf_event_free(e); + return; + } + + pfcp_status = ogs_pfcp_extract_node_id(message, &node_id); + switch (pfcp_status) { + case OGS_PFCP_STATUS_SUCCESS: + case OGS_PFCP_STATUS_NODE_ID_NONE: + case OGS_PFCP_STATUS_NODE_ID_OPTIONAL_ABSENT: + ogs_debug("ogs_pfcp_extract_node_id() " + "type [%d] pfcp_status [%d] node_id [%s] from %s", + message->h.type, pfcp_status, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + break; + + case OGS_PFCP_ERROR_SEMANTIC_INCORRECT_MESSAGE: + case OGS_PFCP_ERROR_NODE_ID_NOT_PRESENT: + case OGS_PFCP_ERROR_NODE_ID_NOT_FOUND: + case OGS_PFCP_ERROR_UNKNOWN_MESSAGE: + ogs_error("ogs_pfcp_extract_node_id() failed " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + + default: + ogs_error("Unexpected pfcp_status " + "type [%d] pfcp_status [%d] from %s", + message->h.type, pfcp_status, + ogs_sockaddr_to_string_static(&from)); + goto cleanup; + } + + node = ogs_pfcp_node_find(&ogs_pfcp_self()->pfcp_peer_list, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, &from); if (!node) { - node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, &from); - if (!node) { - ogs_error("No memory: ogs_pfcp_node_add() failed"); - ogs_pkbuf_free(e->pkbuf); - upf_event_free(e); - return; + if (message->h.type == OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE || + message->h.type == OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE) { + ogs_assert(pfcp_status == OGS_PFCP_STATUS_SUCCESS); + node = ogs_pfcp_node_add(&ogs_pfcp_self()->pfcp_peer_list, + &node_id, &from); + if (!node) { + ogs_error("No memory: ogs_pfcp_node_add() failed"); + goto cleanup; + } + ogs_debug("Added PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + + pfcp_node_fsm_init(node, false); + + } else { + ogs_error("Cannot find PFCP-Node: type [%d] node_id %s from %s", + message->h.type, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? + ogs_pfcp_node_id_to_string_static(&node_id) : + "NULL", + ogs_sockaddr_to_string_static(&from)); + goto cleanup; } - - node->sock = data; - pfcp_node_fsm_init(node, false); + } else { + ogs_debug("Found PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); + ogs_expect(OGS_OK == ogs_pfcp_node_merge( + node, + pfcp_status == OGS_PFCP_STATUS_SUCCESS ? &node_id : NULL, + &from)); + ogs_debug("Merged PFCP-Node: addr_list %s", + ogs_sockaddr_to_string_static(node->addr_list)); } + e->pfcp_node = node; e->pkbuf = pkbuf; + e->pfcp_message = message; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_error("ogs_queue_push() failed:%d", (int)rv); - ogs_pkbuf_free(e->pkbuf); - upf_event_free(e); + goto cleanup; } + + return; + +cleanup: + ogs_pkbuf_free(pkbuf); + ogs_pfcp_message_free(message); + upf_event_free(e); } int upf_pfcp_open(void) diff --git a/src/upf/pfcp-sm.c b/src/upf/pfcp-sm.c index 7a1f74b947..04222172b4 100644 --- a/src/upf/pfcp-sm.c +++ b/src/upf/pfcp-sm.c @@ -30,7 +30,6 @@ static void node_timeout(ogs_pfcp_xact_t *xact, void *data); void upf_pfcp_state_initial(ogs_fsm_t *s, upf_event_t *e) { - int rv; ogs_pfcp_node_t *node = NULL; ogs_assert(s); @@ -41,10 +40,6 @@ void upf_pfcp_state_initial(ogs_fsm_t *s, upf_event_t *e) node = e->pfcp_node; ogs_assert(node); - rv = ogs_pfcp_connect( - ogs_pfcp_self()->pfcp_sock, ogs_pfcp_self()->pfcp_sock6, node); - ogs_assert(rv == OGS_OK); - node->t_no_heartbeat = ogs_timer_add(ogs_app()->timer_mgr, upf_timer_no_heartbeat, node); ogs_assert(node->t_no_heartbeat); @@ -68,12 +63,9 @@ void upf_pfcp_state_final(ogs_fsm_t *s, upf_event_t *e) void upf_pfcp_state_will_associate(ogs_fsm_t *s, upf_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; ogs_assert(s); ogs_assert(e); @@ -101,11 +93,8 @@ void upf_pfcp_state_will_associate(ogs_fsm_t *s, upf_event_t *e) case UPF_EVT_N4_TIMER: switch(e->timer_id) { case UPF_TIMER_ASSOCIATION: - addr = node->sa_list; - ogs_assert(addr); - - ogs_warn("Retry association with peer [%s]:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("Retry association with peer failed %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_assert(node->t_association); ogs_timer_start(node->t_association, @@ -160,13 +149,10 @@ void upf_pfcp_state_will_associate(ogs_fsm_t *s, upf_event_t *e) void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) { - char buf[OGS_ADDRSTRLEN]; - ogs_pfcp_node_t *node = NULL; ogs_pfcp_xact_t *xact = NULL; ogs_pfcp_message_t *message = NULL; - ogs_sockaddr_t *addr = NULL; upf_sess_t *sess = NULL; ogs_assert(s); @@ -176,14 +162,11 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) node = e->pfcp_node; ogs_assert(node); - addr = node->sa_list; - ogs_assert(addr); switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_info("PFCP associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_start(node->t_no_heartbeat, ogs_local_conf()->time.message.pfcp.no_heartbeat_duration); ogs_assert(OGS_OK == @@ -196,9 +179,8 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) } break; case OGS_FSM_EXIT_SIG: - ogs_info("PFCP de-associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_info("PFCP de-associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); break; case UPF_EVT_N4_MESSAGE: @@ -267,16 +249,14 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) } break; case OGS_PFCP_ASSOCIATION_SETUP_REQUEST_TYPE: - ogs_warn("PFCP[REQ] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[REQ] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_request(node, xact, &message->pfcp_association_setup_request); break; case OGS_PFCP_ASSOCIATION_SETUP_RESPONSE_TYPE: - ogs_warn("PFCP[RSP] has already been associated [%s]:%d", - OGS_ADDR(&node->addr, buf), - OGS_PORT(&node->addr)); + ogs_warn("PFCP[RSP] has already been associated %s", + ogs_sockaddr_to_string_static(node->addr_list)); ogs_pfcp_up_handle_association_setup_response(node, xact, &message->pfcp_association_setup_response); break; @@ -322,8 +302,8 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) } break; case UPF_EVT_N4_NO_HEARTBEAT: - ogs_warn("No Heartbeat from SMF [%s]:%d", - OGS_ADDR(addr, buf), OGS_PORT(addr)); + ogs_warn("No Heartbeat from SMF %s", + ogs_sockaddr_to_string_static(node->addr_list)); OGS_FSM_TRAN(s, upf_pfcp_state_will_associate); break; default: diff --git a/src/upf/upf-sm.c b/src/upf/upf-sm.c index a4e842546d..df85d21d7d 100644 --- a/src/upf/upf-sm.c +++ b/src/upf/upf-sm.c @@ -63,21 +63,11 @@ void upf_state_operational(ogs_fsm_t *s, upf_event_t *e) ogs_assert(e); recvbuf = e->pkbuf; ogs_assert(recvbuf); + pfcp_message = e->pfcp_message; + ogs_assert(pfcp_message); node = e->pfcp_node; ogs_assert(node); - - /* - * Issue #1911 - * - * Because ogs_pfcp_message_t is over 80kb in size, - * it can cause stack overflow. - * To avoid this, the pfcp_message structure uses heap memory. - */ - if ((pfcp_message = ogs_pfcp_parse_msg(recvbuf)) == NULL) { - ogs_error("ogs_pfcp_parse_msg() failed"); - ogs_pkbuf_free(recvbuf); - break; - } + ogs_assert(OGS_FSM_STATE(&node->sm)); rv = ogs_pfcp_xact_receive(node, &pfcp_message->h, &xact); if (rv != OGS_OK) { @@ -86,7 +76,6 @@ void upf_state_operational(ogs_fsm_t *s, upf_event_t *e) break; } - e->pfcp_message = pfcp_message; e->pfcp_xact_id = xact ? xact->id : OGS_INVALID_POOL_ID; ogs_fsm_dispatch(&node->sm, e); if (OGS_FSM_CHECK(&node->sm, upf_pfcp_state_exception)) { From 13585a34e3d5505dd86d2cdf78c91829f3936851 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 12 Jan 2025 11:47:12 +0900 Subject: [PATCH 305/323] [Metrics] Added PFCP related measurement --- src/smf/context.c | 2 ++ src/smf/metrics.c | 10 ++++++++++ src/smf/metrics.h | 2 ++ src/smf/pfcp-sm.c | 4 ++++ src/upf/metrics.c | 5 +++++ src/upf/metrics.h | 1 + src/upf/pfcp-sm.c | 4 ++++ 7 files changed, 28 insertions(+) diff --git a/src/smf/context.c b/src/smf/context.c index 762a9914e9..2d38061cd7 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -1479,6 +1479,7 @@ smf_sess_t *smf_sess_add_by_psi(smf_ue_t *smf_ue, uint8_t psi) ogs_list_add(&smf_ue->sess_list, sess); + smf_metrics_inst_global_inc(SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE); stats_add_smf_session(); return sess; @@ -1816,6 +1817,7 @@ void smf_sess_remove(smf_sess_t *sess) smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_GTP2_SESSIONS_ACTIVE); break; } + smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE); stats_remove_smf_session(sess); ogs_pool_free(&smf_n4_seid_pool, sess->smf_n4_seid_node); diff --git a/src/smf/metrics.c b/src/smf/metrics.c index dd8cf3370a..626fd90991 100644 --- a/src/smf/metrics.c +++ b/src/smf/metrics.c @@ -126,6 +126,16 @@ smf_metrics_spec_def_t smf_metrics_spec_def_global[_SMF_METR_GLOB_MAX] = { .name = "gtp_peers_active", .description = "Active GTP peers", }, +[SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_sessions_active", + .description = "Active PFCP Sessions", +}, +[SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_peers_active", + .description = "Active PFCP peers", +}, }; int smf_metrics_init_inst_global(void) { diff --git a/src/smf/metrics.h b/src/smf/metrics.h index 8a2209e0cf..3cb4991df3 100644 --- a/src/smf/metrics.h +++ b/src/smf/metrics.h @@ -24,6 +24,8 @@ typedef enum smf_metric_type_global_s { SMF_METR_GLOB_GAUGE_GTP1_PDPCTXS_ACTIVE, SMF_METR_GLOB_GAUGE_GTP2_SESSIONS_ACTIVE, SMF_METR_GLOB_GAUGE_GTP_PEERS_ACTIVE, + SMF_METR_GLOB_GAUGE_PFCP_SESSIONS_ACTIVE, + SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE, _SMF_METR_GLOB_MAX, } smf_metric_type_global_t; extern ogs_metrics_inst_t *smf_metrics_inst_global[_SMF_METR_GLOB_MAX]; diff --git a/src/smf/pfcp-sm.c b/src/smf/pfcp-sm.c index 58ed1c5924..afea236641 100644 --- a/src/smf/pfcp-sm.c +++ b/src/smf/pfcp-sm.c @@ -197,11 +197,15 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e) node->restoration_required = false; ogs_error("PFCP restoration"); } + + smf_metrics_inst_global_inc(SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case OGS_FSM_EXIT_SIG: ogs_info("PFCP de-associated %s", ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); + + smf_metrics_inst_global_dec(SMF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case SMF_EVT_N4_MESSAGE: message = e->pfcp_message; diff --git a/src/upf/metrics.c b/src/upf/metrics.c index 5f280404f8..1a0ca1f0d4 100644 --- a/src/upf/metrics.c +++ b/src/upf/metrics.c @@ -82,6 +82,11 @@ upf_metrics_spec_def_t upf_metrics_spec_def_global[_UPF_METR_GLOB_MAX] = { .name = "fivegs_upffunction_upf_sessionnbr", .description = "Active Sessions", }, +[UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "pfcp_peers_active", + .description = "Active PFCP peers", +}, }; int upf_metrics_init_inst_global(void) { diff --git a/src/upf/metrics.h b/src/upf/metrics.h index d4e930218b..5df082bf04 100644 --- a/src/upf/metrics.h +++ b/src/upf/metrics.h @@ -15,6 +15,7 @@ typedef enum upf_metric_type_global_s { UPF_METR_GLOB_CTR_SM_N4SESSIONREPORT, UPF_METR_GLOB_CTR_SM_N4SESSIONREPORTSUCC, UPF_METR_GLOB_GAUGE_UPF_SESSIONNBR, + UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE, _UPF_METR_GLOB_MAX, } upf_metric_type_global_t; extern ogs_metrics_inst_t *upf_metrics_inst_global[_UPF_METR_GLOB_MAX]; diff --git a/src/upf/pfcp-sm.c b/src/upf/pfcp-sm.c index 04222172b4..27499ef447 100644 --- a/src/upf/pfcp-sm.c +++ b/src/upf/pfcp-sm.c @@ -177,11 +177,15 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e) node->restoration_required = false; ogs_error("PFCP restoration"); } + + upf_metrics_inst_global_inc(UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case OGS_FSM_EXIT_SIG: ogs_info("PFCP de-associated %s", ogs_sockaddr_to_string_static(node->addr_list)); ogs_timer_stop(node->t_no_heartbeat); + + upf_metrics_inst_global_dec(UPF_METR_GLOB_GAUGE_PFCP_PEERS_ACTIVE); break; case UPF_EVT_N4_MESSAGE: message = e->pfcp_message; From 2e68706f1eea029d5172ccad946e78b352c031d0 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 16 Jan 2025 17:19:44 +0900 Subject: [PATCH 306/323] [AMF] prevent crash on npcf-am-policy-control SBI response handling (#3671) This commit addresses an Open5GS bug where the AMF process crashes when receiving npcf-am-policy-control service responses during UE handovers. The crash was occurring in the gmm_state_authentication() function when the AMF encountered an unexpected SBI (Service Based Interface) message from the PCF related to AM Policy Control requests. Added a new case block in gmm_state_authentication() to explicitly handle messages with the service name OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL. --- src/amf/gmm-sm.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index caa6013ffc..123a779e48 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1977,6 +1977,31 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_POLICIES) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + } + ogs_error("[%s] Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Unknown method [%s]", sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + DEFAULT ogs_error("Invalid service name [%s]", sbi_message->h.service.name); ogs_assert_if_reached(); From 49d2f76fe122e873e02675abe8b492600e9a2637 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 16 Jan 2025 09:25:30 +0100 Subject: [PATCH 307/323] [pfcp] fix return value Return value should be a pointer to sockaddr instead of status code. --- lib/pfcp/util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pfcp/util.c b/lib/pfcp/util.c index d640ba2481..295f1211cd 100644 --- a/lib/pfcp/util.c +++ b/lib/pfcp/util.c @@ -250,7 +250,7 @@ ogs_sockaddr_t *ogs_pfcp_node_id_to_addrinfo(const ogs_pfcp_node_id_t *node_id) /* Copy 16 bytes of IPv6 address */ memcpy(&p->sin6.sin6_addr, node_id->addr6, 16); p->next = NULL; - return OGS_OK; + return p; /*------------------------------------------------ * 3) FQDN From 78a993c486fa3dcfb3628f819b840c7b881c89e3 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 16 Jan 2025 09:26:32 +0100 Subject: [PATCH 308/323] [pfcp] fix use-after-free error Variable was used after it was free'd (put back into the application's memory pool, but still). --- lib/pfcp/context.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 9d5b7544a9..3afb7a8e6d 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -2031,10 +2031,10 @@ void ogs_pfcp_bar_delete(ogs_pfcp_bar_t *bar) if (bar->id_node) ogs_pool_free(&bar->sess->bar_id_pool, bar->id_node); - ogs_pool_free(&ogs_pfcp_bar_pool, bar); - bar->sess = NULL; sess->bar = NULL; + + ogs_pool_free(&ogs_pfcp_bar_pool, bar); } ogs_pfcp_rule_t *ogs_pfcp_rule_add(ogs_pfcp_pdr_t *pdr) From ba6a84d1b32dfc26a77f3ba12f0f3297e639ba43 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Thu, 16 Jan 2025 09:26:55 +0100 Subject: [PATCH 309/323] [pfcp] remove unused memory pool --- lib/pfcp/context.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 3afb7a8e6d..001274ee84 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -26,7 +26,6 @@ static int context_initialized = 0; static OGS_POOL(ogs_pfcp_node_pool, ogs_pfcp_node_t); -static OGS_POOL(ogs_pfcp_sess_pool, ogs_pfcp_sess_t); static OGS_POOL(ogs_pfcp_far_pool, ogs_pfcp_far_t); static OGS_POOL(ogs_pfcp_urr_pool, ogs_pfcp_urr_t); static OGS_POOL(ogs_pfcp_qer_pool, ogs_pfcp_qer_t); @@ -55,8 +54,6 @@ void ogs_pfcp_context_init(void) ogs_pool_init(&ogs_pfcp_node_pool, ogs_app()->pool.nf); - ogs_pool_init(&ogs_pfcp_sess_pool, ogs_app()->pool.sess); - ogs_pool_init(&ogs_pfcp_far_pool, ogs_app()->pool.sess * OGS_MAX_NUM_OF_FAR); ogs_pool_init(&ogs_pfcp_urr_pool, @@ -116,7 +113,6 @@ void ogs_pfcp_context_final(void) ogs_pool_final(&ogs_pfcp_pdr_teid_pool); ogs_free(pdr_random_to_index); - ogs_pool_final(&ogs_pfcp_sess_pool); ogs_pool_final(&ogs_pfcp_far_pool); ogs_pool_final(&ogs_pfcp_urr_pool); ogs_pool_final(&ogs_pfcp_qer_pool); From 9c370ff89a5fb7dc4e970d60836fd27135ee4187 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 18 Jan 2025 12:15:00 +0900 Subject: [PATCH 310/323] [PFCP] Reduce DNS spam for FQDN nodes (#3431) (#3664) Each received PFCP message triggered ogs_pfcp_node_find(), causing a DNS resolution if node_id was FQDN. Under heavy traffic, this could lead to excessive DNS queries. - Implement a 300-second refresh interval to avoid repeated DNS lookups. - Store last_dns_refresh in each node to defer new queries until needed. - Treat config-based nodes with no Node ID as UNKNOWN, matching them by IP alone until ogs_pfcp_node_merge() updates their ID. - Validate IPv4, IPv6, or FQDN types in ogs_pfcp_node_merge() and reject invalid IDs. - Provide inline code comments for clarity and maintainability. --- lib/core/ogs-sockaddr.c | 26 +++++ lib/core/ogs-sockaddr.h | 4 + lib/pfcp/context.c | 235 +++++++++++++++++++++++++--------------- lib/pfcp/context.h | 11 +- lib/pfcp/types.h | 8 ++ 5 files changed, 193 insertions(+), 91 deletions(-) diff --git a/lib/core/ogs-sockaddr.c b/lib/core/ogs-sockaddr.c index c54a1f5908..61ad459db9 100644 --- a/lib/core/ogs-sockaddr.c +++ b/lib/core/ogs-sockaddr.c @@ -530,6 +530,32 @@ bool ogs_sockaddr_is_equal_addr(const void *p, const void *q) return ogs_sockaddr_compare(a, b, false); } +bool ogs_sockaddr_check_any_match( + ogs_sockaddr_t *base, + ogs_sockaddr_t *list, const ogs_sockaddr_t *single, bool compare_port) +{ + ogs_sockaddr_t *p = NULL; + + while (list) { + p = base; + while (p) { + if (ogs_sockaddr_compare(p, list, compare_port) == true) + return true; + p = p->next; + } + list = list->next; + } + if (single) { + p = base; + while (p) { + if (ogs_sockaddr_compare(p, single, compare_port) == true) + return true; + p = p->next; + } + } + return false; +} + static int parse_network(ogs_ipsubnet_t *ipsub, const char *network) { /* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */ diff --git a/lib/core/ogs-sockaddr.h b/lib/core/ogs-sockaddr.h index c4550878cf..1442559260 100644 --- a/lib/core/ogs-sockaddr.h +++ b/lib/core/ogs-sockaddr.h @@ -113,6 +113,10 @@ socklen_t ogs_sockaddr_len(const void *sa); bool ogs_sockaddr_is_equal(const void *p, const void *q); bool ogs_sockaddr_is_equal_addr(const void *p, const void *q); +bool ogs_sockaddr_check_any_match( + ogs_sockaddr_t *base, + ogs_sockaddr_t *list, const ogs_sockaddr_t *single, bool compare_port); + int ogs_ipsubnet(ogs_ipsubnet_t *ipsub, const char *ipstr, const char *mask_or_numbits); diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index 001274ee84..f84fbec442 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -864,42 +864,12 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) return OGS_OK; } -/*-------------------------------------------------------------------------- - * check_any_match(): - * If any node in "list" or the single "single" matches base, return 1 - *-------------------------------------------------------------------------- - */ -static bool check_any_match(ogs_sockaddr_t *base, - ogs_sockaddr_t *list, - const ogs_sockaddr_t *single) -{ - ogs_sockaddr_t *p = NULL; - - while (list) { - p = base; - while (p) { - if (ogs_sockaddr_is_equal_addr(p, list)) - return true; - p = p->next; - } - list = list->next; - } - if (single) { - p = base; - while (p) { - if (ogs_sockaddr_is_equal_addr(p, single)) - return true; - p = p->next; - } - } - return false; -} - -/*-------------------------------------------------------------------------- - * ogs_pfcp_node_new(): - * Create node with config_addr, copy config_addr into node->addr_list - *-------------------------------------------------------------------------- - */ +/****************************************************************************** + * ogs_pfcp_node_new() + * - Initialize node_id.type to OGS_PFCP_NODE_ID_UNKNOWN + * - So the node can later be updated with a real Node ID via + * ogs_pfcp_node_merge() once we learn it from PFCP messages. + ******************************************************************************/ ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *config_addr) { int rv; @@ -926,6 +896,12 @@ ogs_pfcp_node_t *ogs_pfcp_node_new(ogs_sockaddr_t *config_addr) } } + /* + * Initialize node->node_id to UNKNOWN, meaning "no Node ID assigned yet". + */ + memset(&node->node_id, 0, sizeof(node->node_id)); + node->node_id.type = OGS_PFCP_NODE_ID_UNKNOWN; + ogs_list_init(&node->local_list); ogs_list_init(&node->remote_list); @@ -948,12 +924,11 @@ void ogs_pfcp_node_free(ogs_pfcp_node_t *node) ogs_pool_free(&ogs_pfcp_node_pool, node); } -/*-------------------------------------------------------------------------- - * ogs_pfcp_node_add(): - * Create a new node (with config_addr=NULL), set node_id/from, - * then merge => finally add to list - *-------------------------------------------------------------------------- - */ +/****************************************************************************** + * ogs_pfcp_node_add() + * - Create a new PFCP node, then call ogs_pfcp_node_merge() to handle + * IPv4/IPv6 or FQDN logic. + ******************************************************************************/ ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { @@ -962,6 +937,18 @@ ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, ogs_assert(list); ogs_assert(node_id && from); + /* + * We only handle IPv4, IPv6, and FQDN types here. If the incoming + * node_id has any other type, we treat it as invalid. This ensures + * we do not merge a node with an unsupported PFCP Node ID. + */ + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Invalid PFCP Node Type = %d", node_id->type); + return NULL; + } + /* Create node with no config_addr initially */ node = ogs_pfcp_node_new(NULL); if (!node) { @@ -971,10 +958,11 @@ ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, return NULL; } - /* Store node_id and from_addr */ + /* Set node->node_id, reset last_dns_refresh. */ memcpy(&node->node_id, node_id, sizeof(node->node_id)); + node->last_dns_refresh = 0; - /* Merge them => fill node->addr_list if conditions are met */ + /* Merge addresses => fill node->addr_list if conditions are met */ if (ogs_pfcp_node_merge(node, node_id, from) != OGS_OK) { ogs_error("ogs_pfcp_node_merge() failed node_id [%s] from [%s]", ogs_pfcp_node_id_to_string_static(node_id), @@ -988,75 +976,137 @@ ogs_pfcp_node_t *ogs_pfcp_node_add(ogs_list_t *list, return node; } -/*-------------------------------------------------------------------------- - * ogs_pfcp_node_find(): - * Find a node in the list whose "addr_list" matches node_id or from_addr - *-------------------------------------------------------------------------- - */ +/****************************************************************************** + * ogs_pfcp_node_find() + * - No DNS logic here. Merely finds a node by node_id (if provided) and + * checks if 'from' address is in node->addr_list. + ******************************************************************************/ ogs_pfcp_node_t *ogs_pfcp_node_find(ogs_list_t *list, ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { ogs_pfcp_node_t *cur; - ogs_sockaddr_t *nid_list = NULL; - int found = 0; ogs_assert(list); ogs_assert(node_id || from); - if (node_id) - nid_list = ogs_pfcp_node_id_to_addrinfo(node_id); - ogs_list_for_each(list, cur) { - if (check_any_match(cur->addr_list, nid_list, from)) { - found = 1; - break; + /* + * If the node currently has a known Node ID (not UNKNOWN) + * and the caller provided a node_id to match, then compare them. + * If they do not match, skip this node. This allows config-based nodes + * (with an UNKNOWN node_id) to be found by IP address alone, + * while nodes with a definite ID must match the incoming node_id. + */ + if (cur->node_id.type != OGS_PFCP_NODE_ID_UNKNOWN && node_id) { + if (!ogs_pfcp_node_id_compare(&cur->node_id, node_id)) + continue; } - } - if (nid_list) - ogs_freeaddrinfo(nid_list); + if (!from) + return cur; - if (found) - return cur; + /* Check if 'from' is in cur->addr_list. */ + if (ogs_sockaddr_check_any_match(cur->addr_list, NULL, + from, /* compare_port= */ true)) { + return cur; + } + } + /* No match found. */ return NULL; } -/*-------------------------------------------------------------------------- +/****************************************************************************** * ogs_pfcp_node_merge(): - * Merge logic: addr_list + node_id + from_addr - *-------------------------------------------------------------------------- - * - If node->addr_list is empty, copy node->config_addr into addr_list first - * - Convert node_id to addresses, then check from_addr - * - If addr_list is empty => merge everything - * - If addr_list not empty => merge only if there's a matching IP - */ + * - If node_id changes to FQDN, we check last_dns_refresh. + * => If 0, do an immediate DNS resolution (first time). + * => If >= 300 seconds passed, do a periodic refresh. + * => Otherwise, skip. + * - If node_id changes to IPv4/IPv6, convert IP addresses immediately. + * - Merge the 'from' address into addr_list if provided. + ******************************************************************************/ int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from) { - ogs_sockaddr_t *nid_list = NULL; ogs_sockaddr_t single; + ogs_sockaddr_t *tmp_list = NULL; ogs_assert(node); ogs_assert(node_id || from); - /* Convert node_id to a list of addresses */ if (node_id) { - nid_list = ogs_pfcp_node_id_to_addrinfo(node_id); - if (!nid_list) { - ogs_error("ogs_pfcp_node_id_to_addrinfo() failed [%d]", - node_id->type); + /* + * We only handle IPv4, IPv6, and FQDN types here. If the incoming + * node_id has any other type, we treat it as invalid. This ensures + * we do not merge a node with an unsupported PFCP Node ID. + */ + if (node_id->type != OGS_PFCP_NODE_ID_IPV4 && + node_id->type != OGS_PFCP_NODE_ID_IPV6 && + node_id->type != OGS_PFCP_NODE_ID_FQDN) { + ogs_error("Invalid PFCP Node Type = %d", node_id->type); return OGS_ERROR; } - ogs_merge_addrinfo(&node->addr_list, nid_list); - ogs_freeaddrinfo(nid_list); + /* Check if node_id is different from node->node_id. */ + if (!ogs_pfcp_node_id_compare(&node->node_id, node_id)) { + /* Update the node's ID and reset the refresh timestamp. */ + memcpy(&node->node_id, node_id, sizeof(node->node_id)); + node->last_dns_refresh = 0; + } + + /* If FQDN, do a DNS lookup (immediate or periodic). */ + if (node->node_id.type == OGS_PFCP_NODE_ID_FQDN) { +/* + * We perform a DNS resolution if 'last_dns_refresh' is zero, which means + * this FQDN node has never been resolved yet (first-time resolution), or if + * at least 300 seconds have passed since the last refresh. Without checking + * '== 0', a newly created FQDN node might skip resolution if 'now' is less + * than the 300-second threshold. + */ + ogs_time_t now = ogs_time_now(); + +/* For 300-second refresh interval in microseconds. */ +#define OGS_PFCP_NODE_DNS_REFRESH_INTERVAL \ + ((ogs_time_t)(300) * OGS_USEC_PER_SEC) + if (node->last_dns_refresh == 0 || + (now - node->last_dns_refresh) >= + OGS_PFCP_NODE_DNS_REFRESH_INTERVAL) { + + tmp_list = ogs_pfcp_node_id_to_addrinfo(&node->node_id); + if (!tmp_list) { + ogs_error("DNS resolution failed for FQDN [%s]", + node->node_id.fqdn); + return OGS_ERROR; + } + + ogs_freeaddrinfo(node->addr_list); + node->addr_list = tmp_list; + node->last_dns_refresh = now; + tmp_list = NULL; + } + } + /* If IPv4/IPv6, convert immediately. */ + else if (node->node_id.type == OGS_PFCP_NODE_ID_IPV4 || + node->node_id.type == OGS_PFCP_NODE_ID_IPV6) { + tmp_list = ogs_pfcp_node_id_to_addrinfo(&node->node_id); + if (!tmp_list) { + ogs_error("Failed to convert node ID to address info"); + return OGS_ERROR; + } + ogs_merge_addrinfo(&node->addr_list, tmp_list); + ogs_freeaddrinfo(tmp_list); + tmp_list = NULL; + } + else { + /* Not IPv4, IPv6, or FQDN => invalid node type. */ + ogs_error("Invalid Node ID type [%d]", node->node_id.type); + return OGS_ERROR; + } } - /* "from" as single item */ + /* Merge 'from' into addr_list if provided. */ if (from) { memcpy(&single, from, sizeof(single)); single.next = NULL; - ogs_merge_addrinfo(&node->addr_list, &single); } @@ -1082,22 +1132,33 @@ void ogs_pfcp_node_remove_all(ogs_list_t *list) ogs_pfcp_node_remove(list, node); } -/* Function to compare two node IDs */ -int ogs_pfcp_node_id_compare( +/****************************************************************************** + * Compare two node IDs for equality. Returns true if they match, else false. + ******************************************************************************/ +bool ogs_pfcp_node_id_compare( const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2) { - if (id1->type != id2->type) { + if (id1->type != id2->type) return false; /* Types do not match */ - } switch (id1->type) { case OGS_PFCP_NODE_ID_IPV4: - return (id1->addr == id2->addr); + if (id1->addr != id2->addr) return false; + return true; + case OGS_PFCP_NODE_ID_IPV6: - return (memcmp(id1->addr6, id2->addr6, OGS_IPV6_LEN) == 0); + if (memcmp(id1->addr6, id2->addr6, OGS_IPV6_LEN) != 0) + return false; + return true; + case OGS_PFCP_NODE_ID_FQDN: - return (strcmp(id1->fqdn, id2->fqdn) == 0); + if (strcmp(id1->fqdn, id2->fqdn) != 0) + return false; + return true; + default: + ogs_error("Unexpected Node Type [%d]", id1->type); + ogs_abort(); return false; /* Unknown types do not match */ } } diff --git a/lib/pfcp/context.h b/lib/pfcp/context.h index 219644fcf2..f18c8bf319 100644 --- a/lib/pfcp/context.h +++ b/lib/pfcp/context.h @@ -84,17 +84,20 @@ typedef struct ogs_pfcp_context_s { typedef struct ogs_pfcp_node_s { ogs_lnode_t lnode; /* A node of list_t */ - ogs_sockaddr_t *config_addr; /* Configured addresses */ + ogs_sockaddr_t *config_addr; /* Configured addresses */ ogs_pfcp_node_id_t node_id; /* PFCP node ID */ /* List of addresses:: final merged address list */ - ogs_sockaddr_t *addr_list; + ogs_sockaddr_t *addr_list; /* * Iterator for round-robin sendto operations. * Points to the current address in the round-robin sequence. */ - ogs_sockaddr_t *current_addr; + ogs_sockaddr_t *current_addr; + + /* Timestamp of last DNS refresh for FQDN nodes. */ + ogs_time_t last_dns_refresh; ogs_list_t local_list; ogs_list_t remote_list; @@ -417,7 +420,7 @@ int ogs_pfcp_node_merge(ogs_pfcp_node_t *node, ogs_pfcp_node_id_t *node_id, ogs_sockaddr_t *from); void ogs_pfcp_node_remove(ogs_list_t *list, ogs_pfcp_node_t *node); void ogs_pfcp_node_remove_all(ogs_list_t *list); -int ogs_pfcp_node_id_compare( +bool ogs_pfcp_node_id_compare( const ogs_pfcp_node_id_t *id1, const ogs_pfcp_node_id_t *id2); ogs_gtpu_resource_t *ogs_pfcp_find_gtpu_resource(ogs_list_t *list, diff --git a/lib/pfcp/types.h b/lib/pfcp/types.h index 433382f5d9..cbe9df7de8 100644 --- a/lib/pfcp/types.h +++ b/lib/pfcp/types.h @@ -550,9 +550,17 @@ typedef struct ogs_pfcp_outer_header_removal_s { uint8_t gtpu_extheader_deletion; } ogs_pfcp_outer_header_removal_t; +/****************************************************************************** + * PFCP Node ID structure + ******************************************************************************/ #define OGS_PFCP_NODE_ID_IPV4 0 #define OGS_PFCP_NODE_ID_IPV6 1 #define OGS_PFCP_NODE_ID_FQDN 2 + +/****************************************************************************** + * Add this line to define the UNKNOWN type. We use '3' since 0,1,2 are taken. + ******************************************************************************/ +#define OGS_PFCP_NODE_ID_UNKNOWN 0xf typedef struct ogs_pfcp_node_id_s { ED2(uint8_t spare:4;, uint8_t type:4;) From aaa950e6cf24a6ccbf84f4956b70e17f20507b82 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 19 Jan 2025 12:18:52 +0900 Subject: [PATCH 311/323] [SBI] Guard OpenSSL keylog callback with version check Wrap SSL_CTX_set_keylog_callback calls with an OpenSSL version check to ensure compatibility with versions older than 1.1.1. This prevents compilation issues on earlier OpenSSL releases, such as those found on Ubuntu 18.04(bionic). --- lib/sbi/client.c | 2 ++ lib/sbi/nghttp2-server.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/sbi/client.c b/lib/sbi/client.c index 16aa1c617a..d9fef9bb91 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -386,8 +386,10 @@ static CURLcode sslctx_callback(CURL *curl, void *sslctx, void *userdata) /* Ensure app data is set for SSL objects */ SSL_CTX_set_app_data(ctx, client->sslkeylog); +#if OPENSSL_VERSION_NUMBER >= 0x10101000L /* Set the SSL Key Log callback */ SSL_CTX_set_keylog_callback(ctx, ogs_sbi_keylog_callback); +#endif return CURLE_OK; } diff --git a/lib/sbi/nghttp2-server.c b/lib/sbi/nghttp2-server.c index c5f3033799..9fcbd108df 100644 --- a/lib/sbi/nghttp2-server.c +++ b/lib/sbi/nghttp2-server.c @@ -216,8 +216,10 @@ static SSL_CTX *create_ssl_ctx( if (sslkeylog_file) { /* Ensure app data is set for SSL objects */ SSL_CTX_set_app_data(ssl_ctx, sslkeylog_file); +#if OPENSSL_VERSION_NUMBER >= 0x10101000L /* Set the SSL Key Log callback */ SSL_CTX_set_keylog_callback(ssl_ctx, ogs_sbi_keylog_callback); +#endif } ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | From df11b05a1e9118281883d178868c94d961456cd7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 19 Jan 2025 12:21:51 +0900 Subject: [PATCH 312/323] Replaced deprecated libidn11-dev with libidn-dev across the project. This update improves compatibility with newer distributions by modifying dependency declarations in control files, Dockerfiles, and documentation. --- debian/control | 2 +- docker/debian/latest/base/Dockerfile | 8 ++++++-- docker/ubuntu/latest/base/Dockerfile | 8 ++++++-- docs/_docs/guide/02-building-open5gs-from-sources.md | 2 +- docs/_docs/troubleshoot/02-now-in-github-issues.md | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/debian/control b/debian/control index 8cb84efbdb..d8c28b9ea2 100644 --- a/debian/control +++ b/debian/control @@ -13,7 +13,7 @@ Build-Depends: debhelper (>= 11), libgnutls28-dev, libgcrypt-dev, libssl-dev, - libidn11-dev, + libidn-dev | libidn11-dev, libmongoc-dev, libbson-dev, libsctp-dev, diff --git a/docker/debian/latest/base/Dockerfile b/docker/debian/latest/base/Dockerfile index 072628d163..bac24f0b58 100644 --- a/docker/debian/latest/base/Dockerfile +++ b/docker/debian/latest/base/Dockerfile @@ -22,7 +22,6 @@ RUN apt-get update && \ libgnutls28-dev \ libgcrypt-dev \ libssl-dev \ - libidn11-dev \ libmongoc-dev \ libbson-dev \ libyaml-dev \ @@ -35,4 +34,9 @@ RUN apt-get update && \ ca-certificates \ netbase \ pkg-config && \ - apt-get clean + if apt-cache show libidn-dev > /dev/null 2>&1; then \ + apt-get install -y --no-install-recommends libidn-dev; \ + else \ + apt-get install -y --no-install-recommends libidn11-dev; \ + fi && \ + apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/docker/ubuntu/latest/base/Dockerfile b/docker/ubuntu/latest/base/Dockerfile index 072628d163..bac24f0b58 100644 --- a/docker/ubuntu/latest/base/Dockerfile +++ b/docker/ubuntu/latest/base/Dockerfile @@ -22,7 +22,6 @@ RUN apt-get update && \ libgnutls28-dev \ libgcrypt-dev \ libssl-dev \ - libidn11-dev \ libmongoc-dev \ libbson-dev \ libyaml-dev \ @@ -35,4 +34,9 @@ RUN apt-get update && \ ca-certificates \ netbase \ pkg-config && \ - apt-get clean + if apt-cache show libidn-dev > /dev/null 2>&1; then \ + apt-get install -y --no-install-recommends libidn-dev; \ + else \ + apt-get install -y --no-install-recommends libidn11-dev; \ + fi && \ + apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index c7b4fbe4c4..01e572f6e4 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -61,7 +61,7 @@ $ sudo ip link set ogstun up Install the dependencies for building the source code. ```bash -$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson +$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson ``` Git clone. diff --git a/docs/_docs/troubleshoot/02-now-in-github-issues.md b/docs/_docs/troubleshoot/02-now-in-github-issues.md index 06b26c352b..11b1b84fca 100644 --- a/docs/_docs/troubleshoot/02-now-in-github-issues.md +++ b/docs/_docs/troubleshoot/02-now-in-github-issues.md @@ -1356,7 +1356,7 @@ $ DIST=debian TAG=stretch docker-compose run dev ```bash $ sudo dpkg --add-architecture armel $ sudo apt update -$ sudo apt install libsctp-dev:armel libyaml-dev:armel libgnutls28-dev:armel libgcrypt-dev:armel libidn11-dev:armel libssl-dev:armel libmongoc-dev:armel libbson-dev:armel +$ sudo apt install libsctp-dev:armel libyaml-dev:armel libgnutls28-dev:armel libgcrypt-dev:armel libidn-dev:armel libssl-dev:armel libmongoc-dev:armel libbson-dev:armel $ sudo apt install crossbuild-essential-armel $ sudo apt install qemu $ git clone https://github.com/{{ site.github_username }}/open5gs From 81f69b436c5b48c38b7547d198e74e04e7677773 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 22 Jan 2025 17:53:36 +0900 Subject: [PATCH 313/323] [DOCS] Update installation guide (#3681) to conditionally install `libidn-dev` or `libidn11-dev`, depending on availability, and clarify common dependencies for Debian/Ubuntu. --- .../_docs/guide/02-building-open5gs-from-sources.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index 01e572f6e4..2c12d44ac9 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -58,10 +58,19 @@ $ sudo ip link set ogstun up ### Building Open5GS --- -Install the dependencies for building the source code. +Install the common dependencies for building the source code. ```bash -$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson +$ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson +``` + +Install libidn-dev or libidn11-dev Depending on Your System +```bash +if apt-cache show libidn-dev > /dev/null 2>&1; then + sudo apt-get install -y --no-install-recommends libidn-dev +else + sudo apt-get install -y --no-install-recommends libidn11-dev +fi ``` Git clone. From b1462f7236f4507a4cc39535e835c432a4e1f133 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sat, 1 Feb 2025 12:33:34 +0900 Subject: [PATCH 314/323] [UDM] Handle maximum SDM subscription limit gracefully (#3688) Previously, the function `udm_nudm_sdm_handle_subscription_create()` would trigger a fatal assertion failure if the maximum number of SDM subscriptions was reached. This commit adds error handling to check if the subscription pool allocation fails. If `udm_sdm_subscription_add()` returns NULL, an appropriate error message is logged, and a 400 Bad Request response is sent back to the client instead of causing a crash. --- src/udm/nudm-handler.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/udm/nudm-handler.c b/src/udm/nudm-handler.c index 52101b4f01..c48db604be 100644 --- a/src/udm/nudm-handler.c +++ b/src/udm/nudm-handler.c @@ -701,7 +701,14 @@ bool udm_nudm_sdm_handle_subscription_create( } sdm_subscription = udm_sdm_subscription_add(udm_ue); - ogs_assert(sdm_subscription); + if (!sdm_subscription) { + ogs_error("[%s] udm_sdm_subscription_add() failed", udm_ue->supi); + ogs_assert(true == + ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, + recvmsg, "udm_sdm_subscription_add() failed", + udm_ue->supi, NULL)); + return false; + } sdm_subscription->data_change_callback_uri = ogs_strdup(SDMSubscription->callback_reference); From 32cf4daf3a04bfcf2b21a1ff6a732fb44b4b46dc Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 2 Feb 2025 10:38:29 +0900 Subject: [PATCH 315/323] [SEC] Improve PFCP Message Validation to Prevent Fragmentation Attacks (#3689) This commit adds additional checks in the PFCP receive callback to ensure that a complete PFCP message is received before parsing. A minimum header length check and a total message length validation are now performed. This prevents incomplete, fragmented messages from being processed and avoids potential parsing errors and DoS conditions. --- lib/pfcp/path.c | 87 +++++++++++++++++++++++++++++++++++++++++++- lib/pfcp/path.h | 4 +- src/sgwc/pfcp-path.c | 38 ++----------------- src/sgwu/pfcp-path.c | 38 ++----------------- src/smf/pfcp-path.c | 38 ++----------------- src/upf/pfcp-path.c | 38 ++----------------- 6 files changed, 105 insertions(+), 138 deletions(-) diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index bbced86141..118d1622da 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -36,6 +36,91 @@ ogs_sock_t *ogs_pfcp_server(ogs_socknode_t *node) return pfcp; } +/* Minimum PFCP header length (e.g., 12 bytes) */ +#define MIN_PFCP_HEADER_LENGTH 12 + +/* + * ogs_pfcp_recvfrom + * + * Receives a PFCP message from the socket 'fd'. It allocates a pkbuf, + * receives the message, trims the pkbuf, and verifies the header. + * If any error occurs (e.g., too short message, unsupported version, or + * incomplete message), the function frees the pkbuf and returns NULL. + * + * The sender's address is stored in 'from'. + * + * Returns a pointer to ogs_pkbuf_t on success, or NULL on failure. + */ +ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from) +{ + ogs_pkbuf_t *pkbuf; + ssize_t size; + ogs_pfcp_header_t *h; + uint16_t pfcp_body_length; + size_t expected_total_length; + + ogs_assert(fd != INVALID_SOCKET); + ogs_assert(from); + + /* Allocate buffer for maximum SDU length */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + if (pkbuf == NULL) { + ogs_error("ogs_pkbuf_alloc() failed"); + return NULL; + } + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); + + size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, from); + if (size <= 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "ogs_recvfrom() failed"); + ogs_pkbuf_free(pkbuf); + return NULL; + } + ogs_pkbuf_trim(pkbuf, size); + + /* Check that the data is at least as long as the header */ + if (size < MIN_PFCP_HEADER_LENGTH) { + ogs_error("Received PFCP message too short: %ld bytes (min %d)", + size, MIN_PFCP_HEADER_LENGTH); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + h = (ogs_pfcp_header_t *)pkbuf->data; + + /* Verify PFCP version */ + if (h->version != OGS_PFCP_VERSION) { + ogs_pfcp_header_t rsp; + memset(&rsp, 0, sizeof(rsp)); + ogs_error("Not supported version[%d]", h->version); + rsp.flags = (OGS_PFCP_VERSION << 5); + rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; + rsp.length = htobe16(4); + rsp.sqn_only = h->sqn_only; + if (ogs_sendto(fd, &rsp, 8, 0, from) < 0) { + ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, + "ogs_sendto() failed"); + } + ogs_pkbuf_free(pkbuf); + return NULL; + } + + /* Check total PFCP message length. + Assume the header's length field indicates the body length, + excluding the first 4 bytes. */ + pfcp_body_length = be16toh(h->length); + expected_total_length = pfcp_body_length + 4; + if ((size_t)size < expected_total_length) { + ogs_error("Incomplete PFCP message: expected %zu bytes, " + "received %ld bytes", expected_total_length, size); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + return pkbuf; +} + int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf) { ssize_t sent; diff --git a/lib/pfcp/path.h b/lib/pfcp/path.h index f187970b4e..c715b6d4f9 100644 --- a/lib/pfcp/path.h +++ b/lib/pfcp/path.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -58,6 +58,8 @@ typedef struct ogs_pfcp_xact_s ogs_pfcp_xact_t; ogs_sock_t *ogs_pfcp_server(ogs_socknode_t *node); int ogs_pfcp_sendto(ogs_pfcp_node_t *node, ogs_pkbuf_t *pkbuf); +ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from); + ogs_pkbuf_t *ogs_pfcp_handle_echo_req(ogs_pkbuf_t *pkt); int ogs_pfcp_send_heartbeat_request(ogs_pfcp_node_t *node, diff --git a/src/sgwc/pfcp-path.c b/src/sgwc/pfcp-path.c index 5712fa98cd..1483e99a1f 100644 --- a/src/sgwc/pfcp-path.c +++ b/src/sgwc/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,50 +56,20 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) { int rv; - ssize_t size; sgwc_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; ogs_pfcp_message_t *message = NULL; - ogs_pfcp_header_t *h = NULL; ogs_pfcp_status_e pfcp_status;; ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); - return; - } - - ogs_pkbuf_trim(pkbuf, size); - - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version[%d]", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } - ogs_pkbuf_free(pkbuf); - + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } diff --git a/src/sgwu/pfcp-path.c b/src/sgwu/pfcp-path.c index 90093543a5..3cdd32053d 100644 --- a/src/sgwu/pfcp-path.c +++ b/src/sgwu/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -56,50 +56,20 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) { int rv; - ssize_t size; sgwu_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; ogs_pfcp_message_t *message = NULL; - ogs_pfcp_header_t *h = NULL; ogs_pfcp_status_e pfcp_status;; ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); - return; - } - - ogs_pkbuf_trim(pkbuf, size); - - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version[%d]", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } - ogs_pkbuf_free(pkbuf); - + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } diff --git a/src/smf/pfcp-path.c b/src/smf/pfcp-path.c index 55976ea1ee..b560cfa029 100644 --- a/src/smf/pfcp-path.c +++ b/src/smf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -96,50 +96,20 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) { int rv; - ssize_t size; smf_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; ogs_pfcp_message_t *message = NULL; - ogs_pfcp_header_t *h = NULL; ogs_pfcp_status_e pfcp_status;; ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); - return; - } - - ogs_pkbuf_trim(pkbuf, size); - - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version[%d]", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } - ogs_pkbuf_free(pkbuf); - + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } diff --git a/src/upf/pfcp-path.c b/src/upf/pfcp-path.c index bd5c5d03a8..ad3c3577a2 100644 --- a/src/upf/pfcp-path.c +++ b/src/upf/pfcp-path.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com> + * Copyright (C) 2019-2025 by Sukchan Lee <acetcom@gmail.com> * * This file is part of Open5GS. * @@ -59,50 +59,20 @@ static void pfcp_recv_cb(short when, ogs_socket_t fd, void *data) { int rv; - ssize_t size; upf_event_t *e = NULL; ogs_pkbuf_t *pkbuf = NULL; ogs_sockaddr_t from; ogs_pfcp_node_t *node = NULL; ogs_pfcp_message_t *message = NULL; - ogs_pfcp_header_t *h = NULL; ogs_pfcp_status_e pfcp_status;; ogs_pfcp_node_id_t node_id; ogs_assert(fd != INVALID_SOCKET); - pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); - ogs_assert(pkbuf); - ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN); - - size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from); - if (size <= 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_recvfrom() failed"); - ogs_pkbuf_free(pkbuf); - return; - } - - ogs_pkbuf_trim(pkbuf, size); - - h = (ogs_pfcp_header_t *)pkbuf->data; - if (h->version != OGS_PFCP_VERSION) { - ogs_pfcp_header_t rsp; - - ogs_error("Not supported version[%d]", h->version); - - memset(&rsp, 0, sizeof rsp); - rsp.flags = (OGS_PFCP_VERSION << 5); - rsp.type = OGS_PFCP_VERSION_NOT_SUPPORTED_RESPONSE_TYPE; - rsp.length = htobe16(4); - rsp.sqn_only = h->sqn_only; - if (ogs_sendto(fd, &rsp, 8, 0, &from) < 0) { - ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, - "ogs_sendto() failed"); - } - ogs_pkbuf_free(pkbuf); - + pkbuf = ogs_pfcp_recvfrom(fd, &from); + if (!pkbuf) { + ogs_error("ogs_pfcp_recvfrom() failed"); return; } From 350bc271fa29d23d860453b35fc72f58cca898ee Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 2 Feb 2025 11:25:14 +0900 Subject: [PATCH 316/323] [SEC] Fix PFCP Message Length Validation in ogs_pfcp_recvfrom (#3689) This commit modifies the message length check in ogs_pfcp_recvfrom. Previously, the condition only verified that the received size was less than the expected length, which could allow messages that are too long to be processed. The condition now requires an exact match between the received size and the expected total PFCP message length, ensuring proper message validation. --- lib/pfcp/path.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index 118d1622da..31d0a737c9 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -111,8 +111,8 @@ ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from) excluding the first 4 bytes. */ pfcp_body_length = be16toh(h->length); expected_total_length = pfcp_body_length + 4; - if ((size_t)size < expected_total_length) { - ogs_error("Incomplete PFCP message: expected %zu bytes, " + if ((size_t)size != expected_total_length) { + ogs_error("Invalid PFCP Header Length: expected %zu bytes, " "received %ld bytes", expected_total_length, size); ogs_pkbuf_free(pkbuf); return NULL; From 9c36fa5ccde8204645c9220e0724ab708ce20d82 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Sun, 2 Feb 2025 11:48:17 +0900 Subject: [PATCH 317/323] [MME] Fix crash related to eNodeB context handling during indirect tunnel responses Replace enb_ue with source_ue to correctly reference the target eNodeB context during handover. Added null checks and assertions to ensure proper session cleanup in both mme-s11-handler.c and s1ap-handler.c. --- src/mme/emm-sm.c | 12 +++++++++++- src/mme/mme-s11-handler.c | 32 ++++++++++++++------------------ src/mme/s1ap-handler.c | 10 ++++++++++ 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 38f817ddf1..20643b71d0 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -310,7 +310,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, ogs_assert(message); enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_assert(enb_ue); + if (!enb_ue) { + ogs_fatal("No S1 Context IMSI[%s] NAS-Type[%d] " + "ENB-UE-ID[%d:%d][%p:%p]", + mme_ue->imsi_bcd, message->emm.h.message_type, + e->enb_ue_id, mme_ue->enb_ue_id, + enb_ue_find_by_id(e->enb_ue_id), + enb_ue_find_by_id(mme_ue->enb_ue_id)); + ogs_assert(e->pkbuf); + ogs_log_hexdump(OGS_LOG_FATAL, e->pkbuf->data, e->pkbuf->len); + ogs_assert_if_reached(); + } h.type = e->nas_type; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index afab8f6876..d85e46cc3f 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -1708,7 +1708,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( sgw_ue_t *sgw_ue = NULL; mme_bearer_t *bearer = NULL; mme_ue_t *mme_ue = NULL; - enb_ue_t *enb_ue = NULL; enb_ue_t *source_ue = NULL; ogs_gtp2_f_teid_t *teid = NULL; @@ -1722,7 +1721,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( ********************/ ogs_assert(xact); mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data)); - enb_ue = enb_ue_find_by_id(xact->enb_ue_id); + source_ue = enb_ue_find_by_id(xact->enb_ue_id); rv = ogs_gtp_xact_commit(xact); if (rv != OGS_OK) { @@ -1734,6 +1733,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( ogs_error("MME-UE Context has already been removed"); return; } + if (!source_ue) { + ogs_error("ENB(Source)-S1 Context has already been removed"); + return; + } sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id); ogs_assert(sgw_ue); @@ -1758,10 +1761,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - if (enb_ue) - mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); - else - ogs_error("ENB-S1 Context has already been removed"); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1776,10 +1776,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { - if (enb_ue) - mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); - else - ogs_error("ENB-S1 Context has already been removed"); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1790,10 +1787,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause); - if (enb_ue) - mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue); - else - ogs_error("ENB-S1 Context has already been removed"); + mme_send_delete_session_or_mme_ue_context_release(source_ue, mme_ue); return; } @@ -1802,6 +1796,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( ********************/ ogs_assert(mme_ue); ogs_assert(sgw_ue); + ogs_assert(source_ue); ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]", mme_ue->mme_s11_teid, sgw_ue->sgw_s11_teid); @@ -1837,9 +1832,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response( } } - source_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); - ogs_assert(source_ue); - r = s1ap_send_handover_command(source_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1957,7 +1949,11 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response( if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) { /* Nothing to do */ } else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) { - r = s1ap_send_handover_cancel_ack(enb_ue_find_by_id(mme_ue->enb_ue_id)); + if (!enb_ue) { + ogs_error("No S1 context"); + return; + } + r = s1ap_send_handover_cancel_ack(enb_ue); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 618b42bb69..aa5f967ce3 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1988,6 +1988,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) ogs_error("No UE(mme-ue) context"); return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("No UE(target-enb-ue) context"); + return; + } if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( @@ -2009,6 +2014,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) ogs_error("No UE(mme-ue) context"); return; } + enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id); + if (!enb_ue) { + ogs_error("No UE(target-enb-ue) context"); + return; + } if (mme_ue_have_indirect_tunnel(mme_ue) == true) { ogs_assert(OGS_OK == mme_gtp_send_delete_indirect_data_forwarding_tunnel_request( From bbfd46240697bb254c25f7ec94f8490a6acf54ed Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Mon, 3 Feb 2025 08:50:40 +0900 Subject: [PATCH 318/323] [PFCP] Fix the compile error (#3689) --- lib/pfcp/path.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pfcp/path.c b/lib/pfcp/path.c index 31d0a737c9..8877d80eb2 100644 --- a/lib/pfcp/path.c +++ b/lib/pfcp/path.c @@ -82,7 +82,7 @@ ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from) /* Check that the data is at least as long as the header */ if (size < MIN_PFCP_HEADER_LENGTH) { ogs_error("Received PFCP message too short: %ld bytes (min %d)", - size, MIN_PFCP_HEADER_LENGTH); + (long)size, MIN_PFCP_HEADER_LENGTH); ogs_pkbuf_free(pkbuf); return NULL; } @@ -113,7 +113,7 @@ ogs_pkbuf_t *ogs_pfcp_recvfrom(ogs_socket_t fd, ogs_sockaddr_t *from) expected_total_length = pfcp_body_length + 4; if ((size_t)size != expected_total_length) { ogs_error("Invalid PFCP Header Length: expected %zu bytes, " - "received %ld bytes", expected_total_length, size); + "received %ld bytes", expected_total_length, (long)size); ogs_pkbuf_free(pkbuf); return NULL; } From 59f64970ddfadc8ce0ef5fde40c72c34263a59d7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Tue, 4 Feb 2025 21:09:20 +0900 Subject: [PATCH 319/323] Update cifuzz --- .github/workflows/cifuzz.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 924041942d..adf547d37e 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -19,14 +19,14 @@ jobs: fuzz-seconds: 300 output-sarif: true - name: Upload Crash - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts - name: Upload Sarif if: always() && steps.build.outcome == 'success' - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: # Path to SARIF file relative to the root of the repository sarif_file: cifuzz-sarif/results.sarif From e5545669fc0141000bce05337a6f14486e6b2a21 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <b.meglic@iskratel.si> Date: Fri, 31 Jan 2025 11:03:18 +0100 Subject: [PATCH 320/323] [AMF] fix saving SDM subscription client info --- src/amf/nudm-handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index a42e227932..8839090b92 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -352,7 +352,7 @@ int amf_nudm_sdm_handle_provisioned( } } - OGS_SBI_SETUP_CLIENT(&amf_ue->policy_association, client); + OGS_SBI_SETUP_CLIENT(&amf_ue->data_change_subscription, client); ogs_free(fqdn); ogs_freeaddrinfo(addr); From 07cb42110ea8f36c7ae7b3f5a36270c8c1bbf92a Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Wed, 5 Feb 2025 21:37:38 +0900 Subject: [PATCH 321/323] [DBI] Improve YAML policy config by adding SUPI range filtering Previously, policies were configured via YAML files without MongoDB. This update enhances the YAML approach by adding the 'supi_range' key to filter policies based on UE SUPI ranges. When both 'supi_range' and 'plmn_id' are provided, both conditions must be met. Note that PLMN-ID filtering will be deprecated in a future release. --- configs/examples/5gc-sepp1-999-70.yaml.in | 85 +------- configs/examples/5gc-sepp2-001-01.yaml.in | 85 +------- configs/examples/5gc-sepp3-315-010.yaml.in | 85 +------- configs/examples/5gc-tls-sepp1-999-70.yaml.in | 85 +------- configs/examples/5gc-tls-sepp2-001-01.yaml.in | 85 +------- .../examples/5gc-tls-sepp3-315-010.yaml.in | 85 +------- configs/open5gs/pcf.yaml.in | 112 +++++----- configs/open5gs/pcrf.yaml.in | 191 ++++++++++-------- .../guide/02-building-open5gs-from-sources.md | 4 +- lib/app/ogs-config.c | 179 +++++++++++++--- lib/app/ogs-config.h | 27 ++- lib/core/ogs-conv.c | 8 +- lib/core/ogs-conv.h | 13 +- lib/pfcp/context.c | 4 +- lib/proto/types.c | 2 +- lib/sbi/conv.c | 7 +- lib/sbi/message.c | 4 +- lib/sbi/nnrf-handler.c | 25 ++- src/amf/context.c | 2 +- src/amf/npcf-handler.c | 3 +- src/bsf/nbsf-handler.c | 3 +- src/mme/mme-context.c | 4 +- src/nrf/nnrf-handler.c | 3 +- src/pcf/context.c | 33 +-- src/pcf/nbsf-handler.c | 2 +- src/pcf/npcf-handler.c | 9 +- src/pcrf/pcrf-context.c | 118 ++++++----- src/scp/sbi-path.c | 2 +- src/sepp/n32c-handler.c | 6 +- src/smf/context.c | 2 +- src/smf/npcf-handler.c | 2 +- tests/af/npcf-handler.c | 3 +- tests/common/context.c | 2 +- tests/core/conv-test.c | 36 ++-- 34 files changed, 546 insertions(+), 770 deletions(-) diff --git a/configs/examples/5gc-sepp1-999-70.yaml.in b/configs/examples/5gc-sepp1-999-70.yaml.in index 1bf052c94c..536fec39ba 100644 --- a/configs/examples/5gc-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-sepp1-999-70.yaml.in @@ -350,87 +350,9 @@ pcf: - address: 127.0.1.13 port: 9090 policy: - - plmn_id: - mcc: 001 - mnc: 01 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 + - supi_range: + - 001010000000001-001019999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -506,7 +428,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/examples/5gc-sepp2-001-01.yaml.in b/configs/examples/5gc-sepp2-001-01.yaml.in index 67a604e6c7..5637ae6ac8 100644 --- a/configs/examples/5gc-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-sepp2-001-01.yaml.in @@ -351,87 +351,9 @@ pcf: - address: 127.0.2.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 + - supi_range: + - 999700000000001-999709999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -507,7 +429,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/examples/5gc-sepp3-315-010.yaml.in b/configs/examples/5gc-sepp3-315-010.yaml.in index d37817813b..7f6bd606e7 100644 --- a/configs/examples/5gc-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-sepp3-315-010.yaml.in @@ -351,87 +351,9 @@ pcf: - address: 127.0.3.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 001 - mnc: 01 + - supi_range: + - 999700000000001-999709999999999 + - 001010000000001-001019999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -507,7 +429,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/examples/5gc-tls-sepp1-999-70.yaml.in b/configs/examples/5gc-tls-sepp1-999-70.yaml.in index a06648ca90..dd35d4cb76 100644 --- a/configs/examples/5gc-tls-sepp1-999-70.yaml.in +++ b/configs/examples/5gc-tls-sepp1-999-70.yaml.in @@ -355,87 +355,9 @@ pcf: - address: 127.0.1.13 port: 9090 policy: - - plmn_id: - mcc: 001 - mnc: 01 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 + - supi_range: + - 001010000000001-001019999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -511,7 +433,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/examples/5gc-tls-sepp2-001-01.yaml.in b/configs/examples/5gc-tls-sepp2-001-01.yaml.in index 952eca531d..dfaa87bc8c 100644 --- a/configs/examples/5gc-tls-sepp2-001-01.yaml.in +++ b/configs/examples/5gc-tls-sepp2-001-01.yaml.in @@ -356,87 +356,9 @@ pcf: - address: 127.0.2.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 315 - mnc: 010 + - supi_range: + - 999700000000001-999709999999999 + - 315010000000001-315010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -512,7 +434,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/examples/5gc-tls-sepp3-315-010.yaml.in b/configs/examples/5gc-tls-sepp3-315-010.yaml.in index 6f2d2cc6a6..82183cc698 100644 --- a/configs/examples/5gc-tls-sepp3-315-010.yaml.in +++ b/configs/examples/5gc-tls-sepp3-315-010.yaml.in @@ -356,87 +356,9 @@ pcf: - address: 127.0.3.13 port: 9090 policy: - - plmn_id: - mcc: 999 - mnc: 70 - slice: - - sst: 1 # 1,2,3,4 - default_indicator: true - session: - - name: internet - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 - qos: - index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - - name: ims - type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 - ambr: - downlink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 1 - unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - qos: - index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - pcc_rule: - - qos: - index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled - pre_emption_capability: 1 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 82 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - qos: - index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 - arp: - priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled - pre_emption_capability: 2 # 1: Disabled, 2:Enabled - mbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - gbr: - downlink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - uplink: - value: 802 - unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - - plmn_id: - mcc: 001 - mnc: 01 + - supi_range: + - 999700000000001-999709999999999 + - 001010000000001-001010999999999 slice: - sst: 1 # 1,2,3,4 default_indicator: true @@ -512,7 +434,6 @@ pcf: uplink: value: 802 unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps - nssf: sbi: server: diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index 10fd43faff..4c5d103f9e 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -25,73 +25,85 @@ pcf: port: 9090 ################################################################################ -# Locally configured policy -# - The PCF in the VPLMN uses locally configured policies -# according to the roaming agreement with the HPLMN operator -# as input for PCC Rule generation. +# PCF Policy Configuration: UE Home PLMN and SUPI Range Based Policies ################################################################################ # -# o You don't have to use MongoDB if you use the policy configuration as below. +# This configuration applies policies based on the UE's home PLMN ID and +# SUPI range. When both supi_range and plmn_id are specified in a policy, +# the policy is applied only if both conditions are met. +# +# supi_range: Specifies one or more ranges of SUPIs. A maximum of 16 ranges +# can be defined. +# plmn_id : Specifies the UE's home PLMN using MCC and MNC. +# +# Example: # # policy: -# - plmn_id: +# - supi_range: # Filter policies by SUPI +# - 999700000000001-999709999999999 +# - 315010000000001-315010999999999 +# plmn_id: # Filter policies by home PLMN-ID # mcc: 999 # mnc: 70 -# slice: -# - sst: 1 # 1,2,3,4 +# slice: # Specify slice configuration +# - sst: 1 # Allowed values: 1, 2, 3, 4 # default_indicator: true -# session: +# session: # Define session based on DNN # - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 # unit: 3 # qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 9 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # - name: ims -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # qos: -# index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 5 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # pcc_rule: # - qos: -# index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 1 # Allowed values as above # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # mbr: # downlink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # gbr: # downlink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # flow: # - direction: 2 # description: "permit out icmp from any to assigned" @@ -102,48 +114,48 @@ pcf: # - direction: 1 # description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" # - qos: -# index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 2 # Allowed values as above # arp: -# priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled -# pre_emption_capability: 2 # 1: Disabled, 2:Enabled +# priority_level: 4 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 2 # 1: Disabled, 2: Enabled +# pre_emption_capability: 2 # 1: Disabled, 2: Enabled # mbr: # downlink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # gbr: # downlink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 1 # uplink: # value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# - plmn_id: -# mcc: 001 -# mnc: 01 -# slice: -# - sst: 1 # 1,2,3,4 +# unit: 1 +# +# - supi_range: # Filter policies by SUPI only +# - 001010000000001-001019999999999 +# slice: # Specify slice configuration +# - sst: 1 # Allowed values: 1, 2, 3, 4 # sd: 000001 # default_indicator: true -# session: +# session: # Define session based on DNN # - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 # ambr: # downlink: # value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps # uplink: # value: 1 # unit: 3 # qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# index: 9 # Allowed values as above # arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled # ################################################################################ # SBI Server diff --git a/configs/open5gs/pcrf.yaml.in b/configs/open5gs/pcrf.yaml.in index 2fca942c2e..f9afb314ca 100644 --- a/configs/open5gs/pcrf.yaml.in +++ b/configs/open5gs/pcrf.yaml.in @@ -16,90 +16,119 @@ pcrf: port: 9090 ################################################################################ -# Locally configured policy +# PCRF Policy Configuration: SUPI Range Based Policies ################################################################################ # -# o You don't have to use MongoDB if you use the policy configuration as below. +# This configuration applies policies based solely on the UE's SUPI range. # -# session: -# - name: internet -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 -# ambr: -# downlink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 1 -# unit: 3 -# qos: -# index: 9 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 -# arp: -# priority_level: 8 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# - name: ims -# type: 3 # 1:IPv4, 2:IPv6, 3:IPv4v6 -# ambr: -# downlink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 1 -# unit: 3 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# qos: -# index: 5 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 -# arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# pcc_rule: -# - qos: -# index: 1 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# supi_range: Specifies one or more ranges of SUPIs. +# session: Defines the session configuration for each DNN. +# +# Example: +# +# policy: +# - supi_range: # Filter policies by SUPI +# - 999700000000001-999709999999999 +# - 315010000000001-315010999999999 +# session: # Define session based on DNN +# - name: internet +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 9 # Allowed values: 1,2,3,4,65,66,67,75,71,72, +# # 73,74,76,5,6,7,8,9,69,70,79,80,82,83, +# # 84,85,86 # arp: -# priority_level: 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 1 # 1: Disabled, 2:Enabled -# pre_emption_capability: 1 # 1: Disabled, 2:Enabled -# mbr: -# downlink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# gbr: -# downlink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 82 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# flow: -# - direction: 2 -# description: "permit out icmp from any to assigned" -# - direction: 1 -# description: "permit out icmp from any to assigned" -# - direction: 2 -# description: "permit out udp from 10.200.136.98/32 23455 to assigned 1-65535" -# - direction: 1 -# description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" -# - qos: -# index: 2 # 1, 2, 3, 4, 65, 66, 67, 75, 71, 72, 73, 74, 76, 5, 6, 7, 8, 9, 69, 70, 79, 80, 82, 83, 84, 85, 86 +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled +# - name: ims +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 5 # Allowed values as above # arp: -# priority_level: 4 # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -# pre_emption_vulnerability: 2 # 1: Disabled, 2:Enabled -# pre_emption_capability: 2 # 1: Disabled, 2:Enabled -# mbr: -# downlink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# gbr: -# downlink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps -# uplink: -# value: 802 -# unit: 1 # 0:bps, 1:Kbps, 2:Mbps, 3:Gbps, 4:Tbps +# priority_level: 1 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled +# pcc_rule: +# - qos: +# index: 1 # Allowed values as above +# arp: +# priority_level: 1 +# pre_emption_vulnerability: 1 +# pre_emption_capability: 1 +# mbr: +# downlink: +# value: 82 +# unit: 1 # 0: bps, 1: Kbps, 2: Mbps, 3: Gbps, 4: Tbps +# uplink: +# value: 82 +# unit: 1 +# gbr: +# downlink: +# value: 82 +# unit: 1 +# uplink: +# value: 82 +# unit: 1 +# flow: +# - direction: 2 +# description: "permit out icmp from any to assigned" +# - direction: 1 +# description: "permit out icmp from any to assigned" +# - direction: 2 +# description: "permit out udp from 10.200.136.98/32 23455 to assigned 1-65535" +# - direction: 1 +# description: "permit out udp from 10.200.136.98/32 1-65535 to assigned 50021" +# - qos: +# index: 2 # Allowed values as above +# arp: +# priority_level: 4 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 2 # 1: Disabled, 2: Enabled +# pre_emption_capability: 2 # 1: Disabled, 2: Enabled +# mbr: +# downlink: +# value: 802 +# unit: 1 +# uplink: +# value: 802 +# unit: 1 +# gbr: +# downlink: +# value: 802 +# unit: 1 +# uplink: +# value: 802 +# unit: 1 # +# - supi_range: # Filter policies by SUPI only +# - 001010000000001-001019999999999 +# session: # Define session based on DNN +# - name: internet +# type: 3 # 1: IPv4, 2: IPv6, 3: IPv4v6 +# ambr: +# downlink: +# value: 1 +# unit: 3 +# uplink: +# value: 1 +# unit: 3 +# qos: +# index: 9 # Allowed values as above +# arp: +# priority_level: 8 # Allowed values: 1 to 15 +# pre_emption_vulnerability: 1 # 1: Disabled, 2: Enabled +# pre_emption_capability: 1 # 1: Disabled, 2: Enabled diff --git a/docs/_docs/guide/02-building-open5gs-from-sources.md b/docs/_docs/guide/02-building-open5gs-from-sources.md index 2c12d44ac9..6b5de348f0 100644 --- a/docs/_docs/guide/02-building-open5gs-from-sources.md +++ b/docs/_docs/guide/02-building-open5gs-from-sources.md @@ -64,9 +64,9 @@ Install the common dependencies for building the source code. $ sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson ``` -Install libidn-dev or libidn11-dev Depending on Your System +Install libidn-dev or libidn11-dev depending on your system ```bash -if apt-cache show libidn-dev > /dev/null 2>&1; then +$ if apt-cache show libidn-dev > /dev/null 2>&1; then sudo apt-get install -y --no-install-recommends libidn-dev else sudo apt-get install -y --no-install-recommends libidn11-dev diff --git a/lib/app/ogs-config.c b/lib/app/ogs-config.c index 3a64af0977..d9a970b04e 100644 --- a/lib/app/ogs-config.c +++ b/lib/app/ogs-config.c @@ -753,9 +753,83 @@ int ogs_app_parse_sockopt_config( return OGS_OK; } +/*---------------------------------------------------------------------- + * Function: ogs_app_parse_supi_range_conf + * + * Parse the supi_range configuration from a YAML iterator. + * + * The expected YAML format is: + * + * supi_range: + * - 999700000000001-999700000099999 + * - 310789000000005-310789000000888 + * + * Both start and end must be provided. + * + * Returns: + * OGS_OK on success, OGS_ERROR on failure. + *----------------------------------------------------------------------*/ +int ogs_app_parse_supi_range_conf( + ogs_yaml_iter_t *parent, ogs_supi_range_t *supi_range) +{ + ogs_yaml_iter_t range_iter; + + ogs_assert(parent); + ogs_assert(supi_range); + + memset(supi_range, 0, sizeof(ogs_supi_range_t)); + + /* Recurse into the supi_range array node */ + ogs_yaml_iter_recurse(parent, &range_iter); + ogs_assert(ogs_yaml_iter_type(&range_iter) != YAML_MAPPING_NODE); + + do { + char *v = NULL; + char *start_str = NULL, *end_str = NULL; + + if (ogs_yaml_iter_type(&range_iter) == YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next(&range_iter)) + break; + } + + v = (char *)ogs_yaml_iter_value(&range_iter); + + if (v) { + ogs_assert(supi_range->num < OGS_MAX_NUM_OF_SUPI_RANGE); + + /* Split the string on '-' */ + start_str = strsep(&v, "-"); + if (start_str == NULL || strlen(start_str) == 0) { + ogs_error("Invalid supi_range starter bound: %s", v); + return OGS_ERROR; + } + + end_str = v; + if (end_str == NULL || strlen(end_str) == 0) { + ogs_error("Invalid supi_range upper bound: %s", v); + return OGS_ERROR; + } + + supi_range->start[supi_range->num] = + ogs_uint64_from_string_decimal(start_str); + supi_range->end[supi_range->num] = + ogs_uint64_from_string_decimal(end_str); + + supi_range->num++; + } + + } while (ogs_yaml_iter_type(&range_iter) == YAML_SEQUENCE_NODE); + + return OGS_OK; +} + static int parse_br_conf(ogs_yaml_iter_t *parent, ogs_bitrate_t *br) { ogs_yaml_iter_t br_iter; + + ogs_assert(parent); + ogs_assert(br); + ogs_yaml_iter_recurse(parent, &br_iter); while (ogs_yaml_iter_next(&br_iter)) { @@ -1191,11 +1265,12 @@ int ogs_app_parse_session_conf( return OGS_OK; } -ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id) +ogs_app_policy_conf_t *ogs_app_policy_conf_add( + ogs_supi_range_t *supi_range, ogs_plmn_id_t *plmn_id) { ogs_app_policy_conf_t *policy_conf = NULL; - ogs_assert(plmn_id); + ogs_assert(supi_range || plmn_id); ogs_pool_alloc(&policy_conf_pool, &policy_conf); if (!policy_conf) { @@ -1205,7 +1280,25 @@ ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id) } memset(policy_conf, 0, sizeof *policy_conf); - memcpy(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)); + if (supi_range) { + int i; + + memcpy(&policy_conf->supi_range, supi_range, sizeof(ogs_supi_range_t)); + + ogs_info("SUPI[%d]", policy_conf->supi_range.num); + for (i = 0; i < policy_conf->supi_range.num; i++) + ogs_info(" START[%lld]-END[%lld]", + (long long)policy_conf->supi_range.start[i], + (long long)policy_conf->supi_range.end[i]); + + } + if (plmn_id) { + policy_conf->plmn_id_valid = true; + memcpy(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)); + ogs_info("PLMN_ID[MCC:%03d.MNC:%03d]", + ogs_plmn_id_mcc(&policy_conf->plmn_id), + ogs_plmn_id_mnc(&policy_conf->plmn_id)); + } ogs_list_init(&policy_conf->slice_list); @@ -1216,19 +1309,60 @@ ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id) return policy_conf; } -ogs_app_policy_conf_t *ogs_app_policy_conf_find_by_plmn_id( - ogs_plmn_id_t *plmn_id) +ogs_app_policy_conf_t *ogs_app_policy_conf_find( + char *supi, ogs_plmn_id_t *plmn_id) { - ogs_app_policy_conf_t *policy_conf = NULL; + ogs_app_policy_conf_t *policy_conf; + int i; + + char *supi_type = NULL; + char *supi_id = NULL; + uint64_t supi_decimal; + + ogs_assert(supi); + + supi_type = ogs_id_get_type(supi); + ogs_assert(supi_type); + supi_id = ogs_id_get_value(supi); + ogs_assert(supi_id); - ogs_assert(plmn_id); + supi_decimal = ogs_uint64_from_string_decimal(supi_id); + + ogs_free(supi_type); + ogs_free(supi_id); ogs_list_for_each(&local_conf.policy_list, policy_conf) { - if (memcmp(&policy_conf->plmn_id, plmn_id, sizeof(ogs_plmn_id_t)) == 0) - break; + /* If supi_range is set, check if supi_decimal falls within + * any of the defined ranges. + */ + if (policy_conf->supi_range.num > 0) { + int in_range = 0; + for (i = 0; i < policy_conf->supi_range.num; i++) { + if ((supi_decimal >= policy_conf->supi_range.start[i]) && + (supi_decimal <= policy_conf->supi_range.end[i])) { + in_range = 1; + break; + } + } + if (!in_range) { + continue; + } + } + + /* If a plmn_id is set and it does not match the + * current policy's plmn_id, skip this policy. + */ + if (policy_conf->plmn_id_valid && + memcmp(&policy_conf->plmn_id, plmn_id, + sizeof(ogs_plmn_id_t)) != 0) { + continue; + } + + /* Both conditions met; return this policy configuration */ + return policy_conf; } - return policy_conf; + return NULL; } void ogs_app_policy_conf_remove(ogs_app_policy_conf_t *policy_conf) { @@ -1427,29 +1561,26 @@ void ogs_app_session_conf_remove_all(ogs_app_slice_conf_t *slice_conf) } int ogs_app_config_session_data( - ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, + char *supi, ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, ogs_session_data_t *session_data) { ogs_app_policy_conf_t *policy_conf = NULL; ogs_app_slice_conf_t *slice_conf = NULL; ogs_app_session_conf_t *session_conf = NULL; + ogs_assert(supi); ogs_assert(dnn); ogs_assert(session_data); - if (plmn_id) { - policy_conf = ogs_app_policy_conf_find_by_plmn_id(plmn_id); - if (!policy_conf) { - ogs_error("No POLICY [MCC:%03d,MNC:%03d]", - ogs_plmn_id_mcc(plmn_id), ogs_plmn_id_mnc(plmn_id)); - return OGS_ERROR; - } - } else { - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); - if (!policy_conf) { - ogs_error("No default POLICY for EPC"); - return OGS_ERROR; - } + policy_conf = ogs_app_policy_conf_find(supi, plmn_id); + if (!policy_conf) { + if (plmn_id) + ogs_error("No POLICY [SUPI:%s] [MCC:%03d,MNC:%03d]", + supi, ogs_plmn_id_mcc(plmn_id), ogs_plmn_id_mnc(plmn_id)); + else + ogs_error("No POLICY [SUPI:%s]", supi); + + return OGS_ERROR; } if (s_nssai) { diff --git a/lib/app/ogs-config.h b/lib/app/ogs-config.h index 6f98a7c666..13c30b8c45 100644 --- a/lib/app/ogs-config.h +++ b/lib/app/ogs-config.h @@ -144,9 +144,24 @@ typedef struct ogs_local_conf_s { } ogs_app_local_conf_t; +/* Structure for SUPI-range */ +typedef struct { + int num; +#define OGS_MAX_NUM_OF_SUPI_RANGE 16 + uint64_t start[OGS_MAX_NUM_OF_SUPI_RANGE]; + uint64_t end[OGS_MAX_NUM_OF_SUPI_RANGE]; +} ogs_supi_range_t; + + +/* Policy configuration structure. In a real system, additional fields + * (e.g., for plmn_id, slice list, etc.) would be added. + */ typedef struct ogs_app_policy_conf_s { ogs_lnode_t lnode; + ogs_supi_range_t supi_range; + + bool plmn_id_valid; ogs_plmn_id_t plmn_id; ogs_list_t slice_list; @@ -183,13 +198,17 @@ int ogs_app_parse_local_conf(const char *local); int ogs_app_parse_sockopt_config( ogs_yaml_iter_t *parent, ogs_sockopt_t *option); +int ogs_app_parse_supi_range_conf( + ogs_yaml_iter_t *parent, ogs_supi_range_t *supi_range); + int ogs_app_check_policy_conf(void); int ogs_app_parse_session_conf( ogs_yaml_iter_t *parent, ogs_app_slice_conf_t *slice_conf); -ogs_app_policy_conf_t *ogs_app_policy_conf_add(ogs_plmn_id_t *plmn_id); -ogs_app_policy_conf_t *ogs_app_policy_conf_find_by_plmn_id( - ogs_plmn_id_t *plmn_id); +ogs_app_policy_conf_t *ogs_app_policy_conf_add( + ogs_supi_range_t *supi_range, ogs_plmn_id_t *plmn_id); +ogs_app_policy_conf_t *ogs_app_policy_conf_find( + char *supi, ogs_plmn_id_t *plmn_id); void ogs_app_policy_conf_remove(ogs_app_policy_conf_t *policy_conf); void ogs_app_policy_conf_remove_all(void); @@ -209,7 +228,7 @@ void ogs_app_session_conf_remove_all( ogs_app_slice_conf_t *slice_conf); int ogs_app_config_session_data( - ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, + char *supi, ogs_plmn_id_t *plmn_id, ogs_s_nssai_t *s_nssai, char *dnn, ogs_session_data_t *session_data); #ifdef __cplusplus diff --git a/lib/core/ogs-conv.c b/lib/core/ogs-conv.c index f4d3fa188f..5b11f71779 100644 --- a/lib/core/ogs-conv.c +++ b/lib/core/ogs-conv.c @@ -214,17 +214,17 @@ char *ogs_uint64_to_string(uint64_t x) return dup; } -ogs_uint24_t ogs_uint24_from_string(char *str) +ogs_uint24_t ogs_uint24_from_string(char *str, int base) { ogs_uint24_t x; ogs_assert(str); - x.v = ogs_uint64_from_string(str); + x.v = ogs_uint64_from_string(str, base); return x; } -uint64_t ogs_uint64_from_string(char *str) +uint64_t ogs_uint64_from_string(char *str, int base) { uint64_t x; @@ -234,7 +234,7 @@ uint64_t ogs_uint64_from_string(char *str) return 0; errno = 0; - x = strtoll(str, NULL, 16); + x = strtoll(str, NULL, base); if ((errno == ERANGE && (x == LONG_MAX || x == LONG_MIN)) || (errno != 0 && x == 0)) { diff --git a/lib/core/ogs-conv.h b/lib/core/ogs-conv.h index 0374aaf823..b79bd74cd4 100644 --- a/lib/core/ogs-conv.h +++ b/lib/core/ogs-conv.h @@ -53,8 +53,17 @@ char *ogs_uint36_to_0string(uint64_t x); char *ogs_uint64_to_0string(uint64_t x); char *ogs_uint64_to_string(uint64_t x); -ogs_uint24_t ogs_uint24_from_string(char *str); -uint64_t ogs_uint64_from_string(char *str); +#define ogs_uint24_from_string_decimal(str) \ + ogs_uint24_from_string((str), 10) +#define ogs_uint24_from_string_hexadecimal(str) \ + ogs_uint24_from_string((str), 16) +ogs_uint24_t ogs_uint24_from_string(char *str, int base); + +#define ogs_uint64_from_string_decimal(str) \ + ogs_uint64_from_string((str), 10) +#define ogs_uint64_from_string_hexadecimal(str) \ + ogs_uint64_from_string((str), 16) +uint64_t ogs_uint64_from_string(char *str, int base); double *ogs_alloc_double(double value); diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index f84fbec442..439de9a244 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -650,7 +650,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) if (v) { e_cell_id[ num_of_e_cell_id] = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } @@ -686,7 +686,7 @@ int ogs_pfcp_context_parse_config(const char *local, const char *remote) if (v) { nr_cell_id[ num_of_nr_cell_id] = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_nr_cell_id++; } diff --git a/lib/proto/types.c b/lib/proto/types.c index c678bfffb1..62f48136fb 100644 --- a/lib/proto/types.c +++ b/lib/proto/types.c @@ -398,7 +398,7 @@ ogs_uint24_t ogs_s_nssai_sd_from_string(const char *hex) if (hex == NULL) return sd; - return ogs_uint24_from_string((char *)hex); + return ogs_uint24_from_string_hexadecimal((char *)hex); } int ogs_fqdn_build(char *dst, const char *src, int length) diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index 8e133a4ddb..99ba983358 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -1070,7 +1070,7 @@ bool ogs_sbi_s_nssai_from_string(ogs_s_nssai_t *s_nssai, char *str) ogs_error("ogs_strdup[%s:%s] failed", str, token); goto cleanup; } - s_nssai->sd = ogs_uint24_from_string(sd); + s_nssai->sd = ogs_uint24_from_string_hexadecimal(sd); } rc = true; @@ -1414,7 +1414,7 @@ bool ogs_sbi_parse_nr_location(ogs_5gs_tai_t *tai, ogs_nr_cgi_t *nr_cgi, if (Tai->plmn_id) ogs_sbi_parse_plmn_id(&tai->plmn_id, Tai->plmn_id); if (Tai->tac) - tai->tac = ogs_uint24_from_string(Tai->tac); + tai->tac = ogs_uint24_from_string_hexadecimal(Tai->tac); } Ncgi = NrLocation->ncgi; @@ -1422,7 +1422,8 @@ bool ogs_sbi_parse_nr_location(ogs_5gs_tai_t *tai, ogs_nr_cgi_t *nr_cgi, if (Ncgi->plmn_id) ogs_sbi_parse_plmn_id(&nr_cgi->plmn_id, Ncgi->plmn_id); if (Ncgi->nr_cell_id) - nr_cgi->cell_id = ogs_uint64_from_string(Ncgi->nr_cell_id); + nr_cgi->cell_id = ogs_uint64_from_string_hexadecimal( + Ncgi->nr_cell_id); } diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 375e15a628..e747fed350 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -875,7 +875,7 @@ int ogs_sbi_parse_request( char *v = ogs_hash_this_val(hi); if (v) { discovery_option->requester_features = - ogs_uint64_from_string(v); + ogs_uint64_from_string_hexadecimal(v); discovery_option_presence = true; } } @@ -3369,7 +3369,7 @@ void ogs_sbi_discovery_option_parse_tai( if (Tai->plmn_id) ogs_sbi_parse_plmn_id(&tai.plmn_id, Tai->plmn_id); if (Tai->tac) - tai.tac = ogs_uint24_from_string(Tai->tac); + tai.tac = ogs_uint24_from_string_hexadecimal(Tai->tac); ogs_sbi_discovery_option_set_tai(discovery_option, &tai); diff --git a/lib/sbi/nnrf-handler.c b/lib/sbi/nnrf-handler.c index 2cddbdf14d..81c14c1211 100644 --- a/lib/sbi/nnrf-handler.c +++ b/lib/sbi/nnrf-handler.c @@ -472,7 +472,7 @@ static void handle_smf_info( nr_tai = &nf_info->smf.nr_tai[nf_info->smf.num_of_nr_tai]; ogs_assert(nr_tai); ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); - nr_tai->tac = ogs_uint24_from_string(TaiItem->tac); + nr_tai->tac = ogs_uint24_from_string_hexadecimal(TaiItem->tac); nf_info->smf.num_of_nr_tai++; } @@ -507,11 +507,13 @@ static void handle_smf_info( nf_info->smf.nr_tai_range [nf_info->smf.num_of_nr_tai_range]. start[tac_index] = - ogs_uint24_from_string(TacRangeItem->start); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->start); nf_info->smf.nr_tai_range [nf_info->smf.num_of_nr_tai_range]. end[tac_index] = - ogs_uint24_from_string(TacRangeItem->end); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->end); nf_info->smf.nr_tai_range [nf_info->smf.num_of_nr_tai_range]. @@ -703,8 +705,10 @@ static void handle_amf_info( &nf_instance->nf_info_list, OpenAPI_nf_type_AMF); ogs_assert(nf_info); - nf_info->amf.amf_set_id = ogs_uint64_from_string(AmfInfo->amf_set_id); - nf_info->amf.amf_region_id = ogs_uint64_from_string(AmfInfo->amf_region_id); + nf_info->amf.amf_set_id = ogs_uint64_from_string_hexadecimal( + AmfInfo->amf_set_id); + nf_info->amf.amf_region_id = ogs_uint64_from_string_hexadecimal( + AmfInfo->amf_region_id); GuamiList = AmfInfo->guami_list; OpenAPI_list_for_each(GuamiList, node) { @@ -739,7 +743,7 @@ static void handle_amf_info( nr_tai = &nf_info->amf.nr_tai[nf_info->amf.num_of_nr_tai]; ogs_assert(nr_tai); ogs_sbi_parse_plmn_id(&nr_tai->plmn_id, TaiItem->plmn_id); - nr_tai->tac = ogs_uint24_from_string(TaiItem->tac); + nr_tai->tac = ogs_uint24_from_string_hexadecimal(TaiItem->tac); nf_info->amf.num_of_nr_tai++; } } @@ -774,10 +778,12 @@ static void handle_amf_info( nf_info->amf.nr_tai_range [nf_info->amf.num_of_nr_tai_range].start[tac_index] = - ogs_uint24_from_string(TacRangeItem->start); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->start); nf_info->amf.nr_tai_range [nf_info->amf.num_of_nr_tai_range].end[tac_index] = - ogs_uint24_from_string(TacRangeItem->end); + ogs_uint24_from_string_hexadecimal( + TacRangeItem->end); nf_info->amf.nr_tai_range [nf_info->amf.num_of_nr_tai_range].num_of_tac_range++; @@ -962,7 +968,8 @@ void ogs_nnrf_nfm_handle_nf_status_subscribe( /* SBI Features */ if (SubscriptionData->nrf_supported_features) { subscription_data->nrf_supported_features = - ogs_uint64_from_string(SubscriptionData->nrf_supported_features); + ogs_uint64_from_string_hexadecimal( + SubscriptionData->nrf_supported_features); } else { subscription_data->nrf_supported_features = 0; } diff --git a/src/amf/context.c b/src/amf/context.c index 1f69548262..6880c96042 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -759,7 +759,7 @@ int amf_context_parse_config(void) s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = diff --git a/src/amf/npcf-handler.c b/src/amf/npcf-handler.c index ff59e977a0..71b90b0fc6 100644 --- a/src/amf/npcf-handler.c +++ b/src/amf/npcf-handler.c @@ -149,7 +149,8 @@ int amf_npcf_am_policy_control_handle_create( PCF_AM_POLICY_STORE(amf_ue, header.uri, message.h.resource.component[1]); /* SBI Features */ - supported_features = ogs_uint64_from_string(PolicyAssociation->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + PolicyAssociation->supp_feat); amf_ue->am_policy_control_features &= supported_features; OpenAPI_list_for_each(PolicyAssociation->triggers, node) { diff --git a/src/bsf/nbsf-handler.c b/src/bsf/nbsf-handler.c index c391500a63..1c58237c29 100644 --- a/src/bsf/nbsf-handler.c +++ b/src/bsf/nbsf-handler.c @@ -195,7 +195,8 @@ bool bsf_nbsf_management_handle_pcf_binding( if (RecvPcfBinding->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(RecvPcfBinding->supp_feat); + ogs_uint64_from_string_hexadecimal( + RecvPcfBinding->supp_feat); sess->management_features &= supported_features; if (sess->management_features != supported_features) { diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 426ea274a9..fb824af1b2 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -889,7 +889,7 @@ int mme_context_parse_config(void) if (v) { e_cell_id[ num_of_e_cell_id] = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } @@ -1118,7 +1118,7 @@ int mme_context_parse_config(void) if (v) { e_cell_id[ num_of_e_cell_id] = - ogs_uint64_from_string( + ogs_uint64_from_string_hexadecimal( (char*)v); num_of_e_cell_id++; } diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index d82a5040df..544f081c6a 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -499,7 +499,8 @@ bool nrf_nnrf_handle_nf_status_subscribe( if (SubscriptionData->requester_features) { subscription_data->requester_features = - ogs_uint64_from_string(SubscriptionData->requester_features); + ogs_uint64_from_string_hexadecimal( + SubscriptionData->requester_features); /* No need to send SubscriptionData->requester_features to the NF */ ogs_free(SubscriptionData->requester_features); diff --git a/src/pcf/context.c b/src/pcf/context.c index 41f1779bd9..67a6ed46a0 100644 --- a/src/pcf/context.c +++ b/src/pcf/context.c @@ -209,6 +209,9 @@ static int parse_policy_conf(ogs_yaml_iter_t *parent) do { const char *mnc = NULL, *mcc = NULL; ogs_app_policy_conf_t *policy_conf = NULL; + ogs_supi_range_t supi_range; + + memset(&supi_range, 0, sizeof(ogs_supi_range_t)); OGS_YAML_ARRAY_NEXT(&policy_array, &policy_iter); while (ogs_yaml_iter_next(&policy_iter)) { @@ -227,21 +230,31 @@ static int parse_policy_conf(ogs_yaml_iter_t *parent) mnc = ogs_yaml_iter_value(&plmn_id_iter); } } - + } else if (!strcmp(policy_key, "supi_range")) { + rv = ogs_app_parse_supi_range_conf(&policy_iter, &supi_range); + if (rv != OGS_OK) { + ogs_error("ogs_app_parse_supi_range_conf() failed"); + return rv; + } } } - if (mcc && mnc) { + if (supi_range.num || (mcc && mnc)) { ogs_plmn_id_t plmn_id; - ogs_plmn_id_build(&plmn_id, atoi(mcc), atoi(mnc), strlen(mnc)); - policy_conf = ogs_app_policy_conf_add(&plmn_id); + if (mcc && mnc) + ogs_plmn_id_build(&plmn_id, atoi(mcc), atoi(mnc), strlen(mnc)); + policy_conf = ogs_app_policy_conf_add( + supi_range.num ? &supi_range : NULL, + (mcc && mnc) ? &plmn_id : NULL); if (!policy_conf) { ogs_error("ogs_app_policy_conf_add() failed " - "[MCC:%s,MNC:%s]", mcc, mnc); + "[supi_range.num:%d] [MCC:%s, MNC:%s]", + supi_range.num, mcc, mnc); return OGS_ERROR; } } else { - ogs_error("No PLMN-ID [MCC:%s, MNC:%s]", mcc, mnc); + ogs_error("No SUPI Range[%d] OR PLMN-ID [MCC:%s, MNC:%s]", + supi_range.num, mcc, mnc); return OGS_ERROR; } @@ -807,14 +820,10 @@ int pcf_db_qos_data(char *supi, memset(session_data, 0, sizeof(*session_data)); - if (plmn_id) - policy_conf = ogs_app_policy_conf_find_by_plmn_id(plmn_id); - else - ogs_warn("No PLMN_ID"); - + policy_conf = ogs_app_policy_conf_find(supi, plmn_id); if (policy_conf) { rv = ogs_app_config_session_data( - plmn_id, s_nssai, dnn, session_data); + supi, plmn_id, s_nssai, dnn, session_data); if (rv != OGS_OK) ogs_error("ogs_app_config_session_data() failed - " "MCC[%d] MNC[%d] SST[%d] SD[0x%x] DNN[%s]", diff --git a/src/pcf/nbsf-handler.c b/src/pcf/nbsf-handler.c index 14efee5e63..2f4c397946 100644 --- a/src/pcf/nbsf-handler.c +++ b/src/pcf/nbsf-handler.c @@ -70,7 +70,7 @@ bool pcf_nbsf_management_handle_register( PcfBinding = recvmsg->PcfBinding; if (PcfBinding->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(PcfBinding->supp_feat); + ogs_uint64_from_string_hexadecimal(PcfBinding->supp_feat); sess->management_features &= supported_features; } diff --git a/src/pcf/npcf-handler.c b/src/pcf/npcf-handler.c index dadbdf273a..930567ffca 100644 --- a/src/pcf/npcf-handler.c +++ b/src/pcf/npcf-handler.c @@ -118,7 +118,8 @@ bool pcf_npcf_am_policy_control_handle_create(pcf_ue_t *pcf_ue, ogs_freeaddrinfo(addr6); supported_features = - ogs_uint64_from_string(PolicyAssociationRequest->supp_feat); + ogs_uint64_from_string_hexadecimal( + PolicyAssociationRequest->supp_feat); pcf_ue->am_policy_control_features &= supported_features; if (PolicyAssociationRequest->gpsi) { @@ -328,7 +329,8 @@ bool pcf_npcf_smpolicycontrol_handle_create(pcf_sess_t *sess, if (SmPolicyContextData->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(SmPolicyContextData->supp_feat); + ogs_uint64_from_string_hexadecimal( + SmPolicyContextData->supp_feat); sess->smpolicycontrol_features &= supported_features; } else { sess->smpolicycontrol_features = 0; @@ -703,7 +705,8 @@ bool pcf_npcf_policyauthorization_handle_create(pcf_sess_t *sess, goto cleanup; } - supported_features = ogs_uint64_from_string(AscReqData->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + AscReqData->supp_feat); sess->policyauthorization_features &= supported_features; if (sess->policyauthorization_features != supported_features) { diff --git a/src/pcrf/pcrf-context.c b/src/pcrf/pcrf-context.c index 3d70edaf6e..19f69056e4 100644 --- a/src/pcrf/pcrf-context.c +++ b/src/pcrf/pcrf-context.c @@ -92,38 +92,12 @@ static int pcrf_context_validation(void) return OGS_OK; } -static int session_conf_prepare(void) +static int policy_conf_prepare(void) { - ogs_app_policy_conf_t *policy_conf = NULL; - ogs_app_slice_conf_t *slice_conf = NULL; - - ogs_plmn_id_t plmn_id; - ogs_s_nssai_t s_nssai; - - ogs_plmn_id_build(&plmn_id, 999, 70, 2); - - s_nssai.sst = 1; - s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; - - /* Added Dummy POLICY for EPC */ - policy_conf = ogs_app_policy_conf_add(&plmn_id); - if (!policy_conf) { - ogs_error("ogs_app_policy_conf_add() failed"); - return OGS_ERROR; - } - - /* Added Dummy SLICE for EPC */ - slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); - if (!slice_conf) { - ogs_error("ogs_app_slice_conf_add() failed"); - return OGS_ERROR; - } - slice_conf->data.default_indicator = true; - return OGS_OK; } -static int session_conf_validation(void) +static int policy_conf_validation(void) { int rv; @@ -136,27 +110,77 @@ static int session_conf_validation(void) return OGS_OK; } -static int parse_session_conf(ogs_yaml_iter_t *parent) +static int parse_policy_conf(ogs_yaml_iter_t *parent) { int rv; - ogs_app_policy_conf_t *policy_conf = NULL; - ogs_app_slice_conf_t *slice_conf = NULL; + ogs_yaml_iter_t policy_array, policy_iter; ogs_assert(parent); - rv = session_conf_prepare(); + rv = policy_conf_prepare(); if (rv != OGS_OK) return rv; - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); - ogs_assert(policy_conf); + ogs_yaml_iter_recurse(parent, &policy_array); + do { + ogs_app_policy_conf_t *policy_conf = NULL; + ogs_app_slice_conf_t *slice_conf = NULL; + ogs_supi_range_t supi_range; + ogs_s_nssai_t s_nssai; + + memset(&supi_range, 0, sizeof(ogs_supi_range_t)); + + OGS_YAML_ARRAY_NEXT(&policy_array, &policy_iter); + while (ogs_yaml_iter_next(&policy_iter)) { + const char *policy_key = ogs_yaml_iter_key(&policy_iter); + ogs_assert(policy_key); + if (!strcmp(policy_key, "supi_range")) { + rv = ogs_app_parse_supi_range_conf(&policy_iter, &supi_range); + if (rv != OGS_OK) { + ogs_error("ogs_app_parse_supi_range_conf() failed"); + return rv; + } + } + } - slice_conf = ogs_list_first(&policy_conf->slice_list); - ogs_assert(slice_conf); + if (supi_range.num) { + policy_conf = ogs_app_policy_conf_add( + supi_range.num ? &supi_range : NULL, NULL); + if (!policy_conf) { + ogs_error("ogs_app_policy_conf_add() failed " + "[supi_range.num:%d]", supi_range.num); + return OGS_ERROR; + } - rv = ogs_app_parse_session_conf(parent, slice_conf); - if (rv != OGS_OK) return rv; + s_nssai.sst = 1; + s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; + + slice_conf = ogs_app_slice_conf_add(policy_conf, &s_nssai); + if (!slice_conf) { + ogs_error("ogs_app_slice_conf_add() failed"); + return OGS_ERROR; + } + slice_conf->data.default_indicator = true; + } else { + ogs_error("No SUPI Range"); + return OGS_ERROR; + } + + OGS_YAML_ARRAY_RECURSE(&policy_array, &policy_iter); + while (ogs_yaml_iter_next(&policy_iter)) { + const char *policy_key = ogs_yaml_iter_key(&policy_iter); + ogs_assert(policy_key); + if (!strcmp(policy_key, OGS_SESSION_STRING)) { + rv = ogs_app_parse_session_conf(&policy_iter, slice_conf); + if (rv != OGS_OK) { + ogs_error("parse_session_conf() failed"); + return rv; + } + } + } - rv = session_conf_validation(); + } while (ogs_yaml_iter_type(&policy_array) == YAML_SEQUENCE_NODE); + + rv = policy_conf_validation(); if (rv != OGS_OK) return rv; return OGS_OK; @@ -338,17 +362,17 @@ int pcrf_context_parse_config(void) ogs_warn("unknown key `%s`", fd_key); } } - } else if (!strcmp(pcrf_key, OGS_SESSION_STRING)) { - rv = parse_session_conf(&pcrf_iter); - if (rv != OGS_OK) { - ogs_error("parse_session_conf() failed"); - return rv; - } } else if (!strcmp(pcrf_key, "diameter_stats_interval")) { const char *v = ogs_yaml_iter_value(&pcrf_iter); if (v) self.diam_config->stats.interval_sec = atoi(v); } else if (!strcmp(pcrf_key, "metrics")) { /* handle config in metrics library */ + } else if (!strcmp(pcrf_key, OGS_POLICY_STRING)) { + rv = parse_policy_conf(&pcrf_iter); + if (rv != OGS_OK) { + ogs_error("parse_policy_conf() failed"); + return rv; + } } else ogs_warn("unknown key `%s`", pcrf_key); } @@ -381,12 +405,12 @@ int pcrf_db_qos_data( supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd); ogs_assert(supi); - policy_conf = ogs_list_first(&ogs_local_conf()->policy_list); + policy_conf = ogs_app_policy_conf_find(supi, NULL); if (policy_conf) slice_conf = ogs_list_first(&policy_conf->slice_list); if (slice_conf) { - rv = ogs_app_config_session_data(NULL, NULL, apn, session_data); + rv = ogs_app_config_session_data(supi, NULL, NULL, apn, session_data); if (rv != OGS_OK) ogs_error("ogs_app_config_session_data() failed for APN(%s)", apn); } else { diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index 817bdcfa2e..943cadce68 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -293,7 +293,7 @@ static int request_handler(ogs_sbi_request_t *request, void *data) OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_FEATURES)) { if (val) discovery_option->requester_features = - ogs_uint64_from_string(val); + ogs_uint64_from_string_hexadecimal(val); } else { /* ':scheme' and ':authority' will be automatically filled in later */ } diff --git a/src/sepp/n32c-handler.c b/src/sepp/n32c-handler.c index 0a091eaf04..3cd926e5a3 100644 --- a/src/sepp/n32c-handler.c +++ b/src/sepp/n32c-handler.c @@ -140,7 +140,8 @@ bool sepp_n32c_handshake_handle_security_capability_request( if (SecNegotiateReqData->supported_features) { uint64_t supported_features = - ogs_uint64_from_string(SecNegotiateReqData->supported_features); + ogs_uint64_from_string_hexadecimal( + SecNegotiateReqData->supported_features); sepp_node->supported_features &= supported_features; } else { sepp_node->supported_features = 0; @@ -209,7 +210,8 @@ bool sepp_n32c_handshake_handle_security_capability_response( if (SecNegotiateRspData->supported_features) { uint64_t supported_features = - ogs_uint64_from_string(SecNegotiateRspData->supported_features); + ogs_uint64_from_string_hexadecimal( + SecNegotiateRspData->supported_features); sepp_node->supported_features &= supported_features; } else { sepp_node->supported_features = 0; diff --git a/src/smf/context.c b/src/smf/context.c index 2d38061cd7..0686a4fee4 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -706,7 +706,7 @@ int smf_context_parse_config(void) s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = diff --git a/src/smf/npcf-handler.c b/src/smf/npcf-handler.c index 237c46add1..9c5d5810ab 100644 --- a/src/smf/npcf-handler.c +++ b/src/smf/npcf-handler.c @@ -377,7 +377,7 @@ bool smf_npcf_smpolicycontrol_handle_create( /* SBI Features */ if (SmPolicyDecision->supp_feat) { uint64_t supported_features = - ogs_uint64_from_string(SmPolicyDecision->supp_feat); + ogs_uint64_from_string_hexadecimal(SmPolicyDecision->supp_feat); sess->smpolicycontrol_features &= supported_features; } else { sess->smpolicycontrol_features = 0; diff --git a/tests/af/npcf-handler.c b/tests/af/npcf-handler.c index 7967623778..0a561be191 100644 --- a/tests/af/npcf-handler.c +++ b/tests/af/npcf-handler.c @@ -116,7 +116,8 @@ void af_npcf_policyauthorization_handle_create( PCF_APP_SESSION_STORE(sess, header.uri, message.h.resource.component[1]); - supported_features = ogs_uint64_from_string(AscReqData->supp_feat); + supported_features = ogs_uint64_from_string_hexadecimal( + AscReqData->supp_feat); sess->policyauthorization_features &= supported_features; cleanup: diff --git a/tests/common/context.c b/tests/common/context.c index 3aa4ef1a95..b36a6086ac 100644 --- a/tests/common/context.c +++ b/tests/common/context.c @@ -626,7 +626,7 @@ int test_context_parse_config(void) s_nssai->sst = atoi(sst); if (sd) s_nssai->sd = - ogs_uint24_from_string( + ogs_uint24_from_string_hexadecimal( (char*)sd); else s_nssai->sd.v = diff --git a/tests/core/conv-test.c b/tests/core/conv-test.c index 62621aee50..f08ac5d270 100644 --- a/tests/core/conv-test.c +++ b/tests/core/conv-test.c @@ -168,104 +168,104 @@ static void conv_test8(abts_case *tc, void *data) x = 0; str = ogs_uint64_to_string(0); ABTS_STR_EQUAL(tc, "", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string("0")); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal("0")); ogs_free(str); x = 1; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x1234; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1234", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12345; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12345", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x1234567; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "1234567", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x12345678; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "12345678", str); - ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string(str)); + ABTS_INT_EQUAL(tc, x, ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789a; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789a", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789ab; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789ab", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abc; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abc", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcd; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcd", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcde; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcde", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x123456789abcdef; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "123456789abcdef", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); x = 0x120456789abcdef0; str = ogs_uint64_to_string(x); ABTS_STR_EQUAL(tc, "120456789abcdef0", str); - ABTS_TRUE(tc, x == ogs_uint64_from_string(str)); + ABTS_TRUE(tc, x == ogs_uint64_from_string_hexadecimal(str)); ogs_free(str); } From e31e9965f00d9c744a7f728497cb4f3e97744ee8 Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 6 Feb 2025 20:52:47 +0900 Subject: [PATCH 322/323] [AMF] Fix AMF crash during UE handover by handling unexpected SBI responses (#3707) During handover between two gNBs, the AMF enters an invalid state when it receives an unexpected SBI response from the UDM in the process of sending a smf-select-data request. This bug could lead to an AMF crash as the state machine in gmm_state_registration encountered an unknown state. The fix adds explicit handling for SBI messages with resource names such as AM_DATA, SMF_SELECT_DATA, UE_CONTEXT_IN_SMF_DATA, and SDM_SUBSCRIPTIONS. If the HTTP response status is not OK, CREATED, or NO_CONTENT, a warning is logged and the message is ignored. This prevents the AMF from transitioning into an abnormal state and improves overall stability during frequent handovers. --- src/amf/gmm-sm.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 123a779e48..78b79d0dbe 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1977,6 +1977,29 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT)) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + } + + SWITCH(sbi_message->h.resource.component[1]) + CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) + CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA) + CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA) + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + ogs_warn("[%s] Ignore SBI message", amf_ue->supi); + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[1]); + ogs_assert_if_reached(); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_POLICIES) From 056b50c9c8cf2b69e3a057d9aedde3b00634b6ca Mon Sep 17 00:00:00 2001 From: Sukchan Lee <acetcom@gmail.com> Date: Thu, 6 Feb 2025 21:24:39 +0900 Subject: [PATCH 323/323] [AMF] Fix crash on duplicate PDU session requests due to NULL SUPI (#3710) When a duplicate PDU session establishment is received, the AMF logs a warning and proceeds to update the SM context via the SBI interface. This process eventually calls amf_nsmf_pdusession_build_create_sm_context(), which uses the SUPI to build the SBI URI header. If the SUPI is NULL, then the header's resource component becomes NULL. This leads to a call to ogs_uridup() that asserts on the NULL value, causing a crash. This commit adds a check before invoking the SBI update. If the SUPI is NULL, the update is skipped and a warning is logged. This prevents the invalid URI build process and avoids the subsequent crash in ogs_uridup(). --- src/amf/nsmf-handler.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 50828d93ff..c681ad156b 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -681,7 +681,29 @@ int amf_nsmf_pdusession_handle_update_sm_context( ogs_warn("[%s:%d] Receive Update SM context" "(DUPLICATED_PDU_SESSION_ID)", amf_ue->supi, sess->psi); - if (ran_ue) { + /* + * Issue #3710 + * + * A duplicate PDU Session Establishment is received. + * The system intends to update the SM context via the SBI. + * + * The process is as follows: + * 1. Log a warning including the SUPI (subscriber ID) and psi. + * 2. Call amf_sess_sbi_discover_and_send() with a pointer + * to amf_nsmf_pdusession_build_create_sm_context(). + * 3. This function (amf_nsmf_pdusession_build_create_sm_context) + * will eventually build the SBI request header and call + * ogs_sbi_server_uri(), which internally calls ogs_uridup(). + * 4. If the SUPI (used as header.resource.component[0]) is NULL, + * ogs_uridup asserts on the NULL value and causes a crash. + * + * To prevent this, we check for a NULL SUPI before calling the + * update function. + */ + if (!amf_ue->supi) { + ogs_warn("SUPI is NULL. Skipping update SM context for " + "duplicated PDU Session (psi: %d)", sess->psi); + } else if (ran_ue) { r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_create_sm_context,